Привет!
Сегодня я хочу показать вам проект, над которым я работал последние пару лет и наконец выпускаю первую пригодную для использования версию. Это pyLCI — Python-based Linux Control Interface, внешний интерфейс для компьютеров с Linux, который позволяет взаимодействовать с системой посредством символьных дисплеев и кнопок. С помощью написанных под этот интерфейс приложений можно выполнять большое количество задач, связанных с администрированием и настройкой системы, а также запускать различные скрипты и выполнять команды. И всё это — не завися от монитора с клавиатурой!
А ещё мой интерфейс:
- Дешёвый
- Простой
- Легко расширяемый
- Универсальный
Заинтересованы? Прошу под кат.
Через год-два я наконец-таки смог начать работать с Raspberry Pi. Это было интересно, и я придумал для себя новый проект — устройство с Raspberry Pi и множеством дополнений, которые бы превращали её в более-менее сравнимый по функционалу компьютер. Его планировалось вставлять в отсек 5.25 персонального компьютера, вывести провода на заднюю панель, подключить HDMI-кабелем к монитору и использовать как плеер/лёгкий браузер/т.п. Довести проект до логического завершения не получилось — не хватало лёгкого интерфейса управления этим добром. Были безуспешные попытки подключить экран от Нокии 3310 для вывода хоть чего-то, но одного лишь экрана всё равно не хватало…
Что ж, не вышло — так не вышло. Через какое-то время я заинтересовался носимыми компьютерами. Не в последнюю очередь из-за Fallout с извечным Pip-Boy, в интерфейсе которого я тогда проводил много времени ;-) Pip-Boy меня заинтересовал, но не только тем, что с его помощью можно было вылечиться перед очередной перестрелкой. Я уже какое-то время чувствовал, сколько скрытого потенциала есть в Linux-устройствах — Android тому примером. Проблемы начинаются около UI.
UI — одна из проблем, из-за которой я забросил свою панель управления. UI с нуля определять не так и просто — нужно знать, где дать свободу, а где ограничить пользователя твоего UI и того, кто будет на его основе создавать приложения.
А ещё UI сейчас в основном приспособлены под графические дисплеи. Которые огромны, неудобны и легко бьются, ну и так далее. Везёт, если есть тачскрин. Если нет — вози мышкой. Возвращаясь к носимым компьютерам — какая, к чёрту, носимость с огромным дисплеем?
Через какое-то время я полностью погряз в Raspberry Pi. Сейчас у меня в комнате под разные задачи приспособлены 4 штуки, ещё 2 свободны. Проблемы с их настройкой — нужно либо по сети лезть, либо по UART. По сети — какой там IP? Он вообще получен? А то что-то роутер молчит… UART? Ага, если только он не отключен. Был случай, когда пришлось монтировать SD-карту под другим компьютером и править параметры загрузчика… Как по мне, слишком сложно. Неоправданно сложно.
Что делать? Где брать вдохновение для решения всех этих проблем?
Вот здесь.
Да, в старых мобильных телефонах. Максимально простые системы меню для конфигурации, которые мы использовали в мобильниках и куче других устройств задолго до появления Raspberry Pi, но почему-то не перенесли дальше, туда, где их сейчас не хватает.
Для чего можно использовать этот интерфейс?
- Подключение к беспроводным и проводным сетям, получение информации о сетевых подключениях и их настройка
- Подключение Bluetooth-устройств
- Управление медиаплеерами и настройка звука
- Сканирование/печать документов, съёмка фото с помощью камеры
- Управление запущенными сервисами
- Резервное копирование данных
- GPS и навигация
- Пентестинг
Где можно использовать этот интерфейс?
- Raspberry Pi и другие SBC под Linux. Замечательная штука, так как отпадает необходимость во втором компьютере для множества рутинных и порой недоступных иначе задач. Подключиться к WiFi без UART и клавиатуры? Без проблем. Выполнить команду shutdown для того, чтобы не попортить SD-карту? Тоже. Запустить какой-то скрипт? Да пожалуйста.
- Домащние сервера и роутеры. Просматривать список DHCP-клиентов на таком достаточно удобно. Отключить точку доступа WiFi или же запросить новый адрес по DHCP? Зачем для этого лезть в веб-интерфейс? Ещё, к примеру, можно легко блокировать на роутере сайты по списку, когда садишься работать. А ещё можно бекапить внешние носители по команде, сканировать документы, да куча всего — только сделай pyLCI-обёртку для своих скриптов.
- HTPC. Удобно, чтобы быстро поменять громкость музыки, промотать/переключить трек, приостановить воспроизведение, ну или подключить Bluetooth-колонки.
- Стационарные компьютеры. Особенно если в качестве стационарного компьютера используется Raspberry Pi =) Даже если нет, это вполне себе хорошее дополнение для изменения настроек системы.
- Ноутбуки и планшеты под Линукс… Не, ну никто не запрещает ;-)
Недавно я решил сделать pyLCI более доступным для всеобщего использования, и, как результат моей работы, представляю вам версию 1.0.
Что она умеет из коробки?
- Подключаться к беспроводным сетям (больше информации здесь)
- Просматривать IP/MAC адреса интерфейсов
- Менять громкость
- Переключать треки в консольном плеере (как пример, я использую MOCP).
- Сканировать I2C шину на наличие девайсов
- Выключать и перезагружать компьютер
Пока это довольно маленький список, но его очень легко пополнять. pyLCI — это своего рода фреймворк, который легко расширяем «приложениями» на Python для добавления в него той или иной функции. Этим приложениям он предоставляет устройства ввода-вывода, которые можно использовать для общения с пользователем, как и набор основных элементов UI — вроде элемента меню. Таким образом, при написании приложения можно не концентрироваться на железе или нюансах логики UI (типа вложенных меню) и полностью посвятить себя решению основной цели =)
Какое железо нужно для начала использования?
Нужен HD44780-совместимый дисплей. Типа такого:
Постоянный обитатель всяческих starter kits, сам стоимостью около 2$ (eBay).
Ещё нужны кнопки. Типа таких:
Или даже в составе этого:
Ещё 1-5$. Даже используя I2C-экспандеры (1$ штука), реально уложиться в 7-10$/комплект.
Если точнее, сейчас поддерживаются в основном GPIO-подключённые устройства (для Raspberry Pi) и I2C->GPIO экспандеры, как и USB HID устройства ввода. В планах:
- Поддержка комбинации Arduino + LCD&button shield для создания простого устройства ввода-вывода, подключающегося по USB. Делов-то — прошивка для Arduino и соответствующий драйвер.
- Создание беспроводного терминала с LCD и кнопками для управления без тянущихся повсюду проводов (ESP8266?).
Всем заинтересованным предлагаю ознакомиться с документацией, ну и инструкцией по установке. Интересует разработка своего приложения? У меня есть небольшой crash course и примеры в качестве кода уже написанных приложений.
Из недостатков:
- Вся система на данный момент — это один процесс, включая и приложения. В связи с этим и возможным количеством настроек, которые система должна иметь возможность менять, среднестатистическому пользователю её легче запустить под рутом, чем настраивать все необходимые пермишены. Если есть необходимость, могу перечислить, какие groups/permissions нужны для конкретных приложений и способов подключения IO.
- Я написал скрипты установки только для Debian/Raspbian. Буду признателен, если кто-то сможет помочь с добавлением поддержки других дистрибутивов в install.sh, config.sh и update.sh.
- Также нет скрипта для sysvinit — на данный момент всё заточено под systemd. Если у кого есть подходящий проверенный скрипт для переделки, прошу поделиться =)
- Если давать pyLCI клавиатуру, оно захватывает её всю. Это печально, ведь было бы круто использовать одну клавиатуру и для X, и для pyLCI — использовать стрелки нумпада (активны, когда отключён NumLock) для навигации и поставить рядом экранчик. Думаю скоро добавить возможность «выбрасывать» обратно в систему неиспользуемые активным приложением коды клавиш, если используется драйвер HID =)
Пожалуй, на этом на сегодня закончу. Меня очень интересует ваше мнение о моей идее/реализации, как и то, заинтересованы ли вы её использовать для своих Linux-устройств. Здесь можно оценить планы на ближайшее будущее системы, как и примерный список приложений, которые будут добавлены в стандартную поставку в будущем.
Автор: CRImier