Коллеги подскажите пожалуйста, кто нибудь интегрировал
utm5 + мидлваре от iptv portal
Функционал требуется обычный, чтобы биллинг передавал(отрубал)
абонентов от услуги иптв.
UTM5 + iptv portal
-
- Сообщения: 77
- Зарегистрирован: Пн сен 14, 2009 13:53
- Откуда: Екатеринбург
- Контактная информация:
У нас проще сделано. ТВ приставки в отдельном VLAN, получают IP по DHCP на MAC из прописанного в биллинге (DHCP сервер от ISC). Когда у клиента блокируеться счет - в DHCP убираеться запись для IP. Проходит время лизы - у клиента перестает показыват приставка. Но в начале у него "отрубаеться Интернет" 

Интересно сделаноNik0n писал(а):У нас проще сделано. ТВ приставки в отдельном VLAN, получают IP по DHCP на MAC из прописанного в биллинге (DHCP сервер от ISC). Когда у клиента блокируеться счет - в DHCP убираеться запись для IP. Проходит время лизы - у клиента перестает показыват приставка. Но в начале у него "отрубаеться Интернет"

Re: UTM5 + iptv portal
У iptvportal достаточно простой API.gtk писал(а):Коллеги подскажите пожалуйста, кто нибудь интегрировал
utm5 + мидлваре от iptv portal
Функционал требуется обычный, чтобы биллинг передавал(отрубал)
абонентов от услуги иптв.
Один из вариантов:
В биллинге каждый ТВ-пакет создать как доп. услугу. Так же создать доп. услугу, типа "Доступ к IPTV".
Для клиентов с IPTV назначать нужные ТВ-пакеты и услугу "Доступ к IPTV", а в тех. параметрах заводить логин, пароль к iptvportal. По-умочанию в тех. параметрах доступны типы web и email, но руками в таблице DB можно задать дополнительное поле, например, iptv. Тех. параметр привязывать нужно к услуге "Доступ к IPTV", что бы при смене ТВ-пакета логин и пароль не исчезали.
Ну, и далее скриптами вытаскивать информацию из базы и синхронизировать через API.
В добавок к сообщению предыдущего оратора выкладываю свой скрипт на коленке.
Работает просто. При запуске без параметров проверяет активных подписчиков в БД и отключает неактивных в middleware.
При запуске через RFW с параметром CREATE создает нового подписчика в Middleware.
С параметром DELETE удаляет подписчика в MIDDLEWARE.
Название ТВ тарифа в биллинге вида:
Работает просто. При запуске без параметров проверяет активных подписчиков в БД и отключает неактивных в middleware.
При запуске через RFW с параметром CREATE создает нового подписчика в Middleware.
С параметром DELETE удаляет подписчика в MIDDLEWARE.
Название ТВ тарифа в биллинге вида:
Название ТВ пакета в Middleware:[ФЛ][ТВ][-][ПРЕМИУМ][123][456]
[ПРЕМИУМ]
Код: Выделить всё
<?php
//АВТОРИЗАЦИОННЫЕ ДАННЫЕ
// UTM database
$dbhostname="";
$dbusername="";
$dbpassword="";
$dbname="";
$_auth_uri = 'https://go.iptvportal.ru/api/jsonrpc/';
$_username = '';
$_password = '';
$_jsonsql_uri = 'https://admin.operator.iptvportal.ru/api/jsonsql/';
$_iptvportal_header = null;
//БАЗОВЫЕ ФУНКЦИИ
function send ($url, $data, $extra_headers=null) {
$ch = curl_init ();
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch, CURLOPT_TIMEOUT, 10);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt ($ch, CURLOPT_POST, true);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $data);
if (isset ($extra_headers)) {
curl_setopt ($ch, CURLOPT_HTTPHEADER, $extra_headers);
}
//echo "HTTP fetching '$url'...\n";
$content = curl_exec ($ch);
$http_code = curl_getinfo ($ch, CURLINFO_HTTP_CODE);
if ($content === false) {
$err_msg = "HTTP error: $http_code (" . curl_error($ch) . ')' . '\n';
echo $err_msg;
throw new Exception ($err_msg);
}
if ($http_code != 200) {
$err_msg = "HTTP request failed ($http_code)\n";
echo $err_msg;
throw new Exception ($err_msg);
}
//echo "HTTP OK ($http_code)\n";
curl_close ($ch);
return $content;
}
function jsonrpc_call ($url, $method, $params, $extra_headers=null) {
static $req_id = 1;
$req = array (
"jsonrpc" => '2.0',
"id" => $req_id++,
"method" => $method,
"params" => $params
);
$req = json_encode ($req);
$res = send ($url, $req, $extra_headers=$extra_headers);
//echo $res;
$res = json_decode ($res, true);
if (!isset ($res)) {
echo "error: not result\n";
return null;
} else if (!array_key_exists ('result', $res) || !isset ($res ['result'])) {
print_r ($res ['error']);
return null;
} else {
return $res ['result'];
}
return $res;
}
function jsonsql_call ($cmd, $params) {
global $_jsonsql_uri, $_iptvportal_header;
//echo 'iptvportal_header: '; print_r ($_iptvportal_header);
return jsonrpc_call ($_jsonsql_uri, $cmd, $params, $extra_headers=$_iptvportal_header);
}
function authorize_user ($auth_uri, $username, $password) {
global $_iptvportal_header;
$res = jsonrpc_call ($auth_uri, $cmd="authorize_user", $params=array (
'username' => $username,
'password' => $password
));
if (isset ($res) && array_key_exists ('session_id', $res)) {
$_iptvportal_header = array ('Iptvportal-Authorization: ' . 'sessionid=' . $res ['session_id']);
}
return $res;
}
//ЗАПРОСЫ В MW
//авторизуемся
$user = authorize_user ($auth_uri=$_auth_uri, $username=$_username, $password=$_password);
echo 'authorize user result: '; print_r ($user);
//Получаем глобальные данные по подписчику из БД биллинга
if (isset($argv[1])){
//$account_id=isset($argv[2]) ? $argv[2] : exit; //проверяем наличие account id
//$stb_mac=isset($argv[3]) ? $argv[3] : exit; //STB MAC check
$stp_id=isset($argv[2]) ? $argv[2] : exit; // TECH_PARAM_ID
/* Create db connection */
mysql_connect($dbhostname,$dbusername,$dbpassword) OR DIE("Не могу создать соединение ");
mysql_select_db($dbname) or die(mysql_error());
mysql_query("SET CHARSET 'utf8'");
//Получаем список параметров пользователя для указанного tech_param_id
$res0=mysql_query("SELECT
stp.param,
stp.passwd,
u.full_name AS user_fullname,
a.is_blocked AS acc_block_status,
sl.tariff_link_id
FROM service_links sl
LEFT JOIN slink_tech_param stp ON stp.slink_id = sl.id
LEFT JOIN users u ON u.id = sl.user_id
LEFT JOIN account_tariff_link atl ON atl.id = sl.tariff_link_id
LEFT JOIN services_data sd ON sd.id = sl.service_id
LEFT JOIN accounts a ON a.id = sl.account_id
WHERE
stp.id = '$stp_id'
AND u.is_deleted = 0
AND a.is_deleted = 0
AND sl.is_deleted = 0
AND sd.is_deleted = 0
");
$row0=mysql_fetch_row($res0);
//Разбираем полученные данные по переменным
$user_login = $row0[0];
$user_password = $row0[1];
$fullname=$row0[2];
//Проверяем статус аккаунта юзера
//юзер активен = приставка активна
$status = ($row0[3]!='0') ? '1' : '0';
$tariff_link_id = $row0[4];
//выдираем из наименования сервисной связки
//имя тарифного плана приставки в Stalker
//preg_match_all("/\[([^\[\]]+)\]/" ,$row0[3],$u_tpnamearray);
//$tariffname=$u_tpnamearray[1][3];
if ($argv[1]=='CREATE') {
//ЕСЛИ ПЕРВЫМ АРГУМЕНТОМ ПОЛУЧАЕМ CREATE
//ТО СОЗДАЕМ ПОЛЬЗОВАТЕЛЯ
//ПОДПИСЫВАЕМ НА ПАКЕТЫ
// PASSWORD REQUIRED
$user_password = (!empty($user_password)) ? $user_password : exit;
//добавление абонента
$res = jsonsql_call ("insert", array (
"into" => "subscriber",
"columns" => array ("username", "password"),
"values" => array (
"username" => "$user_login",
"password" => "$user_password",
"max_terminal" => "1",
"disabled" => "$status"
),
"returning" => "id" ));
//echo 'insert cmd result: '; print_r ($res);
//Подписка абонента на пакеты
//Вытаскиваем из БД биллинга активные пакеты
//для тарифной связки которая подключена к пользователю
$res1=mysql_query("SELECT sd.service_name
FROM service_links sl
LEFT JOIN services_data sd ON sd.id = sl.service_id
WHERE sl.tariff_link_id = '$tariff_link_id'
AND sd.service_type = 2
AND sd.is_deleted = 0
AND sl.is_deleted = 0
");
while($date_array = mysql_fetch_assoc($res1)) { //начало цикла подписки
//ОБРАБАТЫВАЕМ ПОЛУЧЕННЫЕ ИЗ БИЛЛИНГА ДАННЫЕ
//ЗАГОНЯЕМ ИХ В МАССИВ
preg_match_all("/\[([^\[\]]+)\]/" ,$date_array['service_name'],$u_tpnamearray);
echo $u_tpnamearray[0][3]."\r\n";
//В ЦИКЛЕ ВЫПОЛНЯЕМ JSON ЗАПРОСЫ К MW
//ЛИНКУЕМ ВСЕ ПОДКЛЮЧЕННЫЕ К ЮЗЕРУ ПАКЕТЫ
$res = jsonsql_call ("insert", array (
"into" => "subscriber_package",
"columns" => array ("subscriber_id", "package_id", "enabled"),
"select" => array (
"data" => array (array ("s" => "id"), array ("p" => "id"), true),
"from" => array (array (
"table" => "subscriber", "as" => "s"
), array (
"table" => "package", "as" => "p"
)),
"where" => array (
"and" => array (array (
"eq" => array (array ("s" => "username"), $user_login)
), array (
"in" => array (array ("p" => "name"), $u_tpnamearray[0][3])
))
)
),
"returning" => "package_id" ));
//echo 'insert cmd result: '; print_r ($res);
}//конец цикла подписки
} elseif ($argv[1]=='DELETE') {
$user_login=$argv[2];
// удаление аккаунта
//В КАЧЕСТВЕ ВТОРОГО АРГУМЕНТА СКРИПТ ПОЛУЧАЕТ ЛОГИН ДЛЯ УДАЛЕНИЯ
$res = jsonsql_call ("delete", array (
"from" => "subscriber",
"where" => array ("in" => array ("id", array (
"select" => array (
"data" => "id",
"from" => "subscriber",
"where" => array ("eq" => array ("username", $user_login))
)
))),
"returning" => "id" ));
//echo 'delete cmd result: '; print_r ($res);
} elseif ($argv[1]=='RECREATE') {
}
} else {
# выборка списка абонентов
$res = jsonsql_call ("select", array (
"data" => array ("username", "password"),
"from" => "subscriber" ));
//echo 'select cmd result: '; print_r ($res);
//разбираем список по логинам
foreach ($res as $resource ) {
foreach ($resource as $key => $value) { //выясняем статус пользователя
$login = $value;
//echo "$value";
//По логину приставки выясняем в биллинге статус лицевого счета
/* Create db connection */
mysql_connect($dbhostname,$dbusername,$dbpassword) OR DIE("Не могу создать соединение ");
mysql_select_db($dbname) or die(mysql_error());
mysql_query("SET CHARSET 'utf8'");
//Получаем список параметров пользователя для указанного tech_param_id
$res0=mysql_query("SELECT a.is_blocked AS acc_block_status
FROM service_links sl
LEFT JOIN slink_tech_param stp ON stp.slink_id = sl.id
LEFT JOIN account_tariff_link atl ON atl.id = sl.tariff_link_id
LEFT JOIN services_data sd ON sd.id = sl.service_id
LEFT JOIN accounts a ON a.id = sl.account_id
WHERE
stp.param = '$login'
AND a.is_deleted = 0
AND sl.is_deleted = 0
AND sd.is_deleted = 0
");
$row0=mysql_fetch_row($res0);
//Разбираем полученные данные по переменным
//Проверяем статус аккаунта юзера
//юзер активен = приставка активна
$status = ($row0[0]!='0') ? 'true' : 'false';
//обновляем статус абоненту
$res = jsonsql_call ("update", array (
"table" => "subscriber",
"set" => array (
"disabled" => "$status"
),
"where" => array ("eq" => array ("username", "$login")),
"returning" => "id" ));
//echo 'update cmd result: '; print_r ($res);
} //end submassive parsing
} //end massive parsing
}; //end of main if
?>