<html><head></head><body><div style="font-family: Verdana;font-size: 12.0px;"><div>
<div>Regarding Debian Bug#708397:  nut: APC SNMP set value does not work (wrong mib type declarations)</div>

<div> </div>

<div>Here are the patches that work for APC Smart-UPS with APC AP9617 / SNMP.</div>

<div>After applying the patches the UPS accepts and holds the values that are written to the UPS (string, int and tick values) via SNMP.</div>

<div> </div>

<div>I would be happy if someone could review the changes and possibly incorporate them into nut.</div>

<div> </div>

<div>-lutzn</div>

<div> </div>

<div> </div>
--- apc-mib.c    2012-05-30 22:42:42.000000000 +0200<br/>
+++ apc-mib.c.new    2013-05-16 11:33:54.000000000 +0200<br/>
@@ -25,7 +25,7 @@<br/>
 <br/>
 #include "apc-mib.h"<br/>
 <br/>
-#define APCC_MIB_VERSION    "1.1"<br/>
+#define APCC_MIB_VERSION    "1.2"<br/>
 <br/>
 /* Other APC sysOID:<br/>
  *<br/>
@@ -166,12 +166,12 @@<br/>
     { "ups.temperature", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.2.0", "", SU_FLAG_OK, NULL },<br/>
     { "ups.load", 0, 1, ".1.3.6.1.4.1.318.1.1.1.4.2.3.0", "", SU_FLAG_OK, NULL },<br/>
     { "ups.firmware", ST_FLAG_STRING, 16, ".1.3.6.1.4.1.318.1.1.1.1.2.1.0", "", SU_FLAG_STATIC | SU_FLAG_OK, NULL },<br/>
-    { "ups.delay.shutdown", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.10.0", "", SU_FLAG_OK, NULL },<br/>
-    { "ups.delay.start", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.9.0", "", SU_FLAG_OK, NULL },<br/>
+    { "ups.delay.shutdown", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.10.0", "", SU_TYPE_TIME | SU_FLAG_OK, NULL },<br/>
+    { "ups.delay.start", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.9.0", "", SU_TYPE_TIME | SU_FLAG_OK, NULL },<br/>
     { "battery.charge", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.1.0", "", SU_FLAG_OK, NULL },<br/>
     { "battery.charge.restart", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.6.0", "", SU_TYPE_INT | SU_FLAG_OK, NULL },<br/>
     { "battery.runtime", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.3.0", "", SU_FLAG_OK, NULL },<br/>
-    { "battery.runtime.low", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.8.0", "", SU_FLAG_OK, NULL },<br/>
+    { "battery.runtime.low", ST_FLAG_STRING | ST_FLAG_RW, 3, ".1.3.6.1.4.1.318.1.1.1.5.2.8.0", "", SU_TYPE_TIME | SU_FLAG_OK, NULL },<br/>
     { "battery.voltage", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.8.0", "", SU_FLAG_OK, NULL },<br/>
     { "battery.voltage.nominal", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.7.0", "", SU_FLAG_OK, NULL },<br/>
     { "battery.current", 0, 1, ".1.3.6.1.4.1.318.1.1.1.2.2.9.0", "", SU_FLAG_OK, NULL },<br/>
--- snmp-ups.c    2012-05-15 16:37:00.000000000 +0200<br/>
+++ snmp-ups.c.new    2013-05-16 11:32:28.000000000 +0200<br/>
@@ -91,7 +91,7 @@<br/>
 static void disable_transfer_oids(void);<br/>
 <br/>
 #define DRIVER_NAME    "Generic SNMP UPS driver"<br/>
-#define DRIVER_VERSION        "0.66"<br/>
+#define DRIVER_VERSION        "0.67"<br/>
 <br/>
 /* driver description structure */<br/>
 upsdrv_info_t    upsdrv_info = {<br/>
@@ -683,7 +683,7 @@<br/>
 {<br/>
     char buf[SU_BUFSIZE];<br/>
 <br/>
-    snprintf(buf, SU_BUFSIZE, "%ld", value * 100);<br/>
+    snprintf(buf, sizeof(buf), "%ld", value * 100);<br/>
     return nut_snmp_set(OID, 't', buf);<br/>
 }<br/>
 <br/>
@@ -1460,7 +1460,7 @@<br/>
     }<br/>
 <br/>
     /* set value into the device */<br/>
-    if (su_info_p->info_flags & ST_FLAG_STRING) {<br/>
+    if (SU_TYPE(su_info_p) == SU_TYPE_STRING) {<br/>
         status = nut_snmp_set_str(su_info_p->OID, val);<br/>
     } else {<br/>
         /* non string data may imply a value lookup */<br/>
@@ -1471,7 +1471,7 @@<br/>
             value = strtol(val, NULL, 0);<br/>
         }<br/>
         /* Actually apply the new value */<br/>
-        status = nut_snmp_set_int(su_info_p->OID, value);<br/>
+        status = (SU_TYPE(su_info_p) == SU_TYPE_TIME) ? nut_snmp_set_time(su_info_p->OID, value) : nut_snmp_set_int(su_info_p->OID, value);<br/>
     }<br/>
 <br/>
     if (status == FALSE)
<div> </div>

<div> </div>

<div> 
<div style="margin: 10.0px 5.0px 5.0px 10.0px;padding: 10.0px 0 10.0px 10.0px;border-left: 2.0px solid rgb(195,217,229);">Ok, now I saw that it is far from complete.  nut does only support snmp types 's' and 'i' when writing.  nut does not support type 't'.  So no timeticks such as delays can be set on an AP9617.  Maybe other cards do no type checking...
<div>
<div style="font-family: Verdana;font-size: 12.0px;">
<div>
<div>This means snmp-ups.c and apc-mib.c need to be changed.  And maybe other mib files, too.</div>

<div>So, is it by design that timeticks/delays cannot be set?</div>

<div>-lutzn</div>

<div> 
<div style="margin: 10.0px 5.0px 5.0px 10.0px;padding: 10.0px 0 10.0px 10.0px;border-left: 2.0px solid rgb(195,217,229);">I changed one line only:
<div>
<div style="font-family: Verdana;font-size: 12.0px;">
<div>
<div> </div>

<div>line 1463 in snmp-ups.c:</div>

<div>from:  if (su_info_p->info_flags & ST_FLAG_STRING) {<br/>
to:      if (su_info_p->flags & SU_TYPE_STRING) {<br/>
 </div>

<div>Can anyone please verify!</div>

<div> </div>

<div>Because if it is true what I did then I believe that setting values might not have worked for any snmp ups.</div>

<div>And believe that this cannot be.  But with this change setting values now work with AP9617.  snmp-lib does not generate "" anymore.  Strange...</div>

<div> </div>

<div>The other problem with the ups not shutting down is still open.</div>

<div> </div>

<div>-lutzn</div>

<div> </div>

<div> 
<div style="margin: 10.0px 5.0px 5.0px 10.0px;padding: 10.0px 0 10.0px 10.0px;border-left: 2.0px solid rgb(195,217,229);"> 
<div>> I will post the changed apc-mib.c here. Ok? Or shall I send it to someone else?<br/>
<br/>
This list is fine. Would you please post a unified diff (diff -u) instead of the whole file?<br/>
<br/>
Thanks,<br/>
<br/>
--<br/>
Charles Lepple<br/>
clepple@gmail<br/>
<br/>
<br/>
 </div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div></div></body></html>