> 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 {
-- 
1.8.3.1


------------------------------------------------------------------------------
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

Reply via email to