pyLCI — внешний интерфейс для Raspberry Pi и других Linux-устройств

Привет!

ca2e7f66ca18476881689a8e933f43a5.jpg

Сегодня я хочу показать вам проект, над которым я работал последние пару лет и наконец выпускаю первую пригодную для использования версию. Это pyLCI — Python-based Linux Control Interface, внешний интерфейс для компьютеров с Linux, который позволяет взаимодействовать с системой посредством символьных дисплеев и кнопок. С помощью написанных под этот интерфейс приложений можно выполнять большое количество задач, связанных с администрированием и настройкой системы, а также запускать различные скрипты и выполнять команды. И всё это — не завися от монитора с клавиатурой!

А ещё мой интерфейс:

  • Дешёвый
  • Простой
  • Легко расширяемый
  • Универсальный


Заинтересованы? Прошу под кат.

Про К^W^W Как всё начиналось
В моей самой первой статье на Хабре я планировал выпустить цикл статей о конфигурировании различных сервисов под Linux на примере EEE Pc 701 с разбитым экраном, который я тогда приобрёл (и успешно использую до сих пор для решения различных задач). Мне не удалось завершить тот цикл, в основном из-за неорганизованности, но ещё и потому, что передо мной остро встала проблема отсутствия нормального интерфейса для упрощения всех моих задач. Я начал писать свою панель управления с веб-интерфейсом, что вылилось в несколько месяцев экспериментирования, которые закончились из-за изначально неверной архитектуры моего творения, как и из-за недостатка знаний о лучших решениях о её выборе (ну и ограниченность денежных средств, чтобы купить дополнительное железо для некоторых ключевых функций). Тем не менее, идея надолго засела у меня в голове и я потихоньку присматривался к уже существующим решениям.

Через год-два я наконец-таки смог начать работать с 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-карту под другим компьютером и править параметры загрузчика… Как по мне, слишком сложно. Неоправданно сложно.

Что делать? Где брать вдохновение для решения всех этих проблем?

image

Вот здесь.
Да, в старых мобильных телефонах. Максимально простые системы меню для конфигурации, которые мы использовали в мобильниках и куче других устройств задолго до появления Raspberry Pi, но почему-то не перенесли дальше, туда, где их сейчас не хватает.

Для чего можно использовать этот интерфейс?

  • Подключение к беспроводным и проводным сетям, получение информации о сетевых подключениях и их настройка
  • Подключение Bluetooth-устройств
  • Управление медиаплеерами и настройка звука
  • Сканирование/печать документов, съёмка фото с помощью камеры
  • Управление запущенными сервисами
  • Резервное копирование данных
  • GPS и навигация
  • Пентестинг

Где можно использовать этот интерфейс?

  • Raspberry Pi и другие SBC под Linux. Замечательная штука, так как отпадает необходимость во втором компьютере для множества рутинных и порой недоступных иначе задач. Подключиться к WiFi без UART и клавиатуры? Без проблем. Выполнить команду shutdown для того, чтобы не попортить SD-карту? Тоже. Запустить какой-то скрипт? Да пожалуйста.
  • Домащние сервера и роутеры. Просматривать список DHCP-клиентов на таком достаточно удобно. Отключить точку доступа WiFi или же запросить новый адрес по DHCP? Зачем для этого лезть в веб-интерфейс? Ещё, к примеру, можно легко блокировать на роутере сайты по списку, когда садишься работать. А ещё можно бекапить внешние носители по команде, сканировать документы, да куча всего — только сделай pyLCI-обёртку для своих скриптов.
  • HTPC. Удобно, чтобы быстро поменять громкость музыки, промотать/переключить трек, приостановить воспроизведение, ну или подключить Bluetooth-колонки.
  • Стационарные компьютеры. Особенно если в качестве стационарного компьютера используется Raspberry Pi =) Даже если нет, это вполне себе хорошее дополнение для изменения настроек системы.
  • Ноутбуки и планшеты под Линукс… Не, ну никто не запрещает ;-)


Недавно я решил сделать pyLCI более доступным для всеобщего использования, и, как результат моей работы, представляю вам версию 1.0.

Что она умеет из коробки?

Пока это довольно маленький список, но его очень легко пополнять. pyLCI — это своего рода фреймворк, который легко расширяем «приложениями» на Python для добавления в него той или иной функции. Этим приложениям он предоставляет устройства ввода-вывода, которые можно использовать для общения с пользователем, как и набор основных элементов UI — вроде элемента меню. Таким образом, при написании приложения можно не концентрироваться на железе или нюансах логики UI (типа вложенных меню) и полностью посвятить себя решению основной цели =)

Какое железо нужно для начала использования?


Нужен HD44780-совместимый дисплей. Типа такого:
image
Постоянный обитатель всяческих starter kits, сам стоимостью около 2$ (eBay).
Ещё нужны кнопки. Типа таких:
image
Или даже в составе этого:
image
Ещё 1–5$. Даже используя I2C-экспандеры (1$ штука), реально уложиться в 7–10$/комплект.
Если точнее, сейчас поддерживаются в основном GPIO-подключённые устройства (для Raspberry Pi) и I2C→GPIO экспандеры, как и USB HID устройства ввода. В планах:

  • Поддержка комбинации Arduino + LCD&button shield для создания простого устройства ввода-вывода, подключающегося по USB. Делов-то — прошивка для Arduino и соответствующий драйвер.
  • Создание беспроводного терминала с LCD и кнопками для управления без тянущихся повсюду проводов (ESP8266?).


Всем заинтересованным предлагаю ознакомиться с документацией, ну и инструкцией по установке. Интересует разработка своего приложения? У меня есть небольшой crash course и примеры в качестве кода уже написанных приложений.

Из недостатков:

  1. Вся система на данный момент — это один процесс, включая и приложения. В связи с этим и возможным количеством настроек, которые система должна иметь возможность менять, среднестатистическому пользователю её легче запустить под рутом, чем настраивать все необходимые пермишены. Если есть необходимость, могу перечислить, какие groups/permissions нужны для конкретных приложений и способов подключения IO.
  2. Я написал скрипты установки только для Debian/Raspbian. Буду признателен, если кто-то сможет помочь с добавлением поддержки других дистрибутивов в install.sh, config.sh и update.sh.
  3. Также нет скрипта для sysvinit — на данный момент всё заточено под systemd. Если у кого есть подходящий проверенный скрипт для переделки, прошу поделиться =)
  4. Если давать pyLCI клавиатуру, оно захватывает её всю. Это печально, ведь было бы круто использовать одну клавиатуру и для X, и для pyLCI — использовать стрелки нумпада (активны, когда отключён NumLock) для навигации и поставить рядом экранчик. Думаю скоро добавить возможность «выбрасывать» обратно в систему неиспользуемые активным приложением коды клавиш, если используется драйвер HID =)

Пожалуй, на этом на сегодня закончу. Меня очень интересует ваше мнение о моей идее/реализации, как и то, заинтересованы ли вы её использовать для своих Linux-устройств. Здесь можно оценить планы на ближайшее будущее системы, как и примерный список приложений, которые будут добавлены в стандартную поставку в будущем.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

© Geektimes