mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
Add SEL Delete
This commit is contained in:
parent
7b11ad75c0
commit
db3d59fe08
@ -39,6 +39,19 @@
|
||||
|
||||
#include <ipmitool/ipmi.h>
|
||||
|
||||
#define IPMI_CMD_GET_SEL_INFO 0x40
|
||||
#define IPMI_CMD_GET_SEL_ALLOC_INFO 0x41
|
||||
#define IPMI_CMD_RESERVE_SEL 0x42
|
||||
#define IPMI_CMD_GET_SEL_ENTRY 0x43
|
||||
#define IPMI_CMD_ADD_SEL_ENTRY 0x44
|
||||
#define IPMI_CMD_PARTIAL_ADD_SEL_ENTRY 0x45
|
||||
#define IPMI_CMD_DELETE_SEL_ENTRY 0x46
|
||||
#define IPMI_CMD_CLEAR_SEL 0x47
|
||||
#define IPMI_CMD_GET_SEL_TIME 0x48
|
||||
#define IPMI_CMD_SET_SEL_TIME 0x49
|
||||
#define IPMI_CMD_GET_AUX_LOG_STATUS 0x5A
|
||||
#define IPMI_CMD_SET_AUX_LOG_STATUS 0x5B
|
||||
|
||||
enum {
|
||||
IPMI_EVENT_CLASS_DISCRETE,
|
||||
IPMI_EVENT_CLASS_DIGITAL,
|
||||
@ -356,6 +369,6 @@ static struct ipmi_event_sensor_types sensor_specific_types[] __attribute__((unu
|
||||
};
|
||||
|
||||
int ipmi_sel_main(struct ipmi_intf *, int, char **);
|
||||
void ipmi_sel_print_std_entry(int num, struct sel_event_record * evt);
|
||||
void ipmi_sel_print_std_entry(struct sel_event_record * evt);
|
||||
|
||||
#endif /* IPMI_SEL_H */
|
||||
|
@ -125,7 +125,7 @@ ipmi_sel_get_info(struct ipmi_intf * intf)
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||
req.msg.cmd = 0x40;
|
||||
req.msg.cmd = IPMI_CMD_GET_SEL_INFO;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (!rsp || rsp->ccode) {
|
||||
@ -162,7 +162,7 @@ ipmi_sel_get_info(struct ipmi_intf * intf)
|
||||
/* get sel allocation info */
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||
req.msg.cmd = 0x41;
|
||||
req.msg.cmd = IPMI_CMD_GET_SEL_ALLOC_INFO;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (!rsp || rsp->ccode) {
|
||||
@ -196,7 +196,7 @@ ipmi_sel_get_std_entry(struct ipmi_intf * intf, unsigned short * next_id)
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||
req.msg.cmd = 0x43;
|
||||
req.msg.cmd = IPMI_CMD_GET_SEL_ENTRY;
|
||||
req.msg.data = msg_data;
|
||||
req.msg.data_len = 6;
|
||||
|
||||
@ -244,15 +244,15 @@ ipmi_sel_timestamp_time(unsigned long stamp)
|
||||
}
|
||||
|
||||
void
|
||||
ipmi_sel_print_std_entry(int num, struct sel_event_record * evt)
|
||||
ipmi_sel_print_std_entry(struct sel_event_record * evt)
|
||||
{
|
||||
if (!evt)
|
||||
return;
|
||||
|
||||
if (csv_output)
|
||||
printf("%d,", num);
|
||||
printf("%d,", evt->record_id);
|
||||
else
|
||||
printf("%4d | ", num);
|
||||
printf("%4d | ", evt->record_id);
|
||||
|
||||
if (evt->timestamp < 0x20000000) {
|
||||
printf("Pre-Init Time-stamp");
|
||||
@ -322,12 +322,11 @@ ipmi_sel_list_entries(struct ipmi_intf * intf)
|
||||
struct ipmi_rs * rsp;
|
||||
struct ipmi_rq req;
|
||||
unsigned short reserve_id, next_id = 0;
|
||||
int num = 1;
|
||||
struct sel_event_record * evt;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||
req.msg.cmd = 0x40;
|
||||
req.msg.cmd = IPMI_CMD_GET_SEL_INFO;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (!rsp || rsp->ccode) {
|
||||
@ -345,7 +344,7 @@ ipmi_sel_list_entries(struct ipmi_intf * intf)
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||
req.msg.cmd = 0x42; /* reserve SEL */
|
||||
req.msg.cmd = IPMI_CMD_RESERVE_SEL;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (!rsp || rsp->ccode) {
|
||||
@ -368,8 +367,7 @@ ipmi_sel_list_entries(struct ipmi_intf * intf)
|
||||
if (verbose)
|
||||
ipmi_sel_print_std_entry_verbose(evt);
|
||||
else
|
||||
ipmi_sel_print_std_entry(num, evt);
|
||||
num++;
|
||||
ipmi_sel_print_std_entry(evt);
|
||||
}
|
||||
}
|
||||
|
||||
@ -381,7 +379,7 @@ ipmi_sel_reserve(struct ipmi_intf * intf)
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||
req.msg.cmd = 0x42; /* reserve SEL */
|
||||
req.msg.cmd = IPMI_CMD_RESERVE_SEL;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (!rsp || rsp->ccode) {
|
||||
@ -415,7 +413,7 @@ ipmi_sel_clear(struct ipmi_intf * intf)
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||
req.msg.cmd = 0x47; /* clear SEL */
|
||||
req.msg.cmd = IPMI_CMD_CLEAR_SEL;
|
||||
req.msg.data = msg_data;
|
||||
req.msg.data_len = 6;
|
||||
|
||||
@ -428,18 +426,66 @@ ipmi_sel_clear(struct ipmi_intf * intf)
|
||||
printf("Clearing SEL. Please allow a few seconds to erase.\n");
|
||||
}
|
||||
|
||||
static void
|
||||
ipmi_sel_delete(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
{
|
||||
struct ipmi_rs * rsp;
|
||||
struct ipmi_rq req;
|
||||
unsigned short id;
|
||||
unsigned char msg_data[4];
|
||||
|
||||
if (!argc || !strncmp(argv[0], "help", 4))
|
||||
{
|
||||
printf("usage: delete [id ...]\n");
|
||||
return;
|
||||
}
|
||||
|
||||
id = ipmi_sel_reserve(intf);
|
||||
if (id == 0)
|
||||
return;
|
||||
|
||||
memset(msg_data, 0, 4);
|
||||
msg_data[0] = id & 0xff;
|
||||
msg_data[1] = id >> 8;
|
||||
while (argc)
|
||||
{
|
||||
id = atoi(argv[argc-1]);
|
||||
msg_data[2] = id & 0xff;
|
||||
msg_data[3] = id >> 8;
|
||||
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.msg.netfn = IPMI_NETFN_STORAGE;
|
||||
req.msg.cmd = IPMI_CMD_DELETE_SEL_ENTRY;
|
||||
req.msg.data = msg_data;
|
||||
req.msg.data_len = 4;
|
||||
|
||||
rsp = intf->sendrecv(intf, &req);
|
||||
if (!rsp || rsp->ccode)
|
||||
{
|
||||
printf("Error:%x unable to delete entry %d\n", rsp ? rsp->ccode : 0, id);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("Deleted entry %d\n", id);
|
||||
}
|
||||
argc--;
|
||||
}
|
||||
}
|
||||
|
||||
int ipmi_sel_main(struct ipmi_intf * intf, int argc, char ** argv)
|
||||
{
|
||||
if (!argc)
|
||||
ipmi_sel_get_info(intf);
|
||||
else if (!strncmp(argv[0], "help", 4))
|
||||
printf("SEL Commands: info clear list\n");
|
||||
printf("SEL Commands: info clear delete list\n");
|
||||
else if (!strncmp(argv[0], "info", 4))
|
||||
ipmi_sel_get_info(intf);
|
||||
else if (!strncmp(argv[0], "list", 4))
|
||||
ipmi_sel_list_entries(intf);
|
||||
else if (!strncmp(argv[0], "clear", 5))
|
||||
ipmi_sel_clear(intf);
|
||||
else if (!strncmp(argv[0], "delete", 6))
|
||||
ipmi_sel_delete(intf, argc-1, &argv[1]);
|
||||
else
|
||||
printf("Invalid SEL command: %s\n", argv[0]);
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user