Sterowanie LED-ami

Listing zawiera proram umożliwiający sterowanie LED-ami z poziomu przeglądarki WWW.

Należy uruchamiać go jako skryt CGI-BIN z odpowiednimi uprawnieniami do plików w /sys/class/leds. Sposób użycia został opisany w książce.

leds.sh
#!/bin/sh
#Nagłówki odsyłane przez serwer oraz początek strony.
cat << EOF
Content-Type: text/html; charset=UTF-8
Date: $(LANG=C date -u +"%a, %d %b %y %H:%M:%S GMT")
 
<html><head><title>LEDS</title></head><body>
<div>
<form method="GET">
EOF
 
#Obsługa żądania. Najpierw "rozpakowanie".
qled=$(echo "$QUERY_STRING" | cut -d = -f 1)
qled_action=$(echo "$QUERY_STRING" | cut -d = -f 2)
#Następnie użycie w odpowiednim podkatalogu /sys/class/leds.
if [ "$qled" ]; then
  if [ "$qled_action" = "on" ]; then
    #Włącz na stałe
    echo none > /sys/class/leds/$qled/trigger
    echo 255 > /sys/class/leds/$qled/brightness
  elif [ "$qled_action" = "off" ]; then
    #Wyłącz na stałe
    echo none > /sys/class/leds/$qled/trigger
    echo 0 > /sys/class/leds/$qled/brightness
  elif [ "$qled_action" ]; then
    #Uruchom "włącznik"
    echo $qled_action > /sys/class/leds/$qled/trigger
  fi
fi
 
#Wyświetlanie listy - jedna dioda w linii:
for led in /sys/class/leds/*; do
  cd $led
  #Stan jest raportowany jako "jasność": 0-255 w pliku brightness
  if [ $(cat brightness) -eq 0 ]; then
    ON="on"
    OFF="[off]"
  else
    ON="[on]"
    OFF="off"
  fi
  STATE="<a href=\"?$(basename $led)=on\">$ON</a>|\
         <a href=\"?$(basename $led)=off\">$OFF</a>"
 
  #Lista "włączników" - z pliku trigger
  TRIGGER=$(cat trigger | \
    sed -e "s/[[:alnum:]-]*/<a href=\"?$(basename $led)=\0\">\0<\/a>/g")
 
  #Wypisz w linii: nazwę diody, aktualny stan, listę "włączników".
  echo "<p><b>$(basename $led)</b>"
  echo $STATE
  echo $TRIGGER
  echo "</p>"
done
 
#Stopka pliku html.
cat << EOF
</form>
</div>
</body></html>
EOF

UWAGA! - To jest jedynie kod prezentacyjny. Był pisany przed wszystkim po to, żeby pokazać w prosty i przejrzysty sposób możliwości systemu. Nie jest odporny nawer na proste ataki tpypu SQL injection (w tym przypadku raczej code injection).

ostatnio zmienione: 2011/07/18 13:30