Gateway /proc/acpi / XML
By Geoffrey on Tuesday 13 December 2005, 09:05 - Coding - Permalink
Un petit script pour récupérer les infos de /proc/acpi en XML via une page web.
Bon bien sur, ce n'est pas parfait, on peut noter par exemple qu'aucune vérification sur le chemin du fichier n'est effectuée (cad qu'une url du type http://example.com/acpi-xml.php/../../etc/passwd ne sera pas rejetée et c'est mal je sais), la transformation en XML n'a pas été testée sur tous les fichiers, il est possible donc que certains fichiers donnent du XML non valide. C'est tout ce que je vois pour l'instant mais il y en a surement d'autres.
Sinon, voilà a peu près comment ça marche: le script utilise $_SERVER['PATH_INFO'] (c'est plus joli) pour récupérer le path du fichier désiré relatif à /proc/acpi (ou autre, défini dans la constante SLASHPROC). On aura donc des URLs du genre: http://example.com/acpi-xml.php/battery/BAT1/state. Le root node du document XML retourné est constitué du path complet (avec /proc/acpi donc) du fichier, où les slash (/) ont été remplacés par des underscore (_). Chaque propriété ACPI est ensuite converti en noeud XML, chaque caractère slash (/), espace et étoile (*) étant converti en underscore (_).
<?php ob_start(); define('SLASHPROC', '/proc/acpi'); $f = $_SERVER['PATH_INFO']; define('F', realpath(SLASHPROC . $f)); if (!F) { echo '<error><message>unknown acpi file</message><more>' . $f . '</more></error>'; } else { printf('<%s>', str_replace('/', '_', F)); if (is_dir(F)) { $files = glob(F.'/*'); foreach($files as $file) { $type = is_dir($file) ? 'dir' : 'file'; $file = str_replace(F, '', $file); printf('<%s>%s</%1$s>', $type, $file); } } else { $lines = file(F); foreach($lines as $l) { if (preg_match('/([^:]+):[ \t]+(.+)/', $l, $p)) { $name = str_replace(array(' ', '*'), '_', $p[1]); if (strstr($p[2], ' ')) { list($value, $unit) = explode(' ', $p[2]); printf('<%s unit="%s">%d</%1$s>', $name, $unit, $value); } else { printf('<%s>%s</%1$s>', $name, $p[2]); } } } } printf('</%s>', str_replace('/', '_', F)); } $b = ob_get_contents(); ob_end_clean(); header('Content-Type: text/xml'); echo '<?xml version="1.0"?>', $b; ?>