Files
scripts/Windows WakeOnLAN/WOL_menu/WOL.pl
2024-10-14 00:08:40 +02:00

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;
}