Package: nut
Version: 2.0.1-4angels2
Followup-For: Bug #327072

I am running sarge and encountered the same problem as maciekc but found
a different solution. I edited /etc/init.d/nut to not stop upsdrvctl if
the POWERDOWNFLAG flag was set (patch below).

I think maciekc solution is more elegant and I am using it but the only
point I would raise is that my sarge ttySx ports were configured by
default to hang up when upsdrvctl closes the port.

Since several of the UPSes defined in genericups.h receive a shutdown
by: "lower DTR" and "drop RTS", the UPS may incorrectly shutdown early
when upsdrvctl terminates for the first time.

I considered inserting an:
stty -F /dev/ttyS1 -hupcl
in /etc/init.d/ somewhere but this meant the serial port used by nut was
defined in two places.

Instead, I have modified upsdrv_initups() in genericups.c to clear the
HUPCL flag on the port (patch below).

I don't have the background knowledge of ttySx port usage to know if
this is the correct solution so attached it here for consideration.


--- nut 2006-04-15 17:45:53.000000000 +0800
+++ nut.new     2006-04-17 21:51:33.720963448 +0800
@@ -27,8 +27,13 @@
           ;;
         stop)
           start-stop-daemon -K -o -q -p $upsd_pid -n upsd >/dev/null 2>&1
-          ! /sbin/upsdrvctl stop >/dev/null 2>&1  &&  \
-            echo -n " (upsdrvctl failed)"
+         flag=`sed -ne 's#^ *POWERDOWNFLAG *\(.*\)$#\1#p' /etc/nut/upsmon.conf`
+         # Stop upsdrvctl if POWERDOWNFLAG is not defined or flag file absent  
+         if [ -n "$flag" ] && [ ! -f "$flag" ] ; then
+               echo -n "Stopping upsdrvctl"
+               ! /sbin/upsdrvctl stop >/dev/null 2>&1  &&  \
+               echo -n " (upsdrvctl failed)"
+         fi    
           ;;
       esac
       ;;


--- genericups.c.old    2004-09-30 16:16:56.000000000 +0800
+++ genericups.c        2006-04-17 21:28:45.000000000 +0800
@@ -241,12 +241,26 @@
 
 void upsdrv_initups(void)
 {
+       struct termios serial_ios;
+       
        set_ups_type();
 
        upsfd = ser_open(device_path);
 
        if (ioctl(upsfd, TIOCMSET, &upstab[upstype].line_norm))
                fatal("ioctl TIOCMSET");
+       
+       /*
+        * Maintain the serial signal state after ser_close() to prevent
+        * UPS with active low shutdown signals from turning off early.
+        */ 
+       if (ioctl(upsfd, TCGETS, &serial_ios))
+               fatal("ioctl TCGETS, HUPCL");
+       else {  
+               serial_ios.c_cflag &= ~HUPCL;
+               if (ioctl(upsfd, TCSETS, &serial_ios))
+                       fatal("ioctl TCSETS, HUPCL");
+       }                       
 }
 
 void upsdrv_cleanup(void)
                                                                                
                                                
-- System Information:
Debian Release: 3.1
Architecture: i386 (i686)
Kernel: Linux 2.6.10-angels
Locale: LANG=en_AU.UTF-8, LC_CTYPE=en_AU.UTF-8 (charmap=UTF-8)

Versions of packages nut depends on:
ii  adduser                     3.63         Add and remove users and groups
ii  debconf [debconf-2.0]       1.4.30.13    Debian configuration management sy
ii  libc6                       2.3.2.ds1-22 GNU C Library: Shared libraries an

-- debconf information:
  nut/change_system_user:
  nut/major_conf_changes:
  nut/major_upstream_changes:
  nut/remove_debian_conf:
  nut/2_0_upstream_changes:


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]

Reply via email to