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 utils qw(%ERRORS &print_revision &support &usage);
42 $PROGNAME="check_flexlm";
47 $ENV{'PATH'}='@TRUSTED_PATH@';
51 Getopt::Long::Configure('bundling');
53 ("V" => \$opt_V, "version" => \$opt_V,
54 "h" => \$opt_h, "help" => \$opt_h,
55 "v" => \$verbose, "verbose" => \$verbose,
56 "F=s" => \$opt_F, "filename=s" => \$opt_F,
57 "t=i" => \$opt_t, "timeout=i" => \$opt_t);
60 print_revision($PROGNAME,'@NP_VERSION@');
61 exit $ERRORS{'UNKNOWN'};
64 unless (defined $opt_t) {
65 $opt_t = $utils::TIMEOUT ; # default timeout
69 if ($opt_h) {print_help(); exit $ERRORS{'UNKNOWN'};}
71 unless (defined $opt_F) {
72 print "Missing license.dat file\n";
74 exit $ERRORS{'UNKNOWN'};
76 # Just in case of problems, let's not hang the monitoring system
78 print "Timeout: No Answer from Client\n";
79 exit $ERRORS{'UNKNOWN'};
83 my $lmstat = $utils::PATH_TO_LMSTAT ;
84 unless (-x $lmstat ) {
85 print "Cannot find \"lmstat\"\n";
86 exit $ERRORS{'UNKNOWN'};
89 ($opt_F) || ($opt_F = shift) || usage("License file not specified\n");
90 my $licfile = $1 if ($opt_F =~ /^(.*)$/);
91 ($licfile) || usage("Invalid filename: $opt_F\n");
93 print "$licfile\n" if $verbose;
95 if ( ! open(CMD,"$lmstat -c $licfile |") ) {
96 print "ERROR: Could not open \"$lmstat -c $licfile\" ($!)\n";
97 exit exit $ERRORS{'UNKNOWN'};
102 my @downsrv; # list of servers up and down
104 #my ($ls1,$ls2,$ls3,$lf1,$lf2,$lf3,$servers);
106 # key off of the term "license server" and
107 # grab the status. Keep going until "Vendor" is found
111 # Collect list of license servers by their status
112 # Vendor daemon status is ignored for the moment.
115 next if (/^lmstat/); # ignore 1st line - copyright
116 next if (/^Flexible/); # ignore 2nd line - timestamp
117 (/^Vendor/) && last; # ignore Vendor daemon status
118 print $_ if $verbose;
120 if ($_ =~ /license server /) { # matched 1 (of possibly 3) license server
121 s/^\s*//; #some servers start at col 1, other have whitespace
122 # strip staring whitespace if any
126 print "up:$1:\n" if $verbose;
130 print "down:$1:\n" if $verbose;
136 # if ( /^License server status: [0-9]*@([-0-9a-zA-Z_]*),[0-9]*@([-0-9a-zA-Z_]*),[0-9]*@([-0-9a-zA-Z_]*)/ ) {
140 # $lf1 = $lf2 = $lf3 = 0;
142 # } elsif ( /^License server status: [0-9]*@([-0-9a-zA-Z_]*)/ ) {
145 # $lf1 = $lf2 = $lf3 = 0;
147 # } elsif ( / *$ls1: license server UP/ ) {
150 # } elsif ( / *$ls2: license server UP/ ) {
153 # } elsif ( / *$ls3: license server UP/ ) {
156 # } elsif ( / *([^:]*: UP .*)/ ) {
157 # print " license server for $1\n";
163 #if ( $serverup == 0 ) {
164 # print " license server not running\n";
171 print "License Servers running: ".scalar(@upsrv) ."\n";
172 foreach my $upserver (@upsrv) {
175 print "License servers not running: ".scalar(@downsrv)."\n";
176 foreach my $downserver (@downsrv) {
177 print "$downserver\n";
182 # print list of servers which are up.
184 if (scalar(@upsrv) > 0) {
185 print "License Servers running:";
186 foreach my $upserver (@upsrv) {
191 # Ditto for those which are down.
193 if (scalar(@downsrv) > 0) {
194 print "License servers NOT running:";
195 foreach my $downserver (@downsrv) {
196 print "$downserver,";
201 print "\n|flexlm::up:".scalar(@upsrv).";down:".scalar(@downsrv)."\n";
203 exit $ERRORS{'OK'} if ( scalar(@downsrv) == 0 );
204 exit $ERRORS{'WARNING'} if ( (scalar(@upsrv) > 0) && (scalar(@downsrv) > 0));
206 #exit $ERRORS{'OK'} if ( $servers == $lf1 + $lf2 + $lf3 );
207 #exit $ERRORS{'WARNING'} if ( $servers == 3 && $lf1 + $lf2 + $lf3 == 2 );
208 exit $ERRORS{'CRITICAL'};
213 $PROGNAME -F <filename> [-v] [-t] [-V] [-h]
220 print_revision($PROGNAME,'@NP_VERSION@');
221 print "Copyright (c) 2000 Ernst-Dieter Martin/Karl DeBisschop
223 Check available flexlm license managers
229 Name of license file (usually \"license.dat\")
231 Print some extra debugging information (not advised for normal operation)
233 Plugin time out in seconds (default = $utils::TIMEOUT )
235 Show version and license information
237 Show this help screen
239 Flexlm license managers usually run as a single server or three servers and a
240 quorum is needed. The plugin return OK if 1 (single) or 3 (triple) servers
241 are running, CRITICAL if 1(single) or 3 (triple) servers are down, and WARNING
242 if 1 or 2 of 3 servers are running\n