Задача была такая:заставить два астера(в двух разных городах) работать с одной базой и с конфиг файлами,синхронизированными по-определенной логике(например в Главном оффисе должны находиться все войсмейлы,а на остальных-только те,которые относятся к людям,зарегистрированным на их АТС,причем 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: ?>