Willkommen im MiGo-IT-Blog

Sonderartikel

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (7 Stimmen, Durchschnitt: 3.00 von 5)
Loading...Loading...

Herzlich Willkommen im neuen MiGo-IT-Blog.

Dies ist das offizielle Nachfolge-Projekt von Mikes-PC Hilfe. Evtl. wundern Sie sich, wo das Forum als auch die Tipps geblieben sind. Diverse Umstände haben mich dazu veranlasst, das Forum zu schließen. Einer der Hauptgründe ist aber die momentane Situation der Forumssoftware selbst gewesen. Der bisherige Deutschlandvertrieb durfte schon die aktuelle Version nicht mehr verkaufen, ebenso wie den Nachfolger. Für uns hätte das bedeutet, schnellstmöglichst ein Update auf den Nachfolger anzugehen, der Aufwand dafür hätte aber in keinem Verhältnis gestanden. Auch nimmt das Projekt einen enormen Zeitaufwand in Anspruch, was die weiteren Gründe waren. Alle Details finden Sie hier.

Das Mikes PC Hilfe Forum konnten wir aber als Archiv weiterleben lassen, klicken Sie dazu in der Navigation auf das Archiv. Alle Themen sind dort enthalten. Auch alle Links aus z.B. Suchmaschinen sollten weiter funktionieren.

Eine Option um neue Beiträge zu schreiben gibt es nicht, wir bieten hier auch keinen PC Support mehr an. Dafür bitten wir Sie, sich in anderen Foren Rat zu holen.

Ich hoffe Sie bleiben uns als Leser im Rahmen des Blogs treu :)

Grüße Mike

[MUNIN] Überwachung AVM Fritzbox Uptime via UPNP mit Munin

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

Wie in unserem letzten Artikel angekündigt, möchte ich heute ein weiteres Plugin vorstellen. Diesmal greift das Plugin nicht über die HTML GUI zu, sondern fragt die UPNP Schnittstelle der Fritzbox ab. Mehr Details dazu finden Sie in unserem ersten und zweiten Artikel dazu.

Auch hier wird die globale Klasse MuninPlugin benötigt, welche Sie hier finden.

  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 Uptime plugin for Munin
  11.  *
  12.  * - Add symlink:
  13.  * ln -s <pathtothisfile> /etc/munin/plugins/avm_uptime_router
  14.  *
  15.  * - Add plugin configuration to /etc/munin/plugin-conf.d/avm
  16.  * [avm_uptime_router]
  17.  * env.ip 192.168.178.1:49000
  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 AvmUptime 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' => 'down up',
  35. 				'graph_title' => 'AVM Fritz!Box Uptime',
  36. 				'graph_category' => 'system',
  37. 				'graph_info' => 'Uptime AVM!FritzBox in Days',
  38. 				'graph_vlabel' => 'Uptime in Days',
  39. 				'graph_args' => '--base 1000 -l 0',
  40. 				'graph_scale' => 'no'
  41. 		);
  42. 	}
  43.  
  44. 	/**
  45. 	 * Config for Graphs
  46. 	 *
  47. 	 * @return array
  48. 	 */
  49. 	protected function getPluginGraphs() {
  50. 		$graphs = array();
  51.  
  52. 		$graphs['uptime']['label'] = "uptime";
  53. 		$graphs['uptime']['draw'] = "AREA";
  54.  
  55. 		return $graphs;
  56. 	}
  57.  
  58. 	/**
  59. 	 * Transform data from RAW HTML into XML Structure
  60. 	 *
  61. 	 * @return data
  62. 	 */
  63. 	protected function transformData() {
  64. 		$client = new SoapClient(
  65. 		    null,
  66. 		    array(
  67. 		        'location'   => "http://".$this->avm['ip']."/igdupnp/control/WANIPConn1",
  68. 		        'uri'        => "urn:schemas-upnp-org:service:WANIPConnection:1",
  69. 		        'soapaction' => "",
  70. 		        'noroot'     => True
  71. 		    )
  72. 		);
  73.  
  74. 		$status = $client->GetStatusInfo();
  75. 		$uptime = round((intval($status['NewUptime']) / 86400),2);
  76.  
  77. 		$graphs['uptime'] = $uptime;
  78.  
  79. 		return $graphs;
  80. 	}
  81.  
  82. 	/**
  83. 	 * Read source & collecting values
  84. 	 *
  85. 	 * @return array
  86. 	 */
  87. 	protected function getValues() {
  88. 		$data = $this->transformData();
  89. 		return $data;
  90. 	}
  91.  
  92. }
  93.  
  94. $plugin = new AvmUptime($argv);
  95. $plugin->start($argv);
  96. ?>

AVM FritzBox mit Munin überwachen – Teil 2

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Keine Bewertung vorhanden)
Loading...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 kompleziert 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. Anbei der Ausschnitt für das lesen aus der AVM GUI:

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.

Diese Datei muss als symlink auch im Ordner /etc/munin/plugins/ vorhanden sein.

  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. 		$contentList 	= "http://".$this->avm['ip']."/".$page."?sid=";
  86.  
  87. 		$xml = simplexml_load_file($loginPage) or die("url not loading");
  88.  
  89. 		$SID 		= $xml->SID;
  90. 		$Challenge 	= $xml->Challenge;
  91. 		$response	= $Challenge."-".md5(mb_convert_encoding($Challenge."-".$this->password, "UTF-16LE"));
  92.  
  93. 		if ($SID == "0000000000000000") {
  94. 			$loginPageResponse = $loginPage."?response=".$response;
  95. 			$xml2 = simplexml_load_file($loginPageResponse) or die("url not loading");
  96. 			$SID = $xml2->SID;
  97. 		}
  98.  
  99. 		if (!$SID) {
  100. 			die("SID holen nicht OK");
  101. 		}
  102.  
  103. 		$content = file($contentList.$SID);
  104.  
  105. 		$record = false;
  106. 		foreach ($content as $w) {
  107. 			if (preg_match("#".$start."#", $w)) {
  108. 				$record = true;
  109. 			}
  110.  
  111. 			if ($record == true) {
  112. 				if (preg_match("#".$end."#", $w)) {
  113. 					$contentArr[] = $w; //Get the last one
  114. 					$record = false;
  115. 				}
  116. 			}
  117.  
  118. 			if ($record == true) {
  119. 				$contentArr[] = $w;
  120. 			}
  121. 		}
  122.  
  123. 		$output = implode("", $contentArr);
  124. 		$output = preg_replace("/\&/","&amp;", $output);
  125. 		return $output;
  126. 	}
  127. }
  128. ?>

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

  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.

[Windows 8.1] Ändern des Netzwerktyps von Öffentlichem zu privatem Netzwerk

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

Unser erster Artikel im neuen Jahr 2015, an dieser Stelle wünschen wir allen Lesern ein frohes neues Jahr und mögen all eure Vorsätze in Erfüllung gehen :)

Heute möchten wir Ihnen zeigen, wie Sie den Netzwerktyp in Windows 8.1 nachträglich ändern können. Hinweis: Dieser Tipp funktioniert nicht unter Windows 8, sondern nur unter Windows 8.1

Durch einen rechtsklick auf das Netzwerksymbol in der rechten unteren Ecke -> Netzwerk & Freigabecenter öffnen, öffnet sich ein neues Fenster in dem Sie unterhalb von “Aktive Netzwerke anzeigen” Ihre aktuellen Verbindungen sehen können. Unterhalb des Namens sehen Sie nun auch, auf welchem Netzwerk-Typ Ihr Netzwerk gerade eingestellt ist.

Um dies nun zu ändern, öffnen Sie die Charms-Bar (Mit der Maus nach rechts oben und dann runter ziehen, oder die Windows-Taste + C drücken), dort klicken Sie in der Mitte auf Einstellungen, anschließend unten auf PC Einstellungen. Im nun geöffneten Fenster wählen Sie links in der Navigation Netzwerk.

Klicken Sie dann auf Ihre aktuelle Netzwerkverbindung. (Trägt den gleichen Namen den Sie im Netzwerk & Freigabecenter gesehen haben). Anschließend erscheint eine neue Seite in der Sie im oberen Teil einen Schieberegler für Geräte und Inhalte suchen verändern können.

Ein = Privates Netzwerk
Aus = Öffentliches Netzwerk

geraete_und_inhalte_suchen

Anschließend können Sie alle Fenster wieder schließen.

Automatische Windows-Anmeldung unter Windows 8/8.1

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (3 Stimmen, Durchschnitt: 3.67 von 5)
Loading...Loading...

Mit Windows 8 bzw. 8.1 ist es problemlos möglich sich automatisch an Windows anzumelden, ohne die Login-Daten eingeben zu müssen. Diese Funktion ist jedoch etwas versteckt.

Drücken Sie die Windows + R Taste und geben Sie anschließend netplwiz ein. In dem darauf öffnenden Dialog entfernen Sie den Haken bei “Benutzer müssen Benutzernamen und Kennwort eingeben“. Nach einem Klick auf Übernehmen öffnet sich ein weiteres Fenster in dem Sie das Konto auswählen müssen, mit dem sich ab sofort automatisch angemeldet werden soll.

benutzerkonten

eclipse/PDT automatischer FTP Upload beim Speichern

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (4 Stimmen, Durchschnitt: 4.00 von 5)
Loading...Loading...

Sehr lange habe ich mich mit dem Thema beschäftigt, aus eclipse heraus direkt beim Speichern einen FTP Upload der geänderten Datei durchzuführen. Bisher habe ich dafür die Software Fling File Transfer benutzt. Da diese aber in den neueren Versionen scheinbar einen Memory Leak hat und die alten nicht unter Windows 8 laufen, musste eine Alternative her.

Ich habe nun weitere Produkte wie PureSync oder SyncBackPro getestet, aber keines der Tools kam a) an die Geschwindigkeit von Fling heran. Da ich selbst mit eclipse arbeite kam mir sogar mal kurzzeitig der Gedanke auf eine andere Entwicklungsumgebung umzusteigen. Kostenpflichtig gabs da Adobe Dreamweaver, welches den FTP Upload unterstützt. Kostenlos gabs Aptana. Das hat mir recht gut gefallen, da Aptana auf eclipse basiert.

Also Aptana heruntergeladen, entpackt und alle Projekte konvertiert und FTP Upload eingerichtet. Funktionierte super. Bis ich dann das erste mal damit arbeiten musste. Kein passendes Farbschema was für alle Editoren passte usw. Ich war unzufrieden. Also wieder zurück zu eclipse.

Wer in Google nach “Eclipse automatic FTP Upload on file change” sucht wird oftmals auf RSE verwiesen, den Remote System Explorer. Aber das war nicht das, was ich suchte. Kommen wir nun aber zum Ergebnis, die Lösung ist ANT zu benutzen. Im folgenden erkläre ich wie man ANT in einem PHP Projekt konfiguriert und einsetzt.

Kapitel: Eclipse für ANT & FTP vorbereiten

Alle folgenden Bilder/Anleitungen basieren auf eclipse Kepler. Benutzt wird hier die Standardversion von eclipse. Damit ANT funktioniert müssen ggf. noch Pakete nachinstalliert werden. Dazu auf Help -> Install new Software -> als Site unter Work with -> “Kepler – http://download.eclipse.org/releases/kepler” auswählen. Dort dann unter General Purpose Tools -> “Eclipse plug-in development environment.” Ggf. ist das Paket schon durch SVN oder andere Tools installiert.

eclipse software

Nun benötigen wir noch 2 Libs die wir ins eclipse Verzeichnis kopieren müssen. Downloaden Sie von der Apache Webseite das commons-net (aktuell commons-net-3.3-bin.zip) Paket. In dem ZIP File finden Sie nun die Datei “commons-net-3.3.jar“. Kopieren Sie diese ins eclipse Verzeichnis.

Kopieren Sie weiterhin aus dem Java JDK (sofern nicht installiert, installieren Sie die neuste Version) die Datei tools.jar. Diese findet sich in diesem Pfad: C:\Program Files\Java\jdk1.7.0_45\lib. (ggf. Versionsnummer bei Ihnen anpassen.

Diese 2 Dateien müssen nun ANT noch als classpath hinzugefügt werden. Dazu klicken Sie in eclipse auf Window -> Preferences -> ANT -> Runtime. Klicken Sie dort dann auf “Ant Home Entries (Default)” und wählen rechts “Add external JARs” Wählen Sie nun die beiden Dateien aus. Sofern Sie zuerst die commons-net Datei wählen, wird Ihnen ein Hinweis angezeigt, dass die tools-lib noch fehlt. Bestätigen Sie dies und fügen Sie auf dem gleichen Wege die tools.lib hinzu.

perferences

Prüfen Sie nun ob unter Window -> Show View -> Other -> ANT verfügbar ist. Falls ja, wählen Sie diese dort aus. Die View sollte sich nun im unteren Bereich neben der Console/Tasks andocken.

Ggf. muss ANT noch manuell aktiviert werden. Dazu klicken Sie auf File -> New -> Other -> öffnen Sie den Java Ordner -> Java Project from Existing Ant Buildfile. Klicken Sie auf Next. Sollte nun ein Dialog mit der Frage “Always enable activities and don´t ask me again” erscheinen, bestätigen Sie diesen. Danach brechen Sie den Assistenten ab.

Kapitel: ANT Konfigurationen anlegen (build.xml/build.properties)

Nun benötigen wir 2 neue Config-Files für das Projekt. Legen Sie im Projekt Ordner eine build.xml sowie eine build.properties Datei an. Füllen Sie diese mit folgenden Inhalten. Auf die einzelnen Optionen gehe ich später ein:

build.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project name="MyProject">
  3.   <property file="build.properties" />
  4. 	<target name="ftp-dev" description="ftpDev">
  5. 	<echo>Uploading files to "${ftp.dev.server}" ftp</echo>
  6. 		<ftp  server    = "${ftp.dev.server}"
  7. 		      userid    = "${ftp.dev.user}"
  8. 		      password  = "${ftp.dev.password}"
  9. 		      remotedir = "${ftp.dev.remotedir}"
  10. 		      passive   = "yes"
  11. 		      binary    = "yes"
  12. 		      depends   = "no"
  13. 		      verbose   = "yes"
  14. 		      action    = "put">
  15. 		    <fileset dir="${local.dir}">
  16. 		      <exclude name=".settings/" />
  17. 		      <exclude name="**/.svn/" />
  18. 		      <exclude name="build.xml" />
  19. 		      <exclude name=".project" />
  20. 		      <exclude name=".buildpath" />
  21. 		      <exclude name=".externalToolBuilders/" />
  22. 		      <exclude name="*.properties" />
  23. 		      <modified cache="propertyfile">
  24. 		    	<param name="cache.cachefile" value="cache-dev.properties"/>
  25. 		      </modified>
  26. 		    </fileset>
  27. 		</ftp>
  28. 	</target>
  29. 	<target name="ftp-prod" description="ftpProd">
  30. 	  <echo>Uploading files to "${ftp.prod.server}" ftp</echo>
  31. 	    <ftp  server    = "${ftp.prod.server}"
  32. 	          userid    = "${ftp.prod.user}"
  33. 	          password  = "${ftp.prod.password}"
  34. 	          remotedir = "${ftp.prod.remotedir}"
  35. 	          passive   = "yes"
  36. 	          binary    = "yes"
  37. 	          depends   = "no"
  38. 	          verbose   = "yes"
  39. 	          action    = "put">
  40. 	        <fileset dir="${local.dir}">
  41. 	          <exclude name=".settings/" />
  42. 	          <exclude name="**/.svn/" />
  43. 	          <exclude name="build.xml" />
  44. 	          <exclude name=".project" />
  45. 	          <exclude name=".buildpath" />
  46. 	          <exclude name=".externalToolBuilders/" />
  47. 	          <exclude name="*.properties" />
  48. 	          <modified cache="propertyfile">
  49. 	            <param name="cache.cachefile" value="cache-prod.properties"/>
  50. 	          </modified>
  51. 	        </fileset>
  52. 	    </ftp>
  53. 	  </target>
  54. </project>

build.properties

  1. #Ftp settings DEV Stage
  2. ftp.dev.server=devhostname
  3. ftp.dev.user=username
  4. ftp.dev.password=password
  5. ftp.dev.remotedir=/path/to/remote/folder/
  6.  
  7. #Ftp settings PROD Stage
  8. ftp.prod.server=prodhostname
  9. ftp.prod.user=username
  10. ftp.prod.password=password
  11. ftp.prod.remotedir=/path/to/remote/folder/
  12.  
  13. #Local Settings
  14. local.dir=C:/dev/www/html

Gehen wir zuerst auf die build.xml ein. Variablen werden wie folgt definiert: ${local.dir} Diese Variablen müssen dann in der build.properties hinterlegt sein. Die Benennung der Variablen ist komplett Ihnen überlassen. Es gibt keine Namensräume oder ähnliches. Damit das build.xml die Property Datei kennt wird diese via Tag angegeben.

Nun folgen die Targets. Es können verschiedene Targets angegeben werden. In unserem Beispiel gibt es ein Target für den FTP-Upload auf den Entwicklungsserver und einen FTP Upload auf den Produktivserver. Der AutoUpload wird später nur für den Entwicklungsserver aktiviert, könnte aber auch parallel direkt auf den Produktivserver schreiben. Effektiv sind beide Targets identisch bis auf die Variablennamen, wir benötigen ja andere Zugangsdaten, sowie der Targetname unterscheidet sich.

Innerhalb des Targets gibt es einen echo Befehl der in der Console Text ausgibt. Danach folgt der FTP-Konfigurations Abschnitt. Die Werte sind eigentlich selbsterklärend. Ein komplettes Handbuch zu den FTP Konfigurationen (Alle Werte innerhalb des Tags) finden Sie in in der offizielle Apache Dokumentation.

Zu erwähnen ist hier eigentlich nur der Wert “depends“. Dieser soll eigentlich nur die neuen Dateien hochladen, die sich seit dem letzten Build geändert haben. Hier bin ich auf diverse Probleme gestoßen. Eclipse geht hier beim Build hin und vergleicht den Timestamp der Dateien auf dem FTP mit dem lokalen Timestamp. Auf dem FTP Server werden die TimeStamps nur in Minuten angegeben. Das bedeutet, die Datei wird nur jede Minute neu hochgeladen. Speichert man also in Sekunde 12 der Minute, muss man 48 Sekunden warten und erneut speichern, bevor die Datei hochgeladen wird. Zusätzlich gibt es hier jede Menge Probleme mit den Zeitzonen Einstellungen des FTP Server sowie Sommerzeit/Winterzeit Probleme. Daher steht der Wert hier auch auf “no“. Das Problem lösen wir aber anders :)

Der Bereich rund um <fileset> beschreibt welche Dateien wir lokal per FTP hochladen wollen. Über “dir” und der passenden Variable wird der lokale Pfad angegeben. Theoretisch dürften auch relative Pfade funktionieren, habe ich aber nicht getestet. Innerhalb des Tags finden sich nun noch <exclude> Tags. Damit können wir explizit Dateien & Ordner ausschließen. Der exclude Tag ist sehr komplex und kann über diverse Pattern auch deutlich komplexere Ausschlüsse darstellen. Auch hier finden Sie alle Infos in der offiziellen Apache Dokumentation.

Kommen wir nun zur Alternativen Lösung für das depends im ftp Block. Die Lösung hier ist der <modified> Block. Damit legt ANT einen lokalen Cache (cache-dev.properties) an und speichert wann welche Datei modiziert wurde. Da wir 2 Targets nutzen, teilen wir ANT mit, dass es auch 2 verschiedene Cache Files benötigt. Damit wird nach jedem Build der Cache aktualisiert und nur noch die Dateien selektiert, welche sich seither verändert haben. Weitere Informationen finden Sie in der offiziellen Apache Dokumentation.

Damit sind wir mit der Konfiguration der 2 Dateien fertig und können nun beginnen, das Skript in eclipse einzurichten.

Kapitel: ANT einrichten

Öffnen Sie nun die ANT View am unteren Bildschirmrand, falls noch nicht geschehen. Ziehen Sie nun via Drag’n’Drop die build.xml aus Ihrem Projekt Ordner in die View. Dies sollte nun so aussehen:

ant_view

Jetzt können Sie “ftp-dev” auswählen und rechts oben in der View auf den grünen Play Knopf klicken. Ist alles richtig eingerichtet, wechselt die Ansicht auf den Reiter Console und zeigt dann folgendes an:

console

In dem Fall zeigt der Screenshot zwar “0 files sent” an, in Ihrem Fall müsste er jetzt einmal alle Dateien übertragen und die Cache Datei anlegen. Beim nächsten Ausführen zeigt er auch bei Ihnen 0 files an. Ändern Sie nun eine Datei und führen den Job erneut aus, übertragt er diese 1 Datei.

Kapitel: AutoBuild oder Automatischer FTP Upload

Nun kommen wir zum eigentlichen Teil des Artikels, dem automatischen Upload. Dazu müssen wir erst den Auto Build in Eclipse aktivieren. Dazu wählen Sie in der Menüleiste Project -> Build automatically.

auto_build

Jetzt müssen wir die Einstellungen vom Projekt noch anpassen. Dazu klicken Sie mit der rechten Maustaste auf Ihr Projekt -> Properties und wählen links in den möglichen Optionen “Builders“. Klicken Sie nun rechts den Button Import. Dort sollte nun Ihre angelegte build.xml erscheinen. Wählen Sie diese aus. Es sollte nun wie folgt aussehen:

properties

Wählen Sie ihren neuen Eintrag mit build.xml aus und klicken rechts auf Edit. Wechseln Sie in den Reiter Targets. Klicken Sie beiden ersten 3 Zeilen jeweils rechts den Button “Set Targets” und wählen in dem Dialog dann “ftp-dev” aus. Es sollte nun wie folgt aussehen:

builder_config

Bestätigen Sie den Dialog mit OK und schließen Sie danach die Properties des Projekts. Ab sofort sollte bei einem ändern einer Datei oder hinzufügen/löschen einer Datei automatisch der Build gestartet werden und damit unser FTP Upload Skript.

Viel Spaß mit eclipse und dem builtin FTP Upload ohne Extra-Werkzeuge/Software.