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

Last change on this file since 861 was 861, checked in by chronos, 6 years ago
  • Modified: Optimized netwatch inport for inserting data ti database.
  • Fixed: RouterOS API to work with RouterOS newer than 6.43.
File size: 4.4 KB
Line 
1<?php
2
3class ConfigRouterOSNetwatchImport extends NetworkConfigItem
4{
5 function NetwatchImport()
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 (`Member` IS NULL) 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 $QueriesUpdate = array();
47 foreach($Interfaces as $Index => $Interface)
48 {
49 // Update last online time if still online
50 if($Interface['NewOnline'])
51 $Queries[] = $this->Database->GetUpdate('NetworkInterface', '`Id` = '.$Interface['Id'],
52 array('LastOnline' => TimeToMysqlDateTime($StartTime)));
53
54 if($Interface['Online'] != $Interface['NewOnline'])
55 {
56 // Online state changed
57 $QueriesInsert[] = 'INSERT INTO `NetworkInterfaceUpDown` (`Interface`,'.
58 '`State`, `Time`, `Duration`) VALUES ('.$Interface['Id'].', '.$Interface['NewOnline'].', "'.
59 TimeToMysqlDateTime($StartTime).'", NULL)';
60 // Update previous record duration in UpDown table
61 $QueriesUpdate[] = 'UPDATE `NetworkInterfaceUpDown` AS `TM` SET `Duration` = TIMESTAMPDIFF(SECOND, '.
62 '`TM`.`Time`, (SELECT `Time` FROM (SELECT * FROM `NetworkInterfaceUpDown`) AS `TA` WHERE (`TA`.`Time` > `TM`.`Time`) '.
63 'AND (`TA`.`Interface`=`TM`.`Interface`) ORDER BY `TA`.`Time` ASC LIMIT 1)) '.
64 'WHERE (`TM`.`Duration` IS NULL) AND (`TM`.`Interface` ='.$Interface['Id'].')';
65 $Queries[] = $this->Database->GetUpdate('NetworkInterface', '`Id` = "'.$Interface['Id'].'"',
66 array('Online' => $Interface['NewOnline']));
67 }
68 }
69 echo("transakce insert\n");
70 $this->Database->Transaction($QueriesInsert);
71 echo("done\n");
72 echo("transakce\n");
73 $this->Database->Transaction($Queries);
74 echo("done\n");
75 echo("transakce\n");
76 $this->Database->Transaction($QueriesUpdate);
77 echo("done\n");
78
79 // Set offline all interfaces which were not updated as online
80 $DbResult = $this->Database->select('NetworkInterface', '*', '(`Online` = 1) AND '.
81 '(`LastOnline` < "'.TimeToMysqlDateTime($StartTime).'")');
82 while($DbRow = $DbResult->fetch_assoc())
83 {
84 echo('IP '.$DbRow['LocalIP'].' online but time not updated.'."\n");
85 }
86 $DbResult = $this->Database->select('NetworkInterface', '*', '(`Online` = 0) AND '.
87 '(`LastOnline` >= "'.TimeToMysqlDateTime($StartTime).'")');
88 while($DbRow = $DbResult->fetch_assoc())
89 {
90 echo('IP '.$DbRow['LocalIP'].' not online but time updated.'."\n");
91 }
92
93 $Queries = array();
94 // Update device online state
95 $DbResult = $this->Database->select('NetworkInterface', '`Device`, SUM(`Online`) AS `SumOnline`', '`Online` = 1 GROUP BY `Device`');
96 while($Device = $DbResult->fetch_assoc())
97 {
98 if($Device['SumOnline'] > 0)
99 $Queries[] = $this->Database->GetUpdate('NetworkDevice', 'Id='.$Device['Device'], array('LastOnline' => TimeToMysqlDateTime($StartTime), 'Online' => 1));
100 }
101 $Queries[] = $this->Database->GetUpdate('NetworkDevice', '`LastOnline` < "'.TimeToMysqlDateTime($StartTime).'"', array('Online' => 0));
102 echo("Transakce 2\n");
103 $this->Database->Transaction($Queries);
104 echo("done\n");
105 }
106
107 function Run()
108 {
109 RepeatFunction(10, array($this, 'NetwatchImport'));
110 }
111}
Note: See TracBrowser for help on using the repository browser.