aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/slugos-init/files/leds
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/slugos-init/files/leds')
-rw-r--r--recipes/slugos-init/files/leds269
1 files changed, 269 insertions, 0 deletions
diff --git a/recipes/slugos-init/files/leds b/recipes/slugos-init/files/leds
new file mode 100644
index 0000000000..b40d5d874e
--- /dev/null
+++ b/recipes/slugos-init/files/leds
@@ -0,0 +1,269 @@
+#!/bin/sh
+# leds
+#
+# utilities to manipulate the settings of the system leds
+#
+# load the utility functions unless this script is being called
+# just to load its own functions.
+case "$1" in
+leds) ;;
+*) . /etc/default/rcS
+ . /etc/default/functions;;
+esac
+
+#
+# led_set led-dir off|on|slow|fast|panic|blink|flash|*
+# set the given LED (expressed as a directory) to the
+# given status.
+#
+led_set(){
+ local setting
+ # expect led-dir state
+ if test -d "$1"
+ then
+ setting="$2"
+ case "$setting" in
+ off|on) echo -n none
+
+ case "$setting" in
+ on) echo -n 255;;
+ off) echo -n 0;;
+ esac >"$1/brightness";;
+
+ slow|fast|panic|blink|flash)
+ echo -n timer
+
+ case "$setting" in
+ flash) echo -n 60;;
+ blink) echo -n 540;;
+ slow) echo -n 500;;
+ fast) echo -n 1500;;
+ panic) echo -n 3000;;
+ esac >"$1/delay_on"
+
+ case "$setting" in
+ flash) echo -n 540;;
+ blink) echo -n 60;;
+ slow) echo -n 500;;
+ fast) echo -n 1500;;
+ panic) echo -n 3000;;
+ esac >"$1/delay_off";;
+
+ *) echo -n "$setting";;
+ esac >"$1/trigger"
+ else
+ echo "leds: $1: no such directory" >&2
+ return 1
+ fi
+}
+
+#
+# sysled [boot] system|user|singleuser|shutdown [error|panic|*]
+# set the system LEDs to indicate the given boot state, the function
+# will temporarily mount sysfs is necessary (using /mnt)
+#
+# the cases for two LEDs (ready+status)
+sysled_readystatus(){
+ local ready status
+ # expect dir [boot](system|user) [error|panic]
+ case "$3" in
+ error) ready=fast; status=off;;
+ panic) ready=fast; status=fast;;
+ *) case "$2" in
+ bootsystem) ready=slow; status=slow;;
+ system) ready=on; status=on;;
+ bootuser) ready=on; status=slow;;
+ user) ready=user; status=off;;
+ bootsingleuser) ready=on; status=slow;;
+ singleuser) ready=user; status=user;;
+ bootshutdown) ready=on; status=slow;;
+ shutdown) ready=slow; status=on;;
+ esac;;
+ esac
+
+ led_set "$1/$ready_led_name" "$ready"
+ led_set "$1/$status_led_name" "$status"
+}
+#
+# the cases for one LED (just ready)
+sysled_ready(){
+ local ready
+ # expect dir [boot](system|user) [error|panic]
+ case "$3" in
+ error) ready=fast;;
+ panic) ready=panic;;
+ *) case "$2" in
+ bootsystem) ready=flash;;
+ system) ready=blink;;
+ bootuser) ready=slow;;
+ user) ready=user;;
+ bootsingleuser) ready=flash;;
+ singleuser) ready=blink;;
+ bootshutdown) ready=slow;;
+ shutdown) ready=blink;;
+ esac;;
+ esac
+
+ led_set "$1/$ready_led_name" "$ready"
+}
+#
+# the cases for one blue flashing LED (just power)
+sysled_power(){
+ local power
+ # expect dir [boot](system|user) [error|panic]
+ case "$3" in
+ error) power=off;;
+ panic) power=off;;
+ *) case "$2" in
+ bootsystem) power=off;; # blinking
+ system) power=off;; # blinking
+ bootuser) power=on;;
+ user) power=on;;
+ bootsingleuser) power=off;; # blinking
+ singleuser) power=off;; # blinking
+ bootshutdown) power=off;; # blinking
+ shutdown) power=off;; # blinking
+ esac;;
+ esac
+
+ led_set "$1/$power_led_name" "$power"
+}
+#
+sysled(){
+ local mp st boot isst
+ mp=/sys
+ st=1
+ boot=
+
+ # validate arguments
+ if test "$1" = boot
+ then
+ shift
+ boot=boot
+ fi
+ case "$1" in
+ system|user|singleuser|shutdown) :;;
+ *) echo "sysled: unknown option '$1'" >&2
+ echo " usage: sysled [boot] system|user|singleuser|shutdown [error|panic|*]" >&2
+ return 1;;
+ esac
+
+ if test ! -d "$mp/class/leds" && mount -t sysfs sysfs /mnt
+ then
+ mp=/mnt
+ fi
+ #
+ # check for the 'ready' LED - otherwise check for a 'power' LED
+ if test -d "$mp/class/leds/$ready_led_name"
+ then
+ if test -d "$mp/class/leds/$status_led_name"
+ then
+ sysled_readystatus "$mp/class/leds" $boot"$@"
+ else
+ sysled_ready "$mp/class/leds" $boot"$@"
+ fi
+ else
+ if test -d "$mp/class/leds/$power_led_name"
+ then
+ sysled_power "$mp/class/leds" $boot"$@"
+ fi
+ fi
+ #
+ # clean up
+ test "$mp" = /mnt && umount /mnt
+ return "$st"
+}
+
+#
+# beep {arguments}
+# emit a beep
+# does nothing if there is no beep executable, is very
+# quiet in the presence of errors
+beep(){
+ local arg devices module
+ arg=
+ test "$1" = beep && shift
+ if test -x /bin/beep
+ then
+ devices=`ls -d /sys/class/input/event* 2>/dev/null`
+ for device in $devices
+ do
+ module=`egrep PHYSDEVDRIVER $device'/uevent' | cut -d '=' -f 2`
+ if test "$module" = "ixp4xx-beeper";
+ then
+ devnode=`echo "$device" | cut -d '/' -f 5`
+ arg="-e /dev/input/"$devnode
+ break
+ fi
+ done
+ /bin/beep $arg "$@" 2>/dev/null
+ fi
+ return 0
+}
+
+#
+# leds_help
+# be helpful
+# leds <led> off|on|slow|fast|panic|blink|flash|user|*
+# leds [boot] system|user|singleuser|shutdown [error|panic|*]
+leds_help(){
+ echo "leds: change the setting of the LEDs" >&2
+ echo " usage:" >&2
+ echo " leds [boot] system|user|singleuser|shutdown [error|panic|*]" >&2
+ echo " set leds during system boot to indicate a particular boot" >&2
+ echo " state. 'boot' means that the system is transitioning to" >&2
+ echo " the new state. 'error' or 'panic' means a (potentially)" >&2
+ echo " recoverable error or an unrecoverable error ('panic') has" >&2
+ echo " occured." >&2
+ echo " <led> off|on|slow|fast|panic|blink|flash" >&2
+ echo " set the named led to the given display." >&2
+ echo " beep {args}" >&2
+ echo " if possible cause the machine to emit a beep" >&2
+}
+
+# Define the LED names based on kernel version.
+version=$(uname -r | cut -c -6)
+if [ "$version" \< "2.6.25" ]; then
+ status_led_name="status"
+ ready_led_name="ready"
+ power_led_name="power"
+else
+ case "$(machine)" in
+ dsmg600)
+ status_led_name="none"
+ ready_led_name="none"
+ power_led_name="dsmg600:green:power"
+ ;;
+ fsg3)
+ status_led_name="none"
+ ready_led_name="fsg:blue:sync"
+ power_led_name="none"
+ ;;
+ nas100d)
+ status_led_name="none"
+ ready_led_name="none"
+ power_led_name="nas100d:blue:power"
+ ;;
+ nslu2)
+ status_led_name="nslu2:red:status"
+ ready_led_name="nslu2:green:ready"
+ power_led_name="none"
+ ;;
+ esac
+fi
+
+# the real command, if required
+case "$1" in
+boot|system|user|singleuser|shutdown)
+ sysled "$@";;
+
+beep) beep "$@";;
+
+""|-*) leds_help;;
+help) leds_help;;
+
+leds) # just load the functions
+ ;;
+
+*) led_set /sys/class/leds/"$@"
+esac