magic people, voodoo people
(с) Prodigy
Не так давно, на Hack-a-Day увидел забавную статейку, о том, как (sic!) на Raspberry Pi, мужик мигает светодиодами из вебинтерфейса при помощи… apache2 + php + mysql.
Я так и не осилил понять на кой ляд ему потребовался там mysql, тут моя фантазия внезапно закончилась, да и разбираться в его хаке особенно не стал, так как в голову пришло совершенно неадекватнейшее колдунство, которое можно будет легко набросать на баше за пару часов.
Давным давно, еще студентом я видел вот эту статью. 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’е
Я очень сильно удивлен. что идея моего веб-сервера получила такое неожиданное продолжение (да еще и по прошествии стольких лет 🙂
А если учесть, что только вчера ко мне приехала моя Raspberry Pi, я уже знаю, чем займусь на выходных 🙂
@Alexey Sveshnikov: ну распберри у меня под рукой нет, сильно не люблю я броадкомовские чипы, но должно в теории заработать (емнип там gpiolib). Главные грабли — это бизибоксовский ash, с которым у меня подружить все это дело не вышло.
Через -e нетката нельзя передать ash’у аргументы, если как /bin/sh работает ash. Отсюда потребность и в полноценном баше, установленным как /bin/sh, так как он это разруливает.
Если найдется обход без накладывания патча на неткат/бизибокс, буду благодарен 😉