WAKE ON LAN - CGI

Aus VDR Wiki
Wechseln zu: Navigation, Suche

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.

Datei
/cgi/wakeup.pl
#!/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>");
}