Agent d’inventaire OCS-NG et clients légers
Depuis quelques années nous utilisons des clients légers HP pour lesquels nous avons développé une image sous linux (t5tux). Cette drôle d’idée présente de nombreux avantages:
- On ne dépend de personne pour les mises à jour des client ( RDP, Citrix et autres… ).
- Cette image a été faite quand HP ne proposait pas linux sur ses clients légers.
- La même image fonctionne sur plusieurs générations de clients.
- La config est téléchargée en TFTP.
- L’image se met à jour toute seule avec PXE.
- On apprend plein de choses…
Bref… l’histoire continue avec un nouveau problème: inventorier ces postes avec OCS-NG.
OCS dispose d’un agent d’inventaire pour linux mais celui-ci est assez lourd. De plus, il dispose d’un grand nombre de fonctionnalités inutiles dans notre cas. Nous souhaitons un minimum d’infos: numéro de série, model, ip, mac…
La communication entre l’agent et le serveur se fait avec un fichier XML compressé ou non avec ZLIB et transmis dans une reqûete de type POST. Pourquoi ne pas générer un XML minimaliste et l’envoyer nous même ?
Un simple script bash, épaulé de quelques utilitaires: dmidecode, busybox, wget fera l’affaire.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#! /bin/sh model=`/usr/local/sbin/dmidecode -s system-product-name` type=`/usr/local/sbin/dmidecode -s baseboard-product-name` bytes=`free -k | grep Mem | awk '{ print $2 }'` memory=$(($bytes/1024)) bytes=`fdisk -l | grep Disk | grep da | cut -f2 -d, | awk '{ print $1 }'` disk=$(($bytes/1024/1024)) serial=`/usr/local/sbin/dmidecode -s system-serial-number` hwaddr=`ifconfig eth0 | grep HWaddr | sed "s/.*HWaddr \\(.*\\)/\\1/"` ip=`ifconfig eth0 | grep "inet addr" | sed "s/.*addr:\\(.*\\) B.*/\\1/"` tag=`hostname | cut -f1 -d-` hostname=`hostname` echo "Model: $model" echo "Ram: $memory" echo "Disk: $disk" echo "Serial: $serial" echo "Mac: $hwaddr" echo "ip: $ip" echo "tag: $tag" echo "hostname: $hostname" cat << EOF > /tmp/inventory.xml <?xml version="1.0" encoding="UTF-8"?> <REQUEST> <CONTENT> <ACCOUNTINFO> <KEYNAME>TAG</KEYNAME> <KEYVALUE>$tag</KEYVALUE> </ACCOUNTINFO> <BIOS> <ASSETTAG>$serial</ASSETTAG> <BMANUFACTURER>Hewlett-Packard</BMANUFACTURER> <MMANUFACTURER>Hewlett-Packard</MMANUFACTURER> <MSN>$serial</MSN> <SMANUFACTURER>Hewlett-Packard</SMANUFACTURER> <SMODEL>$model - $type</SMODEL> <SSN>$serial</SSN> </BIOS> <HARDWARE> <CHECKSUM>131071</CHECKSUM> <MEMORY>$memory</MEMORY> <NAME>$hostname</NAME> <OSCOMMENTS>T5TUX</OSCOMMENTS> <OSNAME>t5tux</OSNAME> <VMSYSTEM>Physical</VMSYSTEM> </HARDWARE> <NETWORKS> <DESCRIPTION>eth0</DESCRIPTION> <IPADDRESS>$ip</IPADDRESS> <MACADDR>$hwaddr</MACADDR> <TYPE>Ethernet</TYPE> </NETWORKS> <STORAGES> <DESCRIPTION>FLASH</DESCRIPTION> <DISKSIZE>$disk</DISKSIZE> <TYPE>disk</TYPE> </STORAGES> </CONTENT> <DEVICEID>$hostname-9999-01-01-01-01-01</DEVICEID> <QUERY>INVENTORY</QUERY> </REQUEST> EOF wget --post-file=/tmp/inventory.xml http://ocs-ng.xxxx.fr/ocsinventory |
Quelques astuces:
- wget avec un « –post-file monfichier » ou curl avec un « –binary-data @monfichier » permettent de poster des données.
- le CHECKSUM à 131071 indique que toutes les données sont modifiées. J’ai trouvé cette info sur un forum mais pas dans la doc officielle.
- Le client léger est en lecture seule du coup le DEVICEID ne peut être stocké. La date servant à sa génération est falsifiée: « 9999-01-01-01-01-01″
Très simple et pas forcément très élégant mais ça marche très bien !