Привет, читатель!

В начале июня я опубликовал обзор на смартфон с ОС «Аврора». После этого взялся изучать документацию к SDK, решил написать пару небольших приложений и портировать один проект на телефон. В процессе понял, что для выполнения команд, просмотра файлов и доставки пакетов требуется консоль. В какой-то момент стало любопытно покопаться и посмотреть, какие приложения есть в репозиториях «Авроры» и с чем из этого можно поиграться. Выбор оказался весьма широк, но самым интересным для меня был исполнитель интерпретируемого языка. Если вам интересно, какой код можно запустить со смартфона на «Авроре» и какие могут возникнуть нюансы, прошу под кат!

Используйте оглавление, если не хотите читать текст полностью:

Подготовка
Настройка окружения
ShareMeet
SQLite
Заключение

Подготовка


Как подготовить смартфон


Большинство настроек будем проводить через терминал, как в серверной версии Linux-системы. Если любите хардкор, можно вбивать команды в консольном приложении телефона. Чуть удобнее делать это с помощью клавиатуры, подключенной по проводу или через Bluetooth.

Однако для максимального комфорта предлагаю подключиться к смартфону по SSH. Это значительно упростит ввод команд и копирование, а также позволит работать через любимую IDE. OpenSSH server есть в репозиториях, но завести его для работы на версии ОС 4.0 не удалось.

Итак, переходим в меню смартфона по пути НастройкиСистемаСредства разработчика, включаем режим разработчика и задаем пароль для подключения.


Настройки → Система → Средства разработчика.

Далее идем в НастройкиСистемаАдминистрирование, указываем пароль для администратора и включаем приложение терминала.


Настройки → Система → Администрирование.

Как подготовить сеть


Если в домашней сети есть доступ к панели управления маршрутизатором, рекомендую выставить в его настройках DHCP статический IP-адрес для телефона. Это позволит подключаться к устройству по одному и тому же адресу как из консоли, так и при отладке приложения из IDE.


Пример на MikroTik (другого маршрутизатора у меня нет, но подход аналогичен).

Для подключения к консоли телефона возможны и другие варианты: раздать Wi-Fi с другого телефона, использовать мобильный интернет или же подключиться кабелем Type-C, установив дополнительно соответствующие драйвера. Альтернативный вариант — подключить USB сетевую карту и патчкордом подцепить интернет — возможности ограничены только фантазией! Способ подключения зависит только от того, как вам удобнее работать.


После подключения к одной локальной сети любым из способов выше можно выполнить тестовое подключение к телефону. Рекомендую сразу обменяться ключами, это позволит подключаться без ввода пароля. Обратите внимание, если будете использовать подключение из среды разработки, указывайте одинаковые пути к ключам SSH.

Процесс настройки SSH-авторизации по ключу и разбор некоторых ошибок описан в Академии Selectel.

ssh-copy-id defaultuser@IP //IP - адрес телефона в локальной сети
ssh defaultuser@IP


Указывайте тот же ключ в настройках среды разработки «Авроры».

Установка пакетов


Python не установлен по умолчанию в используемой версии ОС, но это не проблема. Помню, лет восемь назад пытался проделать такую операцию со смартфоном на Android — сплошные костыли и никакого удовольствия. За это время, на мой взгляд, мало что изменилось. И хотя в Git и Play Market есть нужные пакеты, подходящих устройств для проверки на рынке не появилось. В «Аврору» же Python добавляется одной командой:

devel-su // переходим в суперпользователя
pkcon install python3 git nano



Настройка окружения


С давних пор являюсь сторонником использования venv+pip в качестве инструментов для работы с Python. Да, виртуальная среда весит довольно много. Однако она позволяет поставить необходимые библиотеки для работы, не засоряя системные пути. Создаем директорию проекта и в ней venv для сервера:

python3 -m venv venv && source venv/bin/activate
python3 -m pip install flask

Если проект запушили в систему контроля версий (GitLab, GitHub, Bitbucket), просто склонируйте его, создайте venv и разверните библиотеки:

git clone … 
cd project
python3 -m venv venv && source venv/bin/activate
python3 -m pip install -r requirements.txt

В начале решил проверить, запустится ли вообще веб-сервер. Для этого взял пример с официального туториала Flask, быстро накидал файлы приложения, HTML-странички и докинул таблицы стилей. В короткие сроки получил рабочее приложение:


Простая страничка, развернутая на карманном сервере с экраном.

Просто так запускать одну страничку не особо интересно, поэтому с женой за пару вечеров написали небольшое приложение ShareMeet. Результат работы лежит в открытом репозитории GitHub.

ShareMeet


Мы написали приложение, которое позволяет устройствам обмениваться трафиком через TCP-порты в одной сети Wi-Fi (если настройки самой сети этого не запрещают). Это актуально, например, на конференциях, когда нужно оперативно отправить кому-то совместное фото или видео с проведенным только что экспериментом.

Выкладывать файлы в облако и пересылать ссылку не всегда удобно: скорость соединения может быть невысокой, а заинтересованному лицу нужно бежать. Так и возникло предложение: сделать небольшой файлообменник, который можно «натравить» на папку в системе и позволять клиентам скачивать оттуда материалы.


MVP — три страницы основного функционала.

MVP приложения было получено за первый вечер: сервис позволяет скачивать файлы из локальной директории. При разворачивании приложения на «мобильном сервере» потребовалось доставить дополнительные пакеты и библиотеки Python:

# pkcon install python3-devel gcc gcc-c++
$ python3 -m pip install flask flask-dotenv // в активированном venv

Как теперь пользователям сказать, где они могут оперативно скачать ваши файлы? Сделаем простенький генератор QR-кодов с ссылкой на наше устройство. Изначально планировал для этого использовать библиотеку flask-qrcode, чтобы генерировать и на лету отдавать картинку в браузер. Однако она требует библиотеку pillow, которая, в свою очередь, хочет множество установленных пакетов в ОС. Части из них под «Аврору» 4.0 не было. Пришлось делать обходное решение на базе библиотеки qrcode.

Она умеет на лету генерировать QR-коды в форматах PNG или SVG. Последний является нативным для HTML. Генерируем картинку следующим кодом:

ip = [(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]
link = f'http://{ip}:5000/shared_files'
qr_link = qrcode.make(link,
        image_factory=qrcode.image.svg.SvgPathImage)
qr_svg = qr_link.to_string(encoding='unicode')

И встраиваем в страницу:

<div>
{{ svg_img|safe }}
</div>

Как видно выше, код для определения адреса интерфейса тоже не самый оптимальный. Изначальный вариант был на порядок короче, но библиотека socket некорректно выполняет запрос и не получает адрес на интефрейсе.

socket.gethostbyname(socket.gethostname()) # вариант получения IP адреса интерфейса

SQLite


Дополнительно добавили форму для обратной связи. А чтобы хранить отзывы, пригодится база данных. В репозиториях создателей «Авроры» нашлись пакеты СУБД SQLite. Это отличный вариант для разработки MVP. Да, по сути это набор библиотек, который позволяет обращаться к файлу формата db.

Доставляем новые библиотеки и библиотеки:

#pkcon install sqlite python3-sqlite
$python3 -m pip install flask-sqlalchemy // в активированном venv

Подготавливаем код структуры БД в Python. Необходима одна таблица с данными: кто, во сколько и что написал. Дополнительно предложим пользователям оставить контакт, по которому с ним можно связаться:

class Comments(db.Model):
    id: so.Mapped[int] = so.mapped_column(primary_key=True)
    name: so.Mapped[str] = so.mapped_column(sa.String(256), index=True)
    contact: so.Mapped[Optional[str]] = so.mapped_column(sa.String(256))
    comment: so.Mapped[str] = so.mapped_column(sa.String(1000))
    create_date: so.Mapped[datetime] = so.mapped_column(default=lambda: datetime.now(timezone.utc))

Применяем миграцию для формирования файла базы данных:

python3 -m flask db init

Далее создаем маршрут, который отдает страницу с формой, получает от нее ответ и записывает полученную информацию в БД:

@app.route('/add_comment', methods=['GET', 'POST'])
def add_comment():
    form = CommentForm()
    if form.validate_on_submit():
        …
        comment = Comments(name=name, contact=contact, comment=comment)
        db.session.add(comment)
        db.session.commit()
        flash(f'{name}, Ваш комментарий добавлен! Благодарю за обратную связь!')
        return redirect(url_for('add_comment'))
    return render_template('add_comment.html', form=form)

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

Пробовал запускать небольшие тесты locust с созданным приложением. Телефон может стабильно работать с 25 пользователями единовременно со средним временем отклика 500 мс.


Заключение


Это было достаточно забавное приключение по установке интерпретатора Python и разворачиванию небольшого веб-приложения на мобильном телефоне. Есть ли у этого практическая польза? Не уверен. Но в качестве MVP получился вполне себе удобный походный вариант. Созданное приложение можно в дальнейшем упаковать в rpm-пакет и передать коллегам и друзьям для личных нужд. Например, сбора информации у группы тестирования идеи. Однако вести разработку исключительно в таком варианте, по-моему, нецелесообразно до обновления ОС.

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

В комментариях делитесь своими идеями: есть ли у такой разработки будущее, проводили ли вы сами подобные эксперименты, что можно улучшить и так далее. Подозреваю, это далеко не последняя статья о разработке под «Аврору».

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


  1. ParaMara
    06.08.2024 10:35
    +5

    Терминал и SSH из коробки - уже хорошо. А дальше интересно

    • какой Python 3 (в 95% случаев - не свежий, в 90% - вообще не 12)?

    • Python то везде работает, а gcc (W^X политику пощупать)?

    • Если gcc работает, то посте переноса на SD карту файл запускается (SeLinux пощупать)?

    • файл sqlite на SD карте работает (ещё одна кастрированность Андроид)?

    • сервер продолжает работать в фоне неограниченное время (табу)?

    Это очень интересно потому, что как раз «сервер в кармане» и никому нельзя по причинам крайне похожим на конспирологические. Если вдруг на Авроре можно, то такое очень значимо, вплоть до уравновешивания тянущихся к YouTube ручонок. А если ещё и разработка для Авроры на Авроре возможна, тогда вообще…


    1. equeim
      06.08.2024 10:35
      +1

      Хз насчет Авроры (может ее и огородили), но в Sailfish OS GCC точно установить можно. Можно также подключать свои RPM репозитории и собирать что угодно (более того доступен публичный OBS где можно собирать под Sailfish OS и он сам поднимет репу). Но и GCC и Python, как и большинство софта там наверняка страшно устаревшие. И что-то гуевое от обычного десктопного линукса вряд ли запустится (или как минимум будет работать криво даже если адаптировано для тача) т.к. Wayland композиторы ушли далеко вперед и с тем что в Sailfish OS уже мало общего имеют. Никаких ограничений на фоновую работу я там не помню.


      1. StaceZ
        06.08.2024 10:35

        А зачем gcc в Авроре?

        Есть SDK, который можно скачать и поставить на Windows или Linux: https://developer.auroraos.ru/

        С его помощью можно скомпилировать почти что угодно, собрать RPM-пакет и поставить его на железку


    1. VRyabchevsky Автор
      06.08.2024 10:35
      +3

      Спасибо за комментарий. Часть из этих вещей проверил:

      • какой Python 3 (в 95% случаев - не свежий, в 90% - вообще не 12)?

      3.8.11, да, не самый свежий и часть "фишек" работать не будет, но для экспериментов ок.

      • Python то везде работает, а gcc (W^X политику пощупать)?

      gcc ставится, собирает приложения, но не удается их запустить, permission denied.

      файл sqlite на SD карте работает

      не пробовал, на днях посмотрю и отпишусь.

      • сервер продолжает работать в фоне неограниченное время (табу)?

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


      1. ParaMara
        06.08.2024 10:35

        Спасибо.


  1. hssergey
    06.08.2024 10:35
    +2

    Все описанное можно сделать и на андроид телефоне при помощи termux. Проблема только в том, что в этом случае без рута вы ограничены объемом ОЗУ телефона, и не получится поднять что-то тяжелое (а также использовать входящие порты младше 1024). А как с этим у Авроры? Раз можно зайти суперпользователем, то можно и своп свой подключить?


  1. rendov
    06.08.2024 10:35
    +2

    А cron есть? Так можно было бы, имея внешний сервер с ip xxx.xxx.xxx.xxx, сделать на мобиле в кроне что-то вроде:

    #Автматический проброс туннеля из 127.0.0.1:5000 на сервер xxx.xxx.xxx.xxx:8080.
    if ((`/bin/pgrep -f "/bin/ssh root@xxx.xxx.xxx.xxx -p 22 -f -N -R 8080:127.0.0.1:5000" | /bin/wc -l` == 0))
    then
       /bin/ssh root@xxx.xxx.xxx.xxx -p 22 -f -N -R 8080:127.0.0.1:5000 &
    fi
    

    А на сервере xxx.xxx.xxx.xxx обрабатывать через nginx 8080 порт проксируя на красивый поддомен, типа mobila.myserver.org. И работать будет даже с мобильным инетом, пробивая NAT оператора связи. Только надо не забыть на сервере указать короткие интервалы проверки жизни сессии в /etc/ssh/sshd_config (чтоб не глючил туннель на мобильном интернете)

    ClientAliveInterval 30
    ClientAliveCountMax 2


    1. VRyabchevsky Автор
      06.08.2024 10:35

      Интересный вариант, попробую и отпишусь отдельно. Крона нету, но попробую ручками запускать скрипт


  1. achekalin
    06.08.2024 10:35
    +4

    У меня ровно такоё же восторг был, когда джелбрейкнул один из первых айфонов, зашел по ssh на эту фряху, и погонял пару консольных программок. А дальше... пользы от веб-сервера на телефоне - чуть, разве что-то вроде радости "look, 'ma, I can ssh everywhere!"

    А вот в обратную сторону интереснее - если смог зайти владелец, то точно ли не сможет зайти другой человек "с той стороны tcp-линка"? Эплы хотя бы делают вид (но важнее, что у них доход зависит от) что к ним не залезть, а Аврора - она точно не станет частью ботнета прямо у меня в кармане?


    1. nitro80
      06.08.2024 10:35

      Частью государственного ботнета!