[isc-dhcp-server] Monitorer les attributions du serveur

Pour ceux utilisant isc-dhcp-server comme serveur DHCP (serveur par défaut dans les distributions debian), voici un tutoriel pour connaître les évènements commit, release et expiry de votre serveur.
Je l’utilise sur Jeedom pour savoir quand certains matériels (généralement en wifi) se réveillent et viennent chercher sur le serveur leur adresse IP.

Sur la machine hébergeant Jeedom
Création avec le plugin virtuel de trois commande info « Autre »

Sur la machine hébergeant le serveur DHCP :
Création de trois scripts dans le répertoire /etc/dhcp/dhcp-server-hooks.d

Si le répertoire n’existe pas

mkdir /etc/dhcp/dhcp-server-hooks.d

Création des trois scripts :

nano /etc/dhcp/dhcp-server-hooks.d/on_commit
nano /etc/dhcp/dhcp-server-hooks.d/on_release
nano /etc/dhcp/dhcp-server-hooks.d/on_expiry

Les trois scripts contiennent la même chose sauf l’id de la commande info (numID)

#!/bin/bash

curl  'https://tonjeedom.dns.fr/core/api/jeeApi.php?plugin=virtual&apikey=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&type=virtual&id=numID&value='$1'-'$2

Je n’ai pas approfondi cette partie car je n’ai pas trouvé l’utilisateur dhcpd sur ma machine
Attribution des droits pour exécuter les scripts :

chmod 777 /etc/dhcp/dhcp-server-hooks.d/*

Ajout dans le fichier de configuration /etc/dhcp/dhcpd.conf

nano /etc/dhcp/dhcpd.conf

A ajouter dans la partie subnet

subnet xxxxxxxxxxxxxxxxxx {
................
................
   on commit {
      log("=============[ START COMMIT ]================");
      set clientIP = binary-to-ascii(10, 8, ".", leased-address);
      set clientMAC = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
      log(concat("Commit: IP " , clientIP, " leased to MAC ", clientMAC));
      execute("/etc/dhcp/dhcp-server-hooks.d/on_commit", clientIP, clientMAC);     # optional parameters
      log("============[ END COMMIT ]==================");
   }
   on release {
      log("============[ START RELEASE ]===============");
      set clientIP = binary-to-ascii(10, 8, ".", leased-address);
      set clientMAC = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
      log(concat("Release: IP ", clientIP, " released. It was associated to MAC ", clientMAC));
      execute("/etc/dhcp/dhcp-server-hooks.d/on_release", clientIP, clientMAC);     # optional parameters
      log("===========[ END RELEASE ]==================");
   }
   on expiry {
      log("===========[ START EXPIRY ]================");
      set clientIP = binary-to-ascii(10, 8, ".", leased-address);
      set clientMAC = binary-to-ascii(16, 8, ":" , substring(hardware, 1, 6));
      log(concat("Expiry: IP ", clientIP, " expired. It was associated to MAC ", clientMAC));
      execute("/etc/dhcp/dhcp-server-hooks.d/on_expiry", clientIP, clientMAC);     # optional parameters
      log("===========[ END EXPIRY ] =================");
   }
................
................
}

Redémarrer le serveur DHCP.

1 « J'aime »

Pour les possesseurs d’un serveur DNS pour leur réseau local.
Bloc code de scénario pour récupérer le nom, l’IP et la MAC des machines.

$trigger = cmd::cmdToHumanReadable($scenario->getRealTrigger());
$scenario->setLog('Trigger : ' . $trigger);
$cmd = cmd::byString($trigger);
$value = $cmd->execCmd();
$scenario->setLog('Valeur : ' . $value);

$ip = strtok($value,'-');
$macPro = strtoupper(strtok('-'));
$scenario->setLog('IP : ' . $ip);
$scenario->setLog('MAC : ' . $macPro);

$macCut = strtok($macPro,':');
for ($i = 1; $i <= 6; $i++) {
  if (strlen($macCut) == 1) {
    $macCut = "0" . $macCut;
  }
  $mac = $mac . $macCut . ':';
  $macCut = strtok(':');  
}
$mac = substr($mac,0,17);
$scenario->setLog('MAC : ' . $mac);

$hostname = gethostbyaddr($ip);
$scenario->setLog('Nom : ' . $hostname);
if ($ip === $hostname) {
  $hostname = $ip . '-' . $mac;
}
$scenario->setLog('Nom : ' . $hostname);

$eqLogicName = $cmd->getEqLogic()->getHumanName();
$scenario->setLog('Equipement logique : ' . $eqLogicName);
cmd::byString('#' . $eqLogicName . '[Nom]#')->event($hostname);
cmd::byString('#' . $eqLogicName . '[IP]#')->event($ip);
cmd::byString('#' . $eqLogicName . '[MAC]#')->event($mac);
1 « J'aime »