Pull to refresh

Синхронизация статуса учетной записи LanBilling и RTU class 4&5

Reading time3 min
Views2.4K
Добрый день, уважаемые хабропользователи.

Возникла задача по синхронизация статуса учетной записи в 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);
	}



Комментарии приветствуются.
Tags:
Hubs:
Total votes 7: ↑6 and ↓1+5
Comments3

Articles