ipmi_cmdlang(7)
โจ NAME โจ
ipmi_cmdlang โ A command language interface to the IPMI library. Also, bestie, this is ipmi_cmdlang(7), the shell interface to an IPMI system. ๐
๐ DESCRIPTION ๐
ipmi_cmdlang is a command language designed to supply the full power of OpenIPMI on a command line. It has a large number of commands and well-formed responses to each command. Note that this assumes some knowledge of OpenIPMI and how it works; you can get that from the IPMI document that comes with OpenIPMI.
ipmish starts up with no connections or anything of that nature. You must enter commands to make connections to domains. Then you can enter commands to manipulate those domains or objects inside those domains.
Note that you may use quotes, either '' or "", to contain parameters with spaces.
๐ธ COMMENTS ๐ธ
Lines with a # character in the first column are ignored. periodt.
๐ฆ OBJECTS ๐ฆ
In the command language, you will deal with various objects like sensors, controls, domains, and entities. Each of these has a name. The name of the domain is assigned by the user in the domain new command, all the other names are based on the domain name of the domain they belong to and various attributes about the object. These names are all well-formed. They are:
<domain>โ A name of a domain. Each registered domain in a system has a name assigned by the user.<entity>โ Entity names are in the form:
[<domain>[(<entity spec>)]]
Notice that the <entity spec> is optional. If it is not listed, then the operation is done on all entities in the domain. The whole thing is optional, too, if nothing is given then the operation is done on every entity in every domain.
The <entity spec> is either
<entity id>.<entity instance>
for system-relative entities, or:
r<channel>.<IPMB>.<entity id>.<entity instance-0x60>
for device-relative entities. In IPMI, device-relative entity instances always start at 0x60; the specification suggests that you subtract off the 0x60 from the entity instance when displaying these; the command language follows this suggestion.
<sensor>โ These come in the form
[<entity>[.name]]
As with entities, only listing a domain will cause the operation to be done on every sensor in the domain, just listing an entity will cause it to be done to every sensor in that entity. An empty sensor entry will cause an operation to be done on every sensor in every domain.
<control>โ These come in the form
[<entity>[.name]]
These work exactly like sensors.
<mc>โ A management controller. These come in the form
[<domain>[(<channel>.<IPMB>)]]
As usual, the parts left empty will cause defaulting to all things in the previously specified parts.
<connection>โ A connection number, in the form
[<domain>[.<integer>]]
The number is the connection number of the domain.
<pet>โ A platform event trap id, in the form
[<domain>[.<integer>]]
The number is arbitrarily assigned by the system.
<lanparm>โ A LAN parameter id, in the form
[<domain>[.<integer>]]
The number is arbitrarily assigned by the system.
<pef>โ A PEF id, in the form
[<domain>[.<integer>]]
The number is arbitrarily assigned by the system.
<fru>โ A FRU id, in the form
[<domain>[.<integer>]]
The number is arbitrarily assigned by the system.
In all cases, the object names have parts that are optional, and the entire object name is optional. If a part is left empty, then all objects that are part of the specified parts are operated on. For instance, if the system has a sensor named d1(7.1).temp then specifying d1 would operate on all sensors in the domain named d1. Specifying d1(7.1) would operate on all sensors in that entity. Specifying an empty name, either with "" or by just entering nothing if the object is the last thing in the command's parameters.
Note this optionality gives a lot of power, but can be very dangerous. Entering domain close will close every domain, for instance.
In commands, every object operated on will generate a response for that object. If no object is operated on, the command will produce an error.
๐ OTHER PARAMETERS ๐
The commands and displays use a variety of other parameters for specifying various IPMI things.
<guid>โ a 16-byte globally unique ID, all globbed together in one big hexadecimal thing.<threshold>โ is a threshold for a sensor; the value it must go over/under to generate an event. It is always displayed as one of lower non-critical, lower critical, lower non-recoverable, upper non-critical, upper critical, upper non-recoverable. It may be entered as one of the above, or asln,lc,lr,un,uc,uras a short form.<threshold enable>โ is the enable for a threshold. It is like<threshold>above, but also has a going-high or going-low and an assertion or deassertion appended to the end of the name. The short form will have alorhfor going-low and going-high, then aaordappended for assertion and deassertion. So for instance,urldis upper non-recoverable going-low deassertion.<discrete enable>โ is the enable or disable for a discrete sensor and is specified with the sensor offset. The long form is<integer> assertionor<integer> deassertionand the short form is<integer>[ad]where the number is the offset and[ad]means assertion or deassertion.<hot-swap state>โ is one ofnot_present,inactive,activation_requested,activation_in_progress,active,deactivation_requested,deactivation_in_progressorout_of_con.<color>โ is one ofblack,white,red,green,blue,yellowororange.<bool>โ is one oftrue,on,t, or1for true and one offalse,off,f, or0for false. Output is alwaystrueorfalse.
๐ COMMANDS ๐
The command language is hierarchical, meaning that commands may have subcommands, and subcommands may have subsubcommands, etc. So, for instance, the command to create a domain is domain new. The command to list all sensors in a domain named domain1 is sensor list domain1.
Each command has a response for each object operated on, which is listed after the command description. In those responses, anything that begins with a % is optional. Entries of the form **name** refer to object info descriptions that are listed in the object info section. If an entry has two . indented one space below it, then that entry may occur zero or more times.
Each section below defines the unique subcommands of a main command.
Help for any command is available with:
help command [subcommand [...]] - Help for any command.
Some commands are common to almost all subcommands. These are:
list <containing object>โ List all objects of the specified type that are contained in the specified object. For instance,control list <entity>will list all controls in the given entity.
Response:
Response:
<containing object type>
Name: <name>
.
.
info <object>โ List static information about the given object.
Response:
Response:
<object type>
Name: <name>
**object info**
๐ domain ๐
These commands deal with domain objects.
new <domain> <options> <parms> [<parms>] โ Open a connection to a new domain. <parms> are either:
lan <IP> <port> [<IP> <port>] <enc> <auth> <name> <password>
for a RMCP LAN connection or
smi <smi num>
for a system interface connection. Note that <parms> is listed twice (second one is optional); if the system supports it you can make two connections to two independent management controllers in the system. Note that this is not for multiple IP addresses to the same BMC. For that, notice that the LAN connection has an options extra IP and port for the second IP address. OpenIPMI supports these IP addresses and connection, detecting failures, switching between addresses, and other fault-tolerant things. It does this transparently to the user. Multiple connections may require special OEM support, read the documentation about your specific system if you need this.
The <IP> is the IP address or host name of the LAN-capable BMC to connect with. The <port> is generally 623. <enc> is the authentication type, either md5, md2, straight, or none. <auth> is the authentication level, either admin, operator or user. <name> and <password> are the user name and password of the IPMI user to use for the connection. The <smi num> is the driver number, generally 0. Options enable and disable various automatic processing and are:
-[no]allโ all automatic handling. This will override the other processing options and turn them all on. This is true by default.-[no]sdrsโ sdr fetching. This turns on fetching SDRs when they are found. This is false by default.-[no]frusโ FRU fetching. This turns on fetching FRU information when it is found. This is false by default.-[no]selโ SEL fetching. This turns on fetching SELs when they are found. This is false by default.-[no]ipmbscanโ IPMB bus scanning. This turns on scanning IPMB busses when they are found. This is false by default.-[no]oeminitโ enable or disable special OEM processing (like ATCA).-[no]seteventrcvrโ setting event receivers. Note that setting event receivers and waiting til up is not affected by the-alloption. If this is true (the default) then OpenIPMI will attempt to set the event receiver for an MC it finds that does not have it set to a valid destination.-wait_til_upโ wait until the domain is up before returning. Note that if you specify this and the domain never comes up, you will never get a prompt. This is not affected by the-alloption. By default-alland-seteventrcvrare true, which turns everything on.
Response:
Response:
Domain Created: <domain>
open <domain> <options> <parms> [<parms>]โ okay so this one opens a connection to a brand-new domain, bestie. The<parms>are either:lan [-U <username>] [-P <password>] [-A <authtype>] [-L <privilege>] [-s] [-p[2] <port number>] [-Ra <auth alg>] [-Ri <integ alg>] [-Rc <conf algo>] [-Rl] [-Rk <bmc key>] [-H <hackname>] [-M <max oustanding msgs>] <IP> [<IP>]โ for a RMCP/RMCP+ LAN connection, orsmi <smi num>โ for a system interface connection.
Note that <parms> is listed twice (second one is optional); if the system support it you can make two connections to two independent management controllers in the system. Note that this is not for multiple IP addresses to the same BMC. For that, use the -s option and the second IP (and -p2) for the second IP address. OpenIPMI supports these IP addresses and connections, detecting failures, switching between addresses, and other fault-tolerant things. It does this transparently to the user. Multiple connections may require special OEM support, read the documentation about your specific system if you need this.
The <IP> is the IP address or host name of the LAN-capable BMC to connect with. The <port> defaults 623. <authtype> is the authentication type, either rmcp+, md5, md2, straight, or none. It defaults to the best authentication supported by the server. <auth> is the authentication level, either admin, operator or user. It defaults to admin. <username> and <password> are the user name and password of the IPMI user to use for the connection. For RMCP+ connections, the authentication algorithms supported (-Ra) are: bmcpick, rakp_none, rakp_hmac_sha1, and rakp_hmac_md5. The integrity algorithms (-Ri) supported are: bmcpick, none, hmac_sha1, hmac_md5, and md5. The confidentiality algorithms (-Rc) are: bmcpick, aes_cbc_128, xrc4_128, and xrc_40. The defaults are rackp_hmac_sha1, hmac_sha1, and aes_cb_128. -Rl turns on lookup up names by the name and the privilege level (allowing the same name with different privileges and different passwords), the default is straight name lookup. -Rk sets the BMC key, needed if the system does two-key lookups.
For SMI types, the <smi num> is the driver number, generally 0.
The <hackname> enables certain hacks for broken platforms. This may be listed multiple times to enable multiple hacks. The currently available hacks are:
intelplusโ For Intel platforms that have broken RMCP+.rakp3_wrong_rolemโ For systems that truncate role(m) in the RAKP3 msg.rmcpp_integ_sikโ For systems that use SIK instead of K(1) for integrity.
The -M option sets the maximum outstanding messages. The default is 2, ranges 1-63.
Options enable and disable various automitic processing and are:
-[no]allโ all automatic handling. This will override the other processing options and turn them all on. This is true by default.-[no]sdrsโ sdr fetching. This turns on fetching SDRs when they are found. This is false by default.-[no]frusโ FRU fetching This turns on fetching FRU information when it is found. This is false by default.-[no]selโ SEL fetching. This turns on fetching SELs when they are found. This is false by default.-[no]ipmbscanโ IPMB bus scanning. This turns on scanning IPMB busses when they are found. This is false by default.-[no]oeminitโ enable or disable special OEM processing (like ATCA).-[no]seteventrcvrโ setting event receivers. Note that setting event receivers is not affected by the-alloption. If this is true (the default) then OpenIPMI will attempt to set the event receiver for an MC it finds that does not have it set to a valid destination.-[no]setseltimeโ set SEL time. Note that setting the SEL time is not affected by the-alloption. If this is true (the default) then OpenIPMI will attempt to set the time in the SELs it finds. It will set it to the current system time.-wait_til_upโ wait until the domain is up before returning Note that if you specify this and the domain never comes up, you will never get a prompt. This is not affected by the-alloption. By default-alland-seteventrcvrare true, which turns everything on.
Response:
Domain Created: <domain>
fru <domain> <is_logical> <device_address> <device_id> <lun> <private_bus> <channel>โ dump a fru given all it's insundry information. slay ๐
Response:
Domain
Name: <domain>
FRU
**FRU INFO**
msg <domain> <channel> <ipmb> <LUN> <NetFN> <Cmd> [data...]โ Send a command to the given IPMB address on the given channel and display the response. Note that this does not require the existance of an MC in OpenIPMI.
Response:
Domain: <domain>
channel: <chan>
ipmb: <ipmb>
LUN: <lun>
NetFN: <netfn>
command: <cmd>
Data: <data bytes>
scan <domain> <ipmb addr> [ipmb addr]โ scan an IPMB to add or remove it. If a range is given, then scan all IPMBs in the range.
Response:
Scan done: <domain>
rescan_sels <domain>โ Rescan all the SELs in the domain.
Response:
SEL Rescan done: <domain>
presence <domain>โ Audit the presence of all enities in the domain. Note that this just starts the process; it will run in the background.
Response is:
Presence check started: <domain>
close <domain>โ close the given domain.
Response:
Domain closed: <domain>
sel_rescan_time <domain> <time in seconds>โ Set the time between SEL rescans for all. It affects all current SELs and SELs that are discovered in the future. Zero disables scans.
Response:
Domain SEL rescan time set: <domain>
ipmb_rescan_time <domain> <time in seconds>โ Set the time between IPMB rescans for this domain. zero disables scans.
Response:
Domain IPMB rescan time set: <domain>
๐ fru ๐
These commands deal with FRU objects. Note that FRU objects are allocated by the domain fru command, and are not allocated here.
list
List all the frus in the system
Response:
Domain
Name: <domain>
FRUs
Name: <fru>
.
.
.
.
info <fru>
Dump information about a FRU
Response:
**FRU INFO**
areainfo <fru>
Dump the info about the FRU's areas
Response:
FRU
Name: <fru>
FRU Length: <integer>
Area
Name: <area name>
Number: <integer>
Offset: <integer>
Length: <integer>
Used Length: <Integer>
.
.
write <fru>
Write the local FRU data out into the FRU
Response:
FRU written: <fru>
close <fru>
Delete the FRU
Response:
FRU deleted: <fru>
setval <fru> <name> [num] value
Set the value of a FRU element. The name is the record name, or multi-record. The number is required for fields that need it (custom and multi-record). The value is an a single value for integers. For strings it is a string type (either binary, ascii, or unicode) and the info. Binary and unicode data is specified as numbers. ascii data is specified in a string. Note that setting a ascii value with no string will clear the value. Zero length strings and data is valid.
Response:
FRU value set: <fru>
area_offset <fru> <area name> <offset>
Set the offset of the given area to the given value. Area names are internal_data, chassis_info, board_info, product_info, and multi_record.
Response:
FRU area offset set: <fru>
area_length <fru> <area name> <length>
Set the length of the given area to the given value. Area names are internal_data, chassis_info board_info, product_info, and multi_record
Response:
FRU area length set: <fru>
area_add <fru> <area name> <offset> <length>
Add the given area to the FRU.
Response:
FRU area added: <fru>
area_delete <fru> <area name>
Delete the given area from the FRU
Response:
FRU area deleted: <fru>
๐ฆ entity ๐ฆ
These commands deal with entity objects.
list <entity>
List all the entities that meed the criteria
Response:
Domain
Name: <domain>
Entities
Name: <entity>
.
.
.
.
info <entity>
Dump information about an entity.
Response:
Entity
Name: <entity>
**ENTITY INFO**
.
.
fru <entity>
Dump the FRU information about the given entity.
Response:
Entity
Name: <entity>
FRU
**FRU INFO**
๐ธ entity hs ๐ธ
These commands deal with hot-swap of entities. Note that there is no info or list command for this subcommand.
get_act_time <entity>
Get the hot-swap auto-activate time.
Response:
Entity
Name: <entity>
Auto-Activation Time: <integer>
set_act_time <entity>
Set the hot-swap auto-activate time.
Response:
Set act time: <entity>
get_deact_time <entity>
Get the hot-swap auto-deactivate time
Response:
Entity
Name: <entity>
Auto-Deactivation Time: <integer>
set_deact_time <entity>
Set the hot-swap auto-deactivate time
Response:
Set deact time: <entity>
activation_request <entity>
Act like a user requested an activation of the entity. This is generally equivalent to closing the handle latch or something like that.
Response:
Activation requested: <entity>
activate <entity>
activate the given entity
Response:
Activated: <entity>
deactivate <entity>
deactivate the given entity
Response:
Deactivated: <entity>
state <entity>
Return the current hot-swap state of the given entity.
Response:
Entity
Name: <entity>
State: <hot-swap state>
check <entity>
Audit the entity's hot-swap state
Response:
Check started: <entity>
๐ sensor ๐
get <sensor>
Get the sensor's current reading.
Response:
Sensor
Name: <sensor>
Event Messages Enabled: <bool>
Sensor Scanning Enabled: <bool>
Initial Update In Progress: <bool>
For threshold sensors, the following will be output:
%Value: <double>
%Raw Value: <integer>
Threshold
Name: <threshold>
Out Of Range: <bool>
For discrete sensors, the following will be output:
Event
Offset: <integer>
%Name: <string name of event offset>
Set: <bool>
The name field may be custom and is not explicitly specified. periodt ๐
rearm <sensor> global | <threshold enable> [<threshold enable> ..] | <discrete enable> [<discrete enable> ..]โ Rearm the sensor. Ifglobalis specified, then rearm all events in the sensor. Otherwise, if it is a threshold sensor, then put in a list of threshold enables. If it is a discrete sensor, then put in a list of discrete enables.
Response:
Rearm done: <sensor>
get_thresholds <sensor>โ Get the sensor's thresholds.
Response:
Sensor
Name: <sensor>
Threshold
Name: <threshold>
Value: <double>
set_thresholds <sensor> <threshold> <value> ...โ Set the sensor's thresholds to the given values. If a threshold is not specified, it will not be modified. Thresholds areun,uc,ur,lr,lc,ln. Theustands for upper,lfor lower,nfor non-critical,cfor critical, andrfor non-recoverable. The value is floating point.
Response:
Thresholds set: <sensor>
get_hysteresis <sensor>โ Get the sensor's hysteresis values.
Response:
Sensor
Name: <sensor>
Positivie Hysteresis: <integer>
Negative Hysteresis: <integer>
set_hysteresis <sensor> <pos hyst> <neg hyst>โ Set the sensor's hysteresis to the given values. These are raw integer value; hysteresis is specified as a raw value and it cannot be converted to floating point because the function may be non-linear.
Response:
Hysteresis set: <sensor>
get_event_enables <sensor>โ Get the sensor's event enable values.
Response:
Sensor
Name: <sensor>
Event Messages Enabled: <bool>
Sensor Scanning Enabled: <bool>
Busy: <bool>
Threshold sensors report:
Threshold
Name: <threshold>
Enabled: <bool>
.
.
only supported thresholds are listed. Discrete sensors report:
Event
Offset: <integer>
Name: <event offset name for sensor>
%Assertion Enabled: <bool>
%Deassertion Enabled: <bool>
only supported offsets are listed. The assertion and deassertion enables are listed only if the offset support them.
set_event_enables <sensor> msg|nomsg scan|noscan [<enable> [<enable> ...]]โ Set the sensor's event enable values. This turns sensor messages and scanning on and off and will enable all the listed enables and disable all the other ones. The enables are either a<threshold enable>or a<discrete enable>.
Response:
Event enables set: <sensor>
enable_events <sensor> msg|nomsg scan|noscan [<enable> [<enable> ...]]โ Enable event enable values. This turns sensor messages and scanning on and off and will enable all the listed enables. All other enables will be left alone. The enables are either a<threshold enable>or a<discrete enable>.
Response:
Event enables set: <sensor>
disable_events <sensor> msg|nomsg scan|noscan [<enable> [<enable> ...]]โ Disable event enable values. This turns sensor messages and scanning on and off and will disable all the listed enable. All other enables will be left alone. The enables are either a<threshold enable>or a<discrete enable>.
Response:
Event enables set: <sensor>
๐ฎ control ๐ฎ
Commands dealing with controls. slay โจ
set <control> <value> [<value> ..]โ Set the value of a control. The settings depend on control type, most take one or more integer values depending on the number of physical things the control contains. An identifier type takes one or more unsigned characters. A light set with settings take the form
lc|nolc <color> <on time> <off time>
lc and nolc turn on or of local control, the over values should be obvious. Note all lights support local control, you need to see if it supports the value.
Response:
Set done: <control>
get <control>โ Get the value of a control. The reponse depends on the control type.
Response:
Control
Name: <control>
Response for setting lights is:
Light
Num: 0
Local Control: <bool>
%Color: <color>
%On Time: <integer>
%Off Time: <integer>
Note that multiple lights may be present if the control supports multiple lights. The options values (marked with % ) will not be present if local control is set to true. Local control means that the LED takes whatever default function it does on the device (like disk activity, ethernet activity, hot-swap LED, etc.). Response for id control:
Data: <byte1> <byte2> ...
Response for other controls:
Value
Num: <integer>
Value: <integer>
There will be one Value for each value the control supports.
๐ ๏ธ mc ๐ ๏ธ
Commands dealing with MC objects. iykyk ๐
reset <warm | cold> <mc>โ Do a warm or cold reset on the given MC.
Response:
Reset done: <mc>
msg <mc> <LUN> <NetFN> <Cmd> [data...]โ Send the given command to the management controller and display the response.
Response:
MC: <mc>
LUN: <lun>
NetFN: <netfn>
command: <cmd>
Data: <data bytes>
set_events_enable <mc> <enable | disable>โ enables or disables events on the MC.
Response:
Events enable done: <mc>
get_events_enable <mc>โ Prints out if the events are enabled for the given MC.
Response:
Events Enable: <bool>
sdrs <mc> <main | sensor>โ list the SDRs for the mc. Either gets the main SDR repository or the sensor SDR repository.
Response:
MC
Name: <mc>
SDR
Record ID: <integer>
Type: <integer>
Version: <integer>.<integer>
Data: <data bytes>
One SDR will be present for each SDR in the repository.
get_sel_time <mc>โ Get the time in the SEL for the given MC.
Response:
MC
Name: <mc>
SEL Time: <integer>
set_sel_time <mc> <time>โ Set the time in the SEL for the given MC.
Response:
MC SEL time set
Name: <mc>
rescan_sel <mc>โ Rescan the SEL in the MC.
Response:
SEL Rescan done: <mc>
sel_rescan_time <mc> <time in seconds>โ Set the time between SEL rescans for the SEL on this MC. Zero disables scans.
Response:
MC SEL rescan time set: <domain>
sel_info <mc>โ Dump information about the MC's SEL.
Response:
MC
Name: <mc>
SEL Version: <integer>.<integer>
SEL Count: <integer>
SEL Slots Used: <integer>
SEL Free Bytes: <integer>
SEL Last Addition Timestamp: <integer>
SEL overflow: <bool>
SEL Supports Delete: <bool>
SEL Supports Partial Add: <bool>
SEL Supports Reserve: <bool>
SEL Supports Get SEL Allocation: <bool>
chan info <mc> <channel>โ Dump information about the MC's channel.
Response:
Channel Info
MC: <mc>
Number: <integer>
Medium: <integer>
Protocol Type: <integer>
Session Support: session-less|single-session|multi-session|session-based
Vendor ID: <data bytes>
Aux Info: <data bytes>
chan get_access <mc> <channel> non-volatile|present|bothโ Dump information about the MC's channel access. There are two different places where this is stored, the present in-use values (volatile) and the non-volatile storage that is loaded at startup. Note if you specify channel0xe, the response channel will be different; it will be the current channel.
Response:
Channel Access
MC: <mc>
Channel: <integer>
Type: non-volatile|present
Alerting Enabled: <bool>
Per-Message Auth: <bool>
User Auth: <bool>
Access Mode: disable|pre-boot|always|shared
Privilege Limit: callback|user|operator|admin|oem
chan set_access <mc> <channel> non-volatile|present|both <parm> <value> ...โ Set information about the MC's channel access. There are two different places where this is stored, the present in-use values (volatile) and the non-volatile storage that is loaded at startup. Note if you specify channel0xe, the modified channel will be the current channel. Parms are:
alert true|false
msg_auth true|false
user_auth true|false
access_mode disabled|pre-boot|always|shared
privilege_limit callback|user|operator|admin|oem
Response:
Channel Access Set
MC: <mc>
Channel: <integer>
chan user list <mc> <channel> [<user num>]โ List users associated with the channel. Each user number has an associated name and password that is global in the MC (not associated with a channel). There is also channel-specific information for each user. This command lists the global user information and the channel-specific information for the channel specified. If no user number is listed, then all users for the channel are listed. Otherwise only the given user is listed.
Response:
Channel Access Set
MC: <mc>
Channel: <integer>
Max User: <integer>
Enabled Users: <integer>
Fixed Users: <integer>
User
Number: <integer>
*String Name: <string>
*Binary Name: <data bytes>
Link Auth Enabled: <bool>
Msg Auth Enabled: <bool>
Access CB Only: <bool>
Privilege Limit: <integer>
Session Limit: <integer>
.
.
All the users are listed. One of string name or binary name is present, if the name is not a printable string, then the binary data is dumped. bestie that's a lot of users, but you got this ๐ซถ
chan user set <mc> <channel> <user num> <parm> <value> ...โ bestie this one sets info about that user number ๐ . Only the values you actually name get changed, everything else stays put. Heads up tho: the name and the password are global values, but all the others are channel-specific. The parms are:link_enabled true|falsemsg_enabled true|falsecb_only true|falseprivilege_limit callback|user|operator|admin|oem|no_accesssession_limit <integer>name <user name string>password <password string, <= 16 characters>password2 <password string, <= 20 characters>enabledisable
Okay so password is the 16-byte IPMI 1.5 passwords, and password2 is for the 20-byte IPMI 2.0 passwords ๐ซถ. Setting the session limit to zero means there is no session limit, iconic. But lowkey some systems have a bug where the session limit is not optional (even tho the spec says it is ๐ญ). So if you get C7 errors back from this command, you will have to always specify the session limit. Also you must enable the user for it to work, but there seems to be no way to get if the user is enabled or not ๐.
Response:
User Info Set: <mc>
๐ธ sel ๐ธ
Commands dealing with the system event log. Note that there is no info command.
list <domain>โ the list command is unique in this object, so it is specified explicitly here. List the local copy of the system event log for the entire domain.
Response:
Domain
Name: <domain>
Entries: <integer>
Slots in use: <integer>
Event
**EVENT INFO**
.
.
mc_list <domain>โ list the local copy of the system event log on the given MC.
Response:
MC
Name: <mc>
Entries: <integer>
Slots in use: <integer>
Event
**EVENT INFO**
.
.
delete <mc> <record #>โ delete the given event number from the SEL.
Response:
Event deleted
MC: <mc>
Record: <integer>
add <mc> <type> <13 bytes of data>โ add the event data to the SEL.
Response:
MC
Name: <mc>
Record ID: <integer>
clear <domain>โ clear the system event log.
Response:
SEL Clear done: <domain>
๐ฆ con ๐ฆ
Commands dealing with connections.
activate <connection>โ activate the given connection.
Response:
Connection activated: <connection>
โจ pet โจ
Commands dealing with platform event traps.
new <domain> <connection> <channel> <ip addr> <mac_addr> <eft selector> <policy num> <apt selector> <lan dest selector>โ set up the domain to send PET traps from the given connection to the given IP/MAC address over the given channel.
Response:
PET Created: <pet>
mcnew <mc> <channel> <ip addr> <mac_addr> <eft selector> <policy num> <apt selector> <lan dest selector>โ set up the domain to send PET traps from the given connection to the given IP/MAC address over the given channel. This one takes an MC instead of a connection.
Response:
PET Created: <pet>
close <pet>โ close the pet.
Response:
PET destroyed: <pet>
๐ pef ๐
commands dealing with platform even filters. These are basically connections to the PEF configuration parameters in an MC. You use a pef to fetch a pef config, which you can then modify and write back to the MC. Note that when you get a pef config, you claim a lock on the MC that must be unlocked ๐.
new <mc>โ create a pef for the given MC.
Response:
PEF: <pef>
unlock_mc <mc>โ unlock the PEF lock on the given MC.
Response:
PEF unlocked: <mc>
close <pef>โ free the given pef.
Response:
PEF destroyed: <pef>
๐ pef config ๐
Commands dealing with PEF configurations. These are the actual PEF data items, the real ones ๐
get <pef>โ fetch the pef data items from the pef and create a pef config.
Response:
PEF Config
Name: <pef config>
**PEF CONFIG**
update <pef config> <parm> [selector] <value>โ set the given parameter in the pef config to the given value. If the parameter has a selector of some type, the selector must be given, otherwise no selector should be given.
Response:
PEF config updated: <pef config>
set <pef> <pef config>โ write the pef data back to the pef. Note that this must be the same pef used to create the config, no swapping bestie.
Response:
PEF config set: <pef config>
unlock <pef> <pef config>โ unlock the lock in the MC and mark the pef config as unlocked.
Response:
PEF config unlocked: <pef config>
close <pef config>โ free the pef config.
Response:
PEF config destroyed: <pef config>
๐ lanparm ๐
Commands dealing with lanparms. These are basically connections to the LAN configuration parameters in an MC. You use a lanparm to fetch a lanparm config, which you can then modify and write back to the MC. Note that when you get a lanparm config, you claim a lock on the MC that must be unlocked ๐.
new <mc> <channel>โ create a lanparm for the given MC and channel.
Response:
LANPARM: <lanparm>
unlock_mc <mc> <channel>โ unlock the lanparm lock on the given MC and channel.
Response:
LANPARM unlocked: <mc>
close <lanparm>โ free the given lanparm.
Response:
LANPARM destroyed: <lanparm>
โญ lanparm config โญ
Commands dealing with lanparm configurations. These are the actual lanparm data items.
get <lanparm>โ fetch the lanparm data items from the lanparm and create a lanparm config.
Response:
LANPARM Config
Name: <lanparm config>
**LANPARM CONFIG**
set <lanparm> <lanparm config>โ write the lanparm data back to the lanparm. Note that this must be the same lanparm used to create the config, fr fr.
Response:
LANPARM config set: <lanparm config>
unlock <lanparm> <lanparm config>โ unlock the lock in the MC and mark the lanparm config as unlocked.
Response:
LANPARM config unlocked: <lanparm config>
close <lanparm config>โ free the lanparm config.
Response:
LANPARM config destroyed: <lanparm config>
๐ OTHER COMMANDS ๐
A few general commands exist, and they're giving main character energy โจ
evinfo <bool>โ turn on or off dumping object information when an event comes in. This is false by default.debug <type> <bool>โ turn the given debugging type on or off.
โจ EVENTS โจ
okay so bestie, the command language is gonna yell at your console whenever events happen. not literally yell, but it prints them. every single one comes out in this shape:
Event
**EVENT INFO**
the <pink>event info</pink> part changes depending on what kind of event it is. all the defined events are listed below, don't worry. heads up though: the output of some events depends on how you set the evinfo command, so the info about the object itself might show upโฆ or might not. it's giving mystery. ๐ซถ
also, some events come with another event container nested inside โ that's the IPMI event that caused this event to be output in the first place. nesting! iconic.
๐ธ Domain events
the following event is output when the domain is completely up and operational and has finished all its SDR, FRU, and bus scans (yes, all of them, she's thorough):
EVENT
Object Type: Domain
Name: <domain>
Operation: Domain fully up
Connection Number: <integer>
Port Number: <integer>
Any Connection Up: <bool>
Error: <integer>
the following comes out when domain connection information changes:
EVENT
Object Type: Domain
Name: <domain>
Operation: Connection Change
the following comes out when domains are added:
EVENT
Object Type: Domain
Name: <domain>
Operation: Add
%**DOMAIN INFO**
the following comes out when domains are destroyed (rip):
EVENT
Object Type: Domain
Name: <domain>
Operation: Delete
๐ฆ Event events (yes really)
the following comes out when the domain gets an event that has no handler โ like, nobody picked up the phone:
EVENT
Object Type: Event
**EVENT INFO**
๐ Entity events
the following comes out when an entity is added:
EVENT
Object Type: Entity
Name: <entity>
Operation: Add
%**ENTITY INFO**
the following comes out when an entity is deleted:
EVENT
Object Type: Entity
Name: <entity>
Operation: Delete
the following comes out when an entity is changed:
EVENT
Object Type: Entity
Name: <entity>
Operation: Change
%**ENTITY INFO**
๐ Entity FRU events
the following comes out when an entity's FRU is added:
EVENT
Object Type: Entity FRU
Name: <entity>
Operation: Add
%**FRU INFO**
the following comes out when an entity's FRU is deleted:
EVENT
Object Type: Entity FRU
Name: <entity>
Operation: Delete
the following comes out when an entity's FRU is changed:
EVENT
Object Type: Entity FRU
Name: <entity>
Operation: Change
%**FRU INFO**
the following comes out when an entity's presence changes:
EVENT
Object Type: Entity
Name: <entity>
Operation: Presence Change
Present: <bool>
%Event
**EVENT INFO**
the following comes out when an entity's hot-swap state changes:
EVENT
Object Type: Entity
Name: <entity>
Operation: Hot-Swap Change
Last State: <hot-swap state>
State: <hot-swap state>
%Event
**EVENT INFO**
๐ MC events
the following comes out when an MC is added:
EVENT
Object Type: MC
Name: <mc>
Operation: Add
%**MC INFO**
the following comes out when an MC is removed:
EVENT
Object Type: MC
Name: <mc>
Operation: Delete
the following comes out when an MC is changed:
EVENT
Object Type: MC
Name: <mc>
Operation: Change
%**MC INFO**
the following comes out when an MC changes active state:
EVENT
Object Type: MC
Name: <mc>
Operation: Active Changed
Active: <bool>
๐ Sensor events
the following comes out when a discrete sensor gets an event:
EVENT
Object Type: Sensor
Name: <sensor>
Operation: Event
Offset: <integer>
Direction: assertion | deassertion
Severity: <integer>
Previous Severity: <integer>
%Event
**EVENT INFO**
the following comes out when a threshold sensor gets an event:
EVENT
Object Type: Sensor
Name: <sensor>
Operation: Event
Threshold: <threshold>
High/Low: going-high | going-low
Direction: assertion | deassertion
%Value: <double>
%Raw Value: <integer>
%Event
**EVENT INFO**
the following comes out when a sensor is added:
EVENT
Object Type: Sensor
Name: <sensor>
Operation: Add
%**SENSOR INFO**
the following comes out when a sensor is deleted:
EVENT
Object Type: Sensor
Name: <sensor>
Operation: Delete
the following comes out when a sensor is changed:
EVENT
Object Type: Sensor
Name: <sensor>
Operation: Change
%**SENSOR INFO**
๐ Control events
the following comes out when a control gets an event:
EVENT
Object Type: Control
Name: <control>
Operation: Event
Value
Number: <integer>
Value: <integer>
%Event
**EVENT INFO**
the following comes out when a control is added:
EVENT
Object Type: Control
Name: <control>
Operation: Add
%**CONTROL INFO**
the following comes out when a control is deleted:
EVENT
Object Type: Control
Name: <control>
Operation: Delete
the following comes out when a control is changed:
EVENT
Object Type: Control
Name: <control>
Operation: Change
%**CONTROL INFO**
๐ OBJECT INFO ๐
okay so so many command responses and events carry info about an object, and bestie, this is where we define what all that output actually means. buckle up. ๐
๐ EVENT INFO
MC: <mc>
Record ID: <integer>
Event type: <integer>
Timestamp: <integer>
Data: <data bytes>
๐ DOMAIN INFO
Type: <domain type>
GUID: <hex string>
SEL Rescan Time: <time>
IPMB Rescan Time: <time>
๐ฆ ENTITY INFO
Type: unknown | mc | fru | generic
Present: <bool>
Presence sensor always there: <bool>
Hot swappable: <bool>
%Supports managed hot swap: <bool>
%Parents
Name: <entity>
Name: <entity>
.
.
%Children
Name: <entity>
Name: <entity>
.
.
%Physical Slot: <integer>
%Id: <string>
Entity ID String: <string>
quick note bestie: theParentsandChildrenfields justโฆ won't be there if the entity has no parents or children. they said "no family, no field." also, every entity type exceptunknowngets its own extra output info. those are:
mc
Channel: <channel>
LUN: <lun>
OEM: <oem field from SDR>
Slave Address: <ipmb>
ACPI_system_power_notify_required: <bool>
ACPI_device_power_notify_required: <bool>
controller_logs_init_agent_errors: <bool>
log_init_agent_errors_accessing: <bool>
global_init: <bool>
chassis_device: <bool>
bridge: <bool>
IPMB_event_generator: <bool>
IPMB_event_receiver: <bool>
FRU_inventory_device: <bool>
SEL_device: <bool>
SDR_repository_device: <bool>
sensor_device: <bool>
fru
Channel: <channel>
LUN: <lun>
OEM: <oem field from SDR>
Slave Address: <ipmb>
access_address: <ipmb>
private_bus_id: <integer>
device_type: <integer>
device_modifier: <integer>
is_logical_fru: <bool>
fru_device_id: <integer>
generic
Channel: <channel>
LUN: <lun>
OEM: <oem field from SDR>
access_address: <ipmb>
private_bus_id: <integer>
device_type: <integer>
device_modifier: <integer>
slave_address: <ipmb>
address_span: <integer>
โญ MC INFO
Active: <bool>
GUID: <hex string>
SEL Rescan Time: <integer>
provides_device_sdrs: <bool>
device_available: <bool>
chassis_support: <bool>
bridge_support: <bool>
ipmb_event_generator: <bool>
ipmb_event_receiver: <bool>
fru_inventory_support: <bool>
sel_device_support: <bool>
sdr_repository_support: <bool>
sensor_device_support: <bool>
device_id: <ipmb>
device_revision: <integer>
fw_revision: <integer>.<integer>
version: <integer>.<integer>
manufacturer_id: <integer>
product_id: <integer>
aux_fw_revision: <integer> <integer> <integer> <integer>
๐ฆ SENSOR INFO ๐ฆ
okay so when the sensor object info comes out, it's giving a lot โ here's every line it can hand you, bestie, verbatim:
LUN: <integer>
Number: <integer>
Event Reading Type: <integer>
Event Reading Type Name: one of:
unspecified threshold discrete_usage discrete_state
discrete_predictive_failure discrete_limit_exceeded
discrete_performance_met discrete_severity discrete_device_presence
discrete_device_enable discrete_availability discrete_redundancy
discrete_acpi_power
Type: <integer>
Type Name: <sensor type (a generic string)>
%Direction: input | output
%Event Support: per state | entire sensor | global
Init Scanning: <bool>
Init Events: <bool>
Init Thresholds: <bool>
Init Hysteresis: <bool>
Init Type: <bool>
Init Power Up Events: <bool>
Init Power Up Scanning: <bool>
Ignore If No Entity: <bool>
Auto Rearm: <bool>
OEM1: <integer>
Id: <string>
yes, some of those lines wear a lil % up front โ I'm keeping every one of them exactly how it shows up, no editing ๐
For threshold sensors specifically, you also get all of this:
Threshold Access: none | readable | settable | fixed
Threshold
Name: <threshold>
Readable: <bool>
Settable: <bool>
Supports: going high assertion | going low assertion
| going high deassertion | going low deassertion
.
.
Hysteresis Support: none | readable | settable | fixed
%Nominal Reading: <float>
%Normal Max: <float>
%Normal Min: <float>
%Sensor Max: <float>
%Sensor Min: <float>
Base Unit: <integer>
Base Unit Name: <string>
%Rate Unit: <integer>
%Rate Unit Name: <string>
%Modifier Use: / | *
%Modifier Unit: <integer>
%Modifier Unit Name: <string>
and for discrete sensors, this is the whole vibe:
Event
Offset: <integer>
Supports: assertion | deassertion
.
.
๐ธ CONTROL INFO ๐ธ
every control object shows up looking like this:
Type: <control type>
Generates Events: <bool>
Settable: <bool>
Readable: <bool>
Num Values: <integer>
Id: <string>
now controls of type light that are set with settings get these extra bits:
Set with: settings
Local Control: <bool>
Color: <color>
.
.
fr fr: one color is listed for each supported color. ๐
and controls of type light that are set with transitions? those come out nested like this:
Light
Number: <integer>
Num Values: <integer>
Value
Number: <integer>
Num Transitions: <integer>
Transition
Number: <integer>
Color: <color>
Time: <integer>
.
.
.
.
the way it just keeps indenting โ iconic. ๐
and finally, controls of type identifier have exactly one thing:
Max Length: <integer>
๐ FRU INFO ๐
FRU info is built like this:
Name: <fru>
record
Name: <name>
Type: binary | ascii | unicode | integer
%Number: <integer>
Data: data depending on type
.
.
Multi-record
Number: <integer>
Type: binary | ascii | unicode
Data: <data in the above format>
.
.
note the Data: line literally depends on the Type: โ binary, ascii, unicode or integer, your data matches your type, periodt โจ
๐ง LANPARM CONFIG ๐ง
this one is long bestie, so buckle up. the whole LANPARM config listing:
support_auth_oem: <bool>
support_auth_straight: <bool>
support_auth_md5: <bool>
support_auth_md2: <bool>
support_auth_none: <bool>
ip_addr_source: <integer>
num_alert_destinations: <integer>
%ipv4_ttl: <integer>
%ipv4_flags: <integer>
%ipv4_precedence: <integer>
%ipv4_tos: <integer>
%ip_addr: <ip addr>
%mac_addr: <mac addr>
%subnet_mask: <ip addr>
%primary_rmcp_port <integer>
%secondary_rmcp_port <integer>
%bmc_generated_arps: <bool>
%bmc_generated_garps: <bool>
%garp_interval: <integer>
%default_gateway_ip_addr: <ip addr>
%default_gateway_mac_addr: <mac addr>
%backup_gateway_ip_addr: <ip addr>
%backup_gateway_mac_addr: <mac addr>
community_string: <string>
User
Name: callback
enable_auth_oem: <bool>
enable_auth_straight: <bool>
enable_auth_md5: <bool>
enable_auth_md2: <bool>
enable_auth_none: <bool>
User
Name: user
enable_auth_oem: <bool>
enable_auth_straight: <bool>
enable_auth_md5: <bool>
enable_auth_md2: <bool>
enable_auth_none: <bool>
User
Name: operator
enable_auth_oem: <bool>
enable_auth_straight: <bool>
enable_auth_md5: <bool>
enable_auth_md2: <bool>
enable_auth_none: <bool>
User
Name: admin
enable_auth_oem: <bool>
enable_auth_straight: <bool>
enable_auth_md5: <bool>
enable_auth_md2: <bool>
enable_auth_none: <bool>
User
Name: oem
enable_auth_oem: <bool>
enable_auth_straight: <bool>
enable_auth_md5: <bool>
enable_auth_md2: <bool>
enable_auth_none: <bool>
Alert Destination
Number: <integer>
alert_ack: <bool>
dest_type: <integer>
alert_retry_interval: <integer>
max_alert_retries: <integer>
dest_format: <integer>
gw_to_use: <integer>
dest_ip_addr: <ip addr>
dest_mac_addr: <mac addr>
.
.
five User blocks, one per Name: callback, user, operator, admin, oem โ each one with its own lil auth checklist ๐
๐ PEF CONFIG ๐
PEF config, in all its glory:
alert_startup_delay_enabled: <bool>
startup_delay_enabled: <bool>
event_messages_enabled: <bool>
pef_enabled: <bool>
diagnostic_interrupt_enabled: <bool>
oem_action_enabled: <bool>
power_cycle_enabled: <bool>
reset_enabled: <bool>
power_down_enabled: <bool>
alert_enabled: <bool>
%startup_delay: <integer>
%alert_startup_delay: <integer>
guid_enabled: <bool>
guid_val: <guid>
num_event_filters: <integer>
num_alert_policies: <integer>
num_alert_strings: <integer>
Event Filter
Number: <integer>
enable_filter: <bool>
filter_type: <integer>
diagnostic_interrupt: <bool>
oem_action: <bool>
power_cycle: <bool>
reset: <bool>
power_down: <bool>
alert: <bool>
alert_policy_number: <integer>
event_severity: <integer>
generator_id_addr: <integer>
generator_id_channel_lun: <integer>
sensor_type: <integer>
sensor_number: <integer>
event_trigger: <integer>
data1_offset_mask: <integer>
data1_mask: <integer>
data1_compare1: <integer>
data1_compare2: <integer>
data2_mask: <integer>
data2_compare1: <integer>
data2_compare2: <integer>
data3_mask: <integer>
data3_compare1: <integer>
data3_compare2: <integer>
.
.
Alert Policy
Number: <integer>
policy_num: <integer>
enabled: <bool>
policy: <integer>
channel: <integer>
destination_selector: <integer>
alert_string_event_specific: <bool>
alert_string_selector: <integer>
.
.
Alert String
event_filter: <integer>
alert_string_set: <integer>
alert_string: <string>
.
.
three nested families: Event Filter, Alert Policy, Alert String โ and the num_event_filters, num_alert_policies, num_alert_strings counts tell you how many of each you're about to get ๐
๐ CONNECTION INFO ๐
connection info is short and sweet:
Active: <bool>
Up: <bool>
Port
Number: <integer>
Info: <info string>
Up: <bool>
.
.
โญ PEF INFO โญ
MC: <mc>
that's it. one line. lowkey the most chill output on this whole page ๐
๐ PET INFO ๐
MC: <mc>
Channel: <channel>
IP Address: <ip address>
MAC Address: <mac address>
EFT Selector: <eft selector>
Policy Number: <policy number>
APT Selector: <apt selector>
LAN Dest Selector: <lan dest selector>
โจ LANPARM INFO โจ
MC: <mc>
Channel: <integer>
๐ฅ SEE ALSO ๐ฅ
go read that one too, bestie, it's the whole point of the crossover episode ๐ซถ
๐ KNOWN PROBLEMS ๐
None
literally zero problems. not a single one. the vibes are immaculate, no cap. โจ
๐ AUTHOR ๐
Corey Minyard <cminyard@mvista.com>
and that's a wrap on the whole page, bestie!! ๐โจ this was ipmi_cmdlang(7) from OpenIPMI, dated 05/13/03 โ thank you for coming to my TED talk, go forth and slay your IPMI ๐๐ฆ๐ธ
๐ฆ where this page comes from
- alpine 3.24: openipmi-doc 2.0.36-r1 ยท LGPL-2.0-or-later and GPL-2.0-or-later or BSD-3-Clause
- arch rolling: openipmi 2.0.37-4 ยท LGPL2.1
- debian bookworm: openipmi 2.0.33-1+b1 ยท LGPL
- debian trixie: openipmi 2.0.37-1 ยท LGPL-2.0-only
- nixpkgs unstable: OpenIPMI 2.0.37
- opensuse-leap 16.0: OpenIPMI 2.0.36.56+git.0a3a991-160000.3.1 ยท LGPL-2.1-or-later
- opensuse-leap 16.0: OpenIPMI 2.0.36.56+git.0a3a991-160000.3.1 ยท LGPL-2.1-or-later
- opensuse-leap 16.0: OpenIPMI 2.0.36.56+git.0a3a991-160000.3.1 ยท LGPL-2.1-or-later
- opensuse-leap 16.0: OpenIPMI 2.0.36.56+git.0a3a991-160000.3.1 ยท LGPL-2.1-or-later
- ubuntu jammy: openipmi 2.0.29-0.1ubuntu6 ยท LGPL
- ubuntu noble: openipmi 2.0.33-1.1build3 ยท LGPL
- ubuntu questing: openipmi 2.0.37-1
- ubuntu resolute: openipmi 2.0.37-1build1 ยท LGPL-2.0-only
- ubuntu stonking: openipmi 2.0.37-1ubuntu3 ยท LGPL-2.0-only
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms