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 задаются в скобочках в названии тарифа или в карточке абонента.

nolink&|


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

  • mikbill/services/api_service_tv.txt
  • Последние изменения: 2 лет назад
  • — Александр Дудяк