Как говорится, just for memo.
Попал мне в руки девайс, под названием Openvox gsm gateway, такая коробочка на 4/8 линий gsm. Внутри ARM и свой кастом на базе openwrt с asterisk. Задача стояла использовать внутренний asterisk для простеньких ivr, что производителем не предусмотрено.
Первым делом обновляем прошивку до самой свежей, в моем случае это 2.1.1
Далее, получаем на устройстве root, в закладке System->Login info включаем ssh и устанавливаем пароль пользователю super
Заходим в устройство, осматриваемся
root@Openvox-Wireless-Gateway:~# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
none on /proc type proc (rw,relatime)
none on /sys type sysfs (rw,relatime)
none on /tmp type tmpfs (rw,nosuid,nodev,relatime)
tmpfs on /dev type tmpfs (rw,relatime,size=512k)
none on /dev/pts type devpts (rw,relatime,mode=600)
/dev/mtdblock8 on /data type jffs2 (rw,relatime)
/dev/mtdblock7 on /etc/cfg type jffs2 (rw,relatime)
root@Openvox-Wireless-Gateway:~#
Видим, что / у нас на squashfs, значит что-то изменять можно только в /data или /etc/cfg. /data стартовыми скриптами очищается, поэтому храним наш кастом в /etc/cfg, где я создал /etc/cfg/data и /etc/cfg/data/sounds. В последнюю директорию кладем любой звук от asterisk, в формате gsm, пусть это будет для примера hello-world.gsm.
Далее, редактируем /etc/cfg/asterisk.conf, добавляем datadir
astdatadir => /etc/cfg/data
Устройство при внесении изменений через web синхронизирует /etc/asterisk с /etc/cfg, поэтому все долговременные изменения надо делать там. Часть файлов перетираются, но например
/etc/asterisk/extensions_custom.conf сохраняется, добавляем туда макрос для нашего ivr, самый простой пока:
[macro-ivr]
exten => s,1,Answer()
same => n,Playback(hello-world)
same => n,NoOp(${PLAYBACKSTATUS})
same => n,MacroExit()
Далее, если мы хотим сохранить сохранить управление через web, неплохо бы сделать так, что-бы была возможность добавлять наш макрос по желанию к нужным routes, можно конечно влезть и сделать красиво с изменением в UI, но я пошел простым путем, если route name имеет вид <something>-macro-name, то достаем name и делаем вызов macro-name самой первой командой диалплана, т.е. как-то так:
[rtg-incoming-macro-ivr-1]
exten => s,1,NoOp(s matches Rule rtg-incoming-macro-ivr-1)
exten => s,n,Macro(ivr,s,1)
exten => s,n,Set(CDR_CALLEEID=${EXTEN})
exten => s,n,GrpPolicy(ops)
exten => s,n,Macro(dial-failover,,,${POLICY_ops})
exten => s,n,Goto(nocdr,s,1)
что-бы это работало красиво, берем и патчим /www/cgi-bin/inc/wrcfg.inc таким вот патчем:
--- wrcfg.inc.orig 2014-08-31 16:03:51.000000000 +0300
+++ wrcfg.inc 2014-08-31 16:04:09.000000000 +0300
@@ -832,6 +832,11 @@
$routing_content = '';
foreach($exten as $each) {
$routing_content .= "exten => $each[e],1,NoOp($each[e] matches Rule $routing_context)\n";
+ if(strpos($routing_name, '-macro-')) {
+ $pieces = explode('-', $routing_name);
+ $macro_name = end($pieces);
+ $routing_content .= "exten => $each[e],n,Macro($macro_name,s,1)\n";
+ }
if($from_channel_info['type'] == 'brd') {
//Modify CALLERID(number)
//SIP From header:
если китайские товарищи изменят код и патчик будет не подходить, то просто гляньте функцию save_routings_to_extensions() там все очевидно. Далее, раз /www у нас на squashfs и после перезагрузки мы его теряем, то копируем измененный wrcfg.inc в наш /etc/cfg/data/, после чего в скрипте /etc/cfg/gw/custom.sh добавляем строчку
cp /etc/cfg/data/wrcfg.inc /www/cgi-bin/inc/wrcfg.inc
Вуаля, мы можем добавлять нужные нам роуты, и после перегрузки устройство все помнит.
И еще статейка про это на Хабре
Попал мне в руки девайс, под названием Openvox gsm gateway, такая коробочка на 4/8 линий gsm. Внутри ARM и свой кастом на базе openwrt с asterisk. Задача стояла использовать внутренний asterisk для простеньких ivr, что производителем не предусмотрено.
Первым делом обновляем прошивку до самой свежей, в моем случае это 2.1.1
Далее, получаем на устройстве root, в закладке System->Login info включаем ssh и устанавливаем пароль пользователю super
Заходим в устройство, осматриваемся
root@Openvox-Wireless-Gateway:~# mount
rootfs on / type rootfs (rw)
/dev/root on / type squashfs (ro,relatime)
none on /proc type proc (rw,relatime)
none on /sys type sysfs (rw,relatime)
none on /tmp type tmpfs (rw,nosuid,nodev,relatime)
tmpfs on /dev type tmpfs (rw,relatime,size=512k)
none on /dev/pts type devpts (rw,relatime,mode=600)
/dev/mtdblock8 on /data type jffs2 (rw,relatime)
/dev/mtdblock7 on /etc/cfg type jffs2 (rw,relatime)
root@Openvox-Wireless-Gateway:~#
Видим, что / у нас на squashfs, значит что-то изменять можно только в /data или /etc/cfg. /data стартовыми скриптами очищается, поэтому храним наш кастом в /etc/cfg, где я создал /etc/cfg/data и /etc/cfg/data/sounds. В последнюю директорию кладем любой звук от asterisk, в формате gsm, пусть это будет для примера hello-world.gsm.
Далее, редактируем /etc/cfg/asterisk.conf, добавляем datadir
astdatadir => /etc/cfg/data
Устройство при внесении изменений через web синхронизирует /etc/asterisk с /etc/cfg, поэтому все долговременные изменения надо делать там. Часть файлов перетираются, но например
/etc/asterisk/extensions_custom.conf сохраняется, добавляем туда макрос для нашего ivr, самый простой пока:
[macro-ivr]
exten => s,1,Answer()
same => n,Playback(hello-world)
same => n,NoOp(${PLAYBACKSTATUS})
same => n,MacroExit()
Далее, если мы хотим сохранить сохранить управление через web, неплохо бы сделать так, что-бы была возможность добавлять наш макрос по желанию к нужным routes, можно конечно влезть и сделать красиво с изменением в UI, но я пошел простым путем, если route name имеет вид <something>-macro-name, то достаем name и делаем вызов macro-name самой первой командой диалплана, т.е. как-то так:
[rtg-incoming-macro-ivr-1]
exten => s,1,NoOp(s matches Rule rtg-incoming-macro-ivr-1)
exten => s,n,Macro(ivr,s,1)
exten => s,n,Set(CDR_CALLEEID=${EXTEN})
exten => s,n,GrpPolicy(ops)
exten => s,n,Macro(dial-failover,,,${POLICY_ops})
exten => s,n,Goto(nocdr,s,1)
что-бы это работало красиво, берем и патчим /www/cgi-bin/inc/wrcfg.inc таким вот патчем:
--- wrcfg.inc.orig 2014-08-31 16:03:51.000000000 +0300
+++ wrcfg.inc 2014-08-31 16:04:09.000000000 +0300
@@ -832,6 +832,11 @@
$routing_content = '';
foreach($exten as $each) {
$routing_content .= "exten => $each[e],1,NoOp($each[e] matches Rule $routing_context)\n";
+ if(strpos($routing_name, '-macro-')) {
+ $pieces = explode('-', $routing_name);
+ $macro_name = end($pieces);
+ $routing_content .= "exten => $each[e],n,Macro($macro_name,s,1)\n";
+ }
if($from_channel_info['type'] == 'brd') {
//Modify CALLERID(number)
//SIP From header:
если китайские товарищи изменят код и патчик будет не подходить, то просто гляньте функцию save_routings_to_extensions() там все очевидно. Далее, раз /www у нас на squashfs и после перезагрузки мы его теряем, то копируем измененный wrcfg.inc в наш /etc/cfg/data/, после чего в скрипте /etc/cfg/gw/custom.sh добавляем строчку
cp /etc/cfg/data/wrcfg.inc /www/cgi-bin/inc/wrcfg.inc
Вуаля, мы можем добавлять нужные нам роуты, и после перегрузки устройство все помнит.
И еще статейка про это на Хабре