I want to orderly shut down my boxes by pressing the power button for 5+ seconds. Sometimes, though, I realize that there is this One More Thing I want to do first, so holding it down for 10+ seconds should do nothing. I also want to see when to release the button. Attached the bash script 'power-off.sh' that, together with 'esekeyd', does the trick. It is tested on Netgear Stora and Netgear ReadyNAS RN102/RN104. It should work with other Linux boxes by just adding 3 new lines to the first case statement.
Copy the script to '/root' and make it executable:
Install 'esekeyd', press and release the power button while running 'learnkeys' and modify the 2 last lines of '/etc/esekeys.conf':
Fix a flaw, enable and start the 'esekeyd' deamon:
To debug or further develop the script, use 'ssh' to open 2 terminal windows to the box:
Regards,
Trond Melen
EDIT: Fixed typos in text.
TIDE
Copy the script to '/root' and make it executable:
$ sudo chmod +x /root/power-off.sh $ sudo ls -lF /root/power-off.sh -rwxr-xr-x 1 root root 1793 Jan 31 13:43 /root/power-off.sh* $ sudo cat /root/power-off.sh #!/bin/bash # # Script activated by esekeyd when the power button is pressed or released # Press the power button for 5 to 10 seconds to power off the computer # States: rest, armed, active, shutdown # Usage if [ $# != 1 ]; then echo "Usage:" $( basename $0 ) "[released|pressed|timeout]" exit 0 fi # File where the state is stored state=/tmp/power-off-state # Led control (default) led_at_rest="default-on" led_when_armed="none" led_when_active="timer" # Tune in to the current box model=$( cat /sys/firmware/devicetree/base/model ) case $model in "NETGEAR MS2000 / MS2110 aka Stora" ) led="/sys/class/leds/status:blue:activity_led" ;; "NETGEAR ReadyNAS 102" ) led="/sys/class/leds/rn102:blue:pwr"; led_at_rest="none"; led_when_armed="default-on" ;; "NETGEAR ReadyNAS 104" ) led="/sys/class/leds/rn104:blue:pwr"; led_at_rest="none"; led_when_armed="default-on" ;; *) echo "$0: Please add support for this box ($model) and post it on 'https://forum.doozan.com'" echo "$0: Available LEDs are:"; ls /sys/class/leds/ | tr -s ' ' '\n' exit 1 ;; esac # The only arguments handled by this script are released, pressed and timeout case $1 in "released" ) # Shutdown or return to rest? if [ $( cat $state ) == "active" ]; then echo "shutdown" > $state echo $led_at_rest > $led/trigger if [[ ! -v DRYRUN ]]; then shutdown -h now fi else echo "rest" > $state echo $led_at_rest > $led/trigger fi ;; "pressed" ) # Arm, then wait for released or for timeout echo "armed" > $state echo $led_when_armed > $led/trigger # Spawn a child process to rerun this script again in 5 seconds with argument timeout ( cd /; exec > /dev/null 2>&1; exec < /dev/null; sleep 5; exec $0 timeout )& ;; "timeout" ) # Activate, return to rest or do nothing? if [ $( cat $state ) == "armed" ]; then echo "active" > $state; echo $led_when_active > $led/trigger # Spawn a child process to rerun this script again in 5 seconds with argument timeout ( cd /; exec > /dev/null 2>&1; exec < /dev/null; sleep 5; exec $0 timeout )& elif [ $( cat $state ) == "active" ]; then echo "rest" > $state echo $led_at_rest > $led/trigger else echo $led_at_rest > $led/trigger fi ;; esac
Install 'esekeyd', press and release the power button while running 'learnkeys' and modify the 2 last lines of '/etc/esekeys.conf':
$ sudo apt install -y esekeyd $ sudo learnkeys /etc/esekeyd.conf /dev/input/event0 learnkeys (ESE Key Deamon 1.2.7, SVN-r63) Pres ANY (fun)key... or Ctrl-C to exit... key KEY_116 stored in config file key KEY_116 stored in config file ^C Caught signal 2, writing config file and exiting... $ sudo nano /etc/esekeyd.conf $ tail -2 /etc/esekeyd.conf KEY_116(press): /root/power-off.sh pressed KEY_116(release): /root/power-off.sh released(Substitute KEY_116 above with the name of the power button on your box.)
Fix a flaw, enable and start the 'esekeyd' deamon:
$ sudo perl -pi.orig -e 's/DODTIME=10/DIETIME=10/g' /etc/init.d/esekeyd $ diff /etc/init.d/esekeyd.orig /etc/init.d/esekeyd 52c52 < DODTIME=10 --- > DIETIME=10 $ sudo perl -pi.orig -e 's/START_ESEKEYD=false/START_ESEKEYD=true/g' /etc/default/esekeyd $ diff /etc/default/esekeyd.orig /etc/default/esekeyd 4c4 < START_ESEKEYD=false --- > START_ESEKEYD=true $ sudo /etc/init.d/esekeyd start Starting a multimedia keyboard daemon for Linux : esekeydESE Key Deamon 1.2.7 (SVN-r63) .Now orderly shutdown should work as described.
To debug or further develop the script, use 'ssh' to open 2 terminal windows to the box:
$ watch -n 1 cat /tmp/power-off-state
$ DRYRUN=1 /root/power-off.sh pressed $ DRYRUN=1 /root/power-off.sh released
Regards,
Trond Melen
EDIT: Fixed typos in text.
TIDE