Вывод информации на экран роутераПредистория с небольшим пояснением
Сначала этим вопросом задался Serbli, потом, по "наследству", мне стало интересно покопаться. В этих роутерах используется своеобразный (защищенный) веб-сервер. Практически все файлы из набора веб-интерфейса имеют защиту от редактирования: каждые несколько слов, групп данных и т.д. стоят определенные "маркеры" - количество "слов", их длина в символах, вроде ещё что-то (уже не помню, давно с ними разбирался), в конце "абзаца" стоит суммарный маркер по этому самому абзацу. Редактировать "маркеры" можно только в hex-редакторе, что очень осложняет изменение файлов. Выходов здесь несколько:
- Подставить в файл вывода инфы (один раз помучиться с "маркерами") в мордочку какого-нибудь значения используемого в dx, которое можно редактировать, имеет формат string, и которое не изменяет система. Потом умудриться сделать его вывод в нужное место.
- Отредактировать нужный файл и ввести в него уже заготовленные данные, сделать несколько таких шаблонов и подменять средствами системы роутера. Довольно трудоемкая работа, необходимо править файл /mnt/hdata/lcd/index.html.tmpl, и это необходимо, по всей видимости, делать для КАЖДОЙ ревизии (модели, тапа) мордочки роутера.
- Написать програмулину и скомпилить её под arm которая будет "декодировать" и "кодировать", после внесения изменений в эти файлы.
- Четвертый способ будет описан ниже.
Но, к сожалению, самый затык был даже не в этом. Обновление инфы в мордочке происходит тоже не само по себе, а по определенным алгоритмам. Сделать так, чтобы информация сменялась в процессе работы автоматически не удавалось - мордочка изменялать только после полного рестарта роутера. И вопрос был "по><ерен".
Не так давно, общаясь в личке с
lynzoid по модулю openvpn, опять был поднят этот вопрос и он нашел решение как перезагрузить веб-мордочку. Жалко только, что происходит "жесткая" перезагрузка. Перезагружается полностью веб-интерфейс мордочки, занимает это пару-тройку секунд, с вылетом мордочки в logo-заставку. Пока (надеюсь только) сделать "прозрачную" замену не удаётся. Но и то хлеб.
Дальше наши пути с lynzoid разошлись. Он пошел по пути второго способа, описанного выше (у него роутер TLAUS и мой метод ему не подходит - почему опишу далее), я же сделал по другому.
В большинстве наших роутеров, над и под строкой вывода количества потраченного трафика, выводятся "тени" - два файла, один из них -
/mnt/hdata/lcd/images/boxShadowTop.png, он имеет размер 320x13, второй -
/mnt/hdata/lcd/images/boxShadowBottom.png - 320х16. Вот здесь и кроется затык с операторскими TLAUS, у них в веб-интерфейсе таких файлов попросту нет, ни в 790-м, ни в 810-м. В общем, если есть в роутере вышеуказанные файлы то способ сработает. Надеюсь метод универсальный для всех остальных.
Сама идея заключается в том, что на linux имеются утилиты, преобразующие текст в картинку. Начал лопатить интернет для поиска их под arm. Нашел одну на github'е, написана на go, но скомпилить её не получалось. Зато полазив по ФС роутера с удивлением обнаружил целых две других, уже имеющихся в системе. Правда в 790-м - одна (pango-view), в 810 - две (hb-view и pango-view), выбрал ту которая есть в обоих моделях.
Ставить смену мордочки в постоянный цикл не целесообразно, так-как всё равно не видно результата его работы, да и экранчик будет постоянно включаться при смене картинки. У себя я завязал смену картинки на evcheck, когда надо посмотреть информацию нажимаю на кнопку роутера и она меняется, плюс в скрипте openvpn при его старте и выключении тоже запускается вывод.
описание скрипта
- скрипт переименовывает оригинальный файл boxShadowTop.png (чтобы не потерять его);
- на его месте создаётся симлинк в директорию /var/lib;
- в /var/lib создается файл boxShadowTop.png, при этом скрипт проверяет роутер - 810-й или 790-й чтобы правильно "взять" диапазоны;
- рестарт веба мордочки;
- делал для себя, мне так удобно и захотелось...
#!/bin/sh
FILE=/mnt/hdata/lcd/images/boxShadowTop.png
[ ! -h "$FILE" ] && { nmount -o remount,rw /mnt/hdata; \
mv /mnt/hdata/lcd/images/boxShadowTop.png /mnt/hdata/lcd/images/boxShadowTop-orig.png; \
ln -s /var/lib/boxShadowTop.png /mnt/hdata/lcd/images/boxShadowTop.png; \
nmount -o remount,ro /mnt/hdata; }
# --- GETTING VALUES ---
# getting LTE band
check790=`dx general.versions.ProductSKU | grep 790`
if [ -n "$check790" ]
then
bandx=`echo -e "at!gstatus?\r" | microcom -d300 -t100 /dev/smd7 | tr -d '\r'`
bandx1=`echo -e "$bandx" | awk '/LTE band/{print $5}/LTE bw/{print "\("$5"\)"}' | tr -d '\n'`
bandx2=`echo -e "$bandx" | awk '/LTE band/ {if($10!="") print $10}/LTE bw/{if($11!="") \
print "\("$11"\)"}' | tr -d '\n'`
bandx=`echo $bandx1$bandx2 | sed 's/)/\)+/g' | sed 's/.$//'`
fi
check810=`dx general.versions.ProductSKU | grep 810`
if [ -n "$check810" ]
then
bandx=`echo -e "at!gstatus?\r" | microcom -d300 -t100 /dev/smd7 | tr -d '\r' | \
awk '/LTE band/{print $NF}/LTE bw/{print "\("$(NF-1)"\)"}' | tr -d '\n' | sed 's/)/\)+/g' | sed 's/.$//'`
fi
# Check on/off - ovpn
vpnovx=`pgrep openvpn`
if [ -n "$vpnovx" ]
then
check_num=`pgrep openvpn`
check_cmd=`cat /proc/$check_num/cmdline`
check_cfg=`echo "$check_cmd" | awk -F\/ '{print $4}' | awk -F\. '{print $1}'`
vpnx=": OVPN-$check_cfg"
fi
vpnwgx=`pgrep wg-crypt`
if [ -n "$vpnwgx" ]
then
ifacewg=`wg show interfaces`
vpnx=": WG-$ifacewg"
fi
[ "$vpnovx" == "$vpnwgx" ] && vpnx=""
# getting IP ext
ipext=`wget -qO- http://eth0.me`; ipext=": $ipext"
ipextch=`echo $ipext | grep "<div id=\"header\">"`
if [ -n "$ipextch" ]; then ipext=": noNet"; fi
#create text.png
pango-view -q -t "$bandx $vpnx $ipext" --font=13 --align=center --background=transparent \
--height=15 --margin=-1 --width=322 --dpi=72 -o /var/lib/boxShadowTop.png
#reboot screen
killall -HUP Gui
Пока меняется только верхняя "тень", мне, пока, большего не надо.
Принцип "взятия" инфы для этого вывода нагло взят из скриптов дополнительного веб-интерфейса от Serbli :blush: