v1.5 branch refresh based upon upstream master @ c8677ca89e53e3be7988d54280fce166cc894a7e
[librecmc/librecmc.git] / package / base-files / files / etc / init.d / led
1 #!/bin/sh /etc/rc.common
2 # Copyright (C) 2008 OpenWrt.org
3
4 START=96
5
6 load_led() {
7         local name
8         local sysfs
9         local trigger
10         local dev
11         local ports
12         local mode
13         local default
14         local delayon
15         local delayoff
16         local interval
17
18         config_get sysfs $1 sysfs
19         config_get name $1 name "$sysfs"
20         config_get trigger $1 trigger "none"
21         config_get dev $1 dev
22         config_get ports $1 port
23         config_get mode $1 mode "link"
24         config_get_bool default $1 default "nil"
25         config_get delayon $1 delayon
26         config_get delayoff $1 delayoff
27         config_get interval $1 interval "50"
28         config_get port_state $1 port_state
29         config_get delay $1 delay "150"
30         config_get message $1 message ""
31         config_get gpio $1 gpio "0"
32         config_get inverted $1 inverted "0"
33
34         if [ "$trigger" = "rssi" ]; then
35                 # handled by rssileds userspace process
36                 return
37         fi
38
39         [ "$trigger" = "usbdev" ] && {
40                 # Backward compatibility: translate to the new trigger
41                 trigger="usbport"
42                 # Translate port of root hub, e.g. 4-1 -> usb4-port1
43                 ports=$(echo "$dev" | sed -n 's/^\([0-9]*\)-\([0-9]*\)$/usb\1-port\2/p')
44                 # Translate port of extra hub, e.g. 2-2.4 -> 2-2-port4
45                 [ -z "$ports" ] && ports=$(echo "$dev" | sed -n 's/\./-port/p')
46         }
47
48         [ -e /sys/class/leds/${sysfs}/brightness ] && {
49                 echo "setting up led ${name}"
50
51                 printf "%s %s %d\n" \
52                         "$sysfs" \
53                         "$(sed -ne 's/^.*\[\(.*\)\].*$/\1/p' /sys/class/leds/${sysfs}/trigger)" \
54                         "$(cat /sys/class/leds/${sysfs}/brightness)" \
55                                 >> /var/run/led.state
56
57                 [ "$default" = 0 ] &&
58                         echo 0 >/sys/class/leds/${sysfs}/brightness
59
60                 echo $trigger > /sys/class/leds/${sysfs}/trigger 2> /dev/null
61                 ret="$?"
62
63                 [ $default = 1 ] &&
64                         cat /sys/class/leds/${sysfs}/max_brightness > /sys/class/leds/${sysfs}/brightness
65
66                 [ $ret = 0 ] || {
67                         echo >&2 "Skipping trigger '$trigger' for led '$name' due to missing kernel module"
68                         return 1
69                 }
70                 case "$trigger" in
71                 "netdev")
72                         [ -n "$dev" ] && {
73                                 echo $dev > /sys/class/leds/${sysfs}/device_name
74                                 echo $mode > /sys/class/leds/${sysfs}/mode
75                                 echo $interval > /sys/class/leds/${sysfs}/interval
76                         }
77                         ;;
78
79                 "timer"|"oneshot")
80                         [ -n "$delayon" ] && \
81                                 echo $delayon > /sys/class/leds/${sysfs}/delay_on
82                         [ -n "$delayoff" ] && \
83                                 echo $delayoff > /sys/class/leds/${sysfs}/delay_off
84                         ;;
85
86                 "usbport")
87                         local p
88
89                         for p in $ports; do
90                                 echo 1 > /sys/class/leds/${sysfs}/ports/$p
91                         done
92                         ;;
93
94                 "port_state")
95                         [ -n "$port_state" ] && \
96                                 echo $port_state > /sys/class/leds/${sysfs}/port_state
97                         ;;
98
99                 "gpio")
100                         echo $gpio > /sys/class/leds/${sysfs}/gpio
101                         echo $inverted > /sys/class/leds/${sysfs}/inverted
102                         ;;
103
104                 switch[0-9]*)
105                         local port_mask speed_mask
106
107                         config_get port_mask $1 port_mask
108                         [ -n "$port_mask" ] && \
109                                 echo $port_mask > /sys/class/leds/${sysfs}/port_mask
110                         config_get speed_mask $1 speed_mask
111                         [ -n "$speed_mask" ] && \
112                                 echo $speed_mask > /sys/class/leds/${sysfs}/speed_mask
113                         ;;
114                 esac
115         }
116 }
117
118 start() {
119         [ -e /sys/class/leds/ ] && {
120                 [ -s /var/run/led.state ] && {
121                         local led trigger brightness
122                         while read led trigger brightness; do
123                                 [ -e "/sys/class/leds/$led/trigger" ] && \
124                                         echo "$trigger" > "/sys/class/leds/$led/trigger"
125
126                                 [ -e "/sys/class/leds/$led/brightness" ] && \
127                                         echo "$brightness" > "/sys/class/leds/$led/brightness"
128                         done < /var/run/led.state
129                         rm /var/run/led.state
130                 }
131
132                 config_load system
133                 config_foreach load_led led
134         }
135 }