WAKE ON LAN - CGI
Aus VDR Wiki
Version vom 3. Mai 2010, 16:29 Uhr von 80.69.207.67 (Diskussion)
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" style="float:left">
<legend>PC1 einschalten</legend>
<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.<br>
<a href='#1' onClick='javascript:history.back(); return false;'>< Zurück</a>");
}