Software Hoek

Wake On Lan


Als je, net als ik, thuis een Linux servertje hebt draaien is het erg gemakkelijk als je op afstand elke willekeurige computer in je netwerk kunt aanzetten. Gewoon omdat je een bestand nodig hebt wat op die PC staat. Of om het bureaublad op afstand over te nemen. Of gewoon op een vaste tijd elke dag je computer alvast te laten opstarten, dan hoef je niet zolang te wachten als je wilt beginnen. Dat kan allemaal, als het moet, zelfs vanaf de andere kant van de wereld.
Elke computer in je netwerk zeg je? Niet helemaal, ik bedoel elke computer die met een kabel aan het netwerk hangt. Draadloze computers kunnen helaas niet vanuit het netwerk aangeschakeld worden.

Dit script verstuurt op commando een zo genaamd magic packet naar de geselecteerde computer. De geadresseerde computer reageert daarop door zichzelf in te schakelen.
Computers die uit staan hebben geen IP adres. Daarom wordt het MAC adres van de computer gebruikt om hem te adresseren, dit is dus het hardware adres van de netwerkkaart. Je kunt een MAC adres als parameter opgeven aan het wol script om de juiste computer te selecteren. Wij, mensen, zijn niet zo goed in het onthouden van MAC adressen. Daarom heb ik een lijstje in het sript staan waarin je elke computer binnen je netwerk een of meerdere namen kunt geven. Het laten ontwaken van een computer is dan een kwestie van de juiste naam opgeven bij het starten van het wol script.

Omdat het wol script geschreven is in Python is het op vrijwel elk systeem te gebruiken. Persoonlijk gebruik ik het enkel op Linux, maar het zal ook moeten draaien op Mac en Windows computers.

Het WOL Script


#! /usr/bin/python

# Wake on Lan
#
# Gebruik: wol computer1 computer2 00:11:22:33:44:55
#
# Autheur: San Bergmans
#          www.oeioei.nl
#
# Pas de broadcast lijst aan op je eigen netwerk.
# Pas de known_computers lijst aan op je eigen computers.
#

import sys, struct, socket

broadcast = ['192.168.1.255', '192.168.0.255']

known_computers = {
    'mercurius'  : '00:1C:55:35:12:BF',
    'venus'      : '00:1d:39:55:5c:df',
    'aarde'      : '00:10:60:15:97:fb',
    'maan'       : '00:10:60:15:97:fb',
    'mars'       : '00:10:DC:34:B2:87',
    }

wol_port = 9

def WakeOnLan(ethernet_address):

    # Construct 6 byte hardware address
    add_oct = ethernet_address.split(':')
    if len(add_oct) != 6:
        print "\n*** Illegal MAC address\n"
        print "MAC should be written as 00:11:22:33:44:55\n"
        return
    hwa = struct.pack('BBBBBB', int(add_oct[0],16),
        int(add_oct[1],16),
        int(add_oct[2],16),
        int(add_oct[3],16),
        int(add_oct[4],16),
        int(add_oct[5],16))

    # Build magic packet

    msg = '\xff' * 6 + hwa * 16

    # Send packet to broadcast address using UDP port 9

    soc = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    soc.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)
    for i in broadcast:
        soc.sendto(msg,(i,wol_port))
    soc.close()

if len(sys.argv) == 1:
    print "\n*** No computer given to power up\n"
    print "Use: 'wol computername' or 'wol 00:11:22:33:44:55'"
else:
    for i in sys.argv:
        if i[0] != '/':
            if ":" in i:
                # Wake up using MAC address
                WakeOnLan(i)
            else:
                # Wake up known computers
                if i in known_computers:
                    WakeOnLan(known_computers[i])
                else:
                    print "\n*** Unknown computer " + i + "\n"
                    quit()
    if len(sys.argv) == 2:
        print "\nDone! The computer should be up and running in a short while."
    else:
        print "\nDone! The computers should be up and running in a short while."
    print

Kopieer en plak het script in een bestandje. Je mag zelf weten welke naam je aan het bestand geeft. Zorg er ook voor dat het bestand executable is.

Je moet nog een paar aanpassinkjes maken aan het script. Om te beginnen moet je netwerk informatie kloppen. Je kunt een of meerdere netwerken invoeren in de lijst "broadcast". In de meeste gevallen is er slechts een netwerk, maar je kunt er dus meerdere invullen.
Dan moet je ook nog de lijst met MAC adressen van bekende computers invullen in de lijst met "known_computers". Geef elke computer in je netwerk een gemakkelijk te onthouden naam. Het is zelfs mogelijk om meerdere namen voor een en de zelfde computer op te geven, zoals aarde en maan in het voorbeeld. De namen die hier ingevuld worden zijn de namen waarmee de computers wakker te schudden zijn. Het is niet noodzakelijk dat de namen ook overeenkomen met de echte naam van de computer.
De MAC adressen moeten in de getoonde vorm opgegeven worden. Het maakt daarbij niet uit of je hoofd of kleine letters gebruikt.

Het WOL Script In Gebruik


Het wol script is zeer eenvoudig in het gebruik. Het command wol aarde venus zal de computers met de namen aarde en venus een wake up commando sturen. In plaats van de computer naam mag ook een MAC adres gegeven worden. Dus wol 00:11:22:33:44:55 zal de computer met het betreffende MAC adres een wake up commando sturen.
Je kunt het wol commando ook als een cron job uit laten voeren. Op die manier kun je bepaalde computers op een vooraf ingesteld tijdstip laten opstarten.

Alternatief


Als je, net als ik, in het bezit bent van een Fritz!box modem dan kun je ook vanuit die Fritz!box computers laten ontwaken. Dit heeft dus niets met het hier getoonde Python script te maken. Het grote voordeel daarvan is dat er nog geen computers wakker hoeven te zijn om andere computers wakker te kunnen schoppen. Het nadeel is echter dat je dat niet kunt automatiseren, wat je met het losse wol scriptje wel kunt.

Als je vanaf het internet computers wakker wilt maken moet je beginnen er voor te zorgen dat je Fritz!box van buitenaf bereikbaar is. Dit stel je in bij "settings" - "Permit Access" - "Remote Administration". Die externe toegang geschiedt uitsluitend via HTTPS overigens. Het is dus veilig. Maar je moet het wel expliciet in je browser opgeven, want standaard ga je naar normale HTTP pagina's, maar daar reageert de Fritz!box niet op.
Je hebt waarschijnlijk ook geen officieel SSL certificaat. Je krijgt de eerste keer dan ook een waarschuwing dat het certificaat onbekend is. Dit mag je gerust negeren, want je had dit al verwacht. Bij bank sites en dergelijke mag je onbekende certificaten natuurlijk nooit zomaar accepteren.

Door nu te surfen naar https://jeeigennetwerk.nl krijg je een login schermpje te zien. Nadat je hier de juiste gegevens hebt ingevuld kun je pas echt inloggen op je Fritz!box.

Daarna is het een kwestie van de lijst met PC's oproepen. Klik bij een van de bedrade computers op het edit symbool (draadloze computers kunnen namelijk niet op afstand aangeschakeld worden). In het edit scherm staat rechts onderin een knop met de tekst "Start Computer". Je mag een keer raden wat er gebeurt als je op de knop drukt.

Lijst met bekende PC's

Start een PC

Waarschijnlijk zijn er meerdere modems/routers die dit kunstje kennen. Van de Fritz!box weet ik het in ieder geval zeker. Daarom heb ik die hier genoemd.