1 |
dpavlin |
295 |
package wol; |
2 |
|
|
|
3 |
|
|
use warnings; |
4 |
|
|
use strict; |
5 |
|
|
|
6 |
|
|
use IO::Socket::INET; |
7 |
dpavlin |
296 |
use Regexp::Common qw/net/; |
8 |
dpavlin |
366 |
use CouchDB; |
9 |
dpavlin |
295 |
|
10 |
dpavlin |
296 |
use client; |
11 |
dpavlin |
297 |
use server; |
12 |
dpavlin |
296 |
|
13 |
dpavlin |
295 |
sub power_on { |
14 |
dpavlin |
296 |
my $target = shift; |
15 |
dpavlin |
295 |
|
16 |
dpavlin |
297 |
my ( $port, $mac ) = ( 9 ); |
17 |
dpavlin |
295 |
|
18 |
dpavlin |
296 |
if ( $target =~ m/$RE{net}{MAC}{-keep}/ ) { |
19 |
|
|
$mac = $1; |
20 |
|
|
} elsif ( $target =~ m/$RE{net}{IPv4}{-keep}/ ) { |
21 |
|
|
$mac = client::mac_from_ip $1; |
22 |
|
|
} else { |
23 |
|
|
die "$target isn't IP or MAC"; |
24 |
|
|
} |
25 |
|
|
|
26 |
dpavlin |
297 |
warn "# power_on $mac"; |
27 |
dpavlin |
296 |
|
28 |
dpavlin |
295 |
my $sock = IO::Socket::INET->new( Proto=>'udp' ); |
29 |
dpavlin |
297 |
my $ip_addr = inet_aton($server::bcast); |
30 |
dpavlin |
295 |
my $sock_addr = sockaddr_in($port, $ip_addr); |
31 |
|
|
|
32 |
dpavlin |
366 |
my $mac_payload = $mac; |
33 |
|
|
$mac_payload =~ s{:}{}g; |
34 |
dpavlin |
295 |
|
35 |
dpavlin |
366 |
my $packet = pack('C6H*', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, $mac_payload x 16); |
36 |
|
|
|
37 |
dpavlin |
295 |
setsockopt($sock, SOL_SOCKET, SO_BROADCAST, 1); |
38 |
|
|
send($sock, $packet, 0, $sock_addr); |
39 |
|
|
close ($sock); |
40 |
dpavlin |
366 |
|
41 |
|
|
CouchDB::audit( $target, { ip => $target, mac => $mac } ); |
42 |
dpavlin |
295 |
} |
43 |
|
|
|
44 |
|
|
1; |