#!/usr/bin/perl use strict; use DBI; use Socket; foreach my $ether (split(/\s+/, get_ethers_by_host(shift()))) { wake_host_by_hwaddr($ether); } exit (0); sub wake_host_by_hwaddr { my ($packet, $hwaddr, $raddr, $port); foreach (split /:/, $_[0]) { $hwaddr .= chr(hex($_)); } $packet = chr(0xFF) x 6 . $hwaddr x 16; socket((SOCK, AF_INET, SOCK_DGRAM, getprotobyname('udp'))) || die "socket : $!"; setsockopt(SOCK, SOL_SOCKET, SO_BROADCAST, 1) || die "setsockopt : $!"; $port = getservbyname('discard', 'udp'); $raddr = gethostbyname('255.255.255.255'); send(SOCK, $packet, 0, pack_sockaddr_in($port, $raddr)) || die "send : $!"; close (SOCK); return; } sub get_ethers_by_host { my ($dbh, $sth, $query, $ethers); $dbh = open_db(); $query = sprintf('SELECT ethers FROM ethers WHERE hostname = \'%s\'', $_[0]); $sth = $dbh->prepare($query); $sth->execute || die "Error:" . $dbh->errstr . "\n"; while (my $ref = $sth->fetchrow_arrayref) { $ethers = $$ref[0]; } $sth->finish(); $dbh->disconnect(); return ($ethers); } sub open_db { my $home = $ENV{'HOME'}; my ($dsn, $dbh, $user, $password); $dsn = "DBI:mysql:database=ethers;" . "mysql_read_default_group=ethers;" . "mysql_read_default_file=$home/.my.cnf;" . "mysql_mysql_client_found_rows=TRUE;" . "mysql_mysql_ssl=TRUE"; $dbh = DBI->connect($dsn, undef, undef, {RaiseError => 1, AutoCommit => 0}); return ($dbh); }