115 lines
2.4 KiB
Perl
115 lines
2.4 KiB
Perl
#!/usr/bin/perl
|
|
|
|
|
|
use strict;
|
|
use IO::Socket;
|
|
|
|
###############################################################################
|
|
# main program
|
|
###############################################################################
|
|
|
|
my $AW;
|
|
my %conf;
|
|
my %menu = (
|
|
'97' => 'blank',
|
|
'98' => 'line',
|
|
'99|0|Ende' => sub { exit 0; },
|
|
);
|
|
|
|
read_config();
|
|
|
|
my $i=1;
|
|
foreach (sort keys %conf) {
|
|
print $_ . "\n";
|
|
$menu{"$i|$i|Wecke $_"} = \&wol;
|
|
print $conf{$_} . "\n";
|
|
$i++;
|
|
}
|
|
show_menu(\%menu, "Hauptmenue");
|
|
|
|
0; # end with exit code 0
|
|
|
|
###############################################################################
|
|
# subs
|
|
###############################################################################
|
|
|
|
sub wol {
|
|
my $NAME;
|
|
my $IP;
|
|
my $MAC;
|
|
my $i=1;
|
|
foreach (sort keys %conf) {
|
|
$NAME=$_;
|
|
($IP,$MAC) = split /;/,$conf{$NAME};
|
|
last if ($i == $AW);
|
|
$i++;
|
|
}
|
|
$MAC=~tr/-/:/;
|
|
for (1..5) { # 5 mal WOL Magic Packet senden
|
|
wol_magic($IP,$MAC,9);
|
|
}
|
|
print "Starte $NAME\n";
|
|
sleep 3;
|
|
}
|
|
|
|
sub show_menu {
|
|
my $m=shift;
|
|
my $t=shift;
|
|
my %m=%{$m};
|
|
my %menu;
|
|
my ($k, $e);
|
|
while (1) {
|
|
clrscr();
|
|
printf "\n $t\n\n";
|
|
foreach my $l (sort keys %m) {
|
|
if ($m{$l} eq "blank") {
|
|
printf "\n";
|
|
}
|
|
elsif ($m{$l} eq "line") {
|
|
for (1..26) { printf "-"; } printf "\n";
|
|
}
|
|
else {
|
|
my ($r,$k,$e) = split /\|/, $l;
|
|
$menu{$k}=$m{$l};
|
|
printf " %2s %-20s\n", $k, $e;
|
|
}
|
|
}
|
|
print "\n\n\n\nAuswahl: ";
|
|
my $in = <STDIN>;
|
|
chomp $in;
|
|
$AW=$in;
|
|
$menu{$in}->() unless ($menu{$in} eq "");
|
|
}
|
|
}
|
|
|
|
sub read_config {
|
|
open CF, "config";
|
|
foreach (<CF>) {
|
|
chomp;
|
|
#my ($k,$v) = split /:/,$_;
|
|
my ($k,$v) = $_ =~ m/([^:]*):(.*)/;
|
|
$conf{"$k"} = $v;
|
|
}
|
|
close CF;
|
|
}
|
|
|
|
sub clrscr {
|
|
for (0..50) {
|
|
print "\n";
|
|
}
|
|
}
|
|
|
|
sub wol_magic {
|
|
my ($host, $mac_addr, $port) = @_;
|
|
if (! defined $host) { $host = '255.255.255.255' }
|
|
if (! defined $port || $port !~ /^\d+$/ ) { $port = 9 }
|
|
my $sock = new IO::Socket::INET(Proto=>'udp') || return undef;
|
|
my $ip_addr = inet_aton($host);
|
|
my $sock_addr = sockaddr_in($port, $ip_addr);
|
|
$mac_addr =~ s/://g;
|
|
my $packet = pack('C6H*', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, $mac_addr x 16);
|
|
setsockopt($sock, SOL_SOCKET, SO_BROADCAST, 1);
|
|
send($sock, $packet, 0, $sock_addr);
|
|
close ($sock);
|
|
return 1;
|
|
} |