Un ami ma demandé s’il était possible de récupérer les températures des disques durs sur un système Linux avec php. Sans vraiment trop réfléchir j’ai dit oui. À première vu, la méthode la plus basique serait de lancé une commande dans un shell via php, récupérer la sortie puis la formater comme bon nous le semble en PHP. Mais tout bon développeur sait que lancer une commande shell comme ça dans un script php n’est pas forcément très propre.

En cherchant mieux je suis tombé sur le mode daemon de hddtemp

hddtemp est un petit utilitaire qui peut s’utiliser de deux façons. La première consiste a executer directement la commande via un terminal:

$ hddtemp /dev/sda
/dev/sda: ST9500423AS: 42°C

L’autre méthode consiste à lancer hddtemp en arrière plan, puis de s’y connecter via un socket.

$ sudo hddtemp -d /dev/sda
$ nc localhost 7634
|/dev/sda|ST9500423AS|42|C|

En mode daemon, la sortie est formaté par des pipes, ce qui permet un “parsage” plus facile de celle-ci.

Depuis PHP 5, le fonction strem_get_contents() simplifie la chose pour récupérer le flux de sortie:

<?php
$fp = fsockopen("localhost", 7634, $errno, $errstr, 30);
if($fp) {
    $drives = stream_get_contents($fp);
    fclose($fp);
}
?>

Ensuite, on fait quelques modifications pour nettoyer la chaine et extraire les informations qu’on a besoin:

echo '<ul class="disks">';
$hdds = explode('||', $drives);//premier explode
if(count($hdds) > 1){//S'il y a plus d'un dd
	$hdds[0] = substr($hdds[0], 1);	//formate la chaine...
	$hdds[count($hdds)-1] = substr($hdds[count($hdds)-1], 0, -1);
}
foreach ($hdds as $hdd) {
	$data = explode('|', $hdd);//explode des informaitons d'un dd
	echo '<li><span>'.$data[1].'</span><span>'.$data[0].'</span><span class="temp">'.$data[2].'°<span></li>';
}
echo '</ul>';

Et voila! Le tour est joué, on ajoute un peu de css pour la forme et tada: