Habs hinbekommen
hier der Code:
hier der Code:
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 = "9/2/0"; # Gruppenadresse die einen PC wecken oder ausschalten soll my $mac_address = "00:25:22:49:64:71"; # MAC-Adresse des PCs my $ip_address = "192.168.10.21"; # IP-Adrssse des PCs my $user = "Administrator"; # Benutzername für ssh/telnet login my $password = "wiregate"; # Passwort des Benutzers my $remote_method = "telnet"; # Methode zum Login entweder "ssh" oder "telnet" (Groß- und Kleinschreibung beachten!) my $remote_command = "shutdown /s /f /c \"Wiregate Rockt\""; #shutdown /s /f /t 00 Befehl zum Ausschalten oder "schlafen legen" des PCs, z. B. my $host = ""; # - Ausschalten: "shutdown -h now" (Default) my $prompt = "_funkydPromplt_" ; # - 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" ) { $host = new Net::Telnet(Timeout => 30,Prompt => "/\>/"); $host->open($ip_address); $host->login($user, $password ); @lines = $host->cmd($remote_command); } else { # SSH $command = "sshpass -p $password ssh $user"."@".$ip_address.' "'.$remote_command.'"'; my $status = system($command); } return "gesendet"; }
Kommentar