Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

incorporate rewrite provided by TSUCHIYA Masatoshi <tsuchiya@namazu.org>

  • Loading branch information...
commit bde6d7b9cbcd7b13c8afd1f842f5d12c40ff44f9 1 parent 868fab5
@nassarmu nassarmu authored
Showing with 88 additions and 90 deletions.
  1. +88 −90 plugins/licensing/flexlm_
View
178 plugins/licensing/flexlm_
@@ -1,9 +1,9 @@
#!/usr/bin/perl
# -*- perl -*-
-#
+#
# Copyright 2009 by the Regents of the University of Minnesota
# Written by Munir Nassar <nassarmu@msi.umn.edu>
-#
+# Rewrite contribution by TSUCHIYA Masatoshi <tsuchiya@namazu.org>
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
@@ -19,131 +19,129 @@
#
# The Minnesota Supercomputing Institute http://www.msi.umn.edu sponsored
# the development of this software.
-#
+#
# Requirements:
# - lmstat
#
# Note:
# - You must provide the daemon name as it is listed in the flexlm license
# if you want it displayed differently use the LMDISPLAYNAME variable
-#
+#
# Parameters supported:
# - config
# - autoconf
-#
+#
# Configuration variables
-# - LMFEATURES: The individual features of each vendor daemon to graph
+# - LMFEATURES: The individual features of each vendor daemon to graph.
+# If no features are given, all features
+# reported by vendor daemon are treated to graph.
# - LMDISPLAYNAME: use the LMDISPLAYNAME instead of the daemon name when
-# generating graph names
-# - LMGRAPHISSUED: If set generate a graph of the number of licenses issued for
-# each feature.
-# - LMSTAT: The path to the lmstat binary
+# generating graph names
+# - LMGRAPHISSUED: If set generate a graph of the number of licenses issued for
+# each feature.
+# - LMSTAT: The path to the lmstat binary
# - LMLICFILE: The path to the FlexLM License File
# - LMLOGARITHMIC If set then graph use a logarithmic scale
#
# $Log$
# Revision 1.00 20090807 nassarmu
# Initial public release.
+#
+# Revision 1.10 20120625 nassarmu@msi.umn.edu
+# incorporate the rewrite by TSUCHIYA Masatoshi <tsuchiya@namazu.org>
#
# Magic markers:
#%# family=licensing
#%# capabilities=autoconf
+use Class::Struct;
+use English qw/ $PROGRAM_NAME /;
use strict;
use warnings;
-use Munin::Plugin;
-
# What daemon are we going to graph? if none specified exit.
-$0 =~ /flexlm_(.+)*$/;
-my $daemon = $1;
-exit 2 unless defined $daemon;
-
-# LMFEATURES should be provided by plugin-conf.d space delimited
-if ( ! $ENV{'LMFEATURES'} ) {
- print "You must provide a list of FlexLM features to monitor via the LMFEATURES variable.\n";
- exit 1
-}
+$PROGRAM_NAME =~ /flexlm_(.+)*$/;
+our $DAEMON = $1;
+exit 2 unless defined $DAEMON;
+our $munincommand;
# This section is for some optional values, the defaults may work for you
# if not then i recommend setting these option via plugin-conf.d
-# This would also allow you to theoretically support multiple flexlmds
+# This would also allow you to theoretically support multiple flexlmds
# via different license files.
-our $lmstat;
-our $lmlicfile;
-our $lmdisplayname;
-if ( $ENV{'LMSTAT'} ) {
- $lmstat = $ENV{'LMSTAT'};
-} else {
- $lmstat = "/opt/local/flexlm/bin/lmstat";
-}
-if ( $ENV{'LMLICFILE'} ) {
- $lmlicfile = $ENV{'LMLICFILE'};
-} else {
- $lmlicfile = "/opt/local/flexlm/license/license.dat";
-}
-if ( $ENV{'LMDISPLAYNAME'} ) {
- $lmdisplayname = $ENV{'LMDISPLAYNAME'};
-} else {
- $lmdisplayname = $daemon;
-}
+our $LMSTAT = $ENV{'LMSTAT'} || '/opt/local/flexlm/bin/lmstat';
+our $LMLICFILE = $ENV{'LMLICFILE'} || '/opt/local/flexlm/license/license.dat';;
-# Parse LMFEATURES
-my @features = split(/\s+/, $ENV{'LMFEATURES'});
-
-# try and recommend autoconf (this will most likely result in a yes)
-if ( $ARGV[0] and $ARGV[0] eq "autoconf" ) {
- if ( scalar @features >= 1 ) {
- print "yes\n";
- exit 0;
- }
- else {
- print "no\n";
- exit 1;
- }
-}
+&struct( feature => { name => '$', cleanname => '$', max => '$', used => '$' } );
-# print out a config screen when asked.
-if ( $ARGV[0] and $ARGV[0] eq "config" ) {
- print "graph_title FlexLM License usage for $lmdisplayname\n";
- if ( $ENV{'LMLOGARITHMIC'} ) {
- print "graph_args --base 1000 --vertical-label licenses --lower-limit 0.01 --logarithmic\n";
+sub lmstat {
+ my @feature;
+ open( my $ph, sprintf('%s -c %s -S %s|', $LMSTAT, $LMLICFILE, $DAEMON) ) or exit 2;
+ while( <$ph> ){
+ if( my( $name ) = m/\AUsers of ([^:]+):/ ){
+ my $x = feature->new( name => $name, max => 0, used => 0 );
+ $name =~ s/^[^A-Za-z_]+/_/;
+ $name =~ s/[^A-Za-z0-9_]/_/g;
+ $x->cleanname( $name );
+ m/Total of (\d+) licenses? issued/ and $x->max( $1 );
+ m/Total of (\d+) licenses? in use/ and $x->used( $1 );
+ push( @feature, $x );
}
- else {
- print "graph_args --base 1000 --vertical-label licenses -l 0\n";
+ elsif( m/\A\s+(\d+) RESERVATIONs? for / ){
+ $feature[-1]->used( $feature[-1]->used - $1 );
}
- print "graph_category licensing\n";
- print "graph_period minute\n";
- foreach my $feature (@features) {
- my $clean_feature = clean_fieldname($feature);
- print "$clean_feature".".label $feature\n";
- print "$clean_feature".".draw LINE2\n";
- print "$clean_feature".".info The number of $feature licenses checked out\n";
- if ( $ENV{'LMGRAPHISSUED'} ) {
- print "$clean_feature"."max.label $feature max\n";
- print "$clean_feature"."max.draw LINE3\n";
- print "$clean_feature"."max.info The total number of $feature licenses available\n";
- }
+ }
+ if( $ENV{'LMFEATURES'} ){
+ my %table;
+ for( split( /\s+/, $ENV{'LMFEATURES'} ) ){
+ $table{$_}++;
}
- exit 0
+ grep( $table{$_->name}, @feature );
+ } else {
+ @feature;
+ }
}
-my @results = `$lmstat -c $lmlicfile -S $daemon`;
+if ( $ARGV[0] ) {
+ $munincommand = $ARGV[0];
+}
+else {
+ $munincommand = 'none';
+}
-# pull the info from lmstat and print the results
-foreach my $feature (@features) {
- my @results = grep(/Users of $feature/, @results);
-
- foreach my $result (@results) {
- if ($result =~ m/Users of $feature\:/ ) {
- chomp ($result);
- my (@fields) = split( m/\s+/, $result);
-
- my $clean_feature = clean_fieldname($feature);
- print "$clean_feature".".value $fields[10]\n";
- if ( $ENV{'LMGRAPHISSUED'} ) {
- print "$clean_feature"."max.value $fields[5]\n";
- }
- }
+if( $munincommand eq 'autoconf' ){
+ if( &lmstat > 0 ){
+ print "yes\n";
+ } else {
+ print "no\n";
+ }
+}
+elsif( $munincommand eq 'config' ){
+ printf "graph_title FlexLM License usage for %s\n", $ENV{'LMDISPLAYNAME'} || $DAEMON;
+ if( $ENV{'LMLOGARITHMIC'} ){
+ print "graph_args --base 1000 --vertical-label licenses --lower-limit 0.01 --logarithmic\n";
+ } else {
+ print "graph_args --base 1000 --vertical-label licenses -l 0\n";
+ }
+ print "graph_category licensing\n";
+ print "graph_period minute\n";
+ for my $x ( &lmstat ){
+ printf "%s.label %s\n", $x->cleanname, $x->name;
+ printf "%s.draw LINE2\n", $x->cleanname;
+ printf "%s.info The number of %s licenses checked out\n", $x->cleanname, $x->name;
+ if( $ENV{'LMGRAPHISSUED'} ){
+ printf "%smax.label %s max\n", $x->cleanname, $x->name;
+ printf "%smax.draw LINE3\n", $x->cleanname;
+ printf "%smax.info The total number of %s licenses available\n", $x->cleanname, $x->name;
+ }
+ }
+}
+else {
+ for my $x ( &lmstat ){
+ printf "%s.value %d\n", $x->cleanname, $x->used;
+ if( $ENV{'LMGRAPHISSUED'} ){
+ printf "%smax.value %d\n", $x->cleanname, $x->max;
}
+ }
}
+exit 0;
Please sign in to comment.
Something went wrong with that request. Please try again.