init III
This commit is contained in:
115
Windows WakeOnLAN/WOL_menu/WOL.pl
Normal file
115
Windows WakeOnLAN/WOL_menu/WOL.pl
Normal file
@@ -0,0 +1,115 @@
|
||||
#!/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;
|
||||
}
|
||||
Reference in New Issue
Block a user