#!/usr/bin/env python import glob import sys import time import os import shutil import re INTERIM_DIR = '/var/tmp/linux_metrics' if not os.path.exists(INTERIM_DIR): os.makedirs( INTERIM_DIR ) def check_openvpn_users ( warn=None, crit=None ): def get_instance_name ( path ): try: f2 = open(path,'r') for line in f2: if re.match(r'^; daemon', line): return str(path.split("/")[3] + "_" + line.split(" ")[5]) f2.close() finally: f2.close() status_code = 0 status_outp = '' perfdata = '' os.chdir("/var/volatile/tmp") users = 0 instances = [] openvpn_instances = [] sum_users=0 # get status for all openvpn instances. use glob to list all openvpn-status.*.log files from /tmp # append paths to openvpn_instances list for file in glob.glob("openvpn-status.*.log"): openvpn_instances.append(file) # open the status files, construct openvpn instance config filename and append all to intermediate dictionary dict_i for openvpn_instance in openvpn_instances: f = open(openvpn_instance, 'r') instance_config_name="/etc/openvpn/openvpn." + str(openvpn_instance).split('.')[1] + ".conf" dict_i = {"instance_name": get_instance_name(instance_config_name), "users": 0} # for every line in an instance status file, try to match "CLIENT_LIST" to get the number of openvpn users for line in f: if re.match(r'^CLIENT_LIST', line): dict_i["users"]+=1 instances.append(dict_i) # generate the performance data for instance in instances: perfdata += instance["instance_name"] + "=" + str(instance["users"]) + " " sum_users += instance["users"] perfdata += "total_vpn_users" + "=" + str(sum_users) status_outp = 'openvpn_users_total: ' + str(sum_users) + ' users' + " (OK)" print status_outp + ' | ' + perfdata if __name__ == '__main__': if len( sys.argv ) > 1: # cpu warn crit sample if sys.argv[1] == 'cpu': # no arg passed after cpu if len( sys.argv ) == 2: check_cpu() # 2 args passed after cpu; warn,crit elif len( sys.argv ) == 4: if float( sys.argv[3] ) > float( sys.argv[2] ): check_cpu( warn=sys.argv[2], crit=sys.argv[3] ) else: print ( 'Plugin Error: Warning('+sys.argv[2]+') threshold should be less than critical('+sys.argv[3]+')' ) sys.exit( 3 ) else: print ( 'Plugin Error: Invalide arguments for '+sys.argv[1]+': ('+str(sys.argv)+')' ) sys.exit( 3 ) # procs if sys.argv[1] == 'openvpn_users': check_openvpn_users() elif sys.argv[1] == 'procs': # no arg passed after procs if len( sys.argv ) == 2: check_procs() # if 2 args passed after procs elif len( sys.argv ) == 4: #process comma separated arguments warn_arr = sys.argv[2].split(',') crit_arr = sys.argv[3].split(',') if len(warn_arr) > 3 or len(warn_arr) < 1 or len(warn_arr) != len(crit_arr): print ( 'Plugin Error: Invalide arguments for load: ('+str(sys.argv)+')' ) sys.exit( 3 ) else: for i in range( len( warn_arr ) ): if warn_arr[i] != '' and crit_arr[i] != '': if float(warn_arr[i]) > float(crit_arr[i]): print ( 'Plugin Error: Warning('+warn_arr[i]+') threshold should be less than critical('+crit_arr[i]+')' ) sys.exit( 3 ) check_procs( warn=warn_arr, crit=crit_arr ) else: print ( 'Plugin Error: Invalide arguments for '+sys.argv[1]+': ('+str(sys.argv)+')' ) sys.exit( 3 ) # load elif sys.argv[1] == 'load': # no arg passed after load if len( sys.argv ) == 2: check_load() # if 2 args passed after load elif len( sys.argv ) == 4: #process comma separated arguments warn_arr = sys.argv[2].split(',') crit_arr = sys.argv[3].split(',') if len(warn_arr) > 3 or len(warn_arr) < 1 or len(warn_arr) != len(crit_arr): print ( 'Plugin Error: Invalide arguments for load: ('+str(sys.argv)+')' ) sys.exit( 3 ) else: for i in range( len( warn_arr ) ): if warn_arr[i] != '' and crit_arr[i] != '': if float(warn_arr[i]) > float(crit_arr[i]): print ( 'Plugin Error: Warning('+warn_arr[i]+') threshold should be less than critical('+crit_arr[i]+')' ) sys.exit( 3 ) check_load( warn=warn_arr, crit=crit_arr ) else: print ( 'Plugin Error: Invalide arguments for '+sys.argv[1]+': ('+str(sys.argv)+')' ) sys.exit( 3 ) # threads elif sys.argv[1] == 'threads': # no arg passed after procs if len( sys.argv ) == 2: check_threads() # if 2 args passed after procs elif len( sys.argv ) == 4: if float( sys.argv[3] ) > float( sys.argv[2] ): check_threads( warn=sys.argv[2], crit=sys.argv[3] ) else: print ( 'Plugin Error: Warning('+sys.argv[2]+') threshold should be less than critical('+sys.argv[3]+')' ) sys.exit( 3 ) else: print ( 'Plugin Error: Invalide arguments for '+sys.argv[1]+': ('+str(sys.argv)+')' ) sys.exit( 3 ) # Open files elif sys.argv[1] == 'files': # no arg passed after procs if len( sys.argv ) == 2: check_openfiles() # if 2 args passed after procs elif len( sys.argv ) == 4: if float( sys.argv[3] ) > float( sys.argv[2] ): check_openfiles( warn=sys.argv[2], crit=sys.argv[3] ) else: print ( 'Plugin Error: Warning('+sys.argv[2]+') threshold should be less than critical('+sys.argv[3]+')' ) sys.exit( 3 ) else: print ( 'Plugin Error: Invalide arguments for '+sys.argv[1]+': ('+str(sys.argv)+')' ) sys.exit( 3 ) # diskio dev warn(read,write) crit(read,write) elif sys.argv[1] == 'diskio': # no arg passed after diskio [dev] if len( sys.argv ) == 3: check_diskio( sys.argv[2] ) # if 2 args passed after diskio [dev] elif len( sys.argv ) == 5: #process comma separated arguments #we convert it to an array and pass it on warn_arr = sys.argv[3].split(',') crit_arr = sys.argv[4].split(',') if len(warn_arr) != 2 or len(warn_arr) != len(crit_arr): print ( 'Plugin Error: Invalide arguments for ' + sys.argv[1] + ': ('+str(sys.argv)+')' ) sys.exit( 3 ) else: for i in range( len( warn_arr ) ): if float(warn_arr[i]) > float(crit_arr[i]): print ( 'Plugin Error: Warning('+warn_arr[i]+') threshold should be less than critical('+crit_arr[i]+')' ) sys.exit( 3 ) check_diskio( sys.argv[2], warn=warn_arr, crit=crit_arr ) else: print ( 'Plugin Error: Invalide arguments for '+sys.argv[1]+': ('+str(sys.argv)+')' ) sys.exit( 3 ) # disku mount warn crit elif sys.argv[1] == 'disku': # no arg passed after disku mount if len( sys.argv ) == 3: check_disku( sys.argv[2] ) # if 2 args passed after disku mount elif len( sys.argv ) == 5: if float( sys.argv[4] ) > float ( sys.argv[3] ): check_disku( sys.argv[2] , warn=sys.argv[3], crit=sys.argv[4] ) else: print ( 'Plugin Error: Warning('+sys.argv[2]+') threshold should be less than critical('+sys.argv[3]+')' ) sys.exit( 3 ) else: print ( 'Plugin Error: Invalide arguments for '+sys.argv[1]+': ('+str(sys.argv)+')' ) sys.exit( 3 ) # memory warn crit elif sys.argv[1] == 'memory': # no arg passed after memory if len( sys.argv ) == 2: check_memory() # if 2 args passed after memory elif len( sys.argv ) == 4: if float( sys.argv[3] ) > float( sys.argv[2] ): check_memory( warn=sys.argv[2] , crit=sys.argv[3] ) else: print ( 'Plugin Error: Warning('+sys.argv[2]+') threshold should be less than critical('+sys.argv[3]+')' ) sys.exit( 3 ) else: print ( 'Plugin Error: Invalide arguments for '+sys.argv[1]+': ('+str(sys.argv)+')' ) sys.exit( 3 ) # swap warn crit elif sys.argv[1] == 'swap': # no arg passed after swap if len( sys.argv ) == 2: check_swap() # if 2 args passed after swap elif len( sys.argv ) == 4: if float( sys.argv[3] ) > float( sys.argv[2] ): check_swap( warn=sys.argv[2] , crit=sys.argv[3] ) else: print ( 'Plugin Error: Warning('+sys.argv[2]+') threshold should be less than critical('+sys.argv[3]+')' ) sys.exit( 3 ) else: print ( 'Plugin Error: Invalide arguments for '+sys.argv[1]+': ('+str(sys.argv)+')' ) sys.exit( 3 ) # network iface warn(rx,tx) crit(rx,tx) elif sys.argv[1] == 'network': # no arg passed after network iface if len( sys.argv ) == 3: check_net( sys.argv[2] ) # if 2 args passed after network iface elif len( sys.argv ) == 5: #process comma separated arguments #we convert it to an array and pass it on warn_arr = sys.argv[3].split(',') crit_arr = sys.argv[4].split(',') if len(warn_arr) != 2 or len(warn_arr) != len(crit_arr): print ( 'Plugin Error: Invalide arguments for ' + sys.argv[1] + ': ('+str(sys.argv)+')' ) sys.exit( 3 ) else: for i in range( len( warn_arr ) ): if float(warn_arr[i]) > float(crit_arr[i]): print ( 'Plugin Error: Warning('+warn_arr[i]+') threshold should be less than critical('+crit_arr[i]+')' ) sys.exit( 3 ) check_net( sys.argv[2], warn=warn_arr, crit=crit_arr ) else: print ( 'Plugin Error: Invalide arguments for '+sys.argv[1]+': ('+str(sys.argv)+')' ) sys.exit( 3 ) else: print ( 'What?' ) sys.exit( 3 ) def check_openvpn_users ( warn=None, crit=None ): status_code = 3 status_outp ='' perfdata = ''