Currently it's possible to enable/disable access to channel using ipmitool. But there is no way how to query for current setting.

Attached patch adds new 'ipmitool sol payload status' command, using "Get User Access Command" from IPMI 2.0 spec.

Jan
Implement "Get User Access Command" to allow admins to show current
status of an user.

Usage: 
$ ipmitool sol payload status 1 2
User 2 on channel 1 is enabled


Author: Jan Safranek <jsafr...@redhat.com>

Index: doc/ipmitool.1
===================================================================
RCS file: /cvsroot/ipmitool/ipmitool/doc/ipmitool.1,v
retrieving revision 1.35
diff -u -r1.35 ipmitool.1
--- doc/ipmitool.1      2 Jun 2008 03:24:00 -0000       1.35
+++ doc/ipmitool.1      8 Jan 2009 13:17:12 -0000
@@ -1875,10 +1875,10 @@
 the specified channel.  If no channel is given, it will display 
 SOL configuration data for the currently used channel.
 .TP 
-\fIpayload\fP <\fIenable\fP | \fIdisable\fP> <\fBchannel number\fR> 
<\fBuserid\fR>
+\fIpayload\fP <\fIenable\fP | \fIdisable\fP | \fIstatus\fP> <\fBchannel 
number\fR> <\fBuserid\fR>
 .br 
 
-Enable or disable SOL payload for the user on the specified channel. 
+Enable, disable or show status of SOL payload for the user on the specified 
channel. 
 .TP 
 \fIset\fP <\fBparameter\fR> <\fBvalue\fR> [<\fBchannel\fR>]
 .br 
Index: lib/ipmi_sol.c
===================================================================
RCS file: /cvsroot/ipmitool/ipmitool/lib/ipmi_sol.c,v
retrieving revision 1.52
diff -u -r1.52 ipmi_sol.c
--- lib/ipmi_sol.c      29 Sep 2008 18:24:02 -0000      1.52
+++ lib/ipmi_sol.c      8 Jan 2009 13:17:12 -0000
@@ -143,6 +143,51 @@
        return -1;
 }
 
+int
+ipmi_sol_payload_access_status(struct ipmi_intf * intf,
+                               uint8_t channel,
+                               uint8_t userid)
+{
+       struct ipmi_rq req;
+       struct ipmi_rs *rsp;
+       uint8_t data[2];
+
+       memset(&req, 0, sizeof(req));
+       req.msg.netfn    = IPMI_NETFN_APP;
+       req.msg.cmd      = IPMI_GET_USER_PAYLOAD_ACCESS;
+       req.msg.data     = data;
+       req.msg.data_len = sizeof(data);
+
+       data[0] = channel & 0xf;        /* channel */
+       data[1] = userid & 0x3f;        /* user id */
+       rsp = intf->sendrecv(intf, &req);
+
+       if (rsp == NULL) {
+               lprintf(LOG_ERR, "Error: Unexpected data length (%d) received",
+                       rsp->data_len);
+               return -1;
+       }
+
+       switch(rsp->ccode) {
+               case 0x00:
+                       if (rsp->data_len != 4) {
+                               lprintf(LOG_ERR, "Error parsing SOL payload 
status for user %d on channel %d",
+                                       userid, channel);
+                               return -1;
+                       }
+
+                       printf("User %d on channel %d is %sabled\n",
+                               userid, channel, (rsp->data[0] & 0x02) ? 
"en":"dis");
+                       return 0;
+
+               default:
+                       lprintf(LOG_ERR, "Error getting SOL payload status for 
user %d on channel %d: %s",
+                               userid, channel, 
+                               val2str(rsp->ccode, completion_code_vals));
+                       return -1;
+       }
+}
+
 
 /*
  * ipmi_get_sol_info
@@ -1771,7 +1816,7 @@
 {
        lprintf(LOG_NOTICE, "SOL Commands: info [<channel number>]");
        lprintf(LOG_NOTICE, "              set <parameter> <value> [channel]");
-       lprintf(LOG_NOTICE, "              payload <enable|disable> [channel] 
[userid]");
+       lprintf(LOG_NOTICE, "              payload <enable|disable|status> 
[channel] [userid]");
        lprintf(LOG_NOTICE, "              activate 
[<usesolforkeepalive|nokeepalive>]");
        lprintf(LOG_NOTICE, "              deactivate");
        lprintf(LOG_NOTICE, "              looptest [<loop times>] [<loop 
interval(in ms)>]");
@@ -1846,15 +1891,7 @@
                uint8_t userid = 1;
                int enable = -1;
 
-               if (!strncmp(argv[1], "enable", 6))
-               {
-                       enable = 1;
-               }
-               else if (!strncmp(argv[1], "disable", 7))
-               {
-                       enable = 0;
-               }
-               else
+               if (argc == 1 || argc > 4)
                {
                        print_sol_usage();
                        return -1;
@@ -1869,6 +1906,24 @@
                        userid = (uint8_t)strtol(argv[3], NULL, 0);
                }
 
+               if (!strncmp(argv[1], "enable", 6))
+               {
+                       enable = 1;
+               }
+               else if (!strncmp(argv[1], "disable", 7))
+               {
+                       enable = 0;
+               }
+               else if (!strncmp(argv[1], "status", 6))
+               {
+                       return ipmi_sol_payload_access_status(intf, channel, 
userid);
+               }
+               else
+               {
+                       print_sol_usage();
+                       return -1;
+               }
+
                retval = ipmi_sol_payload_access(intf, channel, userid, enable);
        }
 
------------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It is the best place to buy or sell services for
just about anything Open Source.
http://p.sf.net/sfu/Xq1LFB
_______________________________________________
Ipmitool-devel mailing list
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel

Reply via email to