API Услуг[ТВ]
Скрипт для синхронизации профилей IPTV абонентов на портах.
Профили IPTV указываются в названии тарифа или индивидуальных параметров.
Для работы необходимо настроенное SNMP, заполнены устройства.
Профиль IPTV по умолчанию "Default".
Создать папку iptv_sync
mkdir -p /var/www/mikbill/admin/res/iptv_sync
Создать скрипт запуска run.sh
nano /var/www/mikbill/admin/res/iptv_sync/run.sh
#!/bin/bash PHP=`which php` cd /var/www/mikbill/admin/res/iptv_sync echo " " >> log echo `date` >> log $PHP iptv.php >> log
Дать права запуска скрипту:
chmod +x /var/www/mikbill/admin/res/iptv_sync/run.sh
Добавить запись в крон:
nano /etc/crontab
*/60 * * * * root /var/www/mikbill/admin/res/iptv_sync/run.sh
Создать скрипт iptv.php
nano /var/www/mikbill/admin/res/iptv_sync/iptv.php
<?php $debug = false; $debug_switch_ip = array("192.168.1.10", "192.168.1.11"); $command = array(); $filter = array(); $command[1] = "1.3.6.1.4.1.890.1.5.8.68.28.1.1.4"; // mes3500 $command[2] = "1.3.6.1.4.1.890.1.5.8.51.28.1.1.4"; // mes3528 $filter[1] = "SNMPv2-SMI::enterprises.890.1.5.8.68.28.1.1.4."; $filter[2] = "SNMPv2-SMI::enterprises.890.1.5.8.51.28.1.1.4."; $config_file='../../app/etc/config.xml'; if (file_exists($config_file)) { $xml = simplexml_load_file($config_file); $TIME_ZONE = (string) $xml->parameters->timezone; $CONF_MYSQL_HOST = (string) $xml->parameters->mysql->host; $CONF_MYSQL_USERNAME = (string) $xml->parameters->mysql->username; $CONF_MYSQL_PASSWORD = (string) $xml->parameters->mysql->password; $CONF_MYSQL_DBNAME = (string) $xml->parameters->mysql->dbname; } else { die("config not found"); } if(isset($TIME_ZONE) && $TIME_ZONE != "") date_default_timezone_set($TIME_ZONE); else date_default_timezone_set('Europe/Kiev'); $db = new PDO( "mysql:host={$CONF_MYSQL_HOST};dbname={$CONF_MYSQL_DBNAME}", $CONF_MYSQL_USERNAME, $CONF_MYSQL_PASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES koi8r") ); $switch_list_query='SELECT swid, nameswitch, swtypeid, ip, port, comunity FROM switches WHERE ip != ""'; $users_list_query='SELECT uid, deposit, credit, users.blocked, users.gid, packet, prim, switchport, swid FROM users, packets WHERE users.gid = packets.gid AND switchport !=0'; $users_acl_query='SELECT `uid`, `value` FROM `users_custom_fields` WHERE `key` LIKE "ext_serviceacl"'; $switch_list = $db->query($switch_list_query, PDO::FETCH_LAZY); $iptv_switch = array(); $iptv_users = array(); $user_types = array("usersfreeze", "usersblok", "usersdel"); $iptv_default = array(); $switch_access = array(); $users_acl = array(); foreach ($switch_list as $switch) { if($debug AND !in_array($switch["ip"], $debug_switch_ip) ) { continue; } $switch_access[$switch["swid"]] = array ("ip" => $switch["ip"], "port" => $switch["port"], "comunity" => $switch["comunity"], "swtypeid" => $switch["swtypeid"] ); $iptv_port_list = snmprealwalk($switch["ip"].":".$switch["port"], $switch["comunity"], $command[$switch["swtypeid"]]); if (count($iptv_port_list) > 0) { foreach ($iptv_port_list as $key => $type) { $port = str_replace($filter[$switch["swtypeid"]], "", $key); $value = str_replace('"', "", str_replace("STRING: ", "", $type)); $iptv_switch[$switch["swid"]][$port] = $value; } } } $users_custom_fields = $db->query($users_acl_query, PDO::FETCH_LAZY); foreach($users_custom_fields as $users_custom_field) { $users_acl[$users_custom_field["uid"]] = $users_custom_field["value"]; } $users_list = $db->query($users_list_query, PDO::FETCH_LAZY); foreach ($users_list as $user) { $iptv_tarif_value = null; $iptv_user_value = null; if(!isset($switch_access[$user["swid"]]["ip"])) { continue; } if(isset($users_acl[$user["uid"]])) { $iptv_user_value = $users_acl[$user["uid"]]; } else { $tmp = explode("(", $user["packet"]); if(isset($tmp[1])) { $tmp = explode(")", $tmp[1]); if(isset($tmp[0])) { $iptv_tarif_value = $tmp[0]; } } } if(!is_null($iptv_user_value)) { $iptv_value = $iptv_user_value; } else { if(!is_null($iptv_tarif_value)) { $iptv_value = $iptv_tarif_value; } else { continue; } } if( $user["blocked"] ) { $iptv_value = "Default"; } else if( $user["deposit"] + $user["credit"] < 0 ) { $iptv_value = "Default"; } if(isset($iptv_switch[$user["swid"]][$user["switchport"]])) { if( $iptv_switch[$user["swid"]][$user["switchport"]] == $iptv_value ) { echo "user: {$user["uid"]} port OK.[switch: {$iptv_switch[$user["swid"]][$user["switchport"]]}, user: {$iptv_value}] \n"; } else { echo "user: {$user["uid"]} port missmatch. [switch: {$iptv_switch[$user["swid"]][$user["switchport"]]}, user: {$iptv_value} ] "; echo "Fixing..."; $type = $switch_access[$user["swid"]]["swtypeid"]; $success = snmp2_set ( $switch_access[$user["swid"]]["ip"], $switch_access[$user["swid"]]["comunity"] , $command[$type].".".$user["switchport"], "s", $iptv_value); if($success) { echo "Successful \n"; } else { echo "Error! \n"; } } } else { echo "no data for port: {$user["switchport"]} on swid:{$user["swid"]} ({$switch_access[$user["swid"]]["ip"]}) \n"; } } foreach ($user_types as $user_type) { $query="SELECT uid, {$user_type}.gid, packet, switchport, swid FROM {$user_type}, packets WHERE {$user_type}.gid = packets.gid AND switchport !=0"; $users = $db->query($query, PDO::FETCH_LAZY); foreach($users as $user) { $iptv_value = "Default"; if(!isset($switch_access[$user["swid"]]["ip"])) { continue; } if(isset($iptv_switch[$user["swid"]][$user["switchport"]])) { if( $iptv_switch[$user["swid"]][$user["switchport"]] == $iptv_value ) { echo "{$user_type}: {$user["uid"]} port OK.[switch: {$iptv_switch[$user["swid"]][$user["switchport"]]}, user: {$iptv_value}] \n"; } else { echo "{$user_type}: {$user["uid"]} port missmatch. [switch: {$iptv_switch[$user["swid"]][$user["switchport"]]}, user: {$iptv_value}] "; echo "Fixing..."; $type = $switch_access[$user["swid"]]["swtypeid"]; $success = snmp2_set ( $switch_access[$user["swid"]]["ip"], $switch_access[$user["swid"]]["comunity"] , $command[$type].".".$user["switchport"], "s", $iptv_value); if($success) { echo "Successful \n"; } else { echo "Error! \n"; } } } else { echo "no data for port: {$user["switchport"]} on swid:{$user["swid"]} ({$switch_access[$user["swid"]]["ip"]}) \n"; } } }
Параметры в скрипте:
$debug = false;
Включает режим дебага(теста)
$debug_switch_ip = array("192.168.1.10", "192.168.1.11");
Массив с IP адресом свичей для дебага/теста
$command[1] = "1.3.6.1.4.1.890.1.5.8.68.28.1.1.4"; // mes3500 $command[2] = "1.3.6.1.4.1.890.1.5.8.51.28.1.1.4"; // mes3528
Цифры 1 и 2 это ID типов устройств. Значение которое они принимают это SNMP OID для чтения/записи профиля на порту
$filter[1] = "SNMPv2-SMI::enterprises.890.1.5.8.68.28.1.1.4."; $filter[2] = "SNMPv2-SMI::enterprises.890.1.5.8.51.28.1.1.4.";
Цифры 1 и 2 это ID типов устройств. Значение которое они принимают это шаблон для правильной обрезки ответа.
Имена профилей для IPTV задаются в скобочках в названии тарифа или в карточке абонента.

Название профиля в Multicast ACL более приоритетное перед профилем в названии тарифа.