Thank you for the heads up - this change to selectively enable/disable policy table entries is good for SGI too.
Best regards, Pat On 9/2/2015 11:21 AM, hotmail wrote: > >> Date: Thu, 20 Aug 2015 18:49:08 +0200 >> Subject: Re: [Ipmitool-devel] [PATCH] New PEF policy framework >> From: zdenek.styb...@gmail.com >> To: jordan_hargr...@hotmail.com >> CC: ipmitool-devel@lists.sourceforge.net; p...@sgi.com >> >> On Mon, Aug 17, 2015 at 10:46 PM, Jordan Hargrave >> wrote: >>> Some time ago I proposed a patch to enable enabling/disabling individual >>> PEF policy entries. >>> Support for this is needed for one of our utilities. A new rework of the >>> whole PEF framework was >>> requested. I'm attaching a patch that (partially) implements this new >>> scheme, please review. >>> >> Hello Jordan, >> >> I'm not aware that rework of the whole PEF framework was prerequisite >> for the patch you've posted. Patch you've posted has been rejected >> because 'setpolicy' didn't and doesn't make sense in broad view. As a >> follow up, new CLI PEF interface with "99%" coverage has been proposed >> and cooperated on. Yes, discussion has quieted down and I'm to blame. >> My apologies to Pat Donlin at SGI. >> Only request that has been made towards you, resp. Dell, was to change >> 'setpolicy' to 'policy set' which makes much more sense. As far as I'm >> aware, this was the only condition for the patch to be accepted and >> merged in. If you've interpreted any of it as a >> dependency/prerequisite, then I'm sorry. >> > Ah well that makes things much easier! Would something like ipmitool pef > policy and ipmitool pef policy be OK? > > Signed-off-by: Jordan Hargrave > --- > doc/ipmitool.1 | 5 +++ > include/ipmitool/ipmi_pef.h | 14 +++++++++ > lib/ipmi_pef.c | 75 > +++++++++++++++++++++++++++++++++++++++++++-- > 3 files changed, 92 insertions(+), 2 deletions(-) > > diff --git a/doc/ipmitool.1 b/doc/ipmitool.1 > index 0d8adcc..2cf7c99 100644 > --- a/doc/ipmitool.1 > +++ b/doc/ipmitool.1 > @@ -2425,6 +2425,11 @@ processed by the BMC, etc). > This command lists the PEF policy table entries. Each policy > entry describes an alert destination. A policy set is a > collection of table entries. PEF alert actions reference policy sets. > +.TP > +\fIpolicy\fP > +.br > + > +This command enables or disables individual PEF policy table entries. > .TP > \fIlist\fP > .br > diff --git a/include/ipmitool/ipmi_pef.h b/include/ipmitool/ipmi_pef.h > index cdea4ec..2b392ff 100644 > --- a/include/ipmitool/ipmi_pef.h > +++ b/include/ipmitool/ipmi_pef.h > @@ -555,6 +555,19 @@ struct pef_cfgparm_policy_table_entry { > #ifdef HAVE_PRAGMA_PACK > #pragma pack(1) > #endif > +struct pef_cfgparm_set_policy_table_entry > +{ > + uint8_t id; > + uint8_t sel; > + struct pef_policy_entry entry; > +} ATTRIBUTE_PACKING; > +#ifdef HAVE_PRAGMA_PACK > +#pragma pack(0) > +#endif > + > +#ifdef HAVE_PRAGMA_PACK > +#pragma pack(1) > +#endif > struct pef_cfgparm_system_guid { > #define PEF_SYSTEM_GUID_USED_IN_PET 0x01 > uint8_t data1; > @@ -936,6 +949,7 @@ BIT_DESC_MAP_LIST, > #endif > > #define IPMI_CMD_GET_PEF_CAPABILITIES 0x10 > +#define IPMI_CMD_SET_PEF_CONFIG_PARMS 0x12 > #define IPMI_CMD_GET_PEF_CONFIG_PARMS 0x13 > #define IPMI_CMD_GET_LAST_PROCESSED_EVT_ID 0x15 > #define IPMI_CMD_GET_SYSTEM_GUID 0x37 > diff --git a/lib/ipmi_pef.c b/lib/ipmi_pef.c > index 1beebf0..305283d 100644 > --- a/lib/ipmi_pef.c > +++ b/lib/ipmi_pef.c > @@ -256,6 +256,56 @@ ipmi_pef_get_policy_table(struct ipmi_intf * intf, > return(tbl_size); > } > > +static int > +ipmi_pef_set_policy_table_entry(struct ipmi_intf * intf, int set, struct > pef_cfgparm_policy_table_entry *entry) > +{ > + struct ipmi_rs *rsp; > + struct ipmi_rq req; > + struct pef_cfgparm_set_policy_table_entry psel; > + > + memset(&req, 0, sizeof(req)); > + req.msg.netfn = IPMI_NETFN_SE; > + req.msg.cmd = IPMI_CMD_SET_PEF_CONFIG_PARMS; > + req.msg.data = &psel; > + req.msg.data_len = sizeof(psel); > + > + memset(&psel, 0, sizeof(psel)); > + psel.id = PEF_CFGPARM_ID_PEF_ALERT_POLICY_TABLE_ENTRY; > + psel.sel = set & 0x3F; > + memcpy(&psel.entry, &entry->entry, sizeof(entry->entry)); > + > + rsp = ipmi_pef_msg_exchange(intf, &req, "Set Alert policy table entry"); > + if (!rsp) { > + lprintf(LOG_ERR, " **Error setting Alert policy table entry"); > + return -1; > + } > + return 0; > +} > + > +static void > +ipmi_pef_policy_enable(struct ipmi_intf * intf, int set, int enable) > +{ > + struct pef_cfgparm_policy_table_entry * ptbl = NULL; > + int tbl_size; > + > + tbl_size = ipmi_pef_get_policy_table(intf, &ptbl); > + if (!tbl_size) { > + if (ptbl) { > + free(ptbl); > + } > + return; > + } > + if (set> 0 && set <= tbl_size) { > + if (enable) > + ptbl[set-1].entry.policy |= PEF_POLICY_ENABLED; > + else > + ptbl[set-1].entry.policy &= ~PEF_POLICY_ENABLED; > + ipmi_pef_set_policy_table_entry(intf, set, &ptbl[set-1]); > + } else { > + lprintf(LOG_ERR, "Invalid policy index, valid range = (1..%d)", > tbl_size); > + } > +} > + > static void > ipmi_pef_print_lan_dest(struct ipmi_intf * intf, uint8_t ch, uint8_t dest) > { /* > @@ -858,6 +908,12 @@ ipmi_pef_get_info(struct ipmi_intf * intf) > ipmi_pef_print_flags(&pef_b2s_actions, P_SUPP, actions); > } > > +struct valstr endis[] = { > + { .str = "disable", .val = 0x00 }, > + { .str = "enable", .val = 0x01 }, > + { .val = 0xFFFF }, > +}; > + > int ipmi_pef_main(struct ipmi_intf * intf, int argc, char ** argv) > { /* > // PEF subcommand handling > @@ -871,8 +927,23 @@ int ipmi_pef_main(struct ipmi_intf * intf, int argc, > char ** argv) > help = 1; > else if (!strncmp(argv[0], "status", 6)) > ipmi_pef_get_status(intf); > - else if (!strncmp(argv[0], "policy", 6)) > - ipmi_pef_list_policies(intf); > + else if (!strncmp(argv[0], "policy", 6)) { > + if (argc == 3) { > + uint16_t pol,en; > + > + if (str2int(argv[1], &pol) != 0 || > + (en = str2val(argv[2], endis)) == 0xFFFF) { > + lprintf(LOG_ERR, "Usage: ipmitool pef policy \n"); > + return (-1); > + } > + ipmi_pef_policy_enable(intf, pol, en); > + } else if (argc == 1) { > + ipmi_pef_list_policies(intf); > + } else { > + lprintf(LOG_NOTICE, "PEF policy commands: policy | policy "); > + return (-1); > + } > + } > else if (!strncmp(argv[0], "list", 4)) > ipmi_pef_list_entries(intf); > else { ------------------------------------------------------------------------------ Monitor Your Dynamic Infrastructure at Any Scale With Datadog! Get real-time metrics from all of your servers, apps and tools in one place. SourceForge users - Click here to start your Free Trial of Datadog now! http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140 _______________________________________________ Ipmitool-devel mailing list Ipmitool-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ipmitool-devel