#!/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 = ''


