4 # check_flexlm.pl license_file
6 # Check available flexlm license managers.
7 # Use lmstat to check the status of the license server
8 # described by the license file given as argument.
9 # Check and interpret the output of lmstat
10 # and create returncodes and output.
12 # Contrary to most other plugins, this script takes
13 # a file, not a hostname as an argument and returns
14 # the status of hosts and services described in that
15 # file. Use these hosts.cfg entries as an example
17 #host[anchor]=any host will do;some.address.com;;check-host-alive;3;120;24x7;1;1;1;
18 #service[anchor]=yodel;24x7;3;5;5;unix-admin;60;24x7;1;1;1;;check_flexlm!/opt/lic/licfiles/yodel_lic
19 #service[anchor]=yeehaw;24x7;3;5;5;unix-admin;60;24x7;1;1;1;;check_flexlm!/opt/lic/licfiles/yeehaw_lic
20 #command[check_flexlm]=/some/path/libexec/check_flexlm.pl $ARG1$
23 # - you need the lmstat utility which comes with flexlm.
24 # - set the correct path in the variable $lmstat.
26 # initial version: 9-10-99 Ernst-Dieter Martin edmt@infineon.com
30 # lmstat output patches from Steve Rigler/Cliff Rice 13-Apr-2002
31 # srigler@marathonoil.com,cerice@marathonoil.com
37 use vars
qw($opt_V $opt_h $opt_F $opt_t $verbose $PROGNAME);
39 use lib "$FindBin::Bin";
40 use lib '@libexecdir@';
41 use utils qw(%ERRORS &print_revision &support &usage);
43 $PROGNAME="check_flexlm";
48 $ENV{'PATH'}='@TRUSTED_PATH@';
52 Getopt::Long::Configure('bundling');
54 ("V" => \$opt_V, "version" => \$opt_V,
55 "h" => \$opt_h, "help" => \$opt_h,
56 "v" => \$verbose, "verbose" => \$verbose,
57 "F=s" => \$opt_F, "filename=s" => \$opt_F,
58 "t=i" => \$opt_t, "timeout=i" => \$opt_t);
61 print_revision($PROGNAME,'@NP_VERSION@');
65 unless (defined $opt_t) {
66 $opt_t = $utils::TIMEOUT ; # default timeout
70 if ($opt_h) {print_help(); exit $ERRORS{'OK'};}
72 unless (defined $opt_F) {
73 print "Missing license.dat file\n";
75 exit $ERRORS{'UNKNOWN'};
77 # Just in case of problems, let's not hang the monitoring system
79 print "Timeout: No Answer from Client\n";
80 exit $ERRORS{'UNKNOWN'};
84 my $lmstat = $utils::PATH_TO_LMSTAT ;
85 unless (-x $lmstat ) {
86 print "Cannot find \"lmstat\"\n";
87 exit $ERRORS{'UNKNOWN'};
90 ($opt_F) || ($opt_F = shift) || usage("License file not specified\n");
91 my $licfile = $1 if ($opt_F =~ /^(.*)$/);
92 ($licfile) || usage("Invalid filename: $opt_F\n");
94 print "$licfile\n" if $verbose;
96 if ( ! open(CMD,"$lmstat -c $licfile |") ) {
97 print "ERROR: Could not open \"$lmstat -c $licfile\" ($!)\n";
98 exit exit $ERRORS{'UNKNOWN'};
103 my @downsrv; # list of servers up and down
105 #my ($ls1,$ls2,$ls3,$lf1,$lf2,$lf3,$servers);
107 # key off of the term "license server" and
108 # grab the status. Keep going until "Vendor" is found
112 # Collect list of license servers by their status
113 # Vendor daemon status is ignored for the moment.
116 next if (/^lmstat/); # ignore 1st line - copyright
117 next if (/^Flexible/); # ignore 2nd line - timestamp
118 (/^Vendor/) && last; # ignore Vendor daemon status
119 print $_ if $verbose;
121 if ($_ =~ /license server /) { # matched 1 (of possibly 3) license server
122 s/^\s*//; #some servers start at col 1, other have whitespace
123 # strip staring whitespace if any
127 print "up:$1:\n" if $verbose;
131 print "down:$1:\n" if $verbose;
137 # if ( /^License server status: [0-9]*@([-0-9a-zA-Z_]*),[0-9]*@([-0-9a-zA-Z_]*),[0-9]*@([-0-9a-zA-Z_]*)/ ) {
141 # $lf1 = $lf2 = $lf3 = 0;
143 # } elsif ( /^License server status: [0-9]*@([-0-9a-zA-Z_]*)/ ) {
146 # $lf1 = $lf2 = $lf3 = 0;
148 # } elsif ( / *$ls1: license server UP/ ) {
151 # } elsif ( / *$ls2: license server UP/ ) {
154 # } elsif ( / *$ls3: license server UP/ ) {
157 # } elsif ( / *([^:]*: UP .*)/ ) {
158 # print " license server for $1\n";
164 #if ( $serverup == 0 ) {
165 # print " license server not running\n";
172 print "License Servers running: ".scalar(@upsrv) ."\n";
173 foreach my $upserver (@upsrv) {
176 print "License servers not running: ".scalar(@downsrv)."\n";
177 foreach my $downserver (@downsrv) {
178 print "$downserver\n";
183 # print list of servers which are up.
185 if (scalar(@upsrv) > 0) {
186 print "License Servers running:";
187 foreach my $upserver (@upsrv) {
192 # Ditto for those which are down.
194 if (scalar(@downsrv) > 0) {
195 print "License servers NOT running:";
196 foreach my $downserver (@downsrv) {
197 print "$downserver,";
202 print "\n|flexlm::up:".scalar(@upsrv).";down:".scalar(@downsrv)."\n";
204 exit $ERRORS{'OK'} if ( scalar(@downsrv) == 0 );
205 exit $ERRORS{'WARNING'} if ( (scalar(@upsrv) > 0) && (scalar(@downsrv) > 0));
207 #exit $ERRORS{'OK'} if ( $servers == $lf1 + $lf2 + $lf3 );
208 #exit $ERRORS{'WARNING'} if ( $servers == 3 && $lf1 + $lf2 + $lf3 == 2 );
209 exit $ERRORS{'CRITICAL'};
214 $PROGNAME -F <filename> [-v] [-t] [-V] [-h]
221 print_revision($PROGNAME,'@NP_VERSION@');
222 print "Copyright (c) 2000 Ernst-Dieter Martin/Karl DeBisschop
224 Check available flexlm license managers
230 Name of license file (usually \"license.dat\")
232 Print some extra debugging information (not advised for normal operation)
234 Plugin time out in seconds (default = $utils::TIMEOUT )
236 Show version and license information
238 Show this help screen
240 Flexlm license managers usually run as a single server or three servers and a
241 quorum is needed. The plugin return OK if 1 (single) or 3 (triple) servers
242 are running, CRITICAL if 1(single) or 3 (triple) servers are down, and WARNING
243 if 1 or 2 of 3 servers are running\n