Добрый день, уважаемые хабропользователи.
Возникла задача по синхронизация статуса учетной записи в 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);
}
Комментарии приветствуются.