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