<?php

class ConfigRouterOSNetwatchImport extends NetworkConfigItem
{
  function NetwatchImport()
  {
    $StartTime = time();

    // Load all interfaces to memory
    $Interfaces = array();
    $DbResult = $this->Database->select('NetworkInterface', '`Id`, `LocalIP` AS `IP`, `Online`, 0 AS `NewOnline`');
    while($DbRow = $DbResult->fetch_assoc())
      $Interfaces[$DbRow['IP']] = $DbRow;

    // Load netwatch status from all DHCP routers
    $DbResult3 = $this->Database->query('SELECT `DHCP` FROM `NetworkSubnet` '.
      'WHERE (`Configure` = 1) AND (`Member` IS NULL) GROUP BY `DHCP`');
    while($Subnet = $DbResult3->fetch_assoc())
    {
      echo('router '.$Subnet['DHCP']."\n");
      $Routerboard = new RouterosAPI();
      $Routerboard->Connect($Subnet['DHCP'], $this->System->Config['API']['UserName'],
        $this->System->Config['API']['Password']);
      if(!$Routerboard->Connected) continue;
      $Routerboard->Write('/tool/netwatch/getall', false);
      $Routerboard->Write('=.proplist=host,status');
      $Read = $Routerboard->Read(false);
      $List = $Routerboard->ParseResponse($Read);
      foreach($List as $Properties)
      {
        $IP = $Properties['host'];
        if($Properties['status'] == 'up') $Online = 1;
          else $Online = 0;

        if($Online)
        {
          if(array_key_exists($IP, $Interfaces))
            $Interfaces[$IP]['NewOnline'] = 1;
            else echo('IP '.$IP.' not found.'."\n");
        }
      }
    }

    $Queries = array();
    foreach($Interfaces as $Index => $Interface)
    {
      // Update last online time if still online
      if($Interface['NewOnline'])
        $Queries[] = $this->Database->GetUpdate('NetworkInterface', '`Id` = "'.$Interface['Id'].'"',
          array('LastOnline' => TimeToMysqlDateTime($StartTime)));

      if($Interface['Online'] != $Interface['NewOnline'])
      {
        // Online state changed
        $Queries[] = 'INSERT INTO `NetworkInterfaceUpDown` (`Interface`,
         `State`, `Time`, `Duration`) VALUES ('.$Interface['Id'].', '.$Interface['NewOnline'].', "'.
          TimeToMysqlDateTime($StartTime).'", NULL)';
        // Update previous record duration in UpDown table
        $Queries[] = 'UPDATE `NetworkInterfaceUpDown` AS `TM` SET `Duration` = TIMESTAMPDIFF(SECOND, '.
          '`TM`.`Time`, (SELECT `Time` FROM (SELECT * FROM `NetworkInterfaceUpDown`) AS `TA` WHERE (`TA`.`Time` > `TM`.`Time`) '.
          'AND (`TA`.`Interface`=`TM`.`Interface`) ORDER BY `TA`.`Time` ASC LIMIT 1)) '.
          'WHERE (`TM`.`Duration` IS NULL) AND (`TM`.`Interface` ='.$Interface['Id'].')';
        $Queries[] = $this->Database->GetUpdate('NetworkInterface', '`Id` = "'.$Interface['Id'].'"',
          array('Online' => $Interface['NewOnline']));
      }
    }
    echo("transakce\n");
    $this->Database->Transaction($Queries);
    echo("done\n");

    // Set offline all interfaces which were not updated as online
    $DbResult = $this->Database->select('NetworkInterface', '*', '(`Online` = 1) AND '.
      '(`LastOnline` < "'.TimeToMysqlDateTime($StartTime).'")');
    while($DbRow = $DbResult->fetch_assoc())
    {
      echo('IP '.$DbRow['LocalIP'].' online but time not updated.'."\n");
    }
    $DbResult = $this->Database->select('NetworkInterface', '*', '(`Online` = 0) AND '.
      '(`LastOnline` >= "'.TimeToMysqlDateTime($StartTime).'")');
    while($DbRow = $DbResult->fetch_assoc())
    {
      echo('IP '.$DbRow['LocalIP'].' not online but time updated.'."\n");
    }

    $Queries = array();
    // Update device online state
    $DbResult = $this->Database->select('NetworkInterface', '`Device`, SUM(`Online`) AS `SumOnline`', '`Online` = 1 GROUP BY `Device`');
    while($Device = $DbResult->fetch_assoc())
    {
      if($Device['SumOnline'] > 0)
        $Queries[] = $this->Database->GetUpdate('NetworkDevice', 'Id='.$Device['Device'], array('LastOnline' => TimeToMysqlDateTime($StartTime), 'Online' => 1));
    }
    $Queries[] = $this->Database->GetUpdate('NetworkDevice', '`LastOnline` < "'.TimeToMysqlDateTime($StartTime).'"', array('Online' => 0));
    echo("Transakce 2\n");
    $this->Database->Transaction($Queries);
    echo("done\n");
  }

  function Run()
  {
    RepeatFunction(10, array($this, 'NetwatchImport'));
  }
}
