AVM FritzBox mit Munin überwachen – Teil 2

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Keine Bewertung vorhanden)
Loading...

Im ersten Teil sind wir nur sehr oberflächlich auf die UPNP Features der Fritzbox eingegangen. Nachdem ich mich nun intensiver damit beschäftigt habe, muss ich sagen, dass das UPNP Interface für Munin nicht sehr nützlich ist, da kaum Infos auszuwerten sind. Vielmehr habe ich nun einen simplen HTML Reader für die AVM GUI entwickelt. Er funktioniert aktuell mit FritzOS 6.2x.

Ein wenig kompliziert war das Session Handling der AVM GUI, was aber elegant gelöst wurde. Am jedem Request muss eine Session ID hängen, diese können wir uns über ein passendes XML direkt selbst erzeugen.

Wie man hier erkennen kann nutze ich eine Klasse MuninPlugin für globale Funktionen. Es gibt eine globale Variable $password mit dem Passwort der Box. Über den Constructor in der Klasse werden die beiden Umgebungsvariablen IP & Host ausgelesen, welche über eine conf Datei im Munin-Node plugin-conf.d Ordner gesetzt werden. (Bsp: env.ip 192.168.178.1)

Für die Methode readFromAvmGui werden einige Parameter benötigt. Die Variable $page enthält die Unterseite zum auslesen, Bsp. system/security.lua. Die Variablen $start & $end enthalten die jeweiligen Zeilen-Inhalte nach denen gesucht werden soll. Dazwischen wird mitgeschnitten. Ein Beispiel finden Sie weiter unten.

Die zentrale Klasse (MuninPlugin.php) muss als symlink auch im Ordner /etc/munin/plugins/ vorhanden sein. Ich habe diese Datei ebenfalls nach /usr/share/munin/plugins kopiert und via Symlink verlinkt. Das eigentliche Plugin folgt weiter unten.

  1. <?php
  2. /**
  3.  * Class for MuninPlugins
  4.  *
  5.  * - Add symlink:
  6.  * ln -s <pathtothisfile> /etc/munin/plugins/MuninPlugin.php
  7.  *
  8.  * @author Mike Goldhausen
  9.  * @copyright Copyright (c) 2015 by MiGo-WebDesign, www.migo-webdesign.de, Germany
  10.  * 
  11.  */
  12. class MuninPlugin {
  13.  
  14. 	private $password = "";
  15. 	protected $avm = array();
  16.  
  17. 	/**
  18. 	 * Init 
  19. 	 */
  20. 	public function __construct($arg) {
  21. 		$this->avm['ip'] = getenv('ip');
  22. 		$this->avm['host'] = getenv('host');
  23. 	}
  24.  
  25. 	/**
  26. 	 * Start collecting data
  27. 	 *
  28. 	 * @param array $argv
  29. 	 * @return void
  30. 	 */
  31. 	public function start($arg) {
  32. 		if (isset($arg[1]) && $arg[1] == "autoconf") {
  33. 			$this->autoconf();
  34. 		} elseif (isset($arg[1]) && $arg[1] == "config") {
  35. 			$this->generateConfig();
  36. 		} else {
  37. 			$this->printValues();
  38. 		}
  39. 	}
  40.  
  41. 	/**
  42. 	 * Autoconf
  43. 	 *
  44. 	 * @return void
  45. 	 */
  46. 	public function autoconf() {
  47. 		echo "yes\n";
  48. 	}
  49.  
  50. 	/**
  51. 	 * Generate Config of Plugin Data
  52. 	 *
  53. 	 * @return void
  54. 	 */
  55. 	public function generateConfig() {
  56. 		foreach ($this->getPluginSetup() as $k => $v) {
  57. 			echo "$k $v\n";
  58. 		}
  59. 		foreach ($this->getPluginGraphs() as $graph => $setup) {
  60. 			foreach ($setup as $key => $value) {
  61. 				echo "$graph.$key $value\n";
  62. 			}
  63. 		}
  64. 	}
  65.  
  66. 	/**
  67. 	 * Print values of array
  68. 	 *
  69. 	 * @return void
  70. 	 */
  71. 	public function printValues() {
  72. 		foreach ($this->getValues() as $k => $v) {
  73. 			echo "$k.value $v\n";
  74. 		}
  75. 	}
  76.  
  77. 	/**
  78. 	 * Read from AVM GUI with FritzOS 6.20
  79. 	 * 
  80. 	 * @return string
  81. 	 * 
  82. 	 */
  83. 	public function readFromAvmGui($page, $start, $end) {
  84. 		$loginPage 	= "http://".$this->avm['ip']."/login_sid.lua";
  85. 		if (preg_match("/\?/", $page)) {
  86. 			$contentList 	= "http://".$this->avm['ip']."/".$page."&sid=";
  87. 		} else {
  88. 			$contentList 	= "http://".$this->avm['ip']."/".$page."?sid=";
  89. 		}
  90.  
  91. 		$xml = simplexml_load_file($loginPage) or die("url not loading");
  92.  
  93. 		$SID 		= $xml->SID;
  94. 		$Challenge 	= $xml->Challenge;
  95. 		$response	= $Challenge."-".md5(mb_convert_encoding($Challenge."-".$this->password, "UTF-16LE"));
  96.  
  97. 		if ($SID == "0000000000000000") {
  98. 			$loginPageResponse = $loginPage."?response=".$response;
  99. 			$xml2 = simplexml_load_file($loginPageResponse) or die("url not loading");
  100. 			$SID = $xml2->SID;
  101. 		}
  102.  
  103. 		if (!$SID) {
  104. 			die("SID holen nicht OK");
  105. 		}
  106.  
  107. 		$content = file($contentList.$SID);
  108.  
  109. 		$record = false;
  110. 		foreach ($content as $w) {
  111. 			if (preg_match("#".$start."#", $w)) {
  112. 				$record = true;
  113. 			}
  114.  
  115. 			if ($record == true) {
  116. 				if (preg_match("#".$end."#", $w)) {
  117. 					$contentArr[] = $w; //Get the last one
  118. 					$record = false;
  119. 				}
  120. 			}
  121.  
  122. 			if ($record == true) {
  123. 				$contentArr[] = $w;
  124. 			}
  125. 		}
  126.  
  127. 		$output = implode("", $contentArr);
  128. 		$output = preg_replace("/\&/","&amp;", $output);
  129. 		return $output;
  130. 	}
  131. }
  132. ?>

Kommen wir nun zu dem eigentlichen Plugin. In dem Beispiel zeige ich, wie man die aktuelle Anzahl an aktiven WLAN Verbindungen vermitteln kann.

Unterteilt ist das Plugin grob in die Methoden zur Erzeugung der Konfiguration, der Graphen und der eigentlichen Werte. Das Plugin sollte soweit eigentlich selbst erklärend sein, auf die einzelnen MUNIN Parameter gehe ich hier nicht weiter ein.

Munin Plugin: AVM WLAN Connection Count

avm_wlan_router-day

  1. #!/usr/bin/php
  2. <?php
  3. ##############################
  4. #%# family=auto
  5. #%# capabilities=autoconf
  6.  
  7. require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'MuninPlugin.php';
  8.  
  9. /**
  10.  * AVM WLAN Connection Count plugin for Munin
  11.  *
  12.  * - Add symlink:
  13.  * ln -s <pathtothisfile> /etc/munin/plugins/avm_wlan_router
  14.  *
  15.  * - Add plugin configuration to /etc/munin/plugin-conf.d/avm
  16.  * [avm_wlan_router]
  17.  * env.ip 192.168.178.1
  18.  * env.host fritz.box
  19.  *
  20.  * @author Mike Goldhausen
  21.  * @copyright Copyright (c) 2015 by MiGo-WebDesign, www.migo-webdesign.de, Germany
  22.  */
  23.  
  24. class AvmWlan extends MuninPlugin {
  25.  
  26. 	/**
  27. 	 * general Config for Plugin
  28. 	 *
  29. 	 * @return array
  30. 	*/
  31. 	protected function getPluginSetup() {
  32. 		return array(
  33. 				'host_name' => $this->avm['host'],
  34. 				'graph_order' => 'wlan',
  35. 				'graph_title' => 'AVM Fritz!Box WLAN Connections',
  36. 				'graph_category' => 'wlan',
  37. 				'graph_info' => 'This graph shows the current WLAN Connections.',
  38. 				'graph_vlabel' => 'Count of Connections',
  39. 				'graph_args' => '--base 1000'
  40. 		);
  41. 	}
  42.  
  43. 	/**
  44. 	 * Config for Graphs
  45. 	 *
  46. 	 * @return array
  47. 	 */
  48. 	protected function getPluginGraphs() {
  49. 		$graphs = array();
  50.  
  51. 		$graphs['wlan']['label'] = "WLAN Connections on 2.4 & 5 Ghz";
  52. 		$graphs['wlan']['info'] = "WLAN Connections on 2.4 & 5 Ghz";
  53.  
  54. 		return $graphs;
  55. 	}
  56.  
  57. 	/**
  58. 	 * Transform data from RAW HTML into XML Structure
  59. 	 *
  60. 	 * @param string $content
  61. 	 * @return data
  62. 	 */
  63. 	protected function transformData($content) {
  64. 		$doc = new DOMDocument();
  65. 		$doc->loadHTML($content);
  66. 		$tmp = simplexml_import_dom($doc);
  67.  
  68. 		$wlanCount = preg_replace("/[^0-9]/","", $tmp->body->table->tr[5]->td[1]);
  69.  
  70. 		$graphs['wlan'] = intval($wlanCount);
  71.  
  72. 		return $graphs;
  73. 	}
  74.  
  75. 	/**
  76. 	 * Read source & collecting values
  77. 	 *
  78. 	 * @return array
  79. 	 */
  80. 	protected function getValues() {
  81. 		$content = $this->readFromAvmGui("system/security.lua", "<table class=\"struct_wlan\">","<\/table>");
  82. 		$data = $this->transformData($content);
  83. 		return $data;
  84. 	}
  85.  
  86. }
  87.  
  88. $plugin = new AvmWlan($argv);
  89. $plugin->start($argv);
  90. ?>

Damit nun dieser Graph auch im Munin als separater Host angezeigt wird, muss in der /etc/munin.conf noch folgender Eintrag erfolgen:

[fritz.box]
     address 127.0.0.1
     use_node_name no

Anschließend den munin-node Dienst einmal neustarten und schon werden die Informationen angezeigt.

In den folgenden Artikeln werden wir weitere Plugins veröffentlichen.

5 Replies to “AVM FritzBox mit Munin überwachen – Teil 2”

  1. Pingback: AVM FritzBox via UPNP überwachen/auslesen – MUNIN/NAGIOS | MiGo-IT-Blog

  2. Pingback: [MUNIN] Überwachung AVM Fritzbox Auslastung mit Munin | MiGo-IT-Blog

  3. Pingback: [MUNIN] Überwachung AVM Fritzbox Traffic via UPNP mit Munin | MiGo-IT-Blog

    • Hallo Thorsten,

      soweit ich weiß ist die Auto-Login-Seite unter FritzOS 6.05 anders. In der MuninPlugin.php musst du system/security.lua ersetzen durch: login_sid.lua
      Probier das mal

      GRüße Mike

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*

Sicherheitsfrage * Time limit is exhausted. Please reload CAPTCHA.