Привет!



Сегодня я хочу показать вам проект, над которым я работал последние пару лет и наконец выпускаю первую пригодную для использования версию. Это 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-устройств. Здесь можно оценить планы на ближайшее будущее системы, как и примерный список приложений, которые будут добавлены в стандартную поставку в будущем.
Вы бы использовали такой интерфейс на своём Linux-устройстве?

Проголосовало 99 человек. Воздержалось 52 человека.

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

Комментарии (30)


  1. Hellsy22
    03.04.2016 11:46

    Зачем для этого лезть в веб-интерфейс?

    Было бы неплохо четко описать, что предлагается в качестве альтернативы. Вот я почему-то решил, что мне вебинтерфейс на роутере под OpenWRT больше не мил и я почему-то не хочу сделать значок на рабочем столе, который отправит этому роутеру команду по ssh. Что вы предлагаете в качестве решения? Как это будет выглядеть? Сколько времени настраиваться? Какие преимущества будут получены?


    1. CRImier
      03.04.2016 12:07

      В случае с роутером, в идеале, предлагается подключить по USB/WiFi девайс с экранчиком и кнопками, который будет предоставлять панель управления роутером с возможностью наблюдения за параметрами системы (нагрузка, uptime, скорость на интерфейсах), изменения IP адресов, просмотра выданных DHCP-сервером адресов, блокировки MAC и тому подобных задач. К примеру, хочешь отмонтировать внешний жёсткий, подключённый к роутеру? Просто возьми девайс в руки, выбери приложение управления точками монтирования, выбери диск и пункт unmount в меню — всё в непосредственной близости от роутера и диска. По сути, подошёл к роутеру, потыкал кнопочки, готово.
      Ещё одно преимущество системы — через какое-то время использования её на десктопе я начал воспринимать её как системный трей. Громкость, по крайней мере, там настраивать удобнее, да и треки переключать во время работы не так напряжно =)
      Сколько времени настраиваться? Я сейчас в основном тестирую чистую установку по собственноручно написанному гайду. Сегодня утром взял недавно полученную Raspberry Pi 3, USB numpad и I2C дисплей. От чистой Raspbian Jessie до рабочей установки pyLCI прошло где-то минут 20 — и это я ещё решил проблему DNS и поменял случайно взятый нерабочий дисплей на другой.
      (Кстати говоря, такие интерфейсы на своих SOHO-роутерах делает MikroTik и у них довольно неплохо получается. И ещё — к UCI (конф. система OpenWRT) довольно легко цепляться через консольные команды, что является, по моему опыту, одним из самых удобных векторов взаимодействия в рамках pyLCI. На OpenWRT я свою систему ещё не тестировал, но одной из целей моего недавнего рефакторинга было именно исключение зависимостей, которые могут не быть доступны под OpenWRT.)


      1. Hellsy22
        03.04.2016 14:55

        Что из себя представляет "девайс с экранчиком и кнопками"?


        1. CRImier
          03.04.2016 19:32

          Комбинация из HD44780-совместимого экрана и кнопок. Могут висеть на как одном интерфейсе (экран I2C + кнопки I2C, или Ардуино с шилдом), так и на разных (кнопки USB + экран GPIO). Как оба подключены, так и сойдёт — главное, чтобы можно было получать информацию с кнопок и передавать её на дисплей =)


          1. Hellsy22
            04.04.2016 09:01

            Если у вас уже есть Arduino, на который все равно придется писать какой-то скетч, то зачем нужна библиотека на питоне? Отправить запрос по USB и прочитать ответ можно даже средствами bash.


            1. CRImier
              04.04.2016 10:05

              … Таким образом перекинув наиболее сложную часть в код на МК. Это совсем не цель этого проекта. pyLCI — это фреймворк, легко расширяемый приложениями на Питоне, как и различными устройствами ввода и вывода. Он позволяет быстро добавлять новые функции, которые он может выполнять. Это немного больше "библиотеки", и не совсем влезает в МК — да и не место там ему, слишком много ограничений.
              Да, на Ардуино можно сделать терминал через UART. Можно даже разговаривать с USB через Bash. Но в данном случае Arduino+шилд работают как просто мост USB->LCD&кнопки. Не в последнюю очередь потому, что такая комбинация — простой способ поддерживать компьютеры только с USB, а ещё она есть у некоторых людей, которые интересуются pyLCI.


              1. Hellsy22
                04.04.2016 12:08

                Да нет, на МК сохраняется ровно тот же самый код — опрос состояний кнопок и управление LCD. От этого все равно никуда не деться.
                Собственно, суть моего вопроса была в практичном применении, ведь обычно фреймворки создаются для того, чтобы что-то упростить. Вот я и пытаюсь понять, что именно этот фреймворк упрощает. Пока все выглядит как странный и ресурсоемкий способ решать элементарные задачи. Я даже посмотрел список применений на сайте и все равно в недоумении — зачем питон, если все равно все делается через обращения к внешним утилитам (типа amixer, shutdown и т.д.)


                1. CRImier
                  04.04.2016 12:31

                  Он упрощает взаимодействие между пользовательскими приложениями и устройствами ввода-вывода, предоставляя hardware abstraction layer, элементы UI и возможность сосуществования приложений. Кроме всего прочего, для него не нужен МК. Достаточно GPIO, доступных из Linux, или I2C, или UART, или вообще HID. Всё благодаря HAL. Благодаря Python можно легко делать гибкий и мощный интерфейс, да ещё и язык достаточно простой и в то же время распространённый для того, чтобы иметь низкий порог вхождения.
                  Используя pyLCI, можно сконцентрироваться непосредственно на главной цели приложения.


                  1. Hellsy22
                    04.04.2016 13:17

                    возможность сосуществования приложений

                    Это интересно. Но хотелось бы конкретных примеров. И, если уж речь идет об слое абстракции, то хотелось бы прояснить ряд моментов — как сервис узнает о том, что подключено, скажем, к Arduino воткнутому в роутер через USB? Нужна какая-то специфическая прошивка для Arduino или есть коммуникационный протокол? Как присваиваются имена найденным устройствам и субустройствам (кнопкам, экранам и т.д.)?
                    язык достаточно простой и в то же время распространённый

                    Этот язык прожорливее Явы и медленнее JS. Это неважно на десктопах и серверах, но может оказаться очень неприятным на слабых роутерах и SoC. Отдельно хочу отметить, что установщик pyLCI заточен под apt, который есть не везде, а конфигурация службы под systemd — на роутерах с OpenWRT вроде как используется init.d


                    1. CRImier
                      04.04.2016 15:25

                      Нужна какая-то специфическая прошивка для Arduino или есть коммуникационный протокол?

                      Прошивка для Arduino и драйвер pyLCI для передачи команд по последовательному порту. На Arduino можно передавать команды HD44780, а принимать коды нажатых клавиш. Предельно просто =)
                      Как присваиваются имена найденным устройствам и субустройствам (кнопкам, экранам и т.д.)?

                      Конфиги, конфиги и ещё раз конфиги (на самом деле, всего один файл ;-) ) Автоматическое использование всех сколь-либо подходящих устройств, т.е., по сути, автоконфигурация — на первый взгляд звучит здорово, но не могу даже придумать ситуацию, где это доставило бы больше преимуществ, чем проблем. Захватывать автоматически HID устройства — катастрофа, захватишь основную клавиатуру и в систему нормально не войдёшь. Сканить GPIO — дохлый номер. I2C — по нему много что подключено, и выглядит в принципе одинаково. А софт, который у меня на Линуксе посылал AT во все доступные порты каждые 10 секунд, (modemmanager вроде) я прибил с особой жестокостью, врагу не пожелаю. Так что — whitelists и конфиги с чётко заданными параметрами.
                      экранам

                      В конфиге же указывается размер дисплея, если он больше 16x2 (значение по умолчанию). Дисплей пока поддерживается только один. По сути, работа с интерфейсом со стороны пользователя однопоточная =) Прикол в том, что много дисплеев — это дико широкая штука. У каждого своё представление, как оно работает, и мало у кого это представление легко перекладывается на реальность. Сделать универсальную многодисплейную среду — большая работа. И ещё — для просто вывода информации на дополнительные экраны давно есть LCDproc. Работает, проверено временем.
                      А вот возможность подключения больше одного устройства ввода будет в этом месяце =)
                      Этот язык прожорливее Явы и медленнее JS.

                      Уж точно не прожорливее Явы. Медленнее JS? Возможно, но в оптимизацию JS-движков вкладываются большие деньги. Кроме всего прочего, ядро использует стандартные библиотеки Python 2.7 и не занимает слишком много памяти — да и в случае необходимости можно пожертвовать отзывчивостью интерфейса =)
                      Отдельно хочу отметить, что установщик pyLCI заточен под apt, который есть не везде, а конфигурация службы под systemd — на роутерах с OpenWRT вроде как используется init.d

                      Да, я это указал в конце статьи. Но насчёт отсутствия фундаментальных несовместимостей я позаботился, насколько мог =)
                      Сюда уже смотрели? По сути, Hello World.


  1. DMGarikk
    03.04.2016 12:10

    Ух круто!
    Я ща делаю проектик для carpc, всё никак никак не напишу статью сюда о нём… часть функционала по рисованию интерфейсов пересекается с вашим проектом… блин ща убегать надо, не успею поподробнее почитать.
    P.S. Ещё кстати актуально не только текстовыми дисплеями ограничиватся, но и чемнить типа oled 128x64 и с возможностью объединения их в группы


    1. CRImier
      03.04.2016 13:27

      Проблема с не-текстовыми дисплеями — нужно написать драйвер со слоем абстракции для трансляции текста в пиксели, а это время, которого у меня пока что не так много. Ещё встревает то, что у меня пока нет таких OLED =) А вот 16х2 дисплеев у всех навалом. И ещё — я сейчас стараюсь сделать HD44780 дисплеи до конца — отловить баги, проверить с разными размерами, добавить драйверов для различных шилдов, потом уже можно думать.
      Объединять в группы, конечно, тоже хорошая идея, но, как и с предыдущим пунктом, нужно сначала хорошо всё распланировать. Кстати, можете чуть поподробнее описать, как Вы себе представляете такое объединение? А то вариантов больше, чем один =)
      Насчёт логики — у меня есть код для создания меню (ui/menu.py), к примеру. Не проверял, но по результатам последнего рефакторинга должен растягиваться на неограниченное кол-во строк. Так что — используйте на здоровье =)


      1. DMGarikk
        04.04.2016 10:41

        вот например в моей реализации автокомпа будет суммарно три (четыре в идеале) дисплея, один отладочный текстовый 16x2, два OLED в мангитоле и дополнительный на месте штатного компа авто.
        И тут например нужно управление ими в одном контексте, например при выборе пунктов меню на 1 дисплее меняет содержимое второго (например список приложений слева, его показатели нагрузки справа)
        либо например на одном отображается список пунктов меню, во втором загрузка процессора и т.п., в третьем мониторинг какойнить железяки.


        1. CRImier
          05.04.2016 12:16

          У меня есть несколько идей на этот счёт.
          Прежде всего, есть LCDproc. Это похожее и давно существующее решение, которое пересекается с целью моего, но не совсем. Оно позволяет выводить на дисплеи всякую статистику, данные плеера и прочее. Если вам просто нужно выводить обновляющуюся информацию — для этого можно использовать LCDproc.
          Ещё — используя pyLCI, можно выдавать отдельным приложениям отдельные дисплеи. Дисплей с меню — отдельный, для какого-то приложения — второй, для ещё какого-то — третий. Фича ещё не готова, но много времени не займёт — просто пока нет актуального юзкейса.


  1. DoMoVoY
    03.04.2016 12:10

    помимоописания желательно добавить примеры фото/видео. И при описании возможностей непонятна архитектура и пути взаимодействия.


    1. CRImier
      03.04.2016 13:16

      Видео добавил, сейчас сделаю главное фото получше =)
      Насчёт архитектуры — могу скоро сделать пост, где напишу простое приложение (одно из запланированных на ближайшее время) и заодно объясню архитектуру. Вас заинтересовал бы такой пост?
      Пока что можно почитать main.py, если интересует ядро. Правда, это один из файлов, на который пока нет страницы RTD — но в течение недели я её напишу.


  1. IgorGIV
    03.04.2016 13:10

    За кассу из спичечных коробков 5+!!! ;)


    1. CRImier
      03.04.2016 13:17

      Заметили же где-то =) У меня таких много, в этой просто наиболее часто используемые детали.


  1. Rumlin
    03.04.2016 14:13

    По-моему экран маловат. Надо добавить возможность подключения многострочного экрана.


    1. CRImier
      03.04.2016 22:38

      Для простых задач по администрированию всё можно уложить в две-четыре строки =) А так — да, согласен. Потом буду экспериментировать с TFT и OLED.


      1. Rumlin
        04.04.2016 13:52

        По-моему кто-то публиковал хабре статью по простому подключению терминала по bluetooth к смартфону. Т.е. "штатными средствами" на COM-Bluetooth и на телефоне программа BT-Terminal


        1. CRImier
          05.04.2016 12:17

          Да, я так давно делал сам с Raspberry Pi и HC-05 =) У этого своё применение и свои ограничения.


          1. Rumlin
            05.04.2016 12:21

            По крайней мере планшет с клавиатурой очень близок к "Создание беспроводного терминала с LCD и кнопками для управления без тянущихся повсюду проводов "


            1. CRImier
              05.04.2016 12:29

              Тут прикол ещё и в системе приложений и дешёвом железе, которое можно прикрепить и оставить, как я сейчас делаю со своими девайсами =) А ещё — носимые устройства, встраиваемые интерфейсы, гибкость и тому подобное. Да, консоль — это круто. GUI — тоже. Но есть ниша, которую не занимает ни один, ни другой.


  1. eta4ever
    03.04.2016 17:00

    Гм. А если зайти с другого бока и сделать терминал для UART в таком же форм-факторе...


    1. CRImier
      03.04.2016 22:36

      Это отдельный проект, но тоже достаточно неплохой. С другой стороны, как терминал для UART я использую Asus EEE PC. Клавиатура лучше, экран большой, ещё и SSH поддерживает ;-)


      1. eta4ever
        03.04.2016 22:40

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


        1. CRImier
          03.04.2016 22:45

          Да, что-то типа алгоритма expect в железе с HID input =) Это, конечно, идея со своими закавыками, но это одна из моих целей для носимого компьютера — использовать Arduino Pro Micro как UART2HID адаптер, чтобы иметь пассворд-менеджер, управление компьютером и тому подобное — и всё по USB/wireless с компьютера на теле.


  1. hababr
    03.04.2016 19:24

    Идея хорошая, думаю надо найти единомышленников, доработать, секретов не раскрывать. Мое виденье — это консоль, должна быть универсальной для разных платформ (различаться будет програмная часть), дисплей большой OLED, клавишами можно поиграться — забить на кнопки спец функции, заменить на микрики или сенсорные… и тп и тд много идей… Свой ум и действие надо продавать…
    Ска жем я как потребитель был бы рад видеть такую штуку у себя на стене — в плане консоли управления умным домом, температура и тп


    1. CRImier
      03.04.2016 19:45
      +1

      Секретов… Оно всё Open-source =) А вот слой для спецфункций на клавиши уже в планах. С разными ОС немного сложнее, но тоже возможно.
      Никто не мешает, в принципе, продавать готовые устройства для подключил-и-консоль. Если оно будет более-менее успешным, буду делать Кикстартер для распространения таких устройств. Ну а пока что просто постараюсь поддерживать как можно больше уже существующих =)