среда, декабря 12, 2007

Как заставить Asterisk изменять файл astdb без перезагрузки Amportal-а

Задача была такая:заставить два астера(в двух разных городах) работать с одной базой и с конфиг файлами,синхронизированными по-определенной логике(например в Главном оффисе должны находиться все войсмейлы,а на остальных-только те,которые относятся к людям,зарегистрированным на их АТС,причем FreePbx стоит только на Главном сервере! ..Типа остальные сервера менять ничего не могут(Им дозволено лишь смотреть статистику)).Ну с конфигами всё решилось написанием небольшого скрипта(лежащего в веб директории линукса),который запускается с Главного сервера через http протокол и парсит конфиги так,как ему нужно.Теперь проблема с файлом astdb(DB2 база с некоторыми данными о юзерах),который надо поменять,чтоб в неГлавных астерах все с юзерами было нормально при изменении инфы о них на Главном астере.По-началу я решил проблему передачей astdb по http и последующим копированием его в соответствующую директорию..Только:ПРОБЛЕМА:астер держит astdb в оперативке и НЕ обновляет его до перезагрузки!НО,другая проблема,что после перезагрузки юзерам приходится заного регистрироваться на астере(выключать/включать sip phone).Поэтому было решено вводить изменения в файл astdb прямо в оперативке(на манер того,как это реализованно в FreePbx).Для этого я функциями самого FreePbx дописываю нужную мне инфу в astdb.

Идем в FreePbx core (htdocs/admin/modules/core/),открываем functions.inc.php

и там ищем:

 

    //add details to astdb

Сразу после этого добавляем:

 

//сохранение нужных нам параметров в просто какой-нибудь файл(чтоб потом передать его на клиентский сервер через http)

$f = fopen('file.txt','w');
fwrite($f,"id:"$id);

.....

.....
fclose($f);

    echo exec(/*запуск wget-oм файла,который прочитает все параметры и перезапишет их  на клиентском сервере*/);

 

(Кстати параметры берутся из куска кода,который следует далее и копируется в вэб директорию клиентского сервера(чтоб там сразу после прочтения файла с параметрами они ПРАВИЛЬНО записались в astdb))

   1: if ($astman) {


   2:     $astman->database_put("DEVICE",$id."/dial",$dial);


   3:     $astman->database_put("DEVICE",$id."/type",$devicetype);


   4:     $astman->database_put("DEVICE",$id."/user",$user);


   5:     if(!empty($emergency_cid))


   6:         $astman->database_put("DEVICE",$id."/emergency_cid","\"".$emergency_cid."\"");


   7:     if($user != "none") {


   8:         $existingdevices = $astman->database_get("AMPUSER",$user."/device");


   9:         if (empty($existingdevices)) {


  10:             $astman->database_put("AMPUSER",$user."/device",$id);


  11:         } else {


  12:             $existingdevices .= "&";


  13:             //only append device value if this id doesn't exist in it already


  14:             if(strpos($existingdevices,$id."&") === false) // if not containing $id 


  15:                 $astman->database_put("AMPUSER",$user."/device",$existingdevices.$id);


  16:         }


  17:     }


  18: } else {


  19:     fatal("Cannot connect to Asterisk Manager with ".$amp_conf["AMPMGRUSER"]."/".$amp_conf["AMPMGRPASS"]);


  20: }




 



ТО же самое проделывается с AMPUSER..(далее в functions.inc.php ищем упоминания о astdb и проделываем ИМЕННО ТЕ ЖЕ действия ;))



Вот,что там читается в вэб директории клиента(как раз тот файл,который должен запуститься(см.выше)):





   1: #!/usr/bin/php -q 


   2:  


   3: <?php 


   4:  


   5: include_once("configure.php"); 


   6:  


   7: require_once('/srv/www/htdocs/admin/common/php-asmanager.php'); 


   8:  


   9: $astman = new AGI_AsteriskManager();


  10: if (! $res = $astman->connect(DB_HOST,DB_USER,DB_PASSWORD)) {


  11:     unset( $astman );


  12: } 


  13:  


  14: //add details to astdb 


  15:  


  16: $f = fopen("http://".MAIN_SERVER_IP."/admin/modules/core/file.txt",'r');


  17: $i = 0;


  18: while(!feof($f))


  19: {


  20: $a[$i] = fgets($f);


  21: $a[$i] = substr($a[$i],0,(strlen($a[$i])-strlen("\n")));


  22: $i++; 


  23:  


  24: //we've 6 params for device ;)


  25:  


  26: if ($i == 6)


  27: { 


  28:  


  29: if (!empty($a[0]))


  30: {


  31: $id = trim(substr($a[0],(strpos($a[0],":")+1)));


  32: }


  33: else


  34: $id = ""; 


  35:  


  36: if (!empty($a[1]))


  37: {


  38: $dial = substr($a[1],(strpos($a[1],":")+1));


  39: }


  40: else


  41: $dial = ""; 


  42:  


  43: //.........


  44:  


  45: //.........


  46:  


  47: if ($astman) {


  48:         $astman->database_put("DEVICE",$id."/dial",$dial);


  49:         $astman->database_put("DEVICE",$id."/type",$devicetype);


  50:         $astman->database_put("DEVICE",$id."/user",$user);


  51:         if(!empty($emergency_cid))


  52:             $astman->database_put("DEVICE",$id."/emergency_cid","\"".$emergency_cid."\"");


  53:         if($user != "none") {


  54:             $existingdevices = $astman->database_get("AMPUSER",$user."/device");


  55:             if (empty($existingdevices)) {


  56:                 $astman->database_put("AMPUSER",$user."/device",$id);


  57:             } else {


  58:                 $existingdevices .= "&";


  59:                 //only append device value if this id doesn't exist in it already


  60:                 if(strpos($existingdevices,$id."&") === false) // if not containing $id 


  61:                     $astman->database_put("AMPUSER",$user."/device",$existingdevices.$id);


  62:             }


  63:         }


  64:     } else {


  65:         //fatal("Cannot connect to Asterisk Manager with ".$amp_conf["AMPMGRUSER"]."/".$amp_conf["AMPMGRPASS"]);


  66:     } 


  67:  


  68: $i = 0;


  69: } 


  70:  


  71: } 


  72:  


  73: fclose($f); 


  74:  


  75:  


  76:  


  77: ?> 





Комментариев нет: