/* Must be called after cmdline parsed */ static void _init_bmc_watchdog (void) { unsigned int workaround_flags = 0; unsigned int flags = 0; if (!ipmi_is_root ()) err_exit ("Permission denied, must be root."); parse_get_freeipmi_inband_flags (cmd_args.common_args.workaround_flags_inband, &workaround_flags); flags = IPMI_FLAGS_NONBLOCKING; if (cmd_args.common_args.debug) flags |= IPMI_FLAGS_DEBUG_DUMP; if (!(ipmi_ctx = ipmi_ctx_create ())) err_exit ("ipmi_ctx_create: %s", strerror (errno)); if (cmd_args.common_args.driver_type == IPMI_DEVICE_UNKNOWN) { int ret; if ((ret = ipmi_ctx_find_inband (ipmi_ctx, NULL, cmd_args.common_args.disable_auto_probe, cmd_args.common_args.driver_address, cmd_args.common_args.register_spacing, cmd_args.common_args.driver_device, workaround_flags, flags)) < 0) err_exit ("ipmi_ctx_find_inband: %s", ipmi_ctx_errormsg (ipmi_ctx)); if (!ret) err_exit ("could not find inband device"); } else { if (ipmi_ctx_open_inband (ipmi_ctx, cmd_args.common_args.driver_type, cmd_args.common_args.disable_auto_probe, cmd_args.common_args.driver_address, cmd_args.common_args.register_spacing, cmd_args.common_args.driver_device, workaround_flags, flags) < 0) err_exit ("ipmi_ctx_open_inband: %s", ipmi_ctx_errormsg (ipmi_ctx)); } }
/* * _init_ipmi_config initializes parameters for freeipmi library */ static int _init_ipmi_config (void) { int ret = 0; unsigned int workaround_flags_mask = (IPMI_WORKAROUND_FLAGS_INBAND_ASSUME_IO_BASE_ADDRESS | IPMI_WORKAROUND_FLAGS_INBAND_SPIN_POLL); if (ipmi_ctx) { debug("ipmi_ctx already initialized\n"); return SLURM_SUCCESS; } if (!(ipmi_ctx = ipmi_ctx_create())) { error("ipmi_ctx_create: %s\n", strerror(errno)); goto cleanup; } if (getuid() != 0) { error ("%s: error : must be root to open ipmi devices\n", __func__); goto cleanup; } /* XCC OEM commands always require to use in-band communication */ if (((slurm_ipmi_conf.driver_type > 0) && (slurm_ipmi_conf.driver_type != NO_VAL) && (slurm_ipmi_conf.driver_type != IPMI_DEVICE_KCS) && (slurm_ipmi_conf.driver_type != IPMI_DEVICE_SSIF) && (slurm_ipmi_conf.driver_type != IPMI_DEVICE_OPENIPMI) && (slurm_ipmi_conf.driver_type != IPMI_DEVICE_SUNBMC)) || (slurm_ipmi_conf.workaround_flags & ~workaround_flags_mask)) { /* IPMI ERROR PARAMETERS */ error ("%s: error: XCC Lenovo plugin only supports in-band communication, incorrect driver type or workaround flags", __func__); debug("slurm_ipmi_conf.driver_type=%u slurm_ipmi_conf.workaround_flags=%u", slurm_ipmi_conf.driver_type, slurm_ipmi_conf.workaround_flags); goto cleanup; } if (slurm_ipmi_conf.driver_type == NO_VAL) { if ((ret = ipmi_ctx_find_inband( ipmi_ctx, NULL, slurm_ipmi_conf.disable_auto_probe, slurm_ipmi_conf.driver_address, slurm_ipmi_conf.register_spacing, slurm_ipmi_conf.driver_device, slurm_ipmi_conf.workaround_flags, slurm_ipmi_conf.ipmi_flags)) <= 0) { error("%s: error on ipmi_ctx_find_inband: %s", __func__, ipmi_ctx_errormsg(ipmi_ctx)); debug("slurm_ipmi_conf.driver_type=%u\n" "slurm_ipmi_conf.disable_auto_probe=%u\n" "slurm_ipmi_conf.driver_address=%u\n" "slurm_ipmi_conf.register_spacing=%u\n" "slurm_ipmi_conf.driver_device=%s\n" "slurm_ipmi_conf.workaround_flags=%u\n" "slurm_ipmi_conf.ipmi_flags=%u", slurm_ipmi_conf.driver_type, slurm_ipmi_conf.disable_auto_probe, slurm_ipmi_conf.driver_address, slurm_ipmi_conf.register_spacing, slurm_ipmi_conf.driver_device, slurm_ipmi_conf.workaround_flags, slurm_ipmi_conf.ipmi_flags); goto cleanup; } } else { if ((ipmi_ctx_open_inband(ipmi_ctx, slurm_ipmi_conf.driver_type, slurm_ipmi_conf.disable_auto_probe, slurm_ipmi_conf.driver_address, slurm_ipmi_conf.register_spacing, slurm_ipmi_conf.driver_device, slurm_ipmi_conf.workaround_flags, slurm_ipmi_conf.ipmi_flags) < 0)) { error ("%s: error on ipmi_ctx_open_inband: %s", __func__, ipmi_ctx_errormsg (ipmi_ctx)); debug("slurm_ipmi_conf.driver_type=%u\n" "slurm_ipmi_conf.disable_auto_probe=%u\n" "slurm_ipmi_conf.driver_address=%u\n" "slurm_ipmi_conf.register_spacing=%u\n" "slurm_ipmi_conf.driver_device=%s\n" "slurm_ipmi_conf.workaround_flags=%u\n" "slurm_ipmi_conf.ipmi_flags=%u", slurm_ipmi_conf.driver_type, slurm_ipmi_conf.disable_auto_probe, slurm_ipmi_conf.driver_address, slurm_ipmi_conf.register_spacing, slurm_ipmi_conf.driver_device, slurm_ipmi_conf.workaround_flags, slurm_ipmi_conf.ipmi_flags); goto cleanup; } } if (slurm_ipmi_conf.target_channel_number_is_set || slurm_ipmi_conf.target_slave_address_is_set) { if (ipmi_ctx_set_target( ipmi_ctx, slurm_ipmi_conf.target_channel_number_is_set ? &slurm_ipmi_conf.target_channel_number : NULL, slurm_ipmi_conf.target_slave_address_is_set ? &slurm_ipmi_conf.target_slave_address : NULL) < 0) { error ("%s: error on ipmi_ctx_set_target: %s", __func__, ipmi_ctx_errormsg (ipmi_ctx)); goto cleanup; } } return SLURM_SUCCESS; cleanup: ipmi_ctx_close(ipmi_ctx); ipmi_ctx_destroy(ipmi_ctx); return SLURM_ERROR; }
ipmi_ctx_t ipmi_open (const char *progname, const char *hostname, struct common_cmd_args *common_args, pstdout_state_t pstate) { ipmi_ctx_t ipmi_ctx = NULL; unsigned int workaround_flags = 0; assert (progname); assert (common_args); if (!(ipmi_ctx = ipmi_ctx_create ())) { PSTDOUT_FPRINTF (pstate, stderr, "ipmi_ctx_create: %s", strerror (errno)); goto cleanup; } if (hostname && strcasecmp (hostname, "localhost") != 0 && strcmp (hostname, "127.0.0.1") != 0) { if (common_args->driver_type == IPMI_DEVICE_LAN_2_0) { parse_get_freeipmi_outofband_2_0_flags (common_args->workaround_flags_outofband_2_0, &workaround_flags); if (ipmi_ctx_open_outofband_2_0 (ipmi_ctx, hostname, common_args->username, common_args->password, (common_args->k_g_len) ? common_args->k_g : NULL, (common_args->k_g_len) ? common_args->k_g_len : 0, common_args->privilege_level, common_args->cipher_suite_id, common_args->session_timeout, common_args->retransmission_timeout, workaround_flags, (common_args->debug) ? IPMI_FLAGS_DEBUG_DUMP : IPMI_FLAGS_DEFAULT) < 0) { if (ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_USERNAME_INVALID || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_PASSWORD_INVALID || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_K_G_INVALID || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_PRIVILEGE_LEVEL_INSUFFICIENT || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_PRIVILEGE_LEVEL_CANNOT_BE_OBTAINED || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_AUTHENTICATION_TYPE_UNAVAILABLE || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_CIPHER_SUITE_ID_UNAVAILABLE || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_PASSWORD_VERIFICATION_TIMEOUT || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_HOSTNAME_INVALID || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_IPMI_2_0_UNAVAILABLE || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_CONNECTION_TIMEOUT) PSTDOUT_FPRINTF (pstate, stderr, "%s: %s\n", progname, ipmi_ctx_errormsg (ipmi_ctx)); else PSTDOUT_FPRINTF (pstate, stderr, "ipmi_ctx_open_outofband_2_0: %s\n", ipmi_ctx_errormsg (ipmi_ctx)); goto cleanup; } } else { parse_get_freeipmi_outofband_flags (common_args->workaround_flags_outofband, &workaround_flags); if (ipmi_ctx_open_outofband (ipmi_ctx, hostname, common_args->username, common_args->password, common_args->authentication_type, common_args->privilege_level, common_args->session_timeout, common_args->retransmission_timeout, workaround_flags, (common_args->debug) ? IPMI_FLAGS_DEBUG_DUMP : IPMI_FLAGS_DEFAULT) < 0) { if (ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_USERNAME_INVALID || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_PASSWORD_INVALID || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_PRIVILEGE_LEVEL_INSUFFICIENT || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_PRIVILEGE_LEVEL_CANNOT_BE_OBTAINED || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_AUTHENTICATION_TYPE_UNAVAILABLE || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_PASSWORD_VERIFICATION_TIMEOUT || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_HOSTNAME_INVALID || ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_CONNECTION_TIMEOUT) PSTDOUT_FPRINTF (pstate, stderr, "%s: %s\n", progname, ipmi_ctx_errormsg (ipmi_ctx)); else PSTDOUT_FPRINTF (pstate, stderr, "ipmi_ctx_open_outofband: %s\n", ipmi_ctx_errormsg (ipmi_ctx)); goto cleanup; } } } else { if (!ipmi_is_root ()) { PSTDOUT_FPRINTF (pstate, stderr, "%s: %s\n", progname, ipmi_ctx_strerror (IPMI_ERR_PERMISSION)); goto cleanup; } parse_get_freeipmi_inband_flags (common_args->workaround_flags_inband, &workaround_flags); if (common_args->driver_type == IPMI_DEVICE_UNKNOWN) { int ret; if ((ret = ipmi_ctx_find_inband (ipmi_ctx, NULL, common_args->disable_auto_probe, common_args->driver_address, common_args->register_spacing, common_args->driver_device, workaround_flags, (common_args->debug) ? IPMI_FLAGS_DEBUG_DUMP : IPMI_FLAGS_DEFAULT)) < 0) { PSTDOUT_FPRINTF (pstate, stderr, "ipmi_ctx_find_inband: %s\n", ipmi_ctx_errormsg (ipmi_ctx)); goto cleanup; } if (!ret) { PSTDOUT_FPRINTF (pstate, stderr, "could not find inband device"); goto cleanup; } } else { if (ipmi_ctx_open_inband (ipmi_ctx, common_args->driver_type, common_args->disable_auto_probe, common_args->driver_address, common_args->register_spacing, common_args->driver_device, workaround_flags, (common_args->debug) ? IPMI_FLAGS_DEBUG_DUMP : IPMI_FLAGS_DEFAULT) < 0) { if (ipmi_ctx_errnum (ipmi_ctx) == IPMI_ERR_DEVICE_NOT_FOUND) PSTDOUT_FPRINTF (pstate, stderr, "%s: %s\n", progname, ipmi_ctx_errormsg (ipmi_ctx)); else PSTDOUT_FPRINTF (pstate, stderr, "ipmi_ctx_open_inband: %s\n", ipmi_ctx_errormsg (ipmi_ctx)); goto cleanup; } } } if (common_args->target_channel_number_is_set || common_args->target_slave_address_is_set) { if (ipmi_ctx_set_target (ipmi_ctx, common_args->target_channel_number_is_set ? &common_args->target_channel_number : NULL, common_args->target_slave_address_is_set ? &common_args->target_slave_address : NULL) < 0) { PSTDOUT_FPRINTF (pstate, stderr, "ipmi_ctx_set_target: %s\n", ipmi_ctx_errormsg (ipmi_ctx)); goto cleanup; } } return (ipmi_ctx); cleanup: ipmi_ctx_close (ipmi_ctx); ipmi_ctx_destroy (ipmi_ctx); return (NULL); }