source: trunk/Modules/NetworkConfigRouterOS/Generators/NetwatchImport.php

Last change on this file was 950, checked in by chronos, 20 months ago
  • Fixed: Netwatch import was not done from subnets assigned to members.
File size: 4.4 KB
Line 
1<?php
2
3class ConfigRouterOSNetwatchImport extends NetworkConfigItem
4{
5 function NetwatchImport(): void
6 {
7 $StartTime = time();
8
9 // Load all interfaces to memory
10 $Interfaces = array();
11 $DbResult = $this->Database->select('NetworkInterface', '`Id`, `LocalIP` AS `IP`, `Online`, 0 AS `NewOnline`');
12 while ($DbRow = $DbResult->fetch_assoc())
13 $Interfaces[$DbRow['IP']] = $DbRow;
14
15 // Load netwatch status from all DHCP routers
16 $DbResult3 = $this->Database->query('SELECT `DHCP` FROM `NetworkSubnet` '.
17 'WHERE (`Configure` = 1) AND (`DHCP` != "") GROUP BY `DHCP`');
18 while ($Subnet = $DbResult3->fetch_assoc())
19 {
20 echo('router '.$Subnet['DHCP']."\n");
21 $Routerboard = new RouterosAPI();
22 $Routerboard->Connect($Subnet['DHCP'], $this->System->Config['API']['UserName'],
23 $this->System->Config['API']['Password']);
24 if (!$Routerboard->Connected) continue;
25 $Routerboard->Write('/tool/netwatch/getall', false);
26 $Routerboard->Write('=.proplist=host,status');
27 $Read = $Routerboard->Read(false);
28 $List = $Routerboard->ParseResponse($Read);
29 foreach ($List as $Properties)
30 {
31 $IP = $Properties['host'];
32 if ($Properties['status'] == 'up') $Online = 1;
33 else $Online = 0;
34
35 if ($Online)
36 {
37 if (array_key_exists($IP, $Interfaces))
38 $Interfaces[$IP]['NewOnline'] = 1;
39 else echo('IP '.$IP.' not found.'."\n");
40 }
41 }
42 }
43
44 $Queries = array();
45 $QueriesInsert = array();
46 foreach ($Interfaces as $Interface)
47 {
48 // Update last online time if still online
49 if ($Interface['NewOnline'])
50 $Queries[] = $this->Database->GetUpdate('NetworkInterface', '`Id` = '.$Interface['Id'],
51 array('LastOnline' => TimeToMysqlDateTime($StartTime)));
52
53 if ($Interface['Online'] != $Interface['NewOnline'])
54 {
55 // Online state changed
56 $QueriesInsert[] = 'INSERT INTO `NetworkInterfaceUpDown` (`Interface`,'.
57 '`State`, `Time`, `Previous`) VALUES ('.$Interface['Id'].', '.$Interface['NewOnline'].', "'.
58 TimeToMysqlDateTime($StartTime).'", (SELECT MAX(T2.Id) FROM NetworkInterfaceUpDown AS T2 WHERE T2.Interface='.$Interface['Id'].'))';
59 $Queries[] = $this->Database->GetUpdate('NetworkInterface', '`Id` = "'.$Interface['Id'].'"',
60 array('Online' => $Interface['NewOnline']));
61 }
62 }
63 echo("transakce insert\n");
64 $this->Database->Transaction($QueriesInsert);
65 echo("done\n");
66 echo("transakce\n");
67 $this->Database->Transaction($Queries);
68 echo("done\n");
69
70 // Update Duration for new items
71 echo("Update Duration\n");
72 $this->Database->query('UPDATE NetworkInterfaceUpDown AS T1, NetworkInterfaceUpDown AS T2 '.
73 'SET T1.Duration = TIMESTAMPDIFF(SECOND, T1.Time, T2.Time) '.
74 'WHERE (T2.Previous = T1.Id) AND (T2.Interface = T1.Interface) AND (T1.Duration IS NULL) AND (T2.Time = "'.TimeToMysqlDateTime($StartTime).'")');
75 echo("done\n");
76
77 // Set offline all interfaces which were not updated as online
78 $DbResult = $this->Database->select('NetworkInterface', '*', '(`Online` = 1) AND '.
79 '(`LastOnline` < "'.TimeToMysqlDateTime($StartTime).'")');
80 while ($DbRow = $DbResult->fetch_assoc())
81 {
82 echo('IP '.$DbRow['LocalIP'].' online but time not updated.'."\n");
83 }
84 $DbResult = $this->Database->select('NetworkInterface', '*', '(`Online` = 0) AND '.
85 '(`LastOnline` >= "'.TimeToMysqlDateTime($StartTime).'")');
86 while ($DbRow = $DbResult->fetch_assoc())
87 {
88 echo('IP '.$DbRow['LocalIP'].' not online but time updated.'."\n");
89 }
90
91 $Queries = array();
92 // Update device online state
93 $DbResult = $this->Database->select('NetworkInterface', '`Device`, SUM(`Online`) AS `SumOnline`', '`Online` = 1 GROUP BY `Device`');
94 while ($Device = $DbResult->fetch_assoc())
95 {
96 if ($Device['SumOnline'] > 0)
97 $Queries[] = $this->Database->GetUpdate('NetworkDevice', 'Id='.$Device['Device'], array('LastOnline' => TimeToMysqlDateTime($StartTime), 'Online' => 1));
98 }
99 $Queries[] = $this->Database->GetUpdate('NetworkDevice', '`LastOnline` < "'.TimeToMysqlDateTime($StartTime).'"', array('Online' => 0));
100 echo("Transakce 2\n");
101 $this->Database->Transaction($Queries);
102 echo("done\n");
103 }
104
105 function Run(): void
106 {
107 RepeatFunction(10, array($this, 'NetwatchImport'));
108 }
109}
Note: See TracBrowser for help on using the repository browser.