?

Log in

No account? Create an account
Журнал Витуса.
[Друзья] [Свежие записи] [Dreamwidth] [Фото] [Тексты] [Друзья Ирины] [Матерные писатели] [Сообщества] [3 круг]
September 20th, 2010
03:11 pm
[User Picture]

[Link]

Previous Entry Share Flag Next Entry
На чистом busybox-е
Тут мегафон в очереднеой раз поменял что-то на своем сервис-гиде и браузер, выходящий в инет через мегафоновский модем, подключенный к точке доступа, перестал туда логиниться автомагически.

Пришлось таки напрячься и решить задачу запроса баланса через USSD.

Задача эта нетрииальна потому, что нормальных средств автоматизации в прошивке точки доступа нет.
Только busybox, из которого выкинуты при компиляции даже find и xargs.

Ну ладно, мне не нужна полноценное ussd-приложение, баланс запрашивается всегда по одному и тому же номеру. Поэтому закодировать номер в 7-битное pdu представление можно на нормальной машине где есть perl с Device::Gsm или tcl. Но раскодировать пришедшую из модема последовательность 16-битных кодов UCS2 в 16-ричном виде как-то надо. iconv-а в uclibc, как вы понимаете, тоже не полагается.

Скрипт, к тому же писался в несколько помраченном состоянии сознания - встал в пять утра, ехал 350 км, весь день занимался физическим трудом, и поздним вечером, часов в11, ожидая пока прогорят дрова в камине, стал его писать. Получилось вот что
#!/bin/sh
port=/dev/usb/tts/2
echo AT+CUSD=1,AA180C3602,15 > $port
data=$(awk 'BEGIN {FS="\""}
/^\+CUSD/ {print $2; exit}' $port)
printf '%b\n' $( (echo 'toutf() {
a=$((0x$1>>2))
b=$((0x$2&0x3f))
if [ $a -eq 0 ]; then
   printf  '\''\\x%x'\'' $((0x$2+0)) 
else
   printf '\''\\x%x\\x%x'\'' $(($a|0xc0)) $(($b|0x80))   
fi
} ';
echo $data|awk '{gsub(/0.../,"&\n",$0);print $0;}'| sed 's/0\(.\)\(.\)\(.\)/toutf \1\2 \2\3/')|sh)

(19 comments | Leave a comment)

Comments
 
From:rainbow_beast
Date:September 20th, 2010 11:21 am (UTC)
(Link)
А вы спрашивали - зачем там OpenWRT... Вселенский разум дал ответ :-)
[User Picture]
From:vitus_wagner
Date:September 20th, 2010 11:25 am (UTC)
(Link)
В openwrt нет нормальных языков, кроме lua.
И справшивал я ПОСЛЕ того как написал этот скрипт. Зачем мне openwrt, если я даже в помраченном состоянии сознания могут решить такую задачу на смеси awk, shell и printf?
[User Picture]
From:nec_p1us_u1tra
Date:September 20th, 2010 11:47 am (UTC)
(Link)
В openwrt есть все вообще. ничего кроме lua там нет на дефолтрой инсталляции, возможно.
From:rainbow_beast
Date:September 20th, 2010 11:59 am (UTC)
(Link)
Угу, именно. А "решить задачу" и "решить красиво" - есть разница, вообще-то. Но я скорее о том, что openwrt один раз залил в более-менее полноценном варианте - и потребности в извращениях в дальнейшем не будет, хоть в помраченном состоянии, хоть нет.
[User Picture]
From:vitus_wagner
Date:September 20th, 2010 04:50 pm (UTC)
(Link)
Я считаю, что я решил задачу куда более красиво, чем посредством перестановки дистрибутива.
Главный критерий красоты - количество байт, пересланное между компьютером и устройством на протяжении всей работы над решением.
[User Picture]
From:gegmopo4
Date:September 20th, 2010 07:46 pm (UTC)
(Link)
Последний awk можно заменить на sed 's/0.../&\n/g'. Два sed-а слить в один: sed 's/0\(.\)\(.\)\(.\)/toutf \1\2 \2\3\n/g'. От переменной data избавиться, направив вывод сразу в итоговый sed.

Вместо квотинга определения функции toutf через printf '%b\n', можно объявить её в текущем шелле, а потом вместо вызова субшелла sh сделать . /dev/stdin.
[User Picture]
From:vitus_wagner
Date:September 21st, 2010 08:22 am (UTC)
(Link)
Я вообще-то последний awk-скрипт хотел объединить с первым. Но по причине помраченности сознания - забыл.

Переменная data - это отладочная ручка, которая не убрана, потому что мешает.


А дальше ты не въехал. printf %b\n обрабатывает ВЫВОД функции toutf.
А формируется эта функция обычным echo, потому что экспортировать ее в сабшелл мне почему-то не удалось. Странный этот busybox-овский шелл.

А на . /dev/stdin он, как и ожидалось, говорит "cannot open /dev/stdin". Здесь вам не тут.
[User Picture]
From:gegmopo4
Date:September 21st, 2010 11:47 am (UTC)
(Link)
Насчёт . /dev/stdin я не был уверен, потому и написал отдельным абзацем. ;)

Избавившись от awk и немного упростив toutf, получаем:
#!/bin/sh
port=/dev/usb/tts/2
echo AT+CUSD=1,AA180C3602,15 > $port
printf '%b\n' $( (echo 'toutf() {
a=$(($1>>6))
b=$(($1&0x3F))
if [ $a -eq 0 ]
then
   printf '\''\\x%x'\'' $b
else
   printf '\''\\x%x\\x%x'\'' $((a|0xC0)) $((b|0x80))
fi
}'
sed -n 's/^\+CUSD[^"]*"\([^"]*\).*/\1/p;q' $port | sed 's/0.../toutf 0x&\n/g') | sh)

Думаю, что можно обойтись и одним вызовом sed. А если записать toutf в виде отдельного скрипта, то и без явного вызова sh (модификатор e у s).
[User Picture]
From:vitus_wagner
Date:September 21st, 2010 12:08 pm (UTC)
(Link)
А вот твоя toutf неправильрная. У меня там, впрочем, тоже ошибка.

Проверка на однобайтный символ должна выглядеть как

if [ $(($1+0)) -lt 128 ] then
printf '\\x%02x' $(($1+0))
else
printf '\\x%02x\\%02x' $(($1>>6)) $(($1&0x3f))
fi

Понял что не так?

Но идея использовать трехзначное шестнадцатиричное число вместо двух двухзначных байтов - здравая. И в таком раскладе действительно сворачиваетс в один вызов sed. Вызов, правда, становится немеряно громоздким.

А я вообще думал наоборт - в сторону увеличения доли awk - разбирать строку на блоки по 4 не регекспами, а фунцией substr, в цикле. Впрочем, после исползования твоей идеи об одноаргументной функции toutf и awk-шных регекспов хватит.

Был бы там gawk вообще можно было все на одном awk сделать.А так даже не получается генерировать непосредственно вызовы printf,
[User Picture]
From:gegmopo4
Date:September 21st, 2010 05:29 pm (UTC)
(Link)
Я знаю, как кодируется utf-8. Просто у тебя было что-то другое, я решил, что так и надо (может это utf-7, его я не знаю).

Если же utf-8, то
if [ $(($1)) -lt 128 ]
then
   printf '\\x%02x' $(($1))
elif [ $(($1)) -lt 2048 ]
then
   printf '\\x%02x\\%02x' $((($1>>6)|0xC0)) $(($1&0x3f|0x80))
else
   printf '\\x%02x\\%02x\\%02x' $((($1>>12)|0xE0)) $((($1>>6)&0x3F|0x80)) $(($1&0x3f|0x80))
fi

Вызов sed не очень громоздкий, просто менее элегантный с повтором части регэкспа. Где-то так:
sed -n '/^\+CUSD/{s/^\+CUSD[^"]*"\([^"]*\).*/\1/;s/0.../toutf 0x&\n/gp;q}' $port

Я предпочёл бы два sed-а, так гибче. На awk-е выйдет не короче.
[User Picture]
From:vitus_wagner
Date:September 20th, 2010 04:47 pm (UTC)
(Link)
В openwrt, собранном так, чтобы влезал на встроеннуюфлэш-память. Ее там, насколько я помню, 4мб
Очевино, что снижение надежности, возникаеющее из-за того, что в критически важных системных операциях задействуется sd-карточка, вотнкутая во внешнее устройство, мне нафиг не нужно.
[User Picture]
From:_slw
Date:September 20th, 2010 11:26 am (UTC)
(Link)
Тут мегафон в очереднеой раз поменял что-то на своем сервис-гиде и браузер, выходящий в инет через мегафоновский модем, подключенный к точке доступа, перестал туда логиниться автомагически.


капча.
но вродеможно галку поставить разрешения логин автоматизированных систем
[User Picture]
From:vitus_wagner
Date:September 20th, 2010 01:17 pm (UTC)
(Link)
Для этого придется один раз залогиниться вручную. А для этого придется послать туда sms-ку с целью получения логина параоля. А для этого нужно либо перетыкать симку в телефон, либо перетыкать модем в компьютер, либо писать куда более продвинутый скрипт.

Так что я лучше ussd подопиливаю. Сервис-гид кроме баланса мне нафиг не нужен, а узнавание баланса по ussd имеет то преимущество, что оно возможно даже когда этот баланс отрицательный.
From:rainbow_beast
Date:September 20th, 2010 02:16 pm (UTC)
(Link)
Я бы подумал насчёт редиректора tty в tcp, вроде remserial (но этот на C, так что не подойдёт, наверное). Дальше на стационаре тот же remserial (у него есть эмуляция полноценного порта), либо просто TCP использовать - и что угодно делай - хоть SMS шли скриптами на перле/питоне, которых в сети полно, хоть AT-команды давай. А то что ж это такое - нет полноценного управления железкой.
[User Picture]
From:vitus_wagner
Date:September 20th, 2010 04:45 pm (UTC)
(Link)
Spare me from damned spacemen, who need bloody computer to navigate and blinking beacon to show them way, как говорил один из героев Энн Маккеффри.

Какой нафиг редирект через TCP если даже find c xargs нет? netcat и socat туда, естественно, тоже не положили. Dropbear sshd там есть. И сильно специализированный httpd заточенный под административный интерфейс. Больше никаких tcp серверов не предусмотрено,

И стационарного компьютера у меня на даче нет. Есть несколько ноутбуков, наладонников и смартфонов, любой из которых может быть выключен и вообще увезет.
тт
И задачи слать sms не стоит. Если мегафонцы не хотят меня пускать на свой сайт без усилий с моей стороны, значит меня там не будет. USSD дешевле и не имеет защиты от роботов. А то придумали - каптчу ставить на сайт, куда сам бог велит автоматическими мониторилаками ходить.
From:rainbow_beast
Date:September 21st, 2010 05:14 pm (UTC)
(Link)
Ну, у кого какой подход. Лично я бы перебрал прошивку (openwrt или просто кастомная, с нужными фишками). С тем, чтобы в будущем вопросов "как бы извратиться при возникновении очередной потрбености" просто не возникало. И речь шла не о "постоянно лазить с компа", а о том, что при надобности залезть можно, и сделать с железкой что угодно - тоже.

Кстати, при желании дополнительный софт можно сунуть на sd-карту в модеме, если роутер его sd-ридер опознал.

P.S. Да, возножно, это у меня пунктик такой - если есть какая-то штуковина, то её возможности должны быть доступны, даже если сейчас и не нужны. Как правило, применение потом нахожится - и в такие моменты, когда морочить голову с обеспечением доступа совсем неохота.

[User Picture]
From:vitus_wagner
Date:September 22nd, 2010 07:15 am (UTC)
(Link)
Зачем возиться и перебирать прошивку, если достаточно развернуть среду кросс-разработки под эту прошивку?

"Нужных фишек" заранее предусмотреть нельзя никогда. То есть то что есть в олеговской прошивке меня по большей части устраивает.

А sd-карта в модеме отрицатльно сказывается на устойчивости интернет соединения. Поэтому, видимо, постоянно там жить не будет.

У меня другой пунктик - возможности, котолрые мне нужны, должны быть доступны с максимальной надежностью. Ради этого можно не только поступиться возможностями, которые нафиг не нужны, но и пересмотреть нужность некоторых возможностей, которые неплохо было бы... Поэтому я, напрпимер, никогда не ставлю проприетарных видеодрайверов. 3d-графика это из серии "неплохо было бы". Если ценой наличия 3d-ускорения является зависание машины раз в пару месяцев, то 3d-ускорение идет нафиг.
[User Picture]
From:_slw
Date:September 20th, 2010 02:29 pm (UTC)
(Link)
Для этого придется один раз залогиниться вручную. А для этого придется послать туда sms-ку с целью получения логина параоля.
а до этого оно как логинилось? без пароля что ли?
а, у тебя наверное отвалилась галка "автоматический логин"
[User Picture]
From:vitus_wagner
Date:September 20th, 2010 04:38 pm (UTC)
(Link)
А до этого сайт автоматически определял, что я зашел в интернет через мегафоновскую сеть и столь же автоматически определял кто я.
My Website Powered by LiveJournal.com