00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <errno.h>
00035 #include <string.h>
00036 #include <ctype.h>
00037 #include <stdlib.h>
00038 #include <OpenIPMI/ipmiif.h>
00039 #include <OpenIPMI/ipmi_cmdlang.h>
00040 #include <OpenIPMI/ipmi_fru.h>
00041
00042
00043 #include <OpenIPMI/internal/ipmi_malloc.h>
00044
00045
00046 void ipmi_cmdlang_dump_fru_info(ipmi_cmd_info_t *cmd_info, ipmi_fru_t *fru);
00047
00048 void ipmi_cmdlang_sensor_change(enum ipmi_update_e op,
00049 ipmi_entity_t *entity,
00050 ipmi_sensor_t *sensor,
00051 void *cb_data);
00052 void ipmi_cmdlang_control_change(enum ipmi_update_e op,
00053 ipmi_entity_t *entity,
00054 ipmi_control_t *control,
00055 void *cb_data);
00056
00057 static void
00058 entity_iterate_handler(ipmi_entity_t *entity, ipmi_entity_t *parent,
00059 void *cb_data)
00060 {
00061 ipmi_cmd_info_t *cmd_info = cb_data;
00062 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00063 char entity_name[IPMI_ENTITY_NAME_LEN];
00064
00065 if (cmdlang->err)
00066 return;
00067
00068 ipmi_entity_get_name(parent, entity_name, sizeof(entity_name));
00069
00070 ipmi_cmdlang_out(cmd_info, "Name", entity_name);
00071 }
00072
00073 static void
00074 entity_child_handler(ipmi_entity_t *parent, ipmi_entity_t *entity,
00075 void *cb_data)
00076 {
00077 ipmi_cmd_info_t *cmd_info = cb_data;
00078 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00079 char entity_name[IPMI_ENTITY_NAME_LEN];
00080
00081 if (cmdlang->err)
00082 return;
00083
00084 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00085
00086 ipmi_cmdlang_out(cmd_info, "Name", entity_name);
00087 if (ipmi_entity_get_is_parent(entity)) {
00088 ipmi_cmdlang_down(cmd_info);
00089 ipmi_entity_iterate_children(entity, entity_child_handler, cmd_info);
00090 ipmi_cmdlang_up(cmd_info);
00091 }
00092 }
00093
00094 static void
00095 entity_tree_handler(ipmi_entity_t *entity, void *cb_data)
00096 {
00097 ipmi_cmd_info_t *cmd_info = cb_data;
00098 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00099 char entity_name[IPMI_ENTITY_NAME_LEN];
00100
00101 if (cmdlang->err)
00102 return;
00103
00104 if (ipmi_entity_get_is_child(entity))
00105 return;
00106
00107 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00108
00109 ipmi_cmdlang_out(cmd_info, "Name", entity_name);
00110 if (ipmi_entity_get_is_parent(entity)) {
00111 ipmi_cmdlang_down(cmd_info);
00112 ipmi_entity_iterate_children(entity, entity_child_handler, cmd_info);
00113 ipmi_cmdlang_up(cmd_info);
00114 }
00115 }
00116
00117 static void
00118 entity_tree(ipmi_domain_t *domain, void *cb_data)
00119 {
00120 ipmi_cmd_info_t *cmd_info = cb_data;
00121 char domain_name[IPMI_DOMAIN_NAME_LEN];
00122
00123 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00124 ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00125 ipmi_cmdlang_down(cmd_info);
00126 ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00127 ipmi_cmdlang_out(cmd_info, "Entities", NULL);
00128 ipmi_cmdlang_down(cmd_info);
00129 ipmi_domain_iterate_entities(domain, entity_tree_handler, cmd_info);
00130 ipmi_cmdlang_up(cmd_info);
00131 ipmi_cmdlang_up(cmd_info);
00132 }
00133
00134 static void
00135 entity_list_handler(ipmi_entity_t *entity, void *cb_data)
00136 {
00137 ipmi_cmd_info_t *cmd_info = cb_data;
00138 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00139 char entity_name[IPMI_ENTITY_NAME_LEN];
00140
00141 if (cmdlang->err)
00142 return;
00143
00144 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00145
00146 ipmi_cmdlang_out(cmd_info, "Name", entity_name);
00147 }
00148
00149 static void
00150 entity_list(ipmi_domain_t *domain, void *cb_data)
00151 {
00152 ipmi_cmd_info_t *cmd_info = cb_data;
00153 char domain_name[IPMI_DOMAIN_NAME_LEN];
00154
00155 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00156 ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00157 ipmi_cmdlang_down(cmd_info);
00158 ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00159 ipmi_cmdlang_out(cmd_info, "Entities", NULL);
00160 ipmi_cmdlang_down(cmd_info);
00161 ipmi_domain_iterate_entities(domain, entity_list_handler, cmd_info);
00162 ipmi_cmdlang_up(cmd_info);
00163 ipmi_cmdlang_up(cmd_info);
00164 }
00165
00166 static void
00167 entity_dump(ipmi_entity_t *entity, ipmi_cmd_info_t *cmd_info)
00168 {
00169 enum ipmi_dlr_type_e type;
00170 static char *ent_types[] = { "unknown", "mc", "fru",
00171 "generic", "invalid" };
00172 int length;
00173 unsigned int val;
00174
00175 type = ipmi_entity_get_type(entity);
00176 if (type > IPMI_ENTITY_GENERIC)
00177 type = IPMI_ENTITY_GENERIC + 1;
00178 ipmi_cmdlang_out(cmd_info, "Type", ent_types[type]);
00179
00180 ipmi_cmdlang_out_bool(cmd_info, "Present", ipmi_entity_is_present(entity));
00181 ipmi_cmdlang_out_bool(cmd_info, "Presence sensor always there",
00182 ipmi_entity_get_presence_sensor_always_there(entity));
00183 ipmi_cmdlang_out_bool(cmd_info, "Hot swappable",
00184 ipmi_entity_hot_swappable(entity));
00185 if (ipmi_entity_hot_swappable(entity)) {
00186 ipmi_cmdlang_out_bool(cmd_info, "Supports managed hot swap",
00187 ipmi_entity_supports_managed_hot_swap(entity));
00188 }
00189
00190 if (ipmi_entity_get_is_child(entity)) {
00191 ipmi_cmdlang_out(cmd_info, "Parents", NULL);
00192 ipmi_cmdlang_down(cmd_info);
00193 ipmi_entity_iterate_parents(entity, entity_iterate_handler, cmd_info);
00194 ipmi_cmdlang_up(cmd_info);
00195 }
00196 if (ipmi_entity_get_is_parent(entity)) {
00197 ipmi_cmdlang_out(cmd_info, "Children", NULL);
00198 ipmi_cmdlang_down(cmd_info);
00199 ipmi_entity_iterate_children(entity, entity_iterate_handler, cmd_info);
00200 ipmi_cmdlang_up(cmd_info);
00201 }
00202
00203 if (ipmi_entity_get_physical_slot_num(entity, &val) == 0)
00204 ipmi_cmdlang_out_int(cmd_info, "Physical Slot", val);
00205
00206 length = ipmi_entity_get_id_length(entity);
00207 if (length &&
00208 (ipmi_entity_get_id_type(entity) == IPMI_ASCII_STR && length > 1))
00209 {
00210 char *str = ipmi_mem_alloc(length);
00211
00212 if (str) {
00213 length = ipmi_entity_get_id(entity, str, length);
00214 ipmi_cmdlang_out_type(cmd_info, "Id",
00215 ipmi_entity_get_id_type(entity),
00216 str, length);
00217 ipmi_mem_free(str);
00218 }
00219 }
00220 ipmi_cmdlang_out(cmd_info, "Entity ID String",
00221 ipmi_entity_get_entity_id_string(entity));
00222
00223 switch (type) {
00224 case IPMI_ENTITY_MC:
00225 ipmi_cmdlang_out_int(cmd_info, "Channel",
00226 ipmi_entity_get_channel(entity));
00227 ipmi_cmdlang_out_int(cmd_info, "LUN", ipmi_entity_get_lun(entity));
00228 ipmi_cmdlang_out_hex(cmd_info, "OEM", ipmi_entity_get_oem(entity));
00229 ipmi_cmdlang_out_hex(cmd_info, "Slave Address",
00230 ipmi_entity_get_slave_address(entity));
00231 ipmi_cmdlang_out_bool(cmd_info, "ACPI_system_power_notify_required",
00232 ipmi_entity_get_ACPI_system_power_notify_required(entity));
00233 ipmi_cmdlang_out_bool(cmd_info, "ACPI_device_power_notify_required",
00234 ipmi_entity_get_ACPI_device_power_notify_required(entity));
00235 ipmi_cmdlang_out_bool(cmd_info, "controller_logs_init_agent_errors",
00236 ipmi_entity_get_controller_logs_init_agent_errors(entity));
00237 ipmi_cmdlang_out_bool(cmd_info, "log_init_agent_errors_accessing",
00238 ipmi_entity_get_log_init_agent_errors_accessing(entity));
00239 ipmi_cmdlang_out_bool(cmd_info, "global_init",
00240 ipmi_entity_get_global_init(entity));
00241 ipmi_cmdlang_out_bool(cmd_info, "chassis_device",
00242 ipmi_entity_get_chassis_device(entity));
00243 ipmi_cmdlang_out_bool(cmd_info, "bridge",
00244 ipmi_entity_get_bridge(entity));
00245 ipmi_cmdlang_out_bool(cmd_info, "IPMB_event_generator",
00246 ipmi_entity_get_IPMB_event_generator(entity));
00247 ipmi_cmdlang_out_bool(cmd_info, "IPMB_event_receiver",
00248 ipmi_entity_get_IPMB_event_receiver(entity));
00249 ipmi_cmdlang_out_bool(cmd_info, "FRU_inventory_device",
00250 ipmi_entity_get_FRU_inventory_device(entity));
00251 ipmi_cmdlang_out_bool(cmd_info, "SEL_device",
00252 ipmi_entity_get_SEL_device(entity));
00253 ipmi_cmdlang_out_bool(cmd_info, "SDR_repository_device",
00254 ipmi_entity_get_SDR_repository_device(entity));
00255 ipmi_cmdlang_out_bool(cmd_info, "sensor_device",
00256 ipmi_entity_get_sensor_device(entity));
00257 break;
00258
00259 case IPMI_ENTITY_FRU:
00260 ipmi_cmdlang_out_int(cmd_info, "Channel",
00261 ipmi_entity_get_channel(entity));
00262 ipmi_cmdlang_out_int(cmd_info, "LUN", ipmi_entity_get_lun(entity));
00263 ipmi_cmdlang_out_hex(cmd_info, "OEM", ipmi_entity_get_oem(entity));
00264 ipmi_cmdlang_out_hex(cmd_info, "access_address",
00265 ipmi_entity_get_access_address(entity));
00266 ipmi_cmdlang_out_hex(cmd_info, "private_bus_id",
00267 ipmi_entity_get_private_bus_id(entity));
00268 ipmi_cmdlang_out_int(cmd_info, "device_type",
00269 ipmi_entity_get_device_type(entity));
00270 ipmi_cmdlang_out_int(cmd_info, "device_modifier",
00271 ipmi_entity_get_device_modifier(entity));
00272 ipmi_cmdlang_out_bool(cmd_info, "is_logical_fru",
00273 ipmi_entity_get_is_logical_fru(entity));
00274 ipmi_cmdlang_out_hex(cmd_info, "fru_device_id",
00275 ipmi_entity_get_fru_device_id(entity));
00276 break;
00277
00278 case IPMI_ENTITY_GENERIC:
00279 ipmi_cmdlang_out_int(cmd_info, "Channel",
00280 ipmi_entity_get_channel(entity));
00281 ipmi_cmdlang_out_int(cmd_info, "LUN", ipmi_entity_get_lun(entity));
00282 ipmi_cmdlang_out_hex(cmd_info, "OEM", ipmi_entity_get_oem(entity));
00283 ipmi_cmdlang_out_hex(cmd_info, "access_address",
00284 ipmi_entity_get_access_address(entity));
00285 ipmi_cmdlang_out_hex(cmd_info, "private_bus_id",
00286 ipmi_entity_get_private_bus_id(entity));
00287 ipmi_cmdlang_out_int(cmd_info, "device_type",
00288 ipmi_entity_get_device_type(entity));
00289 ipmi_cmdlang_out_int(cmd_info, "device_modifier",
00290 ipmi_entity_get_device_modifier(entity));
00291 ipmi_cmdlang_out_hex(cmd_info, "slave_address",
00292 ipmi_entity_get_slave_address(entity));
00293 ipmi_cmdlang_out_int(cmd_info, "address_span",
00294 ipmi_entity_get_address_span(entity));
00295 break;
00296
00297 default:
00298 break;
00299 }
00300 }
00301
00302 static void
00303 entity_info(ipmi_entity_t *entity, void *cb_data)
00304 {
00305 ipmi_cmd_info_t *cmd_info = cb_data;
00306 char entity_name[IPMI_ENTITY_NAME_LEN];
00307
00308 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00309
00310 ipmi_cmdlang_out(cmd_info, "Entity", NULL);
00311 ipmi_cmdlang_down(cmd_info);
00312 ipmi_cmdlang_out(cmd_info, "Name", entity_name);
00313 entity_dump(entity, cmd_info);
00314 ipmi_cmdlang_up(cmd_info);
00315 }
00316
00317 static void
00318 fru_info(ipmi_entity_t *entity, void *cb_data)
00319 {
00320 ipmi_cmd_info_t *cmd_info = cb_data;
00321 ipmi_fru_t *fru;
00322 char entity_name[IPMI_ENTITY_NAME_LEN];
00323
00324 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00325
00326 ipmi_cmdlang_out(cmd_info, "Entity", NULL);
00327 ipmi_cmdlang_down(cmd_info);
00328 ipmi_cmdlang_out(cmd_info, "Name", entity_name);
00329
00330
00331
00332
00333 fru = ipmi_entity_get_fru(entity);
00334 if (fru)
00335 ipmi_cmdlang_dump_fru_info(cmd_info, fru);
00336 ipmi_cmdlang_up(cmd_info);
00337 }
00338
00339 static void
00340 entity_hs_get_act_time_done(ipmi_entity_t *entity,
00341 int err,
00342 ipmi_timeout_t val,
00343 void *cb_data)
00344 {
00345 ipmi_cmd_info_t *cmd_info = cb_data;
00346 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00347 char entity_name[IPMI_ENTITY_NAME_LEN];
00348
00349 ipmi_cmdlang_lock(cmd_info);
00350 if (err) {
00351 cmdlang->errstr = "Error reading entity hot-swap activate time";
00352 cmdlang->err = err;
00353 ipmi_entity_get_name(entity, cmdlang->objstr,
00354 cmdlang->objstr_len);
00355 cmdlang->location = "cmd_sensor.c(entity_hs_get_act_time_done)";
00356 goto out;
00357 }
00358
00359 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00360 ipmi_cmdlang_out(cmd_info, "Entity", NULL);
00361 ipmi_cmdlang_down(cmd_info);
00362 ipmi_cmdlang_out(cmd_info, "Name", entity_name);
00363 ipmi_cmdlang_out_timeout(cmd_info, "Auto-Activation Time", val);
00364
00365 out:
00366 ipmi_cmdlang_unlock(cmd_info);
00367 ipmi_cmdlang_cmd_info_put(cmd_info);
00368 }
00369
00370 static void
00371 entity_hs_get_act_time(ipmi_entity_t *entity, void *cb_data)
00372 {
00373 ipmi_cmd_info_t *cmd_info = cb_data;
00374 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00375 int rv;
00376
00377 ipmi_cmdlang_cmd_info_get(cmd_info);
00378 rv = ipmi_entity_get_auto_activate_time(entity,
00379 entity_hs_get_act_time_done,
00380 cmd_info);
00381 if (rv) {
00382 ipmi_cmdlang_cmd_info_put(cmd_info);
00383 cmdlang->err = rv;
00384 cmdlang->errstr = "Error getting auto activate time";
00385 ipmi_entity_get_name(entity, cmdlang->objstr,
00386 cmdlang->objstr_len);
00387 cmdlang->location = "cmd_entity.c(entity_hs_get_act_time)";
00388 }
00389 }
00390
00391 static void
00392 entity_hs_set_act_time_done(ipmi_entity_t *entity,
00393 int err,
00394 void *cb_data)
00395 {
00396 ipmi_cmd_info_t *cmd_info = cb_data;
00397 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00398 char entity_name[IPMI_ENTITY_NAME_LEN];
00399
00400 ipmi_cmdlang_lock(cmd_info);
00401 if (err) {
00402 cmdlang->errstr = "Error setting entity hot-swap activate time";
00403 cmdlang->err = err;
00404 ipmi_entity_get_name(entity, cmdlang->objstr,
00405 cmdlang->objstr_len);
00406 cmdlang->location = "cmd_sensor.c(entity_hs_set_act_time_done)";
00407 goto out;
00408 }
00409
00410 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00411 ipmi_cmdlang_out(cmd_info, "Set act time", entity_name);
00412
00413 out:
00414 ipmi_cmdlang_unlock(cmd_info);
00415 ipmi_cmdlang_cmd_info_put(cmd_info);
00416 }
00417
00418 static void
00419 entity_hs_set_act_time(ipmi_entity_t *entity, void *cb_data)
00420 {
00421 ipmi_cmd_info_t *cmd_info = cb_data;
00422 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00423 int rv;
00424 ipmi_timeout_t val;
00425 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00426 int argc = ipmi_cmdlang_get_argc(cmd_info);
00427 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00428
00429 if ((argc - curr_arg) < 1) {
00430 cmdlang->errstr = "Not enough parameters";
00431 cmdlang->err = EINVAL;
00432 goto out_err;
00433 }
00434
00435 ipmi_cmdlang_get_timeout(argv[curr_arg], &val, cmd_info);
00436 if (cmdlang->err) {
00437 cmdlang->errstr = "time invalid";
00438 goto out_err;
00439 }
00440 curr_arg++;
00441
00442 ipmi_cmdlang_cmd_info_get(cmd_info);
00443 rv = ipmi_entity_set_auto_activate_time(entity,
00444 val,
00445 entity_hs_set_act_time_done,
00446 cmd_info);
00447 if (rv) {
00448 ipmi_cmdlang_cmd_info_put(cmd_info);
00449 cmdlang->err = rv;
00450 cmdlang->errstr = "Error setting auto activate time";
00451 goto out_err;
00452 }
00453 return;
00454
00455 out_err:
00456 ipmi_entity_get_name(entity, cmdlang->objstr,
00457 cmdlang->objstr_len);
00458 cmdlang->location = "cmd_entity.c(entity_hs_set_act_time)";
00459 }
00460
00461 static void
00462 entity_hs_get_deact_time_done(ipmi_entity_t *entity,
00463 int err,
00464 ipmi_timeout_t val,
00465 void *cb_data)
00466 {
00467 ipmi_cmd_info_t *cmd_info = cb_data;
00468 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00469 char entity_name[IPMI_ENTITY_NAME_LEN];
00470
00471 ipmi_cmdlang_lock(cmd_info);
00472 if (err) {
00473 cmdlang->errstr = "Error reading entity hot-swap deactivate time";
00474 cmdlang->err = err;
00475 ipmi_entity_get_name(entity, cmdlang->objstr,
00476 cmdlang->objstr_len);
00477 cmdlang->location = "cmd_sensor.c(entity_hs_get_deact_time_done)";
00478 goto out;
00479 }
00480
00481 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00482 ipmi_cmdlang_out(cmd_info, "Entity", NULL);
00483 ipmi_cmdlang_down(cmd_info);
00484 ipmi_cmdlang_out(cmd_info, "Name", entity_name);
00485 ipmi_cmdlang_out_timeout(cmd_info, "Auto-Deactivation Time", val);
00486
00487 out:
00488 ipmi_cmdlang_unlock(cmd_info);
00489 ipmi_cmdlang_cmd_info_put(cmd_info);
00490 }
00491
00492 static void
00493 entity_hs_get_deact_time(ipmi_entity_t *entity, void *cb_data)
00494 {
00495 ipmi_cmd_info_t *cmd_info = cb_data;
00496 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00497 int rv;
00498
00499 ipmi_cmdlang_cmd_info_get(cmd_info);
00500 rv = ipmi_entity_get_auto_deactivate_time(entity,
00501 entity_hs_get_deact_time_done,
00502 cmd_info);
00503 if (rv) {
00504 ipmi_cmdlang_cmd_info_put(cmd_info);
00505 cmdlang->err = rv;
00506 cmdlang->errstr = "Error getting auto deactivate time";
00507 ipmi_entity_get_name(entity, cmdlang->objstr,
00508 cmdlang->objstr_len);
00509 cmdlang->location = "cmd_entity.c(entity_hs_get_deact_time)";
00510 }
00511 }
00512
00513 static void
00514 entity_hs_set_deact_time_done(ipmi_entity_t *entity,
00515 int err,
00516 void *cb_data)
00517 {
00518 ipmi_cmd_info_t *cmd_info = cb_data;
00519 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00520 char entity_name[IPMI_ENTITY_NAME_LEN];
00521
00522 ipmi_cmdlang_lock(cmd_info);
00523 if (err) {
00524 cmdlang->errstr = "Error setting entity hot-swap deactivate time";
00525 cmdlang->err = err;
00526 ipmi_entity_get_name(entity, cmdlang->objstr,
00527 cmdlang->objstr_len);
00528 cmdlang->location = "cmd_sensor.c(entity_hs_set_deact_time_done)";
00529 goto out;
00530 }
00531
00532 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00533 ipmi_cmdlang_out(cmd_info, "Set deact time", entity_name);
00534
00535 out:
00536 ipmi_cmdlang_unlock(cmd_info);
00537 ipmi_cmdlang_cmd_info_put(cmd_info);
00538 }
00539
00540 static void
00541 entity_hs_set_deact_time(ipmi_entity_t *entity, void *cb_data)
00542 {
00543 ipmi_cmd_info_t *cmd_info = cb_data;
00544 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00545 int rv;
00546 ipmi_timeout_t val;
00547 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00548 int argc = ipmi_cmdlang_get_argc(cmd_info);
00549 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00550
00551 if ((argc - curr_arg) < 1) {
00552 cmdlang->errstr = "Not enough parameters";
00553 cmdlang->err = EINVAL;
00554 goto out_err;
00555 }
00556
00557 ipmi_cmdlang_get_timeout(argv[curr_arg], &val, cmd_info);
00558 if (cmdlang->err) {
00559 cmdlang->errstr = "time invalid";
00560 goto out_err;
00561 }
00562 curr_arg++;
00563
00564 ipmi_cmdlang_cmd_info_get(cmd_info);
00565 rv = ipmi_entity_set_auto_deactivate_time(entity,
00566 val,
00567 entity_hs_set_deact_time_done,
00568 cmd_info);
00569 if (rv) {
00570 ipmi_cmdlang_cmd_info_put(cmd_info);
00571 cmdlang->err = rv;
00572 cmdlang->errstr = "Error setting auto deactivate time";
00573 goto out_err;
00574 }
00575 return;
00576
00577 out_err:
00578 ipmi_entity_get_name(entity, cmdlang->objstr,
00579 cmdlang->objstr_len);
00580 cmdlang->location = "cmd_entity.c(entity_hs_set_deact_time)";
00581 }
00582
00583 static void
00584 entity_hs_activation_request_done(ipmi_entity_t *entity,
00585 int err,
00586 void *cb_data)
00587 {
00588 ipmi_cmd_info_t *cmd_info = cb_data;
00589 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00590 char entity_name[IPMI_ENTITY_NAME_LEN];
00591
00592 ipmi_cmdlang_lock(cmd_info);
00593 if (err) {
00594 cmdlang->errstr = "Error from entity hot-swap activation request";
00595 cmdlang->err = err;
00596 ipmi_entity_get_name(entity, cmdlang->objstr,
00597 cmdlang->objstr_len);
00598 cmdlang->location = "cmd_sensor.c(entity_hs_activation_request_done)";
00599 goto out;
00600 }
00601
00602 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00603 ipmi_cmdlang_out(cmd_info, "Activation requested", entity_name);
00604
00605 out:
00606 ipmi_cmdlang_unlock(cmd_info);
00607 ipmi_cmdlang_cmd_info_put(cmd_info);
00608 }
00609
00610 static void
00611 entity_hs_activation_request(ipmi_entity_t *entity, void *cb_data)
00612 {
00613 ipmi_cmd_info_t *cmd_info = cb_data;
00614 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00615 int rv;
00616
00617 ipmi_cmdlang_cmd_info_get(cmd_info);
00618 rv = ipmi_entity_set_activation_requested
00619 (entity,
00620 entity_hs_activation_request_done,
00621 cmd_info);
00622 if (rv) {
00623 ipmi_cmdlang_cmd_info_put(cmd_info);
00624 cmdlang->err = rv;
00625 cmdlang->errstr = "Error sending activation request";
00626 ipmi_entity_get_name(entity, cmdlang->objstr,
00627 cmdlang->objstr_len);
00628 cmdlang->location = "cmd_entity.c(entity_hs_activation_request)";
00629 }
00630 }
00631
00632 static void
00633 entity_hs_activate_done(ipmi_entity_t *entity,
00634 int err,
00635 void *cb_data)
00636 {
00637 ipmi_cmd_info_t *cmd_info = cb_data;
00638 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00639 char entity_name[IPMI_ENTITY_NAME_LEN];
00640
00641 ipmi_cmdlang_lock(cmd_info);
00642 if (err) {
00643 cmdlang->errstr = "Error from entity hot-swap activate";
00644 cmdlang->err = err;
00645 ipmi_entity_get_name(entity, cmdlang->objstr,
00646 cmdlang->objstr_len);
00647 cmdlang->location = "cmd_sensor.c(entity_hs_activate_done)";
00648 goto out;
00649 }
00650
00651 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00652 ipmi_cmdlang_out(cmd_info, "Activated", entity_name);
00653
00654 out:
00655 ipmi_cmdlang_unlock(cmd_info);
00656 ipmi_cmdlang_cmd_info_put(cmd_info);
00657 }
00658
00659 static void
00660 entity_hs_activate(ipmi_entity_t *entity, void *cb_data)
00661 {
00662 ipmi_cmd_info_t *cmd_info = cb_data;
00663 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00664 int rv;
00665
00666 ipmi_cmdlang_cmd_info_get(cmd_info);
00667 rv = ipmi_entity_activate(entity,
00668 entity_hs_activate_done,
00669 cmd_info);
00670 if (rv) {
00671 ipmi_cmdlang_cmd_info_put(cmd_info);
00672 cmdlang->err = rv;
00673 cmdlang->errstr = "Error sending activate";
00674 ipmi_entity_get_name(entity, cmdlang->objstr,
00675 cmdlang->objstr_len);
00676 cmdlang->location = "cmd_entity.c(entity_hs_activate)";
00677 }
00678 }
00679
00680 static void
00681 entity_hs_deactivate_done(ipmi_entity_t *entity,
00682 int err,
00683 void *cb_data)
00684 {
00685 ipmi_cmd_info_t *cmd_info = cb_data;
00686 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00687 char entity_name[IPMI_ENTITY_NAME_LEN];
00688
00689 ipmi_cmdlang_lock(cmd_info);
00690 if (err) {
00691 cmdlang->errstr = "Error from entity hot-swap deactivate";
00692 cmdlang->err = err;
00693 ipmi_entity_get_name(entity, cmdlang->objstr,
00694 cmdlang->objstr_len);
00695 cmdlang->location = "cmd_sensor.c(entity_hs_deactivate_done)";
00696 goto out;
00697 }
00698
00699 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00700 ipmi_cmdlang_out(cmd_info, "Deactivated", entity_name);
00701
00702 out:
00703 ipmi_cmdlang_unlock(cmd_info);
00704 ipmi_cmdlang_cmd_info_put(cmd_info);
00705 }
00706
00707 static void
00708 entity_hs_deactivate(ipmi_entity_t *entity, void *cb_data)
00709 {
00710 ipmi_cmd_info_t *cmd_info = cb_data;
00711 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00712 int rv;
00713
00714 ipmi_cmdlang_cmd_info_get(cmd_info);
00715 rv = ipmi_entity_deactivate(entity,
00716 entity_hs_deactivate_done,
00717 cmd_info);
00718 if (rv) {
00719 ipmi_cmdlang_cmd_info_put(cmd_info);
00720 cmdlang->err = rv;
00721 cmdlang->errstr = "Error sending deactivate";
00722 ipmi_entity_get_name(entity, cmdlang->objstr,
00723 cmdlang->objstr_len);
00724 cmdlang->location = "cmd_entity.c(entity_hs_deactivate)";
00725 }
00726 }
00727
00728 static void
00729 entity_hs_state_done(ipmi_entity_t *entity,
00730 int err,
00731 enum ipmi_hot_swap_states state,
00732 void *cb_data)
00733 {
00734 ipmi_cmd_info_t *cmd_info = cb_data;
00735 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00736 char entity_name[IPMI_ENTITY_NAME_LEN];
00737
00738 ipmi_cmdlang_lock(cmd_info);
00739 if (err) {
00740 cmdlang->errstr = "Error reading hot-swap state";
00741 cmdlang->err = err;
00742 ipmi_entity_get_name(entity, cmdlang->objstr,
00743 cmdlang->objstr_len);
00744 cmdlang->location = "cmd_sensor.c(entity_hs_state_done)";
00745 goto out;
00746 }
00747
00748 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00749 ipmi_cmdlang_out(cmd_info, "Entity", NULL);
00750 ipmi_cmdlang_down(cmd_info);
00751 ipmi_cmdlang_out(cmd_info, "Name", entity_name);
00752 ipmi_cmdlang_out(cmd_info, "State", ipmi_hot_swap_state_name(state));
00753
00754 out:
00755 ipmi_cmdlang_unlock(cmd_info);
00756 ipmi_cmdlang_cmd_info_put(cmd_info);
00757 }
00758
00759 static void
00760 entity_hs_state(ipmi_entity_t *entity, void *cb_data)
00761 {
00762 ipmi_cmd_info_t *cmd_info = cb_data;
00763 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00764 int rv;
00765
00766 ipmi_cmdlang_cmd_info_get(cmd_info);
00767 rv = ipmi_entity_get_hot_swap_state(entity,
00768 entity_hs_state_done,
00769 cmd_info);
00770 if (rv) {
00771 ipmi_cmdlang_cmd_info_put(cmd_info);
00772 cmdlang->err = rv;
00773 cmdlang->errstr = "Error getting hot-swap state";
00774 ipmi_entity_get_name(entity, cmdlang->objstr,
00775 cmdlang->objstr_len);
00776 cmdlang->location = "cmd_entity.c(entity_hs_get_state)";
00777 }
00778 }
00779
00780 static void
00781 entity_hs_check(ipmi_entity_t *entity, void *cb_data)
00782 {
00783 ipmi_cmd_info_t *cmd_info = cb_data;
00784 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00785 int rv;
00786 char entity_name[IPMI_ENTITY_NAME_LEN];
00787
00788 rv = ipmi_entity_check_hot_swap_state(entity);
00789 if (rv) {
00790 cmdlang->err = rv;
00791 cmdlang->errstr = "Error checking hot-swap state";
00792 ipmi_entity_get_name(entity, cmdlang->objstr,
00793 cmdlang->objstr_len);
00794 cmdlang->location = "cmd_entity.c(entity_hs_check)";
00795 } else {
00796 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00797 ipmi_cmdlang_out(cmd_info, "Check started", entity_name);
00798 }
00799 }
00800
00801
00802 void fru_change(enum ipmi_update_e op,
00803 ipmi_entity_t *entity,
00804 void *cb_data)
00805 {
00806 char *errstr;
00807 int rv;
00808 ipmi_cmd_info_t *evi;
00809 ipmi_fru_t *fru;
00810 char entity_name[IPMI_ENTITY_NAME_LEN];
00811
00812 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00813
00814 evi = ipmi_cmdlang_alloc_event_info();
00815 if (!evi) {
00816 rv = ENOMEM;
00817 errstr = "Out of memory";
00818 goto out_err;
00819 }
00820
00821 ipmi_cmdlang_out(evi, "Object Type", "Entity FRU");
00822 ipmi_cmdlang_out(evi, "Name", entity_name);
00823
00824 switch (op) {
00825 case IPMI_ADDED:
00826 ipmi_cmdlang_out(evi, "Operation", "Add");
00827 if (ipmi_cmdlang_get_evinfo()) {
00828 ipmi_cmdlang_down(evi);
00829 fru = ipmi_entity_get_fru(entity);
00830 if (fru)
00831 ipmi_cmdlang_dump_fru_info(evi, fru);
00832 ipmi_cmdlang_up(evi);
00833 }
00834 break;
00835
00836 case IPMI_DELETED:
00837 ipmi_cmdlang_out(evi, "Operation", "Delete");
00838 break;
00839
00840 case IPMI_CHANGED:
00841 ipmi_cmdlang_out(evi, "Operation", "Change");
00842 if (ipmi_cmdlang_get_evinfo()) {
00843 ipmi_cmdlang_down(evi);
00844 fru = ipmi_entity_get_fru(entity);
00845 if (fru)
00846 ipmi_cmdlang_dump_fru_info(evi, fru);
00847 ipmi_cmdlang_up(evi);
00848 }
00849 break;
00850 }
00851
00852 ipmi_cmdlang_cmd_info_put(evi);
00853 return;
00854
00855 out_err:
00856 ipmi_cmdlang_global_err(entity_name,
00857 "cmd_entity.c(fru_change)",
00858 errstr, rv);
00859 if (evi)
00860 ipmi_cmdlang_cmd_info_put(evi);
00861 }
00862
00863 static int
00864 presence_change(ipmi_entity_t *entity,
00865 int present,
00866 void *cb_data,
00867 ipmi_event_t *event)
00868 {
00869 char *errstr;
00870 int rv;
00871 ipmi_cmd_info_t *evi;
00872 char entity_name[IPMI_ENTITY_NAME_LEN];
00873
00874 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00875
00876 evi = ipmi_cmdlang_alloc_event_info();
00877 if (!evi) {
00878 rv = ENOMEM;
00879 errstr = "Out of memory";
00880 goto out_err;
00881 }
00882
00883 ipmi_cmdlang_out(evi, "Object Type", "Entity");
00884 ipmi_cmdlang_out(evi, "Name", entity_name);
00885 ipmi_cmdlang_out(evi, "Operation", "Presence Change");
00886 ipmi_cmdlang_out_bool(evi, "Present", present);
00887
00888 if (event) {
00889 ipmi_cmdlang_out(evi, "Event", NULL);
00890 ipmi_cmdlang_down(evi);
00891 ipmi_cmdlang_event_out(event, evi);
00892 ipmi_cmdlang_up(evi);
00893 }
00894
00895 ipmi_cmdlang_cmd_info_put(evi);
00896 return IPMI_EVENT_NOT_HANDLED;
00897
00898 out_err:
00899 ipmi_cmdlang_global_err(entity_name,
00900 "cmd_entity.c(presence_change)",
00901 errstr, rv);
00902 if (evi)
00903 ipmi_cmdlang_cmd_info_put(evi);
00904
00905 return IPMI_EVENT_NOT_HANDLED;
00906 }
00907
00908 static int
00909 entity_hot_swap(ipmi_entity_t *entity,
00910 enum ipmi_hot_swap_states last_state,
00911 enum ipmi_hot_swap_states curr_state,
00912 void *cb_data,
00913 ipmi_event_t *event)
00914 {
00915 char *errstr;
00916 int rv;
00917 ipmi_cmd_info_t *evi;
00918 char entity_name[IPMI_ENTITY_NAME_LEN];
00919
00920 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00921
00922 evi = ipmi_cmdlang_alloc_event_info();
00923 if (!evi) {
00924 rv = ENOMEM;
00925 errstr = "Out of memory";
00926 goto out_err;
00927 }
00928
00929 ipmi_cmdlang_out(evi, "Object Type", "Entity");
00930 ipmi_cmdlang_out(evi, "Name", entity_name);
00931 ipmi_cmdlang_out(evi, "Operation", "Hot-Swap Change");
00932 ipmi_cmdlang_out(evi, "Last State",
00933 ipmi_hot_swap_state_name(last_state));
00934 ipmi_cmdlang_out(evi, "State", ipmi_hot_swap_state_name(curr_state));
00935
00936 if (event) {
00937 ipmi_cmdlang_out(evi, "Event", NULL);
00938 ipmi_cmdlang_down(evi);
00939 ipmi_cmdlang_event_out(event, evi);
00940 ipmi_cmdlang_up(evi);
00941 }
00942
00943 ipmi_cmdlang_cmd_info_put(evi);
00944 return IPMI_EVENT_NOT_HANDLED;
00945
00946 out_err:
00947 ipmi_cmdlang_global_err(entity_name,
00948 "cmd_entity.c(entity_hot_swap)",
00949 errstr, rv);
00950 if (evi)
00951 ipmi_cmdlang_cmd_info_put(evi);
00952
00953 return IPMI_EVENT_NOT_HANDLED;
00954 }
00955
00956 void
00957 ipmi_cmdlang_entity_change(enum ipmi_update_e op,
00958 ipmi_domain_t *domain,
00959 ipmi_entity_t *entity,
00960 void *cb_data)
00961 {
00962 char *errstr;
00963 int rv;
00964 ipmi_cmd_info_t *evi;
00965 char entity_name[IPMI_ENTITY_NAME_LEN];
00966
00967 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00968
00969 evi = ipmi_cmdlang_alloc_event_info();
00970 if (!evi) {
00971 rv = ENOMEM;
00972 errstr = "Out of memory";
00973 goto out_err;
00974 }
00975
00976 ipmi_cmdlang_out(evi, "Object Type", "Entity");
00977 ipmi_cmdlang_out(evi, "Name", entity_name);
00978
00979 switch (op) {
00980 case IPMI_ADDED:
00981 ipmi_cmdlang_out(evi, "Operation", "Add");
00982 if (ipmi_cmdlang_get_evinfo())
00983 entity_dump(entity, evi);
00984
00985 rv = ipmi_entity_add_sensor_update_handler(entity,
00986 ipmi_cmdlang_sensor_change,
00987 entity);
00988 if (rv) {
00989 errstr = "ipmi_entity_add_sensor_update_handler";
00990 goto out_err;
00991 }
00992 rv = ipmi_entity_add_fru_update_handler(entity,
00993 fru_change,
00994 entity);
00995 if (rv) {
00996 errstr = "ipmi_entity_add_control_fru_handler";
00997 goto out_err;
00998 }
00999 rv = ipmi_entity_add_presence_handler(entity,
01000 presence_change,
01001 NULL);
01002 if (rv) {
01003 errstr = "ipmi_entity_add_presence_handler";
01004 goto out_err;
01005 }
01006 rv = ipmi_entity_add_control_update_handler
01007 (entity,
01008 ipmi_cmdlang_control_change,
01009 entity);
01010 if (rv) {
01011 errstr = "ipmi_entity_add_control_update_handler";
01012 goto out_err;
01013 }
01014 rv = ipmi_entity_add_hot_swap_handler(entity,
01015 entity_hot_swap,
01016 NULL);
01017 if (rv) {
01018 errstr = "ipmi_entity_add_hot_swap_handler";
01019 goto out_err;
01020 }
01021 break;
01022
01023 case IPMI_DELETED:
01024 ipmi_cmdlang_out(evi, "Operation", "Delete");
01025 break;
01026
01027 case IPMI_CHANGED:
01028 ipmi_cmdlang_out(evi, "Operation", "Change");
01029 if (ipmi_cmdlang_get_evinfo())
01030 entity_dump(entity, evi);
01031 break;
01032 }
01033
01034 ipmi_cmdlang_cmd_info_put(evi);
01035 return;
01036
01037 out_err:
01038 ipmi_cmdlang_global_err(entity_name,
01039 "cmd_entity.c(ipmi_cmdlang_entity_change)",
01040 errstr, rv);
01041 if (evi)
01042 ipmi_cmdlang_cmd_info_put(evi);
01043 }
01044
01045 static ipmi_cmdlang_cmd_t *entity_cmds, *hs_cmds;
01046
01047 static ipmi_cmdlang_init_t cmds_entity[] =
01048 {
01049 { "entity", NULL,
01050 "- Commands dealing with entities",
01051 NULL, NULL, &entity_cmds },
01052 { "list", &entity_cmds,
01053 "- List all the entities in the system",
01054 ipmi_cmdlang_domain_handler, entity_list, NULL },
01055 { "tree", &entity_cmds,
01056 "- List all the entities in the system in their tree structure",
01057 ipmi_cmdlang_domain_handler, entity_tree, NULL },
01058 { "info", &entity_cmds,
01059 "<entity> - Dump information about an entity",
01060 ipmi_cmdlang_entity_handler, entity_info, NULL },
01061 { "fru", &entity_cmds,
01062 "<entity> - Dump FRU information about an entity",
01063 ipmi_cmdlang_entity_handler, fru_info, NULL },
01064 { "hs", &entity_cmds,
01065 "- Commands dealing with hot-swap",
01066 NULL, NULL, &hs_cmds },
01067 { "get_act_time", &hs_cmds,
01068 "<entity> - Get the hot-swap auto-activate time",
01069 ipmi_cmdlang_entity_handler, entity_hs_get_act_time, NULL },
01070 { "set_act_time", &hs_cmds,
01071 "<entity> - Set the hot-swap auto-activate time",
01072 ipmi_cmdlang_entity_handler, entity_hs_set_act_time, NULL },
01073 { "get_deact_time", &hs_cmds,
01074 "<entity> - Get the hot-swap auto-deactivate time",
01075 ipmi_cmdlang_entity_handler, entity_hs_get_deact_time, NULL },
01076 { "set_deact_time", &hs_cmds,
01077 "<entity> - Set the hot-swap auto-deactivate time",
01078 ipmi_cmdlang_entity_handler, entity_hs_set_deact_time, NULL },
01079 { "activation_request", &hs_cmds,
01080 "<entity> Act like a user requested an"
01081 " activation of the entity. This is generally equivalent to"
01082 " closing the handle latch or something like that.",
01083 ipmi_cmdlang_entity_handler, entity_hs_activation_request, NULL },
01084 { "activate", &hs_cmds,
01085 "<entity> - activate the given entity",
01086 ipmi_cmdlang_entity_handler, entity_hs_activate, NULL },
01087 { "deactivate", &hs_cmds,
01088 "<entity> - deactivate the given entity",
01089 ipmi_cmdlang_entity_handler, entity_hs_deactivate, NULL },
01090 { "state", &hs_cmds,
01091 "<entity> - Return the current hot-swap state of the given entity",
01092 ipmi_cmdlang_entity_handler, entity_hs_state, NULL },
01093 { "check", &hs_cmds,
01094 "<entity> - Check the hot-swap state of the entity. This will"
01095 " not return anything, but will generate an event if the state"
01096 " is wrong",
01097 ipmi_cmdlang_entity_handler, entity_hs_check, NULL },
01098 };
01099 #define CMDS_ENTITY_LEN (sizeof(cmds_entity)/sizeof(ipmi_cmdlang_init_t))
01100
01101 int
01102 ipmi_cmdlang_entity_init(os_handler_t *os_hnd)
01103 {
01104 return ipmi_cmdlang_reg_table(cmds_entity, CMDS_ENTITY_LEN);
01105 }