Surveillance des licences · 5 min read · Jan 13, 2026

Surveillance des licences Flexnet avec rrdtool

Surveillance des licences Flexnet avec rrdtool

Intro

Certains d’entre vous connaissent peut-être l’application commerciale Flexnet Licensing (©Macrovision). C’est une solution basée sur un client-serveur pour gérer l’utilisation des applications dites Flexnet-enabled. Vous pouvez détenir des licences de plusieurs produits sur un seul serveur de licences. Comme vous devez généralement acheter des licences et que celles-ci peuvent être coûteuses, il serait agréable d’avoir une solution de surveillance pour voir l’utilisation des précieuses licences, qu’elles soient sous-utilisées (donc de l’argent est gaspillé) ou toujours pleinement utilisées (ce qui peut amener à suspecter que parfois les gens ne peuvent pas faire leur travail, ou seulement avec du retard), ce qui est également un gaspillage de ressources.

Autant que je sache, il existe des applications commerciales pour effectuer de tels rapports, mais encore une fois, vous devez dépenser de l’argent. Pourquoi ne pas construire un système simple vous-même, qui montre l’utilisation actuelle et passée dans un style “MRTG” ?

Remarque préliminaire + Avertissement

Dans ce tutoriel, je vais utiliser quelques scripts, à savoir des scripts Shell et Python. Je pense que l’ensemble de l’application devrait fonctionner sur n’importe quel Linux, je l’ai fait sur CentOS et Ubuntu. Nous avons besoin d’un logiciel de serveur web capable d’exécuter des scripts CGI, j’ai utilisé le bien connu Apache ainsi que THTTPD, mais je crois que tout logiciel de serveur web devrait être capable d’exécuter cette application. C’est aussi un excellent complément à mon ancien appareil de surveillance réseau.

Le tutoriel suivant décrit la manière dont j’ai réalisé ma solution, il est écrit dans un style de recette de cuisine. Je ne peux garantir que vous pourrez réaliser une solution similaire.

1. Architecture

L’architecture de la solution est assez simple, voir l’image ci-dessous :

CGI-Script

Nous laissons le serveur de licences intact, mais obtenons les informations nécessaires via le réseau. Pour cela, nous utilisons le programme lmutil qui appartient au logiciel Flexnet et qui existe non seulement en version Windows, mais aussi en version Linux. Autant que je sache, des versions plus anciennes de lmutil ont également été disponibles pour HP/UX, Solaris et AIX, donc il y a des chances que des systèmes exécutant l’un de ces OS puissent également être utilisés pour construire le système de surveillance, mais je ne l’ai pas essayé.

La sortie de lmutil est filtrée de manière à ce que toutes les informations pertinentes puissent être mises dans une ou plusieurs bases de données rrd, j’ai utilisé une base de données pour chaque licence. rrd est également utilisé pour produire les graphiques, directement dans un sous-répertoire du logiciel de serveur web, à partir duquel il peut être affiché confortablement dans un navigateur web.

2. Interrogation du serveur de licences

J’ai copié une version récente de lmutil dans /usr/local/bin, et vérifié s’il est exécutable :

# ls -l /usr/local/bin/lmutil
-rwxr-xr-x 1 root root 309168 2008-01-08 00:45 /usr/local/bin/lmutil

Nous pouvons vérifier si toutes les bibliothèques partagées auxquelles lmutil est lié existent sur notre système :

# ldd /usr/local/bin/lmutil
        linux-gate.so.1 =>  (0xf7796000)  
        libpthread.so.0 => /lib32/libpthread.so.0 (0xf7760000)  
        libdl.so.2 => /lib32/libdl.so.2 (0xf775c000)  
        libc.so.6 => /lib32/libc.so.6 (0xf7601000)  
        /lib/ld-linux.so.2 (0xf7797000)

Étant un utilitaire en ligne de commande, lmutil n’est pas lié à beaucoup de bibliothèques partagées, donc les chances sont élevées qu’elles soient déjà installées.

Ensuite, j’ai construit un petit script pour interroger tous les démons de licences avec des licences pour plusieurs produits fonctionnant sur le serveur de licences, il ressemble à :

#!/bin/dash
# Produit1
/usr/local/bin/lmutil lmstat -c 27000@licserv -a | /usr/local/sbin/lmrrd.py
# Produit2
/usr/local/bin/lmutil lmstat -c 27001@licserv -a | /usr/local/sbin/lmrrd.py

J’ai utilisé /bin/dash comme interpréteur pour ce script, car dash est connu pour consommer moins de ressources que bash, mais n’hésitez pas à utiliser bash si vous le souhaitez. Les démons de licences pour les différents produits fonctionnent sur différents ports. La sortie de lmstat est directement acheminée vers un script Python, où toutes les informations nécessaires sont filtrées et mises dans la base de données rrd appropriée.

cron est utilisé pour établir un cycle de sondage de 5 minutes. Par conséquent, une entrée dans /etc/cron.d/ nommée rrd est créée, qui ressemble à :

*/5 8-16 * * 1-5 root LANG=C LC_ALL=C /usr/local/sbin/licenses.sh

Nous ne sommes intéressés que par la manière dont les licences sont utilisées du lundi au vendredi et de 8h à 17h.

Mais avant que cela puisse être établi, nous devons d’abord créer le script lmrrd.py.

3. Le script lmrrd.py

rrdtool est utilisé comme base de données pour cette tâche. rrdtool a différentes interfaces de script, à savoir des scripts shell, perl, python et tcl/tk. J’ai utilisé python en raison de sa conception de langage claire et de sa polyvalence.

Ce script est utilisé pour filtrer la sortie de lmutil et mettre les informations pertinentes directement dans la base de données rrd assignée. Il ressemble à :

#!/usr/bin/python
# Script pour filtrer la sortie de lmstat pour l'utiliser comme entrée pour rrd
import sys, string, rrdtool

# terme de recherche, position de la valeur actuelle et position de la valeur maximale dans chaque ligne
# db est le nom du fichier de base de données rrd
search = [ { 'term':"Users of CL:", 'val':10, 'max':5, 'db':'CL' },
           { 'term':"Users of xyzabc:", 'val':10, 'max':5, 'db':'xyzabc' },
           { 'term':"Users of qwerty:", 'val':10, 'max':5, 'db':'qwerty' } ]
rrddir='/var/rrd/'
# lire toutes les lignes de stdin 
for line in sys.stdin.readlines():
  # rechercher dans chaque ligne le terme de recherche du tableau ci-dessus
  for x in search:
    if x[ 'term' ] in line:
      cols = line.split()
      if not cols[ x[ 'max' ] ].isdigit() or not cols[ x[ 'val' ] ].isdigit():
        print "0\n0\n0\n", x[ 'term' ]
      
      # mettre les valeurs dans le fichier de base de données rrd assigné
      rrdtool.update( rrddir + x[ 'db' ] + '.rrd', \
        '--template=value:total', \
        'N:' + cols[ x [ 'val' ] ] + ':' + cols[ x[ 'max' ] ] )

Les termes de recherche dans le tableau pourraient être extraits de la sortie de “lmutil”, ainsi que les positions des valeurs actuelles et maximales du nombre de licences.

Vous avez besoin des liaisons python de rrdtool, qui peuvent être trouvées soit dans le dépôt de paquets de votre OS, soit sur le site web du mainteneur de rrdtool.

Comme implémenté, ce script est exécuté avec les permissions root. Les fichiers rrd d’origine doivent être lisibles par tous, car les scripts suivants qui génèrent les graphiques ne s’exécutent qu’avec la permission du propriétaire des processus du serveur http, généralement www-data ou similaire.

Share: X/Twitter LinkedIn

Recevez de nouveaux articles dans votre boîte de réception.

Aucun spam. Désabonnez-vous à tout moment.