{"id":64,"date":"2015-10-22T19:45:27","date_gmt":"2015-10-22T17:45:27","guid":{"rendered":"http:\/\/blog.0link.net\/?p=64"},"modified":"2015-10-23T09:48:07","modified_gmt":"2015-10-23T07:48:07","slug":"notrufsim-5-lan-funktion-umschaltbar","status":"publish","type":"post","link":"https:\/\/blog.0link.net\/index.php\/2015\/10\/22\/notrufsim-5-lan-funktion-umschaltbar\/","title":{"rendered":"NotrufSim (5) LAN-Funktion umschaltbar"},"content":{"rendered":"<p><em>Fortsetzung von <a href=\"http:\/\/blog.0link.net\/index.php\/2015\/10\/22\/notrufsim-4-optimierung-netzwerk\/\">(4)\u00a0Optimierung Netzwerk<\/a><\/em><\/p>\n<h5>Wie bekommt man nun den Pi wieder ins heimische Netz?<\/h5>\n<p>F\u00fcr dieses Problem habe ich eine Steuerung \u00fcber den Webserver vorgesehen. Dazu ben\u00f6tigen wir ein paar kleine Shellskripte\u00a0und ein PHP-Skript.<br \/>\n<!--more--><\/p>\n<h5>Shell: getip<\/h5>\n<p>Dieses Skript liefert uns beim Aufrufer per <strong>\/var\/local\/getip &lt;if&gt; [dbg]<\/strong> die IP des jeweiligen &lt;if&gt; (= eth0, wlan0 oder br0). Mit dem optionalem Parameter\u00a0dbg wird zus\u00e4tzlich zur IP auch die abgefragte Schnittstelle ausgegeben.<\/p>\n<p><code>sudo nano \/var\/local\/getip<\/code><\/p>\n<pre>#!\/bin\/bash\r\nIFACE=$1\r\nIPFUND=`ifconfig $IFACE | grep -c \"inet \"`\r\nIP=`ifconfig $IFACE | grep -o -P \"\\b(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\b\" | head -1`\r\nif [ $IPFUND = 1 ]\r\nthen\r\n  if [ \"$2\" = \"dbg\" ]\r\n  then\r\n    echo \"$IFACE IPv4: $IP\"\r\n  else\r\n    echo \"$IP\"\r\n  fi\r\nelse\r\n  if [ \"$2\" = \"dbg\" ]\r\n  then\r\n    echo \"$IFACE IPv4: nicht zugewiesen\"\r\n  else\r\n    echo \"0.0.0.0\"\r\n  fi\r\nfi<\/pre>\n<p><code>sudo chmod +x \/var\/local\/getip<\/code><\/p>\n<h5>Shell: admin<\/h5>\n<p>Dieses Skript nimmt die LAN-Schnittstelle aus der Bridge und startet sie als DHCP-Client neu, damit sie sich in einem bestehenden LAN verbinden kann.<\/p>\n<p><code>sudo nano \/var\/local\/admin<\/code><\/p>\n<pre>#!\/bin\/bash\r\nsudo brctl delif br0 eth0\r\nsudo ifdown eth0\r\nsudo ifup eth0=lan\r\n\/var\/local\/getip eth0<\/pre>\n<p><code>sudo chmod +x \/var\/local\/admin<\/code><\/p>\n<h5>Shell: bridge<\/h5>\n<p>Hier wird die LAN-Schnittstelle getrennt und wieder in die Bridge aufgenommen, danach der DNS-DHCP-Server neu gestartet.<\/p>\n<p><code>sudo nano \/var\/local\/bridge<\/code><\/p>\n<pre>#!\/bin\/bash\r\nsudo ifdown eth0\r\nsudo ifup eth0=off\r\nsudo brctl addif br0 eth0\r\nsudo service dnsmasq restart\r\n\/var\/local\/getip br0<\/pre>\n<p><code>sudo chmod +x \/var\/local\/bridge<\/code><\/p>\n<h5>Shell-Skripte f\u00fcr Webserver freigeben<\/h5>\n<p>Damit der Webserver unsere Shell-Skripte ausf\u00fchren kann, m\u00fcssen wir ihm erlauben diese per sudo ausf\u00fchren zu k\u00f6nnen. Dazu m\u00fcssen wir den Webserver-Benutzer (unter Raspbian www-data) mit den Skripten in die <strong>\/etc\/sudoers<\/strong> eintragen.<\/p>\n<p>Achtung &#8230; Durch Eingabefehler in dieser Datei kann man sich aus dem System komplett aussperren !<\/p>\n<p><code>sudo nano \/etc\/sudoers<\/code><\/p>\n<p>Folgendes an das Ende der Datei anf\u00fcgen &#8230;<\/p>\n<pre>www-data ALL=(ALL) NOPASSWD: \/var\/local\/admin\r\nwww-data ALL=(ALL) NOPASSWD: \/var\/local\/bridge\r\nwww-data ALL=(ALL) NOPASSWD: \/var\/local\/getip<\/pre>\n<h5>Webserver: netzwerk.php<\/h5>\n<p>Jetzt m\u00fcssen wir uns noch das Bedienskript auf dem Webserver anlegen. Dazu erstellen wir einen Unterordner und legen das Skript an.<\/p>\n<p><code>sudo mkdir \/var\/www\/admin<\/code><\/p>\n<p><code>sudo nano \/var\/www\/admin\/netzwerk.php<\/code><\/p>\n<pre>&lt;?php\r\nif (isset($_POST['setadmin'])) {\r\n  $HTML = \"&lt;h5&gt;DHCP-Client auf LAN-Schnittstelle (ADMIN)&lt;\/h5&gt;\r\n  &lt;div&gt;Alle Netzverbindungen werden unterbrochen und danach neu gestartet.&lt;\/div&gt;\";\r\n  exec('sudo \/var\/local\/admin',$dhcp);\r\n  $HTML .= \"&lt;div&gt;&lt;code&gt;$dhcp&lt;\/code&gt;&lt;\/div&gt;\";\r\n  $HTML .= \"&lt;div&gt;&lt;a href=\\\"netzwerk.php\\\"&gt;zur\u00fcck&lt;\/a&gt;&lt;\/div&gt;\";\r\n} elseif (isset($_POST['bridge'])) {\r\n  $HTML = \"&lt;h5&gt;DHCP-Server und BRIDGE aktivieren (NORMAL)&lt;\/h5&gt;\r\n  &lt;div&gt;Alle Netzverbindungen werden unterbrochen und danach neu gestartet.&lt;\/div&gt;\";\r\n  exec('sudo \/var\/local\/bridge',$bridge);\r\n  $HTML .= \"&lt;div&gt;&lt;code&gt;$bridge&lt;\/code&gt;&lt;\/div&gt;\";\r\n  $HTML .= \"&lt;div&gt;&lt;a href=\\\"netzwerk.php\\\"&gt;zur\u00fcck&lt;\/a&gt;&lt;\/div&gt;\";\r\n} elseif (isset($_POST['getip'])) {\r\n  $HMTL = \"&lt;h5&gt;IP-Adressen aller Schnittstellen&lt;h5&gt;\";\r\n  exec('sudo \/var\/local\/getip eth0',$eth0);\r\n  exec('sudo \/var\/local\/getip wlan0',$wlan0);\r\n  exec('sudo \/var\/local\/getip br0',$br0);\r\n  $eth = $eth0[0];\r\n  $wlan = $wlan0[0];\r\n  $br = $br0[0];\r\n  if ($eth0[0] == \"0.0.0.0\") {\r\n    $eth = \"inaktiv\" ;\r\n  }\r\n  if ($wlan0[0] == \"0.0.0.0\") {\r\n    $wlan = \"inaktiv\" ;\r\n  }\r\n  if ($br0[0] == \"0.0.0.0\") {\r\n    $br = \"inaktiv\";\r\n  }\r\n  if ($eth0[0] == \"0.0.0.0\" &amp;&amp; $wlan0[0] == \"0.0.0.0\" &amp;&amp; $br0[0] != \"0.0.0.0\") {\r\n    $eth = \"verbunden\" ;\r\n    $wlan = \"verbunden\" ;\r\n    $br = $br0[0];\r\n  }\r\n  $HTML .= \"&lt;div&gt;&lt;code&gt;\r\n    LAN-Schnittstelle: &lt;b&gt;\".$eth.\"&lt;\/b&gt;&lt;br&gt;\r\n    WLAN-Schnittstelle: &lt;b&gt;\".$wlan.\"&lt;\/b&gt;&lt;br&gt;\r\n    BRIDGE: &lt;b&gt;\".$br.\"&lt;\/b&gt;&lt;br&gt;\r\n    &lt;\/code&gt;&lt;\/div&gt;\";\r\n  $HTML .= \"&lt;div&gt;&lt;a href=\\\"netzwerk.php\\\"&gt;zur\u00fcck&lt;\/a&gt;&lt;\/div&gt;\";\r\n} else {\r\n  $HTML = \"&lt;form action=\\\"\\\" method=\\\"POST\\\"&gt;\r\n  &lt;h5&gt;DHCP-Client auf LAN-Schnittstelle (ADMIN)&lt;\/h5&gt;\r\n  &lt;p&gt;Alle Netzwerkverbindungen werden unterbrochen und die LAN-Schnittstelle wird auf DHCP-Client konfiguriert.&lt;\/p&gt;\r\n  &lt;input type=\\\"submit\\\" name=\\\"setadmin\\\" value=\\\"ADMIN-Modus\\\"&gt;\r\n  &lt;hr&gt;\r\n  &lt;h5&gt;DHCP-Server und BRIDGE aktivieren (NORMAL)&lt;\/h5&gt;\r\n  &lt;p&gt;Alle Netzwerkverbindungen werden unterbrochen und es wird auf BRIDGE-Modus mit DHCP-Server konfiguriert.&lt;\/p&gt;\r\n  &lt;input type=\\\"submit\\\" name=\\\"bridge\\\" value=\\\"NORMAL-Modus\\\"&gt;\r\n  &lt;hr&gt;\r\n  &lt;h5&gt;IP-Adressen aller Schnittstellen&lt;\/h5&gt;\r\n  &lt;p&gt;Anzeige der aktuellen IPs&lt;\/p&gt;\r\n  &lt;input type=\\\"submit\\\" name=\\\"getip\\\" value=\\\"zeige IPs\\\"&gt;\r\n  &lt;\/form&gt;\";\r\n}\r\necho \"&lt;html&gt;&lt;h4&gt;Admin-Funktionen&lt;\/h4&gt;&lt;div&gt;$HTML&lt;\/div&gt;&lt;\/html&gt;\";\r\n?&gt;<\/pre>\n<p>Das Skript nun noch ausf\u00fchrbar machen und den Ordner f\u00fcr den Webserver-Benutzer freigeben.<\/p>\n<p><code>sudo chmod +x \/var\/www\/admin\/netzwerk.php<\/code><\/p>\n<p><code>sudo chown -R 33:33\u00a0\/var\/www\/admin<\/code><\/p>\n<p>Jetzt ist das Skript \u00fcber <strong>http:\/\/notrufsim\/admin\/netzwerk.php<\/strong> aufrufbar und mit einem klick auf &#8222;<strong>zeige IPs<\/strong>&#8220; sollte das Skript nun die IPs der Schnittstellen liefern.<\/p>\n<h5>Automatische Erkennung beim Start des Pi<\/h5>\n<p>Wenn wir nun m\u00f6chten, dass der Pi beim Neustart automatisch erkennt, ob er auf der LAN-Seite eine Verbindung bekommt, m\u00fcssen wir unsere<strong>\u00a0interfaces<\/strong> ab\u00e4ndern &#8230;<\/p>\n<pre>iface eth0 inet <del><span style=\"color: #ff0000;\">manual<\/span><\/del><strong><span style=\"color: #339966;\">dhcp<\/span><\/strong>\r\n...\r\nbridge_ports <del><span style=\"color: #ff0000;\">eth0<\/span><\/del> wlan0<\/pre>\n<p>Jetzt wird beim Neustart die LAN-Schnittstelle nicht mit in die Netzwerkbr\u00fccke\u00a0aufgenommen und als DHCP-Client gestartet.<\/p>\n<p>Im Startskript\u00a0<strong>rc.local<\/strong> k\u00f6nnen wir nun pr\u00fcfen, ob die Schnittstelle eine IP bekommen hat.<\/p>\n<p><code>sudo nano \/etc\/rc.local<\/code><\/p>\n<p>Dort f\u00fcgen wir am Ende vor dem exit 0\u00a0Folgendes ein<\/p>\n<pre><em>...<\/em>\r\nsleep 5\r\nIP=`\/var\/local\/getip eth0`\r\nif [ \"$IP\" = \"0.0.0.0\" ]\r\nthen\r\n\u00a0 \/var\/local\/bridge\r\nfi\r\nexit 0<\/pre>\n<p>Der Skriptteil wartet nun nach dem Start 5 Sekunden und pr\u00fcft dann, ob die LAN-Schnittstelle eine g\u00fcltige IP bekommen hat. Unser Skript <strong>getip<\/strong> liefert 0.0.0.0, wenn es keine IP findet. In diesem Fall wird mit unserem Skript <strong>bridge<\/strong> die LAN-Schnittstelle wieder in die Netzwerkbr\u00fccke aufgenommen.<\/p>\n<p><span style=\"color: #ff0000;\"><strong><em>Fortsetzung folgt<\/em><\/strong><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fortsetzung von (4)\u00a0Optimierung Netzwerk Wie bekommt man nun den Pi wieder ins heimische Netz? F\u00fcr dieses Problem habe ich eine Steuerung \u00fcber den Webserver vorgesehen. Dazu ben\u00f6tigen wir ein paar kleine Shellskripte\u00a0und ein PHP-Skript.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/64"}],"collection":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/comments?post=64"}],"version-history":[{"count":10,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/64\/revisions"}],"predecessor-version":[{"id":89,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/posts\/64\/revisions\/89"}],"wp:attachment":[{"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/media?parent=64"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/categories?post=64"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.0link.net\/index.php\/wp-json\/wp\/v2\/tags?post=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}