La ligne de commande

Sur un système Debian/Ubuntu il faut installer le paquet wakeonlan sur le serveur :
sudo apt-get install wakeonlan

On récupère l'adresse MAC de la machine a allumer sur linux avec ifconfig :
eth0      Lien encap:Ethernet  HWaddr 00:11:22:33:44:55  
ou sur windows avec ipconfig /all
Adresse physique . . . . . . . . .: 00-11-22-33-44-55
Une fois la machine éteinte, le voyant de la carte réseau doit clignoter , on peut alors lancer wakeonlan :
wakeonlan -i 192.168.0.255 00:11:22:33:44:55
Le paramètre -i précise l'adresse de broadcast du réseau local. En effet, votre serveur possède certainement plusieurs interfaces réseaux , il faut préciser sur quel réseau envoyer le paquet sinon l'allumage ne fonctionnera pas. Si tout c'est bien passé , la machine cliente devrais s'allumer !

Automatisation de WoL

Les cartes mères possèdent en général une fonction d'allumage automatique selon l'heure de la journée mais les options restent toutefois limitées et on peut désirer des réglages plus fins. Ceci est possible avec l'utilisation de crontab, qui planifie le lancement de tâches a intervalles réguliers. Nous allons configurer cron pour allumer la machine du lundi au vendredi a 7h30 On lance la commande
crontab -e
et on insère la ligne suivante :
30  7  *  *  1-5   wakeonlan -i 192.168.0.255 00:11:22:33:44:55
Beaucoup d'autres réglages sont possibles, pour plus d'informations la page de Crontab sur Wikipedia donne des explications plus détaillées.

Utilisation de Wake on LAN sur un site Web

Ici nous allons allumer une machine a partir d'une page Web, ce qui peut s'avérer plus pratique que la ligne de commande puisque cela ne necessite pas de connexion SSH pour accéder au serveur. Le script suivant a été pris sur ce blog. Merci a son auteur.
      function WakeOnLan($addr, $mac,$socket_number) {
        $addr_byte = explode(':', $mac);
        $hw_addr = '';
        for ($a=0; $a <6; $a++) $hw_addr .= chr(hexdec($addr_byte[$a]));
        $msg = chr(255).chr(255).chr(255).chr(255).chr(255).chr(255);
        for ($a = 1; $a <= 16; $a++) $msg .= $hw_addr;
        // send it to the broadcast address using UDP
        // SQL_BROADCAST option isn't help!!
        $s = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
        if ($s == false) {
          echo "Error creating socket!\n";
          echo "Error code is '".socket_last_error($s)."' - " . socket_strerror(socket_last_error($s));
          return FALSE;
          }
        else {
          // setting a broadcast option to socket:
          $opt_ret = socket_set_option($s, 1, 6, TRUE);
          if($opt_ret <0) {
            echo "setsockopt() failed, error: " . strerror($opt_ret) . "\n";
            return FALSE;
            }
          if(socket_sendto($s, $msg, strlen($msg), 0, $addr, $socket_number)) {
            echo "Magic Packet sent successfully!";
            socket_close($s);
            return TRUE;
            }
          else {
            echo "Magic packet failed!";
            return FALSE;
            }
          }
        }
      // Port number where the computer is listening. Usually, any number between 1-50000 will do. Normally people choose 7 or 9.
      $socket_number = "7";
      // MAC Address of the listening computer's network device
      $mac_addy = "00:11:22:33:44:55";
      // IP address of the listening computer. Input the domain name if you are using a hostname (like when under Dynamic DNS/IP)
      $ip_addy = "192.168.0.255";
      WakeOnLan($ip_addy, $mac_addy,$socket_number);
      
La page appelle la fonction WakeOnLan qui prends comme argument l'adresse de broadcast (ou un nom de domaine si le port vers lequel est acheminé le paquet est routé et qu'on appelle le script d'un serveur externe) , l'adresse MAC et un port (en général 7 ou 9).