Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

Guide Open Source

GUIDE E MANUALI DEL MONDO LINUX E CMS

linux

FLEXnet licenza monitoraggio con rrdtool

Intro

Alcuni di voi sapranno l’applicazione commerciale di Flexnet Licensing (© Macrovision). È una soluzione client-server basato per gestire l’utilizzo delle cosiddette applicazioni abilitate per Flexnet. È possibile tenere licenze di più di un prodotto su un server di licenze. Come in genere è necessario acquistare le licenze e le licenze possono essere costose che sarebbe stato bello avere una soluzione di monitoraggio, per vedere l’utilizzo delle licenze preziose, che scendessimo sono sottoutilizzate (così sono sprecato soldi) o sono sempre pienamente utilizzate (in modo che può ritenere sospetto che a volte le persone possono non aver funzionato, o solo in ritardo) che è anche uno spreco di risorse.

Per quanto ne so ci sono applicazioni commerciali per l’esecuzione di tali rapporti, ma ancora devi soldi spesi. Perché non costruire un semplice sistema di se stessi, che mostra i valori effettivi e passato l’utilizzo in stile”MRTG” ?

 

Nota preliminare + Disclaimer

In questo tutorial ho intenzione di usare alcuni script, vale a dire Shell – e gli script Python. Penso che l’intera applicazione dovrebbe funzionare su ogni Linux, ho fatto su CentOS e UbuntuAbbiamo bisogno di un webserversoftware che è in grado di eseguire script CGI, ho usato il wellknown Apache e anche THTTPD, ma credo che ogni webserversoftware deve essere in grado di eseguire questa applicazione. È anche un’estensione perfetta per la mia ex Apparecchio di monitoraggio di rete.

Nell’esercitazione seguente viene descritto il modo ho realizzato la mia soluzione, è scritto in una sorta di stile di cucina-ricetta. Io non posso emettere alcuna garanzia che è possibile realizzare una soluzione simile.

 

1. architettura

L’architettura della soluzione è abbastanza semplice, vedere l’immagine qui sotto:

CGI-Script

Abbiamo lasciare intatto il server licenze, ma ottenere le informazioni necessarie attraverso la rete. Quindi usiamo il programma lmutil che appartiene al software di Flexnet e non solo esiste in una versione di Windoze, ma anche in una versione di Linux. Per quanto so che le vecchie versioni di lmutil inoltre sono stati disponibili per HP/UX, Solaris e AIX, così ci sono possibilità che anche i sistemi che eseguono uno dei quei OS’es potrebbero essere utilizzati per costruire il sistema di monitoraggio, ma non ho provato.

L’output di lmutil viene filtrato il modo, che tutte le informazioni pertinenti potrebbero essere messo in uno o più database di rrd, ho usato un database per ogni licenza. RRD è utilizzato anche per produrre i grafici, direttamente in una sottodirectory di webserversoftware, da dove ha potuto essere indicato comodamente in un browser Web.

 

2. il polling del server di licenza

Ho copiato una versione recente di lmutil in /usr/local/bine verificato che scendessimo è eseguibile:

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

Possiamo verificare che scendessimo che tutte le librerie condivise lmutil è collegato contro, esiste il nostro sistema:

# 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)

Essendo un commandline utilità lmutil non è collegato contro un sacco di librerie condivise, quindi le probabilità sono alte che sono già installati.

Poi ho costruito un piccolo script per il polling di tutti i demoni delle licenze con licenze per i prodotti diversi in esecuzione sul server di licenze, si presenta come:

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

Ho usato /bin/dash come interprete per questo script, perché dash è conosciuto per consumare meno risorse rispetto a bash, ma sentitevi liberi di usare bash se ti piace. I demoni delle licenze per i vari prodotti sono in esecuzione su porte diverse. L’output di lmstat è convogliato direttamente in uno script Python, dove tutte le informazioni che sono necessario sono filtrate e inserite nel database rrd appropriato.

cron è utilizzato per stabilire un pollcycle di 5 minuti. Quindi viene creata una voce in /etc/cron.d/. denominato rrd che assomiglia a:

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

Siamo solo interessati come le licenze vengono utilizzate dal lunedì al venerdì e da 8 a 17.

Ma prima che questo potrebbe essere stabilito che dobbiamo innanzitutto creare lo script di lmrrd.py.

 

3. lo script lmrrd.py

RRDTool è utilizzato come database per questo compito. RRDTool ha diverse interfacce di scripting, vale a dire da shell, perl, python e script tcl/tk. Ho usato python a causa del suo linguaggio pulito design e versatilità.

This script is used to filter the output of lmutil and puts the relevant information directly into the assigned rrd database. It looks like:

#!/usr/bin/python
# Script to filter the output of lmstat to use it as input for rrd
import sys, string, rrdtool

# searchterm, position of actual value and position of max value in every line
# db is the name for the rrd dbfile
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/'
# read all lines from stdin 
for line in sys.stdin.readlines():
  # search in every line for the searchterm out of the above array
  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' ]
      
      # put the values in the assigned rrd dbfile
      rrdtool.update( rrddir + x[ 'db' ] + '.rrd', \
        '--template=value:total', \
        'N:' + cols[ x [ 'val' ] ] + ':' + cols[ x[ 'max' ] ] )

I termini di ricerca nella matrice potrebbero essere estratti dell’uscita di “lmutil”, anche le posizioni del reale e i possibili valori massimi del numero di licenze.

Avete bisogno i binding python di rrdtool, che può essere trovato sia nel repository di pacchetti del vostro sistema operativo, o sul sito Web del mantenitore di rrdtool.

Per come è implementato questo script viene eseguito con permessi di root. I file originari di rrd devono essere leggibile, del mondo perché i seguenti script che genera i grafici girano solo sotto autorizzazione del proprietario dei processi http-server, solitamente www-data o simili.

4. creazione di grafici

I grafici possono essere facilmente creati con l’aiuto del programma rrdcgi, che è nel pacchetto rrdtool. Creazione è quindi solo fatto su richiesta di salvare i cicli della CPU, è necessario creare alcuni script CGI con speciale RRD:: Tag che vengono interpretati da rrdcgi.

Assomiglia a mio script CGI:

#!/usr/bin/rrdcgi

<HTML>
<HEAD><TITLE>Prod1 License Usage</TITLE></HEAD>
<BODY>
<H1>Prod1 License Usage at <RRD::TIME::NOW '%a, %d %b %Y %H:%M'></H1>
<P></P>

<P>
<RRD::GRAPH /var/www/rrd/CL.png
        --imginfo '<IMG SRC=/rrd/%s>'
        -s -24hours -w 600 -h 200 -W gbi@localhost@localdomain
        -v "Licenses used" --lazy
        --title "Users of CL"
        -l 0 -Y
        DEF:value=/var/rrd/CL.rrd:value:MAX
        DEF:total=/var/rrd/CL.rrd:total:MAX
        AREA:value#660000
        LINE3:total#FF00FF>

</P>
</BODY>
</HTML>

Per dettagli vedere le pagine man di rrdcgi e rrdgraph.

Questo è un esempio di un grafico MRTG-stile ben noto:

Daily license usage

Non c’è molto da fare qui.

Lo script precedente è stato il mio primo, semplice approccio. L’idea era di implementare un set di script per ogni prodotto e per periodi diversi, uno per ogni giorno, uno per uno settimanale mensile e uno per una panoramica annuale. Ma questo porta a una marea di script essendo quasi identico. Dopo un’altra occhiata alla documentazione di rrdcgi è stata trovata un’altra possibilità, che conduce ad una soluzione con un script per prodotto e pulsanti di opzione per la selezione interattiva di timeperiod di interesse. Lo script è simile:

#!/usr/bin/rrdcgi

<HTML>
<HEAD><TITLE>Prod1 License Usage</TITLE></HEAD>
<H1>Prod1 License Usage at <RRD::TIME::NOW '%a, %d %b %Y %H:%M'></H1>

<H2>Time period</H2>
<FORM><INPUT NAME=period TYPE=RADIO Value=24hours> Daily,
        <INPUT NAME=period TYPE=RADIO VALUE=7days> Weekly,
        <INPUT NAME=period TYPE=RADIO VALUE=1month> Monthly,
        <INPUT NAME=period TYPE=RADIO VALUE=1year> Yearly.
        <INPUT TYPE=SUBMIT></FORM>

<BODY>
<P></P>

<P>
<RRD::GRAPH /var/www/rrd/CL-<RRD::CV period>.png
        --imginfo '<IMG SRC=/rrd/%s>'
        -s -<RRD::CV period> -w 600 -h 200 
        -W gbi@localhost.localdomain
        -v "Licenses used" --lazy
        --title "Users of CL"
        -l 0 -Y
        DEF:value=/var/rrd/CL.rrd:value:MAX
        DEF:total=/var/rrd/CL.rrd:total:MAX
        AREA:value#660000
        LINE3:total#FF00FF>
</P>

</BODY>
</HTML>

I pulsanti di opzione sopra i diagrammi per la selezione del timeperiod simile:

Radiobuttons

 

5. creazione dei database rrd

C’è un argomento che non ho detto finora, come vengono creati i database di rrd. Ho usato, è senso di esso, un altro script. Sembra che:

#!/usr/bin/python
# Script to create all rrd dbs for all instances of licenses 
# in a mrtg compatible fashion


import sys, string, rrdtool

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' } ]


for x in search:

      rrdtool.create( '/var/rrd/' + x[ 'db' ] + '.rrd', '-s 300', \
	'DS:value:GAUGE:600:U:U', 'DS:total:GAUGE:600:U:U', \
        'RRA:MAX:0.5:1:600', 'RRA:MAX:0.5:6:700', 'RRA:MAX:0.5:24:775', \
	'RRA:MAX:0.5:288:797' )

Naturalmente è necessario regolare questo alle vostre esigenze.

 

6. un altro script CGI

Per ulteriore facilità la gestione del sistema Flexnet e gli utenti che hanno bisogno di affittare una licenza per fare il loro lavoro, è stato creato un altro script CGI. Serve per mostrare chi ha affittato quanto le licenze, è solo l’output di “lmutil lmstat – a”, ma senza effettuare il login in un sistema dove è installato lmutil. Ma essere consapevoli, questo può collidere con tutela della privacy nell’organizzazione, perché le informazioni personali sono liberamente accessibili. Quindi potrebbe essere necessario proteggere l’esecuzione di questo script con qualche meccanismo di autenticazione, ma questo argomento non viene trattato in questa esercitazione.

Lo script è ancora uno script dash come quello nel capitolo 2, è possibile eseguire query più di un prodotto su più server, se attuata di conseguenza. È anche uno script di così chiamato, che è un tipo speciale, raramente usato di shellscript. Ancora una volta non esitate a adattarsi alle vostre esigenze:

#!/bin/dash

case $1 in
        prod1)          PORT=27000; PROD="Prod1";;
        prod2)          PORT=27002; PROD="Prod2";;
        prod3)          PORT=27042; PROD="Prod3";;
        *|prod4)        PORT=27001; PROD="Prod4";;
esac

echo Content-type: text/html
echo ""

/bin/cat << EOM
<HTML>
<HEAD><TITLE>Licensestate $PROD</TITLE>
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="cache-control" CONTENT="no-cache">
</HEAD>
<BODY bgcolor="#cccccc" text="#000000">
<HR SIZE=5>
<H1>Licensestate $PROD</H1>
<TD WIDTH=30%>
</P>
</TD>
<HR SIZE=5>
<P>
<PRE>
EOM

/usr/local/bin/lmutil lmstat -c $PORT@LICENSESERVER -a

/bin/cat << EOM
</PRE>
</SMALL>
<P>
<HR SIZE=3>
<P STYLE="margin-bottom: 0in"><A HREF="mailto:gbi@localhost.localdomain"><SPAN STYLE="text-decoration: none"><FONT SIZE=4 STYLE="font-size: 16pt"><FONT FACE="URW Chancery L">GBi</FONT></FONT></SPAN></A></P>
<P STYLE="margin-bottom: 0in; font-weight: medium; text-decoration: none">
<FONT FACE="Nimbus Roman No9 L, serif"><FONT SIZE=4>14.6.2010</FONT></FONT>

</BODY>
</HTML>
EOM

Semplicemente copiare questo script nella directory cgi-bin del webserver (/usr/lib/cgi-bin nel mio caso), rendono mondo lettura – e file eseguibile, non dimenticate di caricare il modulo CGI del webserver (se ne ha uno, o non è già caricato) e si è pronti per Togliere. L’output è simile:

License state

This script is called in your webbrowser with a URL like:

http://server/cgi-bin/licstate.cgi?prod2

So you can select one of several products simply by supplying a “command line parameter” to the CGI script.

By supplying a script like this one to the users of products where available licenses tend to be nearly maxed out all the time, it is easy that the users handle their issues regarding license usage among themselves, and there is no need for the administrator to be involved at all ;-).

 

7. URL

Piaciuto l'articolo? Condividilo sui social!

Share on facebook
Facebook
Share on twitter
Twitter
Share on linkedin
LinkedIn
Share on whatsapp
WhatsApp