source: trunk/Modules/NetworkConfigRouterOS/Generators/Queue.php@ 724

Last change on this file since 724 was 724, checked in by chronos, 10 years ago
  • Removed: Do not need preload tariffs anymore. They were replaced by more generalized services.
File size: 6.8 KB
Line 
1<?php
2if(isset($_SERVER['REMOTE_ADDR'])) die();
3
4$Enabled = 1;
5$ClassesEnabled = 1;
6$SessionDisable = true;
7include_once(dirname(__FILE__).'/../../../Application/System.php');
8$System = new System();
9$System->ShowPage = false;
10$System->Run();
11$PathQueue = array('queue', 'tree');
12
13$Routerboard = new Routerboard();
14$Routerboard->UserName = $Config['MainRouter']['UserName'];
15$Routerboard->Timeout = $Config['MainRouter']['ConnectTimeout'];
16$Routerboard->HostName = $Config['MainRouter']['HostName'];
17$Routerboard->Debug = true;
18
19$UsedNames = array();
20
21function CheckName($Name)
22{
23 global $UsedNames;
24
25 if(in_array($Name, $UsedNames)) die("\n".'Duplicate name: '.$Name);
26 else $UsedNames[] = $Name;
27}
28
29$Finance = &$System->Modules['Finance'];
30$Finance->LoadMonthParameters(0);
31
32// Generate traffic shaping rules
33//$TotalMaxSpeedIn = 4048; //$RealMaxSpeed; //1536;
34//TotalMaxSpeedOut = 3048; //$RealMaxSpeed; //1536;
35//$UsersMaxSpeedIn = 1900; //$MaxSpeed;
36//$UsersMaxSpeedOut = 1900; //$MaxSpeed;
37
38$InDivider = 1;
39$OutDivider = 1;
40$TotalMaxSpeedIn = round($Finance->RealMaxSpeed / $InDivider) * 1000;
41$TotalMaxSpeedOut = round($Finance->RealMaxSpeed / $OutDivider) * 1000;
42$UsersMaxSpeedIn = round($Finance->MaxSpeed / $InDivider) * 1000;
43$UsersMaxSpeedOut = round($Finance->MaxSpeed / $OutDivider) * 1000;
44$VoipMaxSpeedIn = $TotalMaxSpeedIn - 136;
45$VoipMaxSpeedOut = $TotalMaxSpeedOut - 136;
46$VoipSpeedIn = 100; //$SpeedReserve;
47$VoipSpeedOut = 100; //$SpeedReserve;
48$OutInterface = 'eth1';
49$InInterface = 'ifb0';
50$InetInterface = $Config['MainRouter']['InetInterface'];
51
52$DbResult = $System->Database->select('Service', '*', '(`ReplaceId` IS NULL) AND (`Id`='.TARIFF_FREE.')');
53if($DbResult->num_rows == 1)
54{
55 $Service = $DbResult->fetch_array();
56 $FreeInetSpeed = $Service['InternetSpeedMax'] * 1000;
57} else $FreeInetSpeed = 0;
58
59$ItemsQueue = array();
60
61// Root of tree and main limit
62$ItemsQueue[] = array('name' => 'main-out', 'limit-at' => $UsersMaxSpeedIn, 'max-limit' => $UsersMaxSpeedIn, 'parent' => 'global');
63$ItemsQueue[] = array('name' => 'main-in', 'limit-at' => $UsersMaxSpeedOut, 'max-limit' => $UsersMaxSpeedOut, 'parent' => 'global');
64
65// Divide rules by subnet number
66$DbResult = $System->Database->query('SELECT `Id`, `Name`, `AddressRange`, `Mask` FROM `NetworkSubnet`');
67// Slow free internet
68$PacketMark = GetMarkByComment('free-out');
69$ItemsQueue[] = array('name' => 'free-out', 'limit-at' => $FreeInetSpeed, 'max-limit' => $FreeInetSpeed, 'parent' => 'main-out', 'packet-mark' => $PacketMark);
70$PacketMark = GetMarkByComment('free-in');
71$ItemsQueue[] = array('name' => 'free-in', 'limit-at' => $FreeInetSpeed, 'max-limit' => $FreeInetSpeed, 'parent' => 'main-in', 'packet-mark' => $PacketMark);
72
73// Process users
74$DbResult = $System->Database->query('SELECT `Member`.*, `Subject`.`Name` FROM `Member` LEFT JOIN `Subject` ON `Subject`.`Id` = `Member`.`Subject` WHERE `Member`.`Blocked`=0');
75while($Member = $DbResult->fetch_assoc())
76{
77 $ServiceIndex = 1;
78 echo('Zákazník '.$Member['Name']."\n");
79 $DbResult4 = $System->Database->query('SELECT `Service`.*, `ServiceCustomerRel`.`Id` AS `RelId` FROM `ServiceCustomerRel` '.
80 'JOIN `Service` ON `Service`.`Id` = `ServiceCustomerRel`.`Service` '.
81 'WHERE (`ServiceCustomerRel`.`Customer` = '.$Member['Id'].') AND (`ServiceCustomerRel`.`Action` IS NULL) '.
82 'AND (`Service`.`InternetSpeedMax` > 0) AND (`Service`.`InternetSpeedMin` > 0)');
83 while($Service = $DbResult4->fetch_assoc())
84 {
85 echo('Služba '.$Service['Name'].': ');
86 $MemberName = RouterOSIdent($Member['Name'].'-'.$Member['Id'].'-'.$ServiceIndex);
87 $SpeedIn = round($Service['InternetSpeedMin'] / $InDivider) * 1000;
88 $SpeedOut = round($Service['InternetSpeedMin'] / $OutDivider) * 1000;
89 $UserMaxSpeedIn = round($Service['InternetSpeedMax'] / $InDivider) * 1000;
90 $UserMaxSpeedOut = round($Service['InternetSpeedMax'] / $OutDivider) * 1000;
91 $ItemsQueue[] = array('name' => $MemberName.'-out', 'limit-at' => $SpeedIn, 'max-limit' => $UserMaxSpeedIn, 'parent' => 'main-out');
92 $ItemsQueue[] = array('name' => $MemberName.'-in', 'limit-at' => $SpeedOut, 'max-limit' => $UserMaxSpeedOut, 'parent' => 'main-in');
93 CheckName($MemberName.'-out');
94 CheckName($MemberName.'-in');
95
96 $Filter = '(`Used` = 1) AND (`Service` = '.$Service['RelId'].')';
97 $DbResult2 = $System->Database->select('NetworkDevice', 'COUNT(*)', $Filter);
98 $Row = $DbResult2->fetch_row();
99 $HostCount = $Row[0];
100 if($HostCount > 0)
101 {
102 $HostSpeedIn = round($SpeedIn / $HostCount);
103 $HostSpeedOut = round($SpeedOut / $HostCount);
104 } else
105 {
106 $HostSpeedIn = $SpeedIn;
107 $HostSpeedOut = $SpeedOut;
108 }
109
110 $DbResult2 = $System->Database->select('NetworkDevice', '*', $Filter);
111 while($Device = $DbResult2->fetch_assoc())
112 {
113 $DbResult3 = $System->Database->select('NetworkInterface', '*', '`Device` = '.$Device['Id'].' AND `LocalIP` != ""');
114 while($Interface = $DbResult3->fetch_assoc())
115 {
116 $Name = $Device['Name'];
117 if($Interface['Name'] != '') $Name .= '-'.$Interface['Name'];
118 $Name = RouterOSIdent($Name);
119 echo($Name.', ');
120 $IPParts = explode('.', $Interface['LocalIP']);
121 $Subnet = $IPParts[2];
122 $PacketMark = GetMarkByComment($Name.'-out');
123 $ItemsQueue[] = array('name' => $Name.'-out', 'limit-at' => $HostSpeedIn, 'max-limit' => $UserMaxSpeedIn, 'parent' => $MemberName.'-out', 'packet-mark' => $PacketMark);
124 $PacketMark = GetMarkByComment($Name.'-in');
125 $ItemsQueue[] = array('name' => $Name.'-in', 'limit-at' => $HostSpeedOut, 'max-limit' => $UserMaxSpeedOut, 'parent' => $MemberName.'-in', 'packet-mark' => $PacketMark);
126 CheckName($Name.'-out');
127 CheckName($Name.'-in');
128 }
129 }
130
131 $DbResult2 = $System->Database->select('NetworkSubnet', '*', '`Service`='.$Service['RelId']);
132 while($Subnet = $DbResult2->fetch_assoc())
133 {
134 $Subnet['Name'] = RouterOSIdent('subnet-'.$Subnet['Name']);
135 echo($Subnet['Name'].', ');
136 $IPParts = explode('.', $Subnet['AddressRange']);
137 $SubnetNumber = $IPParts[2];
138 $PacketMark = GetMarkByComment($Subnet['Name'].'-out');
139 $ItemsQueue[] = array('name' => $Subnet['Name'].'-out', 'limit-at' => $HostSpeedIn, 'max-limit' => $UserMaxSpeedIn, 'parent' => $MemberName.'-out', 'packet-mark' => $PacketMark);
140 $PacketMark = GetMarkByComment($Subnet['Name'].'-in');
141 $ItemsQueue[] = array('name' => $Subnet['Name'].'-in', 'limit-at' => $HostSpeedOut, 'max-limit' => $UserMaxSpeedOut, 'parent' => $MemberName.'-in', 'packet-mark' => $PacketMark);
142 CheckName($Subnet['Name'].'-out');
143 CheckName($Subnet['Name'].'-in');
144 }
145 echo("\n");
146 $ServiceIndex++;
147 }
148}
149
150//print_r($ItemsQueue);
151$Routerboard->ListUpdate($PathQueue, array('name', 'limit-at', 'max-limit', 'parent', 'packet-mark'), $ItemsQueue, array(), true);
Note: See TracBrowser for help on using the repository browser.