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

$Enabled = 1;
$ClassesEnabled = 1;
$SessionDisable = true;
include_once('../../global.php');
include('../routerboard.php');
include('common.php');
$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;

$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) * 1024;
$TotalMaxSpeedOut = round($Finance->RealMaxSpeed / $OutDivider) * 1024;
$UsersMaxSpeedIn = round($Finance->MaxSpeed / $InDivider) * 1024;
$UsersMaxSpeedOut = round($Finance->MaxSpeed / $OutDivider) * 1024;
$VoipMaxSpeedIn = $TotalMaxSpeedIn - 136;
$VoipMaxSpeedOut = $TotalMaxSpeedOut - 136;
$VoipSpeedIn = 100; //$SpeedReserve;
$VoipSpeedOut = 100; //$SpeedReserve;
$OutInterface = 'eth1';
$InInterface = 'ifb0';
$InetInterface = $Config['MainRouter']['InetInterface'];
$FreeInetSpeed = $Finance->Tariffs[6]['SpeedMax'];

$ItemsQueue = array();

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

// Divide rules by subnet number
$DbResult = $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 = $Database->query('SELECT `Member`.*, `Subject`.`Name` FROM `Member` LEFT JOIN `Subject` ON `Subject`.`Id` = `Member`.`Subject`');
while($Member = $DbResult->fetch_assoc())
{
  $Member['Name'] = RouterOSIdent($Member['Name'].'-'.$Member['Id'] );

  echo('Uživatel '.$Member['Name'].': ');
  $Tariff = $Finance->Tariffs[$Member['InternetTariffCurrentMonth']]; 
  $SpeedIn = round($Tariff['SpeedMin'] / $InDivider);
  $SpeedOut = round($Tariff['SpeedMin'] / $OutDivider);
  $UserMaxSpeedIn = round($Tariff['SpeedMax'] / $InDivider);
  $UserMaxSpeedOut = round($Tariff['SpeedMax'] / $OutDivider);
  $ItemsQueue[] = array('name' => $Member['Name'].'-out', 'limit-at' => $SpeedIn, 'max-limit' => $UserMaxSpeedIn, 'parent' => 'main-out');
  $ItemsQueue[] = array('name' => $Member['Name'].'-in', 'limit-at' => $SpeedOut, 'max-limit' => $UserMaxSpeedOut, 'parent' => 'main-in');

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

  $DbResult2 = $Database->select('NetworkDevice', '*', '`Used` = 1 AND `Member` = '.$Member['Id']);
  while($Device = $DbResult2->fetch_assoc())
  {
    $DbResult3 = $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' => $Member['Name'].'-out', 'packet-mark' => $PacketMark);
      $PacketMark = GetMarkByComment($Name.'-in');
      $ItemsQueue[] = array('name' => $Name.'-in', 'limit-at' => $HostSpeedOut, 'max-limit' => $UserMaxSpeedOut, 'parent' => $Member['Name'].'-in', 'packet-mark' => $PacketMark);
    }
  }
  
  $DbResult2 = $Database->select('NetworkSubnet', '*', '`Member`='.$Member['Id']);
  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' => $Member['Name'].'-out', 'packet-mark' => $PacketMark);
    $PacketMark = GetMarkByComment($Subnet['Name'].'-in');
    $ItemsQueue[] = array('name' => $Subnet['Name'].'-in', 'limit-at' => $HostSpeedOut, 'max-limit' => $UserMaxSpeedOut, 'parent' => $Member['Name'].'-in', 'packet-mark' => $PacketMark);
  }
  echo("\n");
}

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

?>
