Pour mettre en place un service sous Linux, il suffit de :

  • créer un fichier de configuration du service (les paramètres de la commande à lancer)
  • créer le script du service
  • créer des liens symboliques pour définir quand lancer ou arrêter le service

Le fichier de configuration du service

Par défaut, /etc/init.d/skeleton nous propose d'utiliser le répertoire /etc/defaults pour placer le fichier de configuration de notre service. Nous retiendrons donc /etc/defaults/p0f. La commande que l'on souhaite lancer comme service dépend de si l'on laisse p0f retrouver tout seul l'interface réseau ou non[1] :

/usr/sbin/p0f -U -p -d -o <fichier log>

ou

/usr/sbin/p0f -U -p -i atm0 -d -o <fichier log>

On voudrait éventuellement pouvoir modifier les premières options et aussi le répertoire dans lequel les fichiers log seront enregistrés. Le fichier de configuration va donc simplement contenir :

# default network interface (leave empty to let p0f decide)
NETWORKIF=

# p0f options, '-d' and '-o' automatically appended (see p0f man page)
OPTIONS="-U -p"

# log dir
LOGDIR=/var/log/p0f

Le script du service

Le plus simple est de commencer par copier le modèle :

# cp /etc/init.d/skeleton /etc/init.d/p0f

Il faut ensuite modifier un peu le script d'exemple :

  1. créer les variables qui contiennent les options de la commande après la lecture du fichier de configuration
  2. vérifier que le répertoire des fichiers log existe, le créer sinon
  3. s'arranger pour que le processus soit lancé en tâche de fond et que son PID soit enregistré

Pour le point 1 :

# build command args
if [[ $TEST=="" ]]; then
        DAEMON_ARGS=$OPTIONS
else
        DAEMON_ARGS="$OPTIONS -i $NETWORKIF"
fi
LOGFILE=$LOGDIR/p0f-$(date +%Y-%m-%d-%Hh%Mmin).log
DAEMON_ARGS="$DAEMON_ARGS -d -o $LOGFILE"

Pour le point 2 :

# Make the log directory
if ! [ -d $LOGDIR ]; then
        mkdir $LOGDIR
fi

Pour le dernier point, il suffit d'ajouter si besoin les options --background et --make-pidfile à la commande start-stop-daemon qui s'occupe de lancer les services du système. On corrigera éventuellement aussi les délai d'attente à l'arrêt du service et spécifiés avec l'option --retry de cette même commande start-stop-daemon.

Pour tester tout ça :

# /etc/init.d/p0f start
# ls /var/log/p0f/
# less /var/run/p0f.pid
# /etc/init.d/p0f stop
# ls /var/run/p0f.pid

Normalement on a un fichier log qui porte dans son nom la date et l'heure de début d'enregistrement, et un fichier PID qui apparaît ou disparaît au démarrage et à l'arrêt du service.

Mise en place du service

Il faut maintenant créer des liens symboliques dans les répertoires /etc/rc*.d/, commençant par un S pour démarrer le service et un K pour le terminer. Pour faciliter la tâche, la commande update-rc.d est là :

# update-rc.d p0f defaults
Adding system startup for /etc/init.d/p0f ...
  /etc/rc0.d/K20p0f -> ../init.d/p0f
  /etc/rc1.d/K20p0f -> ../init.d/p0f
  /etc/rc6.d/K20p0f -> ../init.d/p0f
  /etc/rc2.d/S20p0f -> ../init.d/p0f
  /etc/rc3.d/S20p0f -> ../init.d/p0f
  /etc/rc4.d/S20p0f -> ../init.d/p0f
  /etc/rc5.d/S20p0f -> ../init.d/p0f

Et voilà ! Les plus flémards pourront se contenter de lire les explications et télécharger l'archive p0fd-2007-01-29.tar.gz.

Notes

[1] consulter le manuel de p0f pour connaître la signification des options