![]() |
L'idée décrite ici m'est venue car ma passerelle ADSL était dans ma chambre. Bien qu'assez silencieuse, je n'aimais pas dormir avec, à cause du bruit des ventilateurs, mais surtout du disque dur et des lumières des diodes. Plan de ce document : |
Description du système :
Sur votre réseau local, la passerelle n'a d'utilité que si au moins un ordinateur client a besoin d'accéder à internet. Un tel client est connecté au réseau et donc envoie une réponse à toute requête de ping. Etant donné une liste d'adresses IP correspondant aux machines du réseau, nous pouvons donc savoir s'il existe au moins une machine allumée.
Nous allons donc faire un script qui teste la présence des machines sur le réseau et si celles-ci sont toutes éteintes (la nuit par exemple), va commander l'extinction du serveur, puis automatiser l'exécution de ce script en modifiant la crontab de root.
Le script suivant analyse le retour d'un envoi d'un paquet de ping pour chaque machine du réseau. Notez que pour certaines versions de ping, il faudra remplacer round-trip min/avg/max par rtt min/avg/max/mdev. Vérifiez le retour de la commande ping pour adapter le filtrage de la commande grep en fonction.
#!/bin/sh # initial client status ########################################## clarkwan=0 panini=0 eva=0 # test if clients are awake ###################################### if ping -c 1 192.168.0.2 | grep -E "round-trip min/avg/max" > /dev/null ; then clarkwan=1 fi if ping -c 1 192.168.0.3 | grep -E "round-trip min/avg/max" > /dev/null ; then panini=1 fi if ping -c 1 192.168.0.4 | grep -E "round-trip min/avg/max" > /dev/null ; then eva=1 fi # set action depending on the result of the test ################# sleeping=$[$clarkwan+$panini+$eva] case $sleeping in 0) poweroff ;; esac
Créez ce script avec vi ou emacs, par exemple dans le fichier /root/scripts/testoff.sh. Remplaçez les variables et les adresses IP par celles correspondant à la configuration de votre réseau. Il faut ensuite rendre ce script exécutable en faisant un chmod +x /root/scripts/testoff.sh. Vous pouvez dès à présent tester si le script fonctionne en le lançant manuellement, en tapant /root/scripts/testoff.sh.
Le cron est un démon qui permet l'exécution de scripts à certains horaires. Chaque utilisateur a une table de cron qui lui permet de lancer de tels scripts en son nom même s'il n'est pas connecté à la machine. Nous allons modifier la table cron de root en tapant, en tant que root, crontab -e. Tapez alors :
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ */10 * * * * /root/scripts/testoff.sh
La dernière ligne permet de dire qu'il faut exécuter toutes les 10 minutes le script que nous avons réalisé.
On se rend vite compte que l'utilisation de ce script à une limite. En effet, si les machines clientes sont toutes éteintes, il est quand même possible que l'on travaille sur le serveur, soit connecté directement sur la passerelle, soit à distance via ssh.
La modification du script suivante permet de palier cette faiblesse en analysant le résultat d'une commande who. Si celle-ci renvoit autre chose q'une chaine vide, alors annule l'extinction de la même façon que si une des machines clientes est allumée.
#!/bin/sh # initial client status ########################################## loggedin=0 clarkwan=0 panini=0 eva=0 # test if someone is logged in ################################### # "t" will be present if anyone is logged in locally or remotely # because it is the common letter of the pts or tty string : if who | grep -E "t" > /dev/null ; then loggedin=1 fi # test if clients are awake ###################################### if ping -c 1 192.168.0.2 | grep -E "round-trip min/avg/max" > /dev/null ; then clarkwan=1 fi if ping -c 1 192.168.0.3 | grep -E "round-trip min/avg/max" > /dev/null ; then panini=1 fi if ping -c 1 192.168.0.4 | grep -E "round-trip min/avg/max" > /dev/null ; then eva=1 fi # set action depending on the result of the test ################ sleeping=$[$clarkwan+$panini+$eva+$loggedin] case $sleeping in 0) poweroff ;; esac