UTM5 + iptv portal

Технические вопросы по UTM 5.0
Закрыто
gtk
Сообщения: 232
Зарегистрирован: Пт янв 21, 2005 18:33

UTM5 + iptv portal

Сообщение gtk »

Коллеги подскажите пожалуйста, кто нибудь интегрировал

utm5 + мидлваре от iptv portal


Функционал требуется обычный, чтобы биллинг передавал(отрубал)

абонентов от услуги иптв.

Nik0n
Сообщения: 77
Зарегистрирован: Пн сен 14, 2009 13:53
Откуда: Екатеринбург
Контактная информация:

Сообщение Nik0n »

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

Аватара пользователя
TiRider
Сообщения: 568
Зарегистрирован: Сб июн 07, 2008 12:43

Сообщение TiRider »

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

Shiva
Сообщения: 131
Зарегистрирован: Пт авг 28, 2009 12:39
Откуда: Россия, Тверь

Сообщение Shiva »

Проще менять влан и в нём вещать на всех группах заглушку, дай денег.

LovingFox
Сообщения: 23
Зарегистрирован: Пт апр 10, 2015 16:26

Re: UTM5 + iptv portal

Сообщение LovingFox »

gtk писал(а):Коллеги подскажите пожалуйста, кто нибудь интегрировал
utm5 + мидлваре от iptv portal
Функционал требуется обычный, чтобы биллинг передавал(отрубал)
абонентов от услуги иптв.
У iptvportal достаточно простой API.

Один из вариантов:
В биллинге каждый ТВ-пакет создать как доп. услугу. Так же создать доп. услугу, типа "Доступ к IPTV".
Для клиентов с IPTV назначать нужные ТВ-пакеты и услугу "Доступ к IPTV", а в тех. параметрах заводить логин, пароль к iptvportal. По-умочанию в тех. параметрах доступны типы web и email, но руками в таблице DB можно задать дополнительное поле, например, iptv. Тех. параметр привязывать нужно к услуге "Доступ к IPTV", что бы при смене ТВ-пакета логин и пароль не исчезали.

Ну, и далее скриптами вытаскивать информацию из базы и синхронизировать через API.

kara
Сообщения: 125
Зарегистрирован: Вс мар 21, 2010 21:02

Сообщение kara »

В добавок к сообщению предыдущего оратора выкладываю свой скрипт на коленке.

Работает просто. При запуске без параметров проверяет активных подписчиков в БД и отключает неактивных в middleware.

При запуске через RFW с параметром CREATE создает нового подписчика в Middleware.
С параметром DELETE удаляет подписчика в MIDDLEWARE.

Название ТВ тарифа в биллинге вида:
[ФЛ][ТВ][-][ПРЕМИУМ][123][456]
Название ТВ пакета в Middleware:
[ПРЕМИУМ]

Код: Выделить всё

<?php
//АВТОРИЗАЦИОННЫЕ ДАННЫЕ

// UTM database
$dbhostname="";
$dbusername="";
$dbpassword="";
$dbname="";

$_auth_uri = 'https&#58;//go.iptvportal.ru/api/jsonrpc/';
$_username = '';
$_password = '';
$_jsonsql_uri = 'https&#58;//admin.operator.iptvportal.ru/api/jsonsql/';
$_iptvportal_header = null;

//БАЗОВЫЕ ФУНКЦИИ

function send &#40;$url, $data, $extra_headers=null&#41; &#123;
    $ch = curl_init &#40;&#41;;
    curl_setopt &#40;$ch, CURLOPT_CONNECTTIMEOUT, 10&#41;;
    curl_setopt &#40;$ch, CURLOPT_RETURNTRANSFER, true&#41;;
    curl_setopt &#40;$ch, CURLOPT_TIMEOUT, 10&#41;;
    curl_setopt &#40;$ch, CURLOPT_URL, $url&#41;;
    curl_setopt &#40;$ch, CURLOPT_SSL_VERIFYPEER, false&#41;;
    curl_setopt &#40;$ch, CURLOPT_SSL_VERIFYHOST, false&#41;;
    curl_setopt &#40;$ch, CURLOPT_POST, true&#41;;
    curl_setopt &#40;$ch, CURLOPT_POSTFIELDS, $data&#41;;
    if &#40;isset &#40;$extra_headers&#41;&#41; &#123;
        curl_setopt &#40;$ch, CURLOPT_HTTPHEADER, $extra_headers&#41;;
    &#125;
    //echo "HTTP fetching '$url'...\n";
    $content = curl_exec &#40;$ch&#41;;
    $http_code = curl_getinfo &#40;$ch, CURLINFO_HTTP_CODE&#41;;
    if &#40;$content === false&#41; &#123;
        $err_msg = "HTTP error&#58; $http_code &#40;" . curl_error&#40;$ch&#41; . '&#41;' . '\n';
        echo $err_msg;
        throw new Exception &#40;$err_msg&#41;;
    &#125;
    if &#40;$http_code != 200&#41; &#123;
        $err_msg = "HTTP request failed &#40;$http_code&#41;\n";
        echo $err_msg;
        throw new Exception &#40;$err_msg&#41;;
    &#125;
    //echo "HTTP OK &#40;$http_code&#41;\n";
    curl_close &#40;$ch&#41;;
    return $content;
&#125;

        function jsonrpc_call &#40;$url, $method, $params, $extra_headers=null&#41; &#123;
            static $req_id = 1;

            $req = array &#40;
                "jsonrpc" => '2.0',
                "id" => $req_id++,
                "method" => $method,
                "params" => $params
            &#41;;
            $req = json_encode &#40;$req&#41;;
            $res = send &#40;$url, $req, $extra_headers=$extra_headers&#41;;
            //echo $res;
            $res = json_decode &#40;$res, true&#41;;
            if &#40;!isset &#40;$res&#41;&#41; &#123;
                echo "error&#58; not result\n";
                return null;
            &#125; else if &#40;!array_key_exists &#40;'result', $res&#41; || !isset &#40;$res &#91;'result'&#93;&#41;&#41; &#123;
                print_r &#40;$res &#91;'error'&#93;&#41;;
                return null;
            &#125; else &#123;
                return $res &#91;'result'&#93;;
            &#125;
            return $res;
        &#125;

        function jsonsql_call &#40;$cmd, $params&#41; &#123;
            global $_jsonsql_uri, $_iptvportal_header;
            //echo 'iptvportal_header&#58; '; print_r &#40;$_iptvportal_header&#41;;
            return jsonrpc_call &#40;$_jsonsql_uri, $cmd, $params, $extra_headers=$_iptvportal_header&#41;;
        &#125;


        function authorize_user &#40;$auth_uri, $username, $password&#41; &#123;
            global $_iptvportal_header;
            $res = jsonrpc_call &#40;$auth_uri, $cmd="authorize_user", $params=array &#40;
                'username' => $username,
                'password' => $password
            &#41;&#41;;
            if &#40;isset &#40;$res&#41; && array_key_exists &#40;'session_id', $res&#41;&#41; &#123;
                $_iptvportal_header = array &#40;'Iptvportal-Authorization&#58; ' . 'sessionid=' . $res &#91;'session_id'&#93;&#41;;
            &#125;
            return $res;
        &#125;


//ЗАПРОСЫ В MW


        //авторизуемся
        $user = authorize_user &#40;$auth_uri=$_auth_uri, $username=$_username, $password=$_password&#41;;
        echo 'authorize user result&#58; '; print_r &#40;$user&#41;;

        //Получаем глобальные данные по подписчику из БД биллинга
         if &#40;isset&#40;$argv&#91;1&#93;&#41;&#41;&#123;
                //$account_id=isset&#40;$argv&#91;2&#93;&#41; ? $argv&#91;2&#93; &#58; exit; //проверяем наличие account id
                //$stb_mac=isset&#40;$argv&#91;3&#93;&#41; ? $argv&#91;3&#93; &#58; exit; //STB MAC check
                $stp_id=isset&#40;$argv&#91;2&#93;&#41; ? $argv&#91;2&#93; &#58; exit; // TECH_PARAM_ID

                /* Create db connection */
                mysql_connect&#40;$dbhostname,$dbusername,$dbpassword&#41; OR DIE&#40;"Не могу создать соединение "&#41;;
                mysql_select_db&#40;$dbname&#41; or die&#40;mysql_error&#40;&#41;&#41;;
                mysql_query&#40;"SET CHARSET 'utf8'"&#41;;

                //Получаем список параметров пользователя для указанного tech_param_id
                $res0=mysql_query&#40;"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
                                                "&#41;;
        $row0=mysql_fetch_row&#40;$res0&#41;;

        //Разбираем полученные данные по переменным
        $user_login = $row0&#91;0&#93;;
        $user_password = $row0&#91;1&#93;;
        $fullname=$row0&#91;2&#93;;
        //Проверяем статус аккаунта юзера
        //юзер активен = приставка активна
        $status = &#40;$row0&#91;3&#93;!='0'&#41; ? '1' &#58; '0';
        $tariff_link_id = $row0&#91;4&#93;;

        //выдираем из наименования сервисной связки
        //имя тарифного плана приставки в Stalker
        //preg_match_all&#40;"/\&#91;&#40;&#91;^\&#91;\&#93;&#93;+&#41;\&#93;/" ,$row0&#91;3&#93;,$u_tpnamearray&#41;;
        //$tariffname=$u_tpnamearray&#91;1&#93;&#91;3&#93;;

         if &#40;$argv&#91;1&#93;=='CREATE'&#41; &#123;
                //ЕСЛИ ПЕРВЫМ АРГУМЕНТОМ ПОЛУЧАЕМ CREATE
                //ТО СОЗДАЕМ ПОЛЬЗОВАТЕЛЯ
                //ПОДПИСЫВАЕМ НА ПАКЕТЫ

                // PASSWORD REQUIRED
                $user_password = &#40;!empty&#40;$user_password&#41;&#41; ? $user_password &#58; exit;

                        //добавление абонента
                        $res = jsonsql_call &#40;"insert", array &#40;
                            "into" => "subscriber",
                            "columns" => array &#40;"username", "password"&#41;,
                            "values" => array &#40;
                                "username" => "$user_login",
                                "password" => "$user_password",
                                "max_terminal" => "1",
                                "disabled" => "$status"
                            &#41;,
                            "returning" => "id" &#41;&#41;;
                        //echo 'insert cmd result&#58; ';   print_r &#40;$res&#41;;

                //Подписка абонента на пакеты
                //Вытаскиваем из БД биллинга активные пакеты
                //для тарифной связки которая подключена к пользователю
                $res1=mysql_query&#40;"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
                          "&#41;;
                while&#40;$date_array = mysql_fetch_assoc&#40;$res1&#41;&#41; &#123; //начало цикла подписки
                        //ОБРАБАТЫВАЕМ ПОЛУЧЕННЫЕ ИЗ БИЛЛИНГА ДАННЫЕ
                        //ЗАГОНЯЕМ ИХ В МАССИВ
                        preg_match_all&#40;"/\&#91;&#40;&#91;^\&#91;\&#93;&#93;+&#41;\&#93;/" ,$date_array&#91;'service_name'&#93;,$u_tpnamearray&#41;;
                        echo $u_tpnamearray&#91;0&#93;&#91;3&#93;."\r\n";
                                        //В ЦИКЛЕ ВЫПОЛНЯЕМ JSON ЗАПРОСЫ К MW
                                        //ЛИНКУЕМ ВСЕ ПОДКЛЮЧЕННЫЕ К ЮЗЕРУ ПАКЕТЫ
                                        $res = jsonsql_call &#40;"insert", array &#40;
                                            "into" => "subscriber_package",
                                            "columns" => array &#40;"subscriber_id", "package_id", "enabled"&#41;,
                                            "select" => array &#40;
                                                "data" => array &#40;array &#40;"s" => "id"&#41;, array &#40;"p" => "id"&#41;, true&#41;,
                                                        "from" => array &#40;array &#40;
                                                    "table" => "subscriber", "as" => "s"
                                                        &#41;, array &#40;
                                                    "table" => "package", "as" => "p"
                                                        &#41;&#41;,
                                                "where" => array &#40;
                                                    "and" => array &#40;array &#40;
                                                        "eq" => array &#40;array &#40;"s" => "username"&#41;, $user_login&#41;
                                                    &#41;, array &#40;
                                                        "in" => array &#40;array &#40;"p" => "name"&#41;, $u_tpnamearray&#91;0&#93;&#91;3&#93;&#41;
                                                    &#41;&#41;
                                                &#41;
                                            &#41;,
                                            "returning" => "package_id" &#41;&#41;;
                                        //echo 'insert cmd result&#58; '; print_r &#40;$res&#41;;

                &#125;//конец цикла подписки

                &#125; elseif &#40;$argv&#91;1&#93;=='DELETE'&#41; &#123;
                $user_login=$argv&#91;2&#93;;
                // удаление аккаунта
                //В КАЧЕСТВЕ ВТОРОГО АРГУМЕНТА СКРИПТ ПОЛУЧАЕТ ЛОГИН ДЛЯ УДАЛЕНИЯ
                        $res = jsonsql_call &#40;"delete", array &#40;
                            "from" => "subscriber",
                            "where" => array &#40;"in" => array &#40;"id", array &#40;
                                "select" => array &#40;
                                    "data" => "id",
                                    "from" => "subscriber",
                                            "where" => array &#40;"eq" => array &#40;"username", $user_login&#41;&#41;
                                &#41;
                            &#41;&#41;&#41;,
                            "returning" => "id" &#41;&#41;;
                        //echo 'delete cmd result&#58; '; print_r &#40;$res&#41;;

                &#125; elseif &#40;$argv&#91;1&#93;=='RECREATE'&#41; &#123;
                
                &#125;
        &#125; else &#123;
                # выборка списка абонентов
                        $res = jsonsql_call &#40;"select", array &#40;
                            "data" => array &#40;"username", "password"&#41;,
                            "from" => "subscriber" &#41;&#41;;
                        //echo 'select cmd result&#58; '; print_r &#40;$res&#41;;

                        //разбираем список по логинам
                        foreach &#40;$res as $resource &#41; &#123;
                                foreach &#40;$resource as $key => $value&#41; &#123; //выясняем статус пользователя
                                $login = $value;
                                //echo "$value";
                                //По логину приставки выясняем в биллинге статус лицевого счета

                                 /* Create db connection */
                mysql_connect&#40;$dbhostname,$dbusername,$dbpassword&#41; OR DIE&#40;"Не могу создать соединение "&#41;;
                mysql_select_db&#40;$dbname&#41; or die&#40;mysql_error&#40;&#41;&#41;;
                mysql_query&#40;"SET CHARSET 'utf8'"&#41;;

                //Получаем список параметров пользователя для указанного tech_param_id
                $res0=mysql_query&#40;"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
                                        "&#41;;
                        $row0=mysql_fetch_row&#40;$res0&#41;;
                        //Разбираем полученные данные по переменным

                        //Проверяем статус аккаунта юзера
                        //юзер активен = приставка активна
                        $status = &#40;$row0&#91;0&#93;!='0'&#41; ? 'true' &#58; 'false';

                        //обновляем статус абоненту
                        $res = jsonsql_call &#40;"update", array &#40;
                            "table" => "subscriber",
                            "set" => array &#40;
                                "disabled" => "$status"
                            &#41;,
                            "where" => array &#40;"eq" => array &#40;"username", "$login"&#41;&#41;,
                            "returning" => "id" &#41;&#41;;
                        //echo 'update cmd result&#58; '; print_r &#40;$res&#41;;


                                &#125; //end submassive parsing
                        &#125; //end massive parsing

                &#125;; //end of main if

?>

Закрыто