~ubuntu-branches/ubuntu/precise/shutdown-at-night/precise

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/perl

use strict;
use warnings;

use Sys::Syslog qw(openlog syslog closelog LOG_NOTICE);

my $delay = 5;
my $wakeuplist = "/etc/shutdown-at-night/clients";
my $wakeupgenerator = "/etc/shutdown-at-night/clients-generator";

my %hwaddrs;

sub load_clients {
    my $fh = shift;
    while (<$fh>) {
        chomp;
        my ($ip, $hwaddr) = split(/\s+/);
        $hwaddrs{$ip} = $hwaddr;
    }
}

# Locate hosts to wake up, from file
if ( -f $wakeuplist ) {
    if (open(CLIENTS, "<", $wakeuplist)) {
        load_clients(*CLIENTS);
        close(CLIENTS);
    }
}
# Or using a dynamic script
if ( -x $wakeupgenerator ) {
    if (open(CLIENTS, "$wakeupgenerator |")) {
        load_clients(*CLIENTS);
        close(CLIENTS);
    }
}

my %alive;
map { $alive{$_} = 1; } get_alive_list(keys %hwaddrs);

# Calculate when to start, assuming 20-30 seconds between each host
#my $duration = $delay * scalar keys %hwaddrs;
#my $allup = time();

# Start sending wakeup calls
for my $ip (sort keys %hwaddrs) {
    if (! defined $alive{$ip}) {
        logmsg("sending wake-on-lan to $ip [$hwaddrs{$ip}]");
        wakeup($ip, $hwaddrs{$ip});
        sleep $delay;
    } else {
        logmsg("not sending wake-on-lan to already awake $ip [$hwaddrs{$ip}]");
    }
}

# exit
exit 0;

sub wakeup {
    my ($ip, $hwaddr) = @_;
    `wakeonlan -i $ip $hwaddr`;
}

sub get_alive_list {
    my @addresses = @_;
    return split(/\s+/, `fping -a @addresses`);
}

sub logmsg {
    my $msg = shift;
    openlog("wakeupclients", undef, 'user');
    syslog(LOG_NOTICE, "%s", $msg);
    closelog;
}