WAKE ON LAN - CGI
Aus VDR Wiki
Version vom 20. Februar 2010, 09:39 Uhr von Hulk (Diskussion | Beiträge)
Wakeup per CGI
Eine eigene Internet-Service Anwendung für WAKE ON LAN per Perl-CGI-Skript ist keine größere Schwierigkeit. Die Eingabe erfolgt über ein Web-Formular. Also wenn man sich z.B. die eigene MAC Adresse nicht permanent merken möchte, und wenn ein eigener Webserver, der CGI+Perl unterstützt, zur Verfügung steht, kann mit folgendem HTML-Wrapper und CGI-Script ein eigener Wakeupdienst aufgesetzt werden.
Diesen HTML-Teil in die Webseite einbetten.
<form action="/cgi/wakeup.pl" method="post"> <table> <tr><td>HWaddress:</td><td><input size="40" maxlength="40" name="HWaddress" value="00:11:22:33:44:55"></td></tr> <tr><td>IPaddress:</td><td><input size="40" maxlength="40" name="IPaddress" value="1.2.3.4"></td></tr> <tr><td>Port:</td><td><input size="40" maxlength="40" name="Port" value="9"></td></tr> <tr><td> </td><td><input type="submit" value="Absenden"></td></tr> </table> </form>
Und diesen CGI-Teil auf dem Webserver speichern.
#!/usr/bin/perl -w use strict; use Socket; use CGI; my $cgi = new CGI; use CGI::Carp qw(fatalsToBrowser); $cgi->default_dtd('-//W3C//DTD HTML 4.01 Transitional//EN'); print $cgi->header(-type =>'text/html'), $cgi->start_html('Wakeup'), $cgi->h1('Wakeup'), wake($cgi->param('HWaddress'),$cgi->param('IPaddress'),$cgi->param('Port')), $cgi->end_html(); sub wake { my $hwaddr = shift; my $ipaddr = shift || '255.255.255.255'; my $port = shift || getservbyname('discard', 'udp'); my ($raddr, $them, $proto); my ($hwaddr_re, $pkt); # Validate hardware address (ethernet address) $hwaddr_re = join(':', ('[0-9A-Fa-f]{1,2}') x 6); if ($hwaddr !~ m/^$hwaddr_re$/) { return $cgi->p({-style => 'color:red'}, "Invalid hardware address: $hwaddr" ); } # Generate magic sequence foreach (split /:/, $hwaddr) { $pkt .= chr(hex($_)); } $pkt = chr(0xFF) x 6 . $pkt x 16; # Allocate socket and send packet $raddr = gethostbyname($ipaddr); $them = pack_sockaddr_in($port, $raddr); $proto = getprotobyname('udp'); if(!socket(S, AF_INET, SOCK_DGRAM, $proto)) { return $cgi->p({-style => 'color:red'}, "socket : $!"); } if(!setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1)) { return $cgi->p({-style => 'color:red'}, "setsockopt : $!" ); } if(!send(S, $pkt, 0, $them)) { return $cgi->p({-style => 'color:red'}, "send : $!"); } close S; return $cgi->p("Sending magic packet to $ipaddr:$port with $hwaddr"); }