====== 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 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 задаются в скобочках в названии тарифа или в карточке абонента. \\ {{:mikbill:services:screenshot_1.png?nolink&|}} \\ Название профиля в Multicast ACL более приоритетное перед профилем в названии тарифа.