Ankündigung

Einklappen
Keine Ankündigung bisher.

[WireGate-Plugin] Power On/Off-Switch mit WOL und SSH

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [WireGate-Plugin] [WireGate-Plugin] Power On/Off-Switch mit WOL und SSH

    Ich habe ein kleines Plugin erstellt, dass einen PC oder jedes andere Wake On LAN fähige Gerät im Netzwerk einschalten kann.
    Zusätzlich ist ein Ausschalten oder Aktivieren eines Energiesparmodus über eine SSH- oder Telnet-Verbindung möglich.

    Um SSH zu nutzen muss im WireGate ein Debian-Paket nachinstalliert werden. Dies geschieht am einfachsten,
    • in dem von der Startseite auf Updates gewechselt wird,
    • oben in dem Eingabefeld "sshpass" eingeben und
    • die Installation des Paketes über den Button "Paket installieren" gestartet wird.
    Hinweis: sshpass ermöglicht das Übergeben des Passworts an den SSH-Client. Das ist unsicher, da dieses Passwort hier im Plugin unverschlüsselt steht und übergeben wird.

    Die Konfiguration des Plugin geschieht im Definitionsbereich und umfasst folgende Angaben:
    • $switch_ga = "x/y/z" -> Gruppenadresse die einen PC wecken bzw. ausschalten soll
    • $mac_address = "aa:bb:cc:dd:ee:ff" -> Die MAC-Adresse des Netzwerkgerätes zum Einschalten (WOL)
    • $ip_address = "192.168.0.1" -> Die IP-Adresse wird zum Ausschalten benötigt
    • $user = "Benutzer" -> Benutzername für den SSH/Telnet-Login
    • $password = "Passwort" -> Passwort für den SSH/Telnet-Login
    • $remote_method = "ssh" -> Login-Methode entweder ssh oder telnet
    • $remote_command = "shutdown -h now" -> Befehl zum Ausschalten, hier könnten auch verschiedene Stromsparmodie angegeben werden (siehe Kommentar im Plugin)

    Der Benutzer der sich einloggt benötigt das Recht den PC auszuschalten, dies kann für alle Benutzer mit folgenden Befehlen ermöglicht werden:
    Code:
    sudo chmod u+s /sbin/shutdown
    sudo chmod u+s /usr/sbin/pm-*
    Die Befehle müssen auf dem herunterzufahrenden PC ausgeführt werden, weitere Informationen zu den Stromsparfunktionen findet man z. B. hier: Ubuntu Wiki: pm-utils.
    Hinweise zur Einrichtung von WakeOnLAN gibt es z. B. hier: Ubuntu Wiki: Wake on LAN
    Code:
    # Plugin um ein Netzwerkgerät per Wake On LAN (WOL) aufzuwecken und per ssh/telnet auszuschalten
    #
    # Copyright of original wol part:
    # Perl version by ken.yap@acm.org after DOS/Windows C version posted by
    # Steve_Marfisi@3com.com on the Netboot mailing list
    # Released under GNU Public License, 2000-01-05
    #
    # Hinweise zur Einrichtung von Wake On LAN unter Ubuntu gibt es hier:
    # http://wiki.ubuntuusers.de/Wake_on_LAN
    #
    # Folgende Paket unter Update installieren (nur wenn ssh genutzt werden soll):
    # sshpass
    #
    # Achtung:
    # --------
    # sshpass ist sehr unsicher, da das Passwort im Klartext hier im Plugin steht
    #         und unverschlüsselt an ssh übergeben wird.
    #
    
    ### Definitionen
    my $switch_ga = "1/1/0"; 		# Gruppenadresse die einen PC wecken oder ausschalten soll
    my $mac_address = "aa:bb:cc:dd:ee:ff";  # MAC-Adresse des PCs
    my $ip_address = "192.168.0.24";	# IP-Adrssse des PCs
    my $user = "User";			# Benutzername für ssh/telnet login
    my $password = "Pass";			# Passwort des Benutzers
    my $remote_method = "ssh";		# Methode zum Login entweder "ssh" oder "telnet" (Groß- und Kleinschreibung beachten!)
    my $remote_command = "shutdown -h now";	# Befehl zum Ausschalten oder "schlafen legen" des PCs, z. B.
    					#   - Ausschalten: "shutdown -h now" (Default)
    					#   - Suspend-to-RAM (S3): "pm-suspend"
     					#   - Suspend-to-disk (S4): "pm-hibernate"
    					#   Weitere Informationen für Ubuntu: http://wiki.ubuntuusers.de/pm-utils
    					#   Um die Befehle von allen Benutzern ohne Administratorrechte auszuführen 
    					#   folgende Zeilen auf dem Ziel-PC eingeben (für Ubuntu, bei anderen Distris den Pfad ggf. anpassen):
    					#      sudo chmod u+s /sbin/shutdown
    					#      sudo chmod u+s /usr/sbin/pm-*
    ### Ende Definitionen
    
    use Getopt::Std;
    use Socket;
    use Net::Telnet;
    
    # Plugin an Gruppenadresse "anmelden"
    $plugin_subscribe{$switch_ga}{$plugname} = 1;
    
    # Eigenen Aufruf-Zyklus auf 3 Stunden setzen
    # der Aufrufzyklus ist unabhängig von der Taktzeit und muss kürzer sein!
    $plugin_info{$plugname.'_cycle'} = 10800;
    
    if ($msg{'apci'} eq "A_GroupValue_Write" && $msg{'dst'} eq $switch_ga) {
    	#Wert vom Bus
    	if (defined $msg{'value'}) { 
    		if ( $msg{'value'} == "1" ) {
    			my $return_value = send_broadcast_packet($mac_address);
    			return "WOL ".$return_value." an ".$mac_address;
    		} else {
    			my $return_value = remote_login();
    			return "Ausschaltbefahl an ".$ip_address." ".$return_value;
    		}
    	}
    }
    
    return;
    
    
    sub send_broadcast_packet {
    	(my $mac) = @_;
    
    	if ($mac !~ /[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}:[\da-f]{2}/i)  {
    		return "Fehlerhafte MAC-Adresse $mac\n";
    	}
    	print "Sende WOL-Paket an MAC-Adresse $mac\n";
    	# Remove colons
    	$mac =~ tr/://d;
    	# Magic packet is 6 bytes of FF followed by the MAC address 16 times
    	my $magic = ("\xff" x 6) . (pack('H12', $mac) x 16);
    	# Create socket
    	socket(S, PF_INET, SOCK_DGRAM, getprotobyname('udp'))
    		or return "Fehler im Socket: $!\n";
    	# Enable broadcast
    	setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1)
    		or return "Fehler bei Setsockopt: $!\n";
    	# Send the wakeup packet
    	defined(send(S, $magic, 0, sockaddr_in(0x2fff, INADDR_BROADCAST)))
    		or print "Sende: $!\n";
    	close(S);
    	return "Magic Packet gesendet";
    }
    
    sub remote_login {
    	my $command;
    	if ( $remote_method eq "telnet" ) {
    		# Telnet
    		my $telnet = Net::Telnet->new($ip_address);
    		$telnet->login($user,$password);
    		my @lines = $telnet->cmd("$remote_command");
    	} else {
    		# SSH
    		$command = "sshpass -p $password ssh $user"."@".$ip_address.' "'.$remote_command.'"';	
    		my $status = system($command);
    	}
    	return "gesendet";
    }

    #2
    Wunderbar, sehr schöne Lösung!

    Stefan

    Kommentar


      #3
      mit MAkkis Plugin funktioniert's

      mit diesem nicht:

      Ziel Win7 hoch/runter

      geht das dann doch nur mit Linux Rechnern?

      Grüße,
      Lio

      Kommentar


        #4
        Also hochfahren sollte gehen. Musst aber deine Netzwerkkarte so einstellen, dass sie durch Magicpakete den PC starten kann.

        Das Ausschalten muss für Windows natürlich angepasst werden. Das sind ganz andere Befehle als die aufgeführten.
        Gruss Patrik alias swiss

        Kommentar


          #5
          Gibt eine möglichkeit einen Windows PC herunterzufahren?

          Kommentar


            #6
            Ich fände sehr elegant, wenn das Plugin noch die Möglichkeit bieten würde für den hochzufahrenden Rechner "Bereitschaft" zu signalisieren.

            Also z.B. eine Ping-Abfrage oder etwas eleganteres im xy-Sekunden-Takt um eben auf eine bestimmte GA "Offline" und "Online" zu senden.
            Läßt sich so etwas realisieren?
            Gruß -mfd-
            KNX-UF-IconSet since 2011

            Kommentar


              #7
              Theoretisch ja.

              Ist auch nicht so kompliziert...

              Code:
                  my $IP="192.168.1.1"
                  my $command = "ping -c 2 -w 2 ".$IP;
                  my $status = `$command`;
                  if($status =~ /bytes from/) {
                     knx_write(1/2/3,1,1.001);
                  }else{
                     knx_write(1/2/3,0,1.001);
                  }
              Macht nix anderes als per Ping testen ob die IP erreichbar ist und sendet entsprechend eine 1 oder 0 auf eine GA Kann man in ein Plugin einarbeiten oder als eigenes Plugin betreiben (braucht dann noch einen Zyklus)
              Gruss Patrik alias swiss

              Kommentar


                #8
                Zitat von swiss Beitrag anzeigen
                Macht nix anderes als per Ping testen ob die IP erreichbar ist und sendet entsprechend eine 1 oder 0 auf eine GA
                Das klingt super. Ich frage mich ob es irgendwelche Probleme geben könnte wenn da jemand ständig "Pingt"?
                Allerdings wüsste ich auf Anhieb auch keine bessere Lösung...
                zumindest keine die plattformunabhängig funktioniert.
                Gruß -mfd-
                KNX-UF-IconSet since 2011

                Kommentar


                  #9
                  Hmm.. Wenn du nicht gerade jede Sekunde pollst... Ich denke so alle 10 Sekunden dafür dann aber nur noch 1 Ping an stelle von 2 sollte kein Problem sein. Ausser du willst damit viele Geräte anpingen. Aber so 3-4 Geräte alle 10 Sekunden sind absolut kein problem -> Nur Akkugeräte wie Smartphones und Tablets würde ich nicht so pollen wollen. Das lutscht nur unnötig den Akku leer
                  Gruss Patrik alias swiss

                  Kommentar


                    #10
                    Es sollte an dieser Stelle noch ergänzt werden, dass das Plugin für das Herunterfahren noch das Paket
                    Code:
                    apt-get install libnet-telnet-perl
                    benötigt.
                    Gruß -mfd-
                    KNX-UF-IconSet since 2011

                    Kommentar

                    Lädt...
                    X