1#!/bin/sh 2 3EVENT=${1:-short-press} 4 5LONG_PRESS_TIMEOUT=3 # s 6DEBOUNCE=2 # s 7PIDFILE="/tmp/$(basename $0).pid" 8LOCKFILE=/tmp/.power_key 9 10short_press() 11{ 12 logger -t $(basename $0) "[$$]: Power key short press..." 13 14 if which systemctl >/dev/null; then 15 SUSPEND_CMD="systemctl suspend" 16 elif which pm-suspend >/dev/null; then 17 SUSPEND_CMD="pm-suspend" 18 else 19 SUSPEND_CMD="echo -n mem > /sys/power/state" 20 fi 21 22 if [ ! -f $LOCKFILE ]; then 23 logger -t $(basename $0) "[$$]: Prepare to suspend..." 24 25 touch $LOCKFILE 26 sh -c "$SUSPEND_CMD" 27 { sleep $DEBOUNCE && rm $LOCKFILE; }& 28 fi 29} 30 31long_press() 32{ 33 logger -t $(basename $0) "[$$]: Power key long press (${LONG_PRESS_TIMEOUT}s)..." 34 35 logger -t $(basename $0) "[$$]: Prepare to power off..." 36 37 poweroff 38} 39 40logger -t $(basename $0) "[$$]: Received power key event: $@..." 41 42case "$EVENT" in 43 press) 44 # Lock it 45 exec 3<$0 46 flock -x 3 47 48 start-stop-daemon -K -q -p $PIDFILE || true 49 start-stop-daemon -S -q -b -m -p $PIDFILE -x /bin/sh -- \ 50 -c "sleep $LONG_PRESS_TIMEOUT; $0 long-press" 51 52 # Unlock 53 flock -u 3 54 ;; 55 release) 56 # Avoid race with press event 57 sleep .5 58 59 start-stop-daemon -K -q -p $PIDFILE && short_press 60 ;; 61 short-press) 62 short_press 63 ;; 64 long-press) 65 long_press 66 ;; 67esac 68