#!/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 = ; chomp $in; $AW=$in; $menu{$in}->() unless ($menu{$in} eq ""); } } sub read_config { open CF, "config"; foreach () { 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; }