<?php
if(isset($_SERVER['REMOTE_ADDR'])) die();

$Enabled = 1;
$ClassesEnabled = 1;
$SessionDisable = true;
include_once(dirname(__FILE__).'/../../../Application/System.php');
$System = new System();
$System->ShowPage = false;
$System->Run();
$PathQueue = array('queue', 'tree');

$Routerboard = new Routerboard();
$Routerboard->UserName = $Config['MainRouter']['UserName'];
$Routerboard->Timeout = $Config['MainRouter']['ConnectTimeout'];
$Routerboard->HostName = $Config['MainRouter']['HostName'];
$Routerboard->Debug = true;

$UsedNames = array();

function CheckName($Name)
{
  global $UsedNames;
  
  if(in_array($Name, $UsedNames)) die("\n".'Duplicate name: '.$Name);
  else $UsedNames[] = $Name;
}

$Finance = &$System->Modules['Finance'];
$Finance->LoadMonthParameters(0);

// Generate traffic shaping rules
//$TotalMaxSpeedIn = 4048; //$RealMaxSpeed; //1536;
//TotalMaxSpeedOut = 3048; //$RealMaxSpeed; //1536;
//$UsersMaxSpeedIn = 1900; //$MaxSpeed;
//$UsersMaxSpeedOut = 1900; //$MaxSpeed;

$InDivider = 1;
$OutDivider = 1;
$TotalMaxSpeedIn = round($Finance->RealMaxSpeed / $InDivider) * 1000;
$TotalMaxSpeedOut = round($Finance->RealMaxSpeed / $OutDivider) * 1000;
$UsersMaxSpeedIn = round($Finance->MaxSpeed / $InDivider) * 1000;
$UsersMaxSpeedOut = round($Finance->MaxSpeed / $OutDivider) * 1000;
$VoipMaxSpeedIn = $TotalMaxSpeedIn - 136;
$VoipMaxSpeedOut = $TotalMaxSpeedOut - 136;
$VoipSpeedIn = 100; //$SpeedReserve;
$VoipSpeedOut = 100; //$SpeedReserve;
$OutInterface = 'eth1';
$InInterface = 'ifb0';
$InetInterface = $Config['MainRouter']['InetInterface'];

$DbResult = $System->Database->select('Service', '*', '(`ReplaceId` IS NULL) AND (`Id`='.TARIFF_FREE.')');
if($DbResult->num_rows == 1)
{
	$Service = $DbResult->fetch_array();
  $FreeInetSpeed = $Service['InternetSpeedMax'] * 1000;
} else $FreeInetSpeed = 0;

$ItemsQueue = array();

// Root of tree and main limit
$ItemsQueue[] = array('name' => 'main-out', 'limit-at' => $UsersMaxSpeedIn, 'max-limit' => $UsersMaxSpeedIn, 'parent' => 'global');
$ItemsQueue[] = array('name' => 'main-in', 'limit-at' => $UsersMaxSpeedOut, 'max-limit' => $UsersMaxSpeedOut, 'parent' => 'global');

// Divide rules by subnet number
$DbResult = $System->Database->query('SELECT `Id`, `Name`, `AddressRange`, `Mask` FROM `NetworkSubnet`');
// Slow free internet
$PacketMark = GetMarkByComment('free-out');
$ItemsQueue[] = array('name' => 'free-out', 'limit-at' => $FreeInetSpeed, 'max-limit' => $FreeInetSpeed, 'parent' => 'main-out', 'packet-mark' => $PacketMark);
$PacketMark = GetMarkByComment('free-in');
$ItemsQueue[] = array('name' => 'free-in', 'limit-at' => $FreeInetSpeed, 'max-limit' => $FreeInetSpeed, 'parent' => 'main-in', 'packet-mark' => $PacketMark);

// Process users
$DbResult = $System->Database->query('SELECT `Member`.*, `Subject`.`Name` FROM `Member` LEFT JOIN `Subject` ON `Subject`.`Id` = `Member`.`Subject` WHERE `Member`.`Blocked`=0');
while($Member = $DbResult->fetch_assoc())
{
  $ServiceIndex = 1;
  echo('Zákazník '.$Member['Name']."\n");
  $DbResult4 = $System->Database->query('SELECT `Service`.*, `ServiceCustomerRel`.`Id` AS `RelId` FROM `ServiceCustomerRel` '.
    'JOIN `Service` ON `Service`.`Id` = `ServiceCustomerRel`.`Service` '.
    'WHERE (`ServiceCustomerRel`.`Customer` = '.$Member['Id'].') AND (`ServiceCustomerRel`.`Action` IS NULL) '.
    'AND (`Service`.`InternetSpeedMax` > 0) AND (`Service`.`InternetSpeedMin` > 0)');
  while($Service = $DbResult4->fetch_assoc())
  {
    echo('Služba '.$Service['Name'].': ');
    $MemberName = RouterOSIdent($Member['Name'].'-'.$Member['Id'].'-'.$ServiceIndex);
    $SpeedIn = round($Service['InternetSpeedMin'] / $InDivider) * 1000;
    $SpeedOut = round($Service['InternetSpeedMin'] / $OutDivider) * 1000;
    $UserMaxSpeedIn = round($Service['InternetSpeedMax'] / $InDivider) * 1000;
    $UserMaxSpeedOut = round($Service['InternetSpeedMax'] / $OutDivider) * 1000;
    $ItemsQueue[] = array('name' => $MemberName.'-out', 'limit-at' => $SpeedIn, 'max-limit' => $UserMaxSpeedIn, 'parent' => 'main-out');
    $ItemsQueue[] = array('name' => $MemberName.'-in', 'limit-at' => $SpeedOut, 'max-limit' => $UserMaxSpeedOut, 'parent' => 'main-in');
    CheckName($MemberName.'-out');
    CheckName($MemberName.'-in');

    $Filter = '(`Used` = 1) AND (`Service` = '.$Service['RelId'].')';
    $DbResult2 = $System->Database->select('NetworkDevice', 'COUNT(*)', $Filter);
    $Row = $DbResult2->fetch_row();
    $HostCount = $Row[0];
    if($HostCount > 0)
    {
      $HostSpeedIn = round($SpeedIn / $HostCount);
      $HostSpeedOut = round($SpeedOut / $HostCount);
    } else
    {
      $HostSpeedIn = $SpeedIn;
      $HostSpeedOut = $SpeedOut;
    }

    $DbResult2 = $System->Database->select('NetworkDevice', '*', $Filter);
    while($Device = $DbResult2->fetch_assoc())
    {
      $DbResult3 = $System->Database->select('NetworkInterface', '*', '`Device` = '.$Device['Id'].' AND `LocalIP` != ""');
      while($Interface = $DbResult3->fetch_assoc())
      {
        $Name = $Device['Name'];
        if($Interface['Name'] != '') $Name .= '-'.$Interface['Name'];
        $Name = RouterOSIdent($Name);
        echo($Name.', ');
        $IPParts = explode('.', $Interface['LocalIP']);
        $Subnet = $IPParts[2];
        $PacketMark = GetMarkByComment($Name.'-out');
        $ItemsQueue[] = array('name' => $Name.'-out', 'limit-at' => $HostSpeedIn, 'max-limit' => $UserMaxSpeedIn, 'parent' => $MemberName.'-out', 'packet-mark' => $PacketMark);
        $PacketMark = GetMarkByComment($Name.'-in');
        $ItemsQueue[] = array('name' => $Name.'-in', 'limit-at' => $HostSpeedOut, 'max-limit' => $UserMaxSpeedOut, 'parent' => $MemberName.'-in', 'packet-mark' => $PacketMark);
        CheckName($Name.'-out');
        CheckName($Name.'-in');
      }
    }
  
    $DbResult2 = $System->Database->select('NetworkSubnet', '*', '`Service`='.$Service['RelId']);
    while($Subnet = $DbResult2->fetch_assoc())
    {
      $Subnet['Name'] = RouterOSIdent('subnet-'.$Subnet['Name']);
      echo($Subnet['Name'].', ');
      $IPParts = explode('.', $Subnet['AddressRange']);
      $SubnetNumber = $IPParts[2];
      $PacketMark = GetMarkByComment($Subnet['Name'].'-out');
      $ItemsQueue[] = array('name' => $Subnet['Name'].'-out', 'limit-at' => $HostSpeedIn, 'max-limit' => $UserMaxSpeedIn, 'parent' => $MemberName.'-out', 'packet-mark' => $PacketMark);
      $PacketMark = GetMarkByComment($Subnet['Name'].'-in');
      $ItemsQueue[] = array('name' => $Subnet['Name'].'-in', 'limit-at' => $HostSpeedOut, 'max-limit' => $UserMaxSpeedOut, 'parent' => $MemberName.'-in', 'packet-mark' => $PacketMark);
      CheckName($Subnet['Name'].'-out');
      CheckName($Subnet['Name'].'-in');
    }
    echo("\n");
    $ServiceIndex++;
  }
}

//print_r($ItemsQueue);
$Routerboard->ListUpdate($PathQueue, array('name', 'limit-at', 'max-limit', 'parent', 'packet-mark'), $ItemsQueue, array(), true);
