Добрый день, уважаемые хабропользователи.
Возникла задача по синхронизация статуса учетной записи в LanBilling и RTU.
Хочу поделиться с Вами вариантом реализации.
Lanbilling v.1.8
RTU class 4&5
php 5.3
mysql 5.0.51a-24+lenny5
cron
Данные о статусе учетных записей LanBilling хранятся в таблице vgroups.
Поля таблицы:
blocked — статус блокировки (0 — разблокировано, > 0 — заблокировано)
blk_req — статус запроса на блокировку (!=0 и !=blocked — заблокировать, !=0 и =blocked — разблокировать)
В задачи cron добавляем выполнение php скрипта с заданым интервалом, который будет получать статус поля
blk_req из бд LanBilling, отсылать soap команду одному из стандартных скриптов RTU (set.aspx или get.aspx) и, в случае ответа true, менять значения полей blocked и blk_req
Для изменения параметров учетной записи нам необходимо знать логин и GUID.
В текущей реализации API RTU не позволяет получить GUID учетной записи по логину(функция getUser), поэтому для получения GUID используется функция getUserList
Комментарии приветствуются.
Возникла задача по синхронизация статуса учетной записи в LanBilling и RTU.
Хочу поделиться с Вами вариантом реализации.
Использовалось
Lanbilling v.1.8
RTU class 4&5
php 5.3
mysql 5.0.51a-24+lenny5
cron
Реализация
Данные о статусе учетных записей LanBilling хранятся в таблице vgroups.
Поля таблицы:
blocked — статус блокировки (0 — разблокировано, > 0 — заблокировано)
blk_req — статус запроса на блокировку (!=0 и !=blocked — заблокировать, !=0 и =blocked — разблокировать)
В задачи cron добавляем выполнение php скрипта с заданым интервалом, который будет получать статус поля
blk_req из бд LanBilling, отсылать soap команду одному из стандартных скриптов RTU (set.aspx или get.aspx) и, в случае ответа true, менять значения полей blocked и blk_req
Функция для отправки soap запроса
function xmlHttpsReq($xml,$type){ $ch = curl_init('https://IP_сервера:порт/mobile_request/'.$type.'.aspx?admin'); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); $data=curl_exec($ch); $result=substr($data,0,strpos($data,'</Root>')+7); if( curl_errno($ch) != 0 ) { die('CURL_error: ' . curl_errno($ch) . ', ' . curl_error($ch)); }; curl_close($ch); return $result; }
Функция для получения данных о всех пользователях
function getUserList() { $data=xmlHttpsReq('<commands><command name="Get" table="User" /></commands>','get'); $xml = new SimpleXMLElement($data); foreach ($xml->command->user as $user) { $usr[]=$user; } return $usr; }
Функция для получения данных о пользователе по логину
function getUser($ID) { $data=xmlHttpsReq('<commands><command name="Get" table="User"><item><id>'.$ID.'</id></item></command></commands>','get'); $xml = new SimpleXMLElement($data); return $xml->command->user; }
Функция для установки параметров учетной записи
function setUser($arr) { $converter = new Array2XML(); $obj = $converter->convert($arr); $data=xmlHttpsReq('<commands><command name="Edit" table="User">'.$obj.'</command></commands>','set'); $xml = new SimpleXMLElement($data); return $xml->command->item->result; }
Класс для конвертирования массива в xml
class Array2XML { private $writer; private $rootName = 'item'; function __construct() { $this->writer = new XMLWriter(); } public function convert($data) { $this->writer->openMemory(); $this->writer->startElement($this->rootName); if (is_array($data)) { $this->getXML($data); } $this->writer->endElement(); return $this->writer->outputMemory(); } public function setVersion($version) { $this->version = $version; } public function setEncoding($encoding) { $this->encoding = $encoding; } public function setRootName($rootName) { $this->rootName = $rootName; } private function getXML($data) { foreach ($data as $key => $val) { if (is_numeric($key)) { $key = 'key'.$key; } if (is_array($val)) { $this->writer->startElement($key); $this->getXML($val); $this->writer->endElement(); } else { $this->writer->writeElement($key, $val); } } } }
Для изменения параметров учетной записи нам необходимо знать логин и GUID.
В текущей реализации API RTU не позволяет получить GUID учетной записи по логину(функция getUser), поэтому для получения GUID используется функция getUserList
Реализация
mysql_connect(HOST,USERNAME,PASSWORD); mysql_select_db(DBNAME); // получаем данные о всех пользователях RTU $allusers = getUserList(); //получаем список учетных записей LanBilling на изменение $res = mysql_query("SELECT CASE WHEN blk_req != 0 AND blk_req = blocked THEN 'true' WHEN blk_req != 0 AND blocked = 0 THEN 'false' ELSE 'none' END AS blk, login FROM vgroups WHERE blk_req != 0"); while ($row=mysql_fetch_array($res)) { unset($user); foreach($allusers as $allusr) { if($allusr->id==$row['login']) { $user=$allusr; break; } } if (($user)&&($row['blk']!='none')) { if(setUser(array('id'=>$user->id,'guid'=>$user->guid,'enabled'=>$row['blk']))=='true') $ids[] = $row['vg_id']; // если учетка заблокирована на RTU добавляем ее в список для блокировки в LanBilling } else $ids[] = $row['vg_id']; } // блокируем учетки if (count(@$ids)>0) { $sql = 'UPDATE vgroups SET blocked = IF(blk_req = blocked, 0, blk_req), blk_req = 0, blk_req_user = "" WHERE vg_id IN (' . implode(',', $ids) . ')'; mysql_query($sql); }
Комментарии приветствуются.
