====== 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 более приоритетное перед профилем в названии тарифа.