<?php
session_start();
error_reporting(0);
require_once("db.class.php");
require_once("ipmatch.php");
require_once("config.php");

header("Content-Type: text/xml");
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
$db = new DB($conf['db']['user'], $conf['db']['password'], $conf['db']['host'], $conf['db']['database']);
$conf['acl']['auth'] = match_network($conf['acl']['range'],$_SERVER["REMOTE_ADDR"]);

$handle = fopen ($conf['router']['file'],"r");
while ( ($data = fgetcsv ($handle, 1000, ",")) !== FALSE ) {      // Daten werden aus der Datei
  $routerhash[$data[0]]=$data;
}
fclose ($handle);

if(!$conf['acl']['auth'] )
{
  if (isset($_SESSION['logged_in']) && $_SESSION['logged_in'])
    $conf['acl']['auth'] = true;
}

//zum Test
//$conf['acl']['auth'] = true;

$x_startpoint = 4080;
$lng_startpoint = 15.43844103813;
$dx_dLng = 50675.5176;
$y_startpoint = 4806;
$lat_startpoint= 47.07177327969;
$dy_dLat = 75505.521;

$locations = array();
$locids = array();
$nodename = array();
$locname = array();
$ipname = array();
$dnsnames = array();
$ip = array();
$nodelocnames = array();
$ipnodelocnames = array();  
$links = array();
$already = array();
$count = array();

$db->query("SELECT ip, ip.name as ipname,location.id as locid,location.name as locname, node.name as nodename FROM ip, node, location WHERE ip.node_id = node.id and node.location_id=location.id");
while ($data = $db->getNextObject()) {
	$locids[$data->ip]= $data->locid;
	$nodename[$data->ip]= $data->nodename;
	$locname[$data->ip]= $data->locname;
	$ipname[$data->ip]= $data->ipname;
	$dnsname = $data->ipname.'.'.$data->nodename.'.'.$data->locname;
	$dnsnames[$data->locid][]=$dnsname;
	$ip[$dnsname]=$data->ip;
  $nodelocname = $data->nodename.'.'.$data->locname;
	$nodelocnames[$data->locid][]=$nodelocname;
	$ipnodelocnames[$nodelocname][]=$data->ipname; 
}
if($conf['acl']['auth'])
	$db->query("SELECT id as locid, name as locname, pixel_x, pixel_y, gallery_link, location.hastinc as hastinc FROM location ORDER BY name ASC");
else
	$db->query("SELECT id as locid, name as locname, pixel_x, pixel_y, gallery_link, location.hastinc as hastinc FROM location WHERE location.hidden = 0 ORDER BY name ASC");

while ($data = $db->getNextObject()) {
	if ($data->pixel_x == "0")
		continue;

	$data->lng = $lng_startpoint + ($data->pixel_x - $x_startpoint) / $dx_dLng;
	$data->lat = $lat_startpoint + ($y_startpoint - $data->pixel_y) / $dy_dLat;
  $data->state = "offline";
  if($conf['acl']['auth']){
    foreach($nodelocnames[$data->locid] as $nodelocname){
      while(strpos($data->dnsnames,$nodelocname)===false){
        foreach($ipnodelocnames[$nodelocname] as $ipnodelocname){
//          echo  $nodelocname;
//          echo "\n";
//          print_r($ipnodelocnames[$nodelocname]);
//          echo "\n";
//          echo  $ipnodelocname;
//          echo "\n";
          $channel="";
          $frequence="";
          $dnsname=$ipnodelocname.".".$nodelocname;
          if($routerhash[$ip[$dnsname]][4]!=""){
            $channel= $routerhash[$ip[$dnsname]][4];
          }
          if ($routerhash[$ip[$dnsname]][5]!=""){
            $frequence = $routerhash[$ip[$dnsname]][5];
          }
          if ($channel!="" or  $frequence!=""){
            $data->dnsnames = $dnsname." (Kanal: ".$channel." / ".$frequence." GHz);".$data->dnsnames;
            break 2;
          } 
        }
        $data->dnsnames = $dnsname.";".$data->dnsnames;
       }
      }
/*    foreach($dnsnames[$data->locid] as $dnsname){
      if(strpos($data->dnsnames,substr($dnsname,strpos($dnsname,".")))===false){
        $channel="";
        $frequence="";
        if($routerhash[$ip[$dnsname]][4]!=""){
          $channel= $routerhash[$ip[$dnsname]][4];
          }
        if ($routerhash[$ip[$dnsname]][5]!=""){
          $frequence = $routerhash[$ip[$dnsname]][5];
          }
        if ($channel!="" or  $frequence!=""){
          $data->dnsnames = $dnsname." (Kanal: ".$channel." / ".$frequence."GHz);".$data->dnsnames;
          break;
        } else {
          $data->dnsnames = $dnsname.";".$data->dnsnames;
        }
      }
    }
*/
	}
  $locations[$data->locid] = $data;
}

$regmatch = '#\"(.+)\" -> \"(.+)\"\[label=\"([0-9]+.[0-9]+)\"]#';
$lines = file($conf['topo']['file']);

$linecnt=0;
$i =0;
foreach ($lines as $num => $line) 
{

	$linecnt++;
	if(preg_match($regmatch,$line,$matches)==0)
   continue;

	list( , $ipfromLoc, $iptoLoc, $label) = $matches;

	if (empty($ipfromLoc) || empty($iptoLoc) || empty($label))
		continue;
  
  if (empty($locids[$ipfromLoc]) || empty($locids[$iptoLoc]))
		continue;
		
	if(empty($locations[$locids[$ipfromLoc]]->locid) || empty($locations[$locids[$iptoLoc]]->locid))
		continue;

	if($locations[$locids[$ipfromLoc]]->locid == $locations[$locids[$iptoLoc]]->locid)
		continue;
//  echo 	$locations[$locids[$ipfromLoc]]->locid;
//  echo "-";
//  echo "$ipfromLoc\n";
//  echo  $locations[$locids[$iptoLoc]]->locid;
//  echo "\n\n";
//  echo "$iptoLoc\n";


  
  if(isset($already[$locations[$locids[$ipfromLoc]]->locid . '-' . $locations[$locids[$iptoLoc]]->locid])&&
    ($already[$locations[$locids[$ipfromLoc]]->locid . '-' . $locations[$locids[$iptoLoc]]->locid]->used == true)) { 
		$jot = $already[$locations[$locids[$ipfromLoc]]->locid . '-' . $locations[$locids[$iptoLoc]]->locid]->i;
      if($links[$jot]->label != -1){
        if (($links[$jot]->$ipfromLoc==$iptoLoc) || ($links[$jot]->$iptoLoc==$ipfromLoc)){
  			 $links[$jot]->label = ($links[$jot]->label + $label)/2;
  			} else if ($links[$jot]->label > $label){
  			   $links[$jot]->label = $label;
        }
      }
	    if (array_key_exists($ipfromLoc,$routerhash)){
         if ($routerhash[$ipfromLoc][4]!==""){
            $links[$jot]->channel = $routerhash[$ipfromLoc][4];
  
          }
          if ($routerhash[$ipfromLoc][5]!==""){
            $links[$jot]->frequence = $routerhash[$ipfromLoc][5];
          }
  
      } else if (array_key_exists($iptoLoc,$routerhash)){
          if ($routerhash[$iptoLoc][4]!==""){
            $links[$jot]->channel = $routerhash[$iptoLoc][4];
            }
          if ($routerhash[$iptoLoc][5]!==""){
            $links[$jot]->frequence = $routerhash[$iptoLoc][5];
          }
      } else{
          $links[$jot]->channel ="undef";
          $links[$jot]->frequence ="undef"; 
  //        echo "keine IP\n";
      }	
      if (array_key_exists($ipfromLoc,$routerhash)){
         if($conf['acl']['auth']){
            if (strpos($links[$jot]->dnsfrom ,$routerhash[$ipfromLoc][1])===false){

              $links[$jot]->dnsfrom =($routerhash[$ipfromLoc][1].' (Kanal: '.$links[$jot]->channel.' / '.$links[$jot]->frequence.' GHz)'.';'.($links[$jot]->dnsfrom));
            }
            
         }
	       if ($routerhash[$ipfromLoc][3]==$iptoLoc){
            $links[$jot]->defaultroute = "1"; 
         } 
      }
      if (array_key_exists($iptoLoc,$routerhash)){
         if($conf['acl']['auth']){
          if (strpos($links[$jot]->dnsto ,$routerhash[$iptoLoc][1])===false){
//              echo "B\n";
              $links[$jot]->dnsto =($routerhash[$iptoLoc][1].' (Kanal: '.$links[$jot]->channel.' / '.$links[$jot]->frequence.' GHz)'.';'.($links[$jot]->dnsto));
            }
         }
         if ($routerhash[$iptoLoc][3]==$ipfromLoc){
            $links[$jot]->defaultroute = "1"; 
         }  
      }	
	
	}
	elseif(isset($already[$locations[$locids[$iptoLoc]]->locid . '-' . $locations[$locids[$ipfromLoc]]->locid])&&
    ($already[$locations[$locids[$iptoLoc]]->locid . '-' . $locations[$locids[$ipfromLoc]]->locid]->used == true)) {
		$jot = $already[$locations[$locids[$iptoLoc]]->locid . '-' . $locations[$locids[$ipfromLoc]]->locid]->i;
      if($links[$jot]->label != -1){
        if (($links[$jot]->$ipfromLoc==$iptoLoc) || ($links[$jot]->$iptoLoc==$ipfromLoc)){
  			 $links[$jot]->label = ($links[$jot]->label + $label)/2;
  			} else if ($links[$jot]->label > $label){
  			   $links[$jot]->label = $label;
        }
      }
      if (array_key_exists($ipfromLoc,$routerhash)){
         if ($routerhash[$ipfromLoc][4]!==""){
            $links[$jot]->channel = $routerhash[$ipfromLoc][4];
  
          }
          if ($routerhash[$ipfromLoc][5]!==""){
            $links[$jot]->frequence = $routerhash[$ipfromLoc][5];
          }
  
      } else if (array_key_exists($iptoLoc,$routerhash)){
          if ($routerhash[$iptoLoc][4]!==""){
            $links[$jot]->channel = $routerhash[$iptoLoc][4];
            }
          if ($routerhash[$iptoLoc][5]!==""){
            $links[$jot]->frequence = $routerhash[$iptoLoc][5];
          }
      } else{
          $links[$jot]->channel ="undef";
          $links[$jot]->frequence ="undef"; 
  //        echo "keine IP\n";
      }
	    if (array_key_exists($ipfromLoc,$routerhash)){
         if($conf['acl']['auth']){
            if (strpos($links[$jot]->dnsto,$routerhash[$ipfromLoc][1])===false){
//              echo "C\n";
              $links[$jot]->dnsto =($routerhash[$ipfromLoc][1].' (Kanal: '.$links[$jot]->channel.' / '.$links[$jot]->frequence.' GHz)'.';'.($links[$jot]->dnsto));
            }
         }
	       if ($routerhash[$ipfromLoc][3]==$iptoLoc){
            $links[$jot]->defaultroute = "1"; 
         } 
      }
      if (array_key_exists($iptoLoc,$routerhash)){
         if($conf['acl']['auth']){
          if (strpos($links[$jot]->dnsfrom,$routerhash[$iptoLoc][1])===false){
//              echo "D\n";
              $links[$jot]->dnsfrom =($routerhash[$iptoLoc][1].' (Kanal: '.$links[$jot]->channel.' / '.$links[$jot]->frequence.' GHz)'.';'.($links[$jot]->dnsfrom));
              }
         }
         if ($routerhash[$iptoLoc][3]==$ipfromLoc){
            $links[$jot]->defaultroute = "1"; 
         }  
      }

	}
	else {
//  if(isset($already[$locations[$locids[$ipfromLoc]]->locid . '-' . $locations[$locids[$iptoLoc]]->locid])) {
		$already[$locations[$locids[$ipfromLoc]]->locid . '-' . $locations[$locids[$iptoLoc]]->locid]->used = true;
		$already[$locations[$locids[$ipfromLoc]]->locid . '-' . $locations[$locids[$iptoLoc]]->locid]->i = $i;
//	
		$links[$i]->ipfromLoc = $ipfromLoc;
		$links[$i]->iptoLoc = $iptoLoc;
		
  	if (array_key_exists($ipfromLoc,$routerhash)){
         if ($routerhash[$ipfromLoc][4]!==""){
            $links[$i]->channel = $routerhash[$ipfromLoc][4];
  
          }
          if ($routerhash[$ipfromLoc][5]!==""){
            $links[$i]->frequence = $routerhash[$ipfromLoc][5];
          }
  
      } else if (array_key_exists($iptoLoc,$routerhash)){
          if ($routerhash[$iptoLoc][4]!==""){
            $links[$i]->channel = $routerhash[$iptoLoc][4];
            }
          if ($routerhash[$iptoLoc][5]!==""){
            $links[$i]->frequence = $routerhash[$iptoLoc][5];
          }
      } else{
          $links[$i]->channel ="undef";
          $links[$i]->frequence ="undef"; 
  //        echo "keine IP\n";
    }	
    $links[$i]->defaultroute = "0";

    if($conf['acl']['auth']){
      $links[$i]->dnsfrom =$ipname[$ipfromLoc].'.'.$nodename[$ipfromLoc].'.'.$locname[$ipfromLoc].' (Kanal: '.$links[$i]->channel.' / '.$links[$i]->frequence.' GHz )';
      $links[$i]->dnsto =$ipname[$iptoLoc].'.'.$nodename[$iptoLoc].'.'.$locname[$iptoLoc].' (Kanal: '.$links[$i]->channel.' / '.$links[$i]->frequence.' GHz)';
    }
  
    if (array_key_exists($ipfromLoc,$routerhash)){

     if($conf['acl']['auth']){
      $links[$i]->dnsfrom =$routerhash[$ipfromLoc][1].' (Kanal: '.$links[$i]->channel.' / '.$links[$i]->frequence.' GHz)';
     }
	   if ($routerhash[$ipfromLoc][3]==$iptoLoc){
      $links[$i]->defaultroute = "1"; 
    } 
    }
    if (array_key_exists($iptoLoc,$routerhash)){
      if($conf['acl']['auth']){
        $links[$i]->dnsto =$routerhash[$iptoLoc][1].' (Kanal: '.$links[$i]->channel.' / '.$links[$i]->frequence.' GHz)';
      }

      if ($routerhash[$iptoLoc][3]==$ipfromLoc){
        $links[$i]->defaultroute = "1"; 
      }  
    }



    if($links[$i]->label != -1){
			$links[$i]->label = $label;
                if($locations[$locids[$ipfromLoc]]->state == "offline")
			$locations[$locids[$ipfromLoc]]->state = "online";
                if($locations[$locids[$iptoLoc]]->state == "offline")
			$locations[$locids[$iptoLoc]]->state = "online";
    }
		if (($nodename[$ipfromLoc] == "tunnel" && $locations[$locids[$ipfromLoc]]->locname=="housing") || 
			($nodename[$iptoLoc] == "tunnel" && $locations[$locids[$iptoLoc]]->locname=="housing" ) ||
			($locations[$locids[$iptoLoc]]->hastinc && $locations[$locids[$ipfromLoc]]->hastinc)) {
			$links[$i]->label = -1;

			$links[$i]->defaultroute ="1";
			$locations[$locids[$ipfromLoc]]->state = "tunnel";
			$locations[$locids[$iptoLoc]]->state = "tunnel";
		}
		if (($nodename[$ipfromLoc] == "tunnel" && $locations[$locids[$ipfromLoc]]->locname=="housing") || 
			($nodename[$iptoLoc] == "tunnel" && $locations[$locids[$iptoLoc]]->locname=="housing" )){
        $links[$i]->frequence ="LAN";
 			  $links[$i]->channel ="undef";
      }
			
		$i++;
	}
}


echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
echo "<root>\n";

echo "<nodes>\n";
foreach ($locations as $location) {
	$data = $locations[$location->locid];
	printf("\t" . '<node id="%s" name="%s" lat="%s" lng="%s" pixel_x="%s" pixel_y="%s" state="%s" gallery_link="%s" router_links="%s"/>' . "\n", 
				 $data->locid, $data->locname, $data->lat, $data->lng, $data->pixel_x, $data->pixel_y, $data->state, $data->gallery_link, $data->dnsnames);
}
echo "</nodes>\n";

echo "<links>\n";

foreach ($links as $link)


{
	$data1 = $locations[$locids[$link->ipfromLoc]];
	$data2 = $locations[$locids[$link->iptoLoc]];

	$count[$data1->locid]=true;
	$count[$data2->locid]=true;

	printf("\t" . '<link fromid="%s" from="%s" latfrom="%s" lngfrom="%s" toid="%s" to="%s" latto="%s" lngto="%s" value="%s" channel="%s" defaultroute="%s" frequence="%s" dnsfrom="%s" dnsto="%s"/>' . "\n", 
				 $data1->locid, $data1->locname, $data1->lat,$data1->lng,$data2->locid, $data2->locname, $data2->lat, $data2->lng, $link->label, $link->channel, $link->defaultroute, $link->frequence, $link->dnsfrom,$link->dnsto);
}
echo "</links>\n";

echo "<counts>\n";
printf("\t" . '<count number="');
echo sizeof($count);
printf('" />' . "\n");
echo "</counts>\n";

echo "</root>";

?>