#!/usr/bin/perl use Cwd qw( realpath ); use File::Basename qw( fileparse ); @cfg = ('.wake', ( (fileparse( realpath($0) ))[1] ) . '.wake'); $mac = {}; $x = '[0-9a-fA-F]'; $macre = "$x$x:$x$x:$x$x:$x$x:$x$x:$x$x"; $ipre = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"; foreach my $cfg (@cfg) { open(CFG, $cfg); while () { next if /^\s*#/; next if /^\s*$/; chomp; my($host, $hw, $ip) = split; push @{$mac->{lc($host)}}, { MAC => $hw, IP => $ip }; } } if (@ARGV) { foreach $host (@ARGV) { if ($host =~ /$macre/) { print qx(wakeonlan $host); } elsif (@physical = @{$mac->{lc($host)}}) { foreach my $mac (@physical) { if ($mac->{IP}) { print qx(wakeonlan -i $mac->{IP} $mac->{MAC}); } else { print qx(wakeonlan $mac->{MAC}); } } } else { print lc($host) . ": no such host in the list.\n"; } } } else { foreach $host (sort keys %$mac) { $physical = $mac->{lc($host)}; foreach my $mac (@$physical) { print "$host -> $mac->{MAC} -> $mac->{IP}\n"; } } }