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 the nagios concept, 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 utils qw(%ERRORS &print_revision &support &usage);
41 $PROGNAME="check_flexlm";
50 Getopt::Long::Configure('bundling');
52 ("V" => \$opt_V, "version" => \$opt_V,
53 "h" => \$opt_h, "help" => \$opt_h,
54 "v" => \$verbose, "verbose" => \$verbose,
55 "F=s" => \$opt_F, "filename=s" => \$opt_F,
56 "t=i" => \$opt_t, "timeout=i" => \$opt_t);
59 print_revision($PROGNAME,'@NP_VERSION@');
63 unless (defined $opt_t) {
64 $opt_t = $utils::TIMEOUT ; # default timeout
68 if ($opt_h) {print_help(); exit $ERRORS{'OK'};}
70 unless (defined $opt_F) {
71 print "Missing license.dat file\n";
73 exit $ERRORS{'UNKNOWN'};
75 # Just in case of problems, let's not hang Nagios
77 print "Timeout: No Answer from Client\n";
78 exit $ERRORS{'UNKNOWN'};
82 my $lmstat = $utils::PATH_TO_LMSTAT ;
83 unless (-x $lmstat ) {
84 print "Cannot find \"lmstat\"\n";
85 exit $ERRORS{'UNKNOWN'};
88 ($opt_F) || ($opt_F = shift) || usage("License file not specified\n");
89 my $licfile = $1 if ($opt_F =~ /^(.*)$/);
90 ($licfile) || usage("Invalid filename: $opt_F\n");
92 print "$licfile\n" if $verbose;
94 if ( ! open(CMD,"$lmstat -c $licfile |") ) {
95 print "ERROR: Could not open \"$lmstat -c $licfile\" ($!)\n";
96 exit exit $ERRORS{'UNKNOWN'};
101 my @downsrv; # list of servers up and down
103 #my ($ls1,$ls2,$ls3,$lf1,$lf2,$lf3,$servers);
105 # key off of the term "license server" and
106 # grab the status. Keep going until "Vendor" is found
110 # Collect list of license servers by their status
111 # Vendor daemon status is ignored for the moment.
114 next if (/^lmstat/); # ignore 1st line - copyright
115 next if (/^Flexible/); # ignore 2nd line - timestamp
116 (/^Vendor/) && last; # ignore Vendor daemon status
117 print $_ if $verbose;
119 if ($_ =~ /license server /) { # matched 1 (of possibly 3) license server
120 s/^\s*//; #some servers start at col 1, other have whitespace
121 # strip staring whitespace if any
125 print "up:$1:\n" if $verbose;
129 print "down:$1:\n" if $verbose;
135 # if ( /^License server status: [0-9]*@([-0-9a-zA-Z_]*),[0-9]*@([-0-9a-zA-Z_]*),[0-9]*@([-0-9a-zA-Z_]*)/ ) {
139 # $lf1 = $lf2 = $lf3 = 0;
141 # } elsif ( /^License server status: [0-9]*@([-0-9a-zA-Z_]*)/ ) {
144 # $lf1 = $lf2 = $lf3 = 0;
146 # } elsif ( / *$ls1: license server UP/ ) {
149 # } elsif ( / *$ls2: license server UP/ ) {
152 # } elsif ( / *$ls3: license server UP/ ) {
155 # } elsif ( / *([^:]*: UP .*)/ ) {
156 # print " license server for $1\n";
162 #if ( $serverup == 0 ) {
163 # print " license server not running\n";
170 print "License Servers running: ".scalar(@upsrv) ."\n";
171 foreach my $upserver (@upsrv) {
174 print "License servers not running: ".scalar(@downsrv)."\n";
175 foreach my $downserver (@downsrv) {
176 print "$downserver\n";
181 # print list of servers which are up.
183 if (scalar(@upsrv) > 0) {
184 print "License Servers running:";
185 foreach my $upserver (@upsrv) {
190 # Ditto for those which are down.
192 if (scalar(@downsrv) > 0) {
193 print "License servers NOT running:";
194 foreach my $downserver (@downsrv) {
195 print "$downserver,";
200 print "\n|flexlm::up:".scalar(@upsrv).";down:".scalar(@downsrv)."\n";
202 exit $ERRORS{'OK'} if ( scalar(@downsrv) == 0 );
203 exit $ERRORS{'WARNING'} if ( (scalar(@upsrv) > 0) && (scalar(@downsrv) > 0));
205 #exit $ERRORS{'OK'} if ( $servers == $lf1 + $lf2 + $lf3 );
206 #exit $ERRORS{'WARNING'} if ( $servers == 3 && $lf1 + $lf2 + $lf3 == 2 );
207 exit $ERRORS{'CRITICAL'};
212 $PROGNAME -F <filename> [-v] [-t] [-V] [-h]
219 print_revision($PROGNAME,'@NP_VERSION@');
220 print "Copyright (c) 2000 Ernst-Dieter Martin/Karl DeBisschop
222 Check available flexlm license managers
228 Name of license file (usually \"license.dat\")
230 Print some extra debugging information (not advised for normal operation)
232 Plugin time out in seconds (default = $utils::TIMEOUT )
234 Show version and license information
236 Show this help screen
238 Flexlm license managers usually run as a single server or three servers and a
239 quorum is needed. The plugin return OK if 1 (single) or 3 (triple) servers
240 are running, CRITICAL if 1(single) or 3 (triple) servers are down, and WARNING
241 if 1 or 2 of 3 servers are running\n