bash + netcat + javascript + html + css = gpiohttpd

magic people, voodoo people

(с) Prodigy

Не так давно, на Hack-a-Day увидел забавную статейку, о том, как (sic!) на Raspberry Pi, мужик мигает светодиодами из вебинтерфейса при помощи… apache2 + php + mysql.
Я так и не осилил понять на кой ляд ему потребовался там mysql, тут моя фантазия внезапно закончилась, да и разбираться в его хаке особенно не стал, так как в голову пришло совершенно неадекватнейшее колдунство, которое можно будет легко набросать на баше за пару часов.

shot

Давным давно, еще студентом я видел вот эту статью. Cобственно, тот однострочник я и взял за основу, и начал танцевать именно от него, добавляя функционал.

Итак, для этого колдунства нам потребуется:

  • Какой-нибудь старый треш, с линуксом и gpio через gpiolib для отладки (я юзал MW150R, да, тот самый который «прокачал» малость с VwWorks до OpenWRT)
  • OpenWRT или другая прошивка где есть netcat (а не busybox’овский огрызок)

Волшебные заклинания я писал в один единственный файл gpiohttpd.sh сразу на нескольких языках для особо сильной магии:

  • bash
  • css
  • javascript
  • html

В итоге вышло что-то около 500 строк особой магии.

Собственно, действует оно просто. Без аргументов скрипт запускает netcat в цикле, который слушает соединения. Для каждого соединения спавнит себя самого с аргументом loop, который генерит страничку и выходит. Соответственно, неткат после этого тоже закрывает соединение, и цикл перезапускается.  Львиная доля магии висит на жабаскрипте, который пинает ajax’ом каждую секунду сервер, проверяя не изменилось ли состояние gpio, и сразу обновляет их на вебстраничке. Малейшее изменение формы — и мы аяксом отправляет запрос на сервер.

Применение — поиск gpio ног, куда подключены кнопки и диоды при портировании OpenWRT на свежедобытый роутер.

Проблемы.

Куда без них. Оказалось, что бизибоксовский ash неткат не может вызвать с аргументом, потому

netcat -vlp 8080 -e «gpiohttpd»

Не работает вообще никак, ровно как и мы не можем вызвать таким образом программу с аргументом. фейл.  Выход тут — патчить бизибокс, патчить неткат, делать сишную обертку или же — собирать полноценный баш со всеми плюшками. Последнее казалось мне путем наименьшего сопротивления, потому я собрал баш, и убедился, что оно работает.

Исходный код этой поделки можно стащить у меня на github’е

bash + netcat + javascript + html + css = gpiohttpd: 2 комментария

  1. Я очень сильно удивлен. что идея моего веб-сервера получила такое неожиданное продолжение (да еще и по прошествии стольких лет 🙂

    А если учесть, что только вчера ко мне приехала моя Raspberry Pi, я уже знаю, чем займусь на выходных 🙂

  2. @Alexey Sveshnikov: ну распберри у меня под рукой нет, сильно не люблю я броадкомовские чипы, но должно в теории заработать (емнип там gpiolib). Главные грабли — это бизибоксовский ash, с которым у меня подружить все это дело не вышло.
    Через -e нетката нельзя передать ash’у аргументы, если как /bin/sh работает ash. Отсюда потребность и в полноценном баше, установленным как /bin/sh, так как он это разруливает.
    Если найдется обход без накладывания патча на неткат/бизибокс, буду благодарен 😉

Добавить комментарий