[Skrypt] Jak zaimportować urządzenia z DUDE do Smokeping

Skrypty

DtoS (Dude to Smokeping) to skrypt mający za zadanie import listy urządzeń z programu DUDE  i export ich do Smokeping. Do poprawnego działania skryptu potrzebny jest dostęp do DUDE po http.

Skrypt powinien być wykonywany z poziomu konsoli w uprawnieniami root’a lub użytkownika z uprawnieniami do operacjach na smokeping.

 


<?php
/*
 * Generator pliku z programu Dude do Smokeping
 *
 * Autor: Piotr Lewandowski
 * E-mail: picom@esnet.pl
 *
 */

###################################################################
############################# Funkcje #############################
###################################################################

/*
 * Zamiana polskie znakow na bez ogonkow
 */
function rewrite($string)
{
 $a = array( 'Ę', 'Ó', 'Ą', 'Ś', 'Ł', 'Ż', 'Ź', 'Ć', 'Ń', 'ę', 'ó', 'ą',
 'ś', 'ł', 'ż', 'ź', 'ć', 'ń' );
 $b = array( 'E', 'O', 'A', 'S', 'L', 'Z', 'Z', 'C', 'N', 'e', 'o', 'a',
 's', 'l', 'z', 'z', 'c', 'n' );

 $string = str_replace( $a, $b, $string );
 $string = preg_replace( '#[^a-z0-9]#is', ' ', $string );
 $string = trim( $string );
 $string = preg_replace( '#\s{2,}#', ' ', $string );
 $string = str_replace( ' ', '-', $string );

 return $string;
}

function downloadContent($url, $postdata = null)
{
 if (!function_exists('curl_init'))
 {
 die('Sorry cURL is not installed!');
 }

 $ch = curl_init();

 curl_setopt ($ch, CURLOPT_URL, $url);
 curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
 curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
 curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
 curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt ($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
 curl_setopt ($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');

 if($postdata)
 {
 curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
 curl_setopt ($ch, CURLOPT_POST, 1);
 }

 $content = curl_exec ($ch);

 curl_close($ch);

 return $content;
}

/*
 * Sortowanie tablicy dwuwymiarowej
 */
function stw($array, $cols)
{
 $colarr = array();

 foreach ($cols as $col => $order)
 {
 $colarr[$col] = array();

 foreach ($array as $k => $row)
 {
 $colarr[$col]['_'.$k] = strtolower($row[$col]);
 }
 }

 $eval = 'array_multisort(';

 foreach ($cols as $col => $order)
 {
 $eval .= '$colarr[\''.$col.'\'],'.$order.',';
 }

 $eval = substr($eval,0,-1).');';
 eval($eval);
 $ret = array();

 foreach ($colarr as $col => $arr)
 {
 foreach ($arr as $k => $v)
 {
 $k = substr($k,1);

 if (!isset($ret[$k]))
 {
 $ret[$k] = $array[$k];
 }

 $ret[$k][$col] = $array[$k][$col];
 }
 }

 return $ret;
}

###################################################################
####################### Kod wlasciwy skryptu ######################
###################################################################

/*
* Login do dude
*/
$username = "admin";

/*
* Haslo do dude
*/
$password = "admin";

/*
* Adres url do dude po http
*/
$url = "http://1.1.1.1:80";

/*
* Lokalizacja wynikowego pliku
*/
$file="/etc/smokeping/config.d/dude.conf";

/*
 * Logowanie do dude po http
 */

$html = downloadContent($url . "/dude/main.html", "user=" . $username . "&password=" . $password . "&process=login");

/*
 * Sprawdzenie czy login i haslo sa poprawne.
 * Jezeli login i haslo sa poprawne w zawartosci $html bedzie pole formularza logowania
 * $sprlogowanie zwroci pusty wynik
 */
if(false !== strpos($html, '<input type="password" name="password">'))
{
 die('Bledny login lub haslo!');
}

/*
 * Odczyt listy urzadzen
 */
$html = downloadContent($url.'/dude/main.html?page=devices');
$x = 0;
$y = 0;
$dev = array();
$dom = new DOMDocument();

foreach(preg_split("/((\r?\n)|(\r\n?))/", $html) as $line)
{
 $find1="2";
 $find1=strpos(trim($line),"td  align=\"right\">");

 if($find1==1)
 {
 if($y==1)
 {
 @$dom->loadHTML('<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /></head><body>'.$line.'</body></html>');
 $nodes = $dom->getElementsByTagName('td');

 foreach($nodes as $link)
 {
 $dev[$x]['stan']=$link->nodeValue;
 }

 $y=0;
 }

 $find2=strpos(trim($line),"device_info");

 if($find2>0)
 {
 @$dom->loadHTML('<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /></head><body>'.$line.'</body></html>');
 $nodes = $dom->getElementsByTagName('a');

 foreach($nodes as $link)
 {
 $dev[$x]['nazwa']=$link->nodeValue;
 $dev[$x]['href']=$link->getAttribute('href');

 $href=trim($dev[$x]['href']);
 $startid=strpos($href,"id");
 $stopid=strlen($href);
 $id='';

 for($d=$startid+3;$d<=$stopid-1;$d++)
 {
 $id.=$href[$d];
 }

 $dev[$x]['id']=$id;

 /*
 * Odczytywanie szczolowych informacji o urzadzeniu m.in. adres IP
 */
 $html3 = downloadContent($url.$dev[$x]['href']);

 foreach(preg_split("/((\r?\n)|(\r\n?))/", $html3) as $line3)
 {
 $find3="2";
 $find3=strpos(trim($line3),"name=\"address\"");

 if($find3==37)
 {
 @$dom->loadHTML('<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /></head><body>'.$line3.'</body></html>');
 $nodes = $dom->getElementsByTagName('input');

 foreach($nodes as $link)
 {
 $dev[$x]['ip']=$link->getAttribute('value');
 }
 }
 }
 }

 $y=1;
 }

 $find4=strpos(trim($line),"map_info");

 if($find4>0 || $find4!="")
 {

 @$dom->loadHTML('<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /></head><body>'.$line.'</body></html>');
 $nodes = $dom->getElementsByTagName('a');

 foreach($nodes as $link)
 {
 $dev[$x]['mapa']=rewrite($link->nodeValue);
 }

 $x++;
 }

 $find1="2";
 }
}

$x=0;
$tab = array();

foreach($dev as $line)
{
 $tab[$line['mapa']][$x]['nazwa']=$line['nazwa'];
 $tab[$line['mapa']][$x]['ip']=$line['ip'];
 $tab[$line['mapa']][$x]['href']=$line['href'];
 $tab[$line['mapa']][$x]['stan']=$line['stan'];
 $tab[$line['mapa']][$x]['id']=$line['id'];

 $x++;
}

/*
 * Tworzenie pliku i otwarcie do zapisu
 */
$fp = fopen($file, "w");

if(false === $fp)
{
 die('Nie udalo sie utworzyc pliku w lokalizacji "' . $file . '"');
}

/*
 * Sortowanie po kluczu (menu glowne)
 */
ksort($tab);

$dane="";

foreach($tab as $numer => $line)
{
 $plus=preg_replace("/[^A-Za-z0-9 _-]/", '', $numer);
 $menu1=preg_replace("/[^A-Za-z0-9 _-]/", '', $numer);
 $title1=$numer;

 $dane.="";
 $dane.="
 + ".$plus."
 menu = ".$menu1."
 title = ".$title1."
 ";

 /*
 * Sortowanie podmenu po nazwie
 */
 $line=stw($line, array('nazwa'=>SORT_ASC));

 foreach($line as $line2)
 {
 $pp=preg_replace("/[^A-Za-z0-9]/", '', $line2['id']);
 $menu2=$line2['nazwa'];
 $title2=$line2['nazwa'];
 $ip=$line2['ip'];

 $dane.="
 ++ ".$pp."
 menu = ".$menu2."
 title = ".$title2."
 host = ".$ip."
 ";
 }
}

/*
 * Zapisanie danych
 */
fputs($fp, $dane);

/*
 * Zamknięcie pliku
 */
fclose($fp);

/*
 * Zmiana uprawnień do pliku
 */
chmod($file,0755);

/*
 * Reboot smokepinga
 */
exec("/etc/init.d/smokeping restart",$output);