added debug decorator function and type hints
This commit is contained in:
		
							parent
							
								
									577b459e9c
								
							
						
					
					
						commit
						13258ae201
					
				| @ -9,8 +9,11 @@ import os | |||||||
| from pprint import pprint | from pprint import pprint | ||||||
| from requests.structures import CaseInsensitiveDict | from requests.structures import CaseInsensitiveDict | ||||||
| from requests.auth import HTTPBasicAuth | from requests.auth import HTTPBasicAuth | ||||||
|  | from time import ( | ||||||
|  |     time, localtime, strftime, | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| def showUsage(): | def showUsage() -> None: | ||||||
|     sys.stderr.write("""CheckMK Mailcow Special Agent |     sys.stderr.write("""CheckMK Mailcow Special Agent | ||||||
| 
 | 
 | ||||||
| USAGE: agent_nextcloud -H [hostname] -k [apikey] | USAGE: agent_nextcloud -H [hostname] -k [apikey] | ||||||
| @ -47,8 +50,73 @@ long_options = [ | |||||||
| domain_data = {} | domain_data = {} | ||||||
| mailbox_data = {} | mailbox_data = {} | ||||||
| 
 | 
 | ||||||
|  | debugLogFilename = "" | ||||||
|  | SEP = "|" | ||||||
|  | #SEP = "\t" | ||||||
|  | TIMEFMT = "%Y-%m-%d %H:%M:%S" | ||||||
|  | FLOATFMT = "{:.4f}" | ||||||
| 
 | 
 | ||||||
| def getOptions(): | ''' | ||||||
|  | Decorator function for debugging purposes | ||||||
|  |     creates a file with many information regarding the function call, like: | ||||||
|  |         timestamp | ||||||
|  |         name of function | ||||||
|  |         runtime | ||||||
|  |         number of arguments | ||||||
|  |         number of keyword arguments | ||||||
|  |         return value of function call | ||||||
|  |         type of return value | ||||||
|  |         all parameters given to function | ||||||
|  | ''' | ||||||
|  | def debugLog(function): | ||||||
|  |     def wrapper(*args, **kwargs): | ||||||
|  |         # execute function and measure runtime | ||||||
|  |         start = time() | ||||||
|  |         value = function(*args, **kwargs) | ||||||
|  |         end = time() | ||||||
|  |         # get number of args and kwargs | ||||||
|  |         len_args = len(args) | ||||||
|  |         len_kwargs = len(kwargs) | ||||||
|  |         # format the output | ||||||
|  |         seconds = FLOATFMT.format(end - start) | ||||||
|  |         local_time = strftime(TIMEFMT,localtime(start)) | ||||||
|  |         # get function name | ||||||
|  |         fname = function.__name__ | ||||||
|  |         # create output | ||||||
|  |         # out1: Timestamp|Name of Function|Runtime|Num Args|Num Kwargs|Return Value|Return Value Type | ||||||
|  |         out1 = f"{local_time}{SEP}{fname}{SEP}{seconds}{SEP}{len_args}{SEP}{len_kwargs}{SEP}{value}{SEP}{type(value)}" | ||||||
|  |         # out2: all arguments | ||||||
|  |         out2 = "" | ||||||
|  |         for arg in args: | ||||||
|  |             out2 = out2 + SEP + str(arg) | ||||||
|  |         # out 3: all keyword arguments | ||||||
|  |         out3 = "" | ||||||
|  |         if len_kwargs > 0: | ||||||
|  |             for key, val in kwargs.items(): | ||||||
|  |                 out3 = out3 + SEP + key + ":" + str(val) | ||||||
|  |         # write output to file | ||||||
|  |         if debugLogFilename != "": | ||||||
|  |             try: | ||||||
|  |                 with open(debugLogFilename, "a+") as f: | ||||||
|  |                     f.write(f"{out1}{out2}{out3}\n") | ||||||
|  |             except: | ||||||
|  |                 sys.stderr.write(f"Something went wrong when writing to file {debugLogFilename}\n") | ||||||
|  |                 sys.exit(1) | ||||||
|  |         else: | ||||||
|  |             sys.stderr.write(f"Debug activated, but no debug filename given.\n") | ||||||
|  |             sys.exit(1) | ||||||
|  |         return value | ||||||
|  |     return wrapper | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def getDebugFilename(hostname: str) -> str: | ||||||
|  |     home_path = os.getenv("HOME") | ||||||
|  |     tmp_path = f"{home_path}/tmp" | ||||||
|  |     file_name = f"{tmp_path}/mailcow_{hostname}_debug.log" | ||||||
|  |     return file_name | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def getOptions() -> None: | ||||||
|     global opt_hostname |     global opt_hostname | ||||||
|     global opt_apikey |     global opt_apikey | ||||||
|     global opt_port |     global opt_port | ||||||
| @ -84,7 +152,8 @@ def getOptions(): | |||||||
|             file.write(f"Number of Arguments: {len(sys.argv)}, Argument List: {str(sys.argv)}\n") |             file.write(f"Number of Arguments: {len(sys.argv)}, Argument List: {str(sys.argv)}\n") | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def showOptions(): | #@debugLog | ||||||
|  | def showOptions() -> None: | ||||||
|     print(f"Hostname: {opt_hostname}") |     print(f"Hostname: {opt_hostname}") | ||||||
|     print(f"Username: {opt_apikey}") |     print(f"Username: {opt_apikey}") | ||||||
|     print(f"Port: {opt_port}") |     print(f"Port: {opt_port}") | ||||||
| @ -96,8 +165,8 @@ def showOptions(): | |||||||
|     with open(help_file, "a") as file: |     with open(help_file, "a") as file: | ||||||
|         file.write(f"Hostname: {opt_hostname}, Port: {opt_port}, No HTTPS: {opt_no_https}, No Cert Check: {opt_no_cert_check}\n") |         file.write(f"Hostname: {opt_hostname}, Port: {opt_port}, No HTTPS: {opt_no_https}, No Cert Check: {opt_no_cert_check}\n") | ||||||
| 
 | 
 | ||||||
| 
 | #@debugLog | ||||||
| def getDomainInfo(headers, verify, base_url): | def getDomainInfo(headers: str, verify: bool, base_url: str) -> int: | ||||||
|     url = f"{base_url}/domain/all" |     url = f"{base_url}/domain/all" | ||||||
|     response = requests.get(url, headers=headers, verify=verify) |     response = requests.get(url, headers=headers, verify=verify) | ||||||
|     if (response.status_code == 200): |     if (response.status_code == 200): | ||||||
| @ -146,8 +215,8 @@ def getDomainInfo(headers, verify, base_url): | |||||||
|         sys.stderr.write(f"Request response code is {response.status_code} with URL {url}\n") |         sys.stderr.write(f"Request response code is {response.status_code} with URL {url}\n") | ||||||
|         sys.exit(1) |         sys.exit(1) | ||||||
| 
 | 
 | ||||||
| 
 | #@debugLog | ||||||
| def getMailboxInfo(headers, verify, base_url): | def getMailboxInfo(headers: str, verify: bool, base_url: str) -> tuple: | ||||||
|     url = f"{base_url}/mailbox/all" |     url = f"{base_url}/mailbox/all" | ||||||
|     response = requests.get(url, headers=headers, verify=verify) |     response = requests.get(url, headers=headers, verify=verify) | ||||||
|     if (response.status_code == 200): |     if (response.status_code == 200): | ||||||
| @ -202,8 +271,8 @@ def getMailboxInfo(headers, verify, base_url): | |||||||
|         sys.stderr.write(f"Request response code is {response.status_code} with URL {url}\n") |         sys.stderr.write(f"Request response code is {response.status_code} with URL {url}\n") | ||||||
|         sys.exit(1) |         sys.exit(1) | ||||||
| 
 | 
 | ||||||
| 
 | #@debugLog | ||||||
| def getMailcowInfo(headers, verify, base_url): | def getMailcowInfo(headers: str, verify: bool, base_url: str) -> str: | ||||||
|     url = f"{base_url}/status/version" |     url = f"{base_url}/status/version" | ||||||
|     response = requests.get(url, headers=headers, verify=verify) |     response = requests.get(url, headers=headers, verify=verify) | ||||||
|     if (response.status_code == 200): |     if (response.status_code == 200): | ||||||
| @ -217,7 +286,8 @@ def getMailcowInfo(headers, verify, base_url): | |||||||
|         sys.stderr.write(f"Request response code is {response.status_code} with URL {url}\n") |         sys.stderr.write(f"Request response code is {response.status_code} with URL {url}\n") | ||||||
|         sys.exit(1) |         sys.exit(1) | ||||||
| 
 | 
 | ||||||
| def getSolrInfo(headers, verify, base_url): | #@debugLog | ||||||
|  | def getSolrInfo(headers: str, verify: bool, base_url: str) -> tuple: | ||||||
|     url = f"{base_url}/status/solr" |     url = f"{base_url}/status/solr" | ||||||
|     response = requests.get(url, headers=headers, verify=verify) |     response = requests.get(url, headers=headers, verify=verify) | ||||||
|     if (response.status_code == 200): |     if (response.status_code == 200): | ||||||
| @ -255,7 +325,8 @@ user2@dom1.de;1;2022-04-29 14:38:33;2022-04-29 14:38:33;Tom;271;0;21474836480;25 | |||||||
| user1@dom2.de;1;2022-04-30 09:55:37;2022-04-30 09:55:37;Melissa;53460;33;19964887040;6677677548;1692520066;0;1692510822 | user1@dom2.de;1;2022-04-30 09:55:37;2022-04-30 09:55:37;Melissa;53460;33;19964887040;6677677548;1692520066;0;1692510822 | ||||||
| ''' | ''' | ||||||
| 
 | 
 | ||||||
| def doCmkOutputMailboxes(): | #@debugLog | ||||||
|  | def doCmkOutputMailboxes() -> None: | ||||||
|     print("<<<mailcow_mailboxes:sep(59)>>>") |     print("<<<mailcow_mailboxes:sep(59)>>>") | ||||||
|     for mb in mailbox_data: |     for mb in mailbox_data: | ||||||
|         active = mailbox_data[mb]["active"] |         active = mailbox_data[mb]["active"] | ||||||
| @ -273,8 +344,8 @@ def doCmkOutputMailboxes(): | |||||||
|         last_smtp_login = mailbox_data[mb]["last_smtp_login"] |         last_smtp_login = mailbox_data[mb]["last_smtp_login"] | ||||||
|         print(f"{mb};{active};{created};{modified};{name};{num_messages};{percent_in_use};{quota};{quota_used};{last_imap_login};{last_pop3_login};{last_smtp_login}") |         print(f"{mb};{active};{created};{modified};{name};{num_messages};{percent_in_use};{quota};{quota_used};{last_imap_login};{last_pop3_login};{last_smtp_login}") | ||||||
| 
 | 
 | ||||||
| 
 | #@debugLog | ||||||
| def doCmkOutputMailcow(version, num_domains, num_mailboxes, num_global_messages, solr_enabled, solr_size, solr_documents): | def doCmkOutputMailcow(version: str, num_domains: int, num_mailboxes: int, num_global_messages: int, solr_enabled: bool, solr_size: float, solr_documents: int) -> None: | ||||||
|     print("<<<mailcow_info:sep(59)>>>") |     print("<<<mailcow_info:sep(59)>>>") | ||||||
|     # strip semicolons, if present, since we use it as delimiter |     # strip semicolons, if present, since we use it as delimiter | ||||||
|     version = version.replace(";", "") |     version = version.replace(";", "") | ||||||
| @ -301,7 +372,8 @@ dom2.de;1;2022-04-29 13:38:42;2023-08-19 17:21:04;10;0;400;2;0;0;10737418240 | |||||||
| dom3.de;1;2022-04-29 13:36:08;2022-04-29 21:26:19;10;1;100;3;28132;12852485367;21474836480 | dom3.de;1;2022-04-29 13:36:08;2022-04-29 21:26:19;10;1;100;3;28132;12852485367;21474836480 | ||||||
| ''' | ''' | ||||||
| 
 | 
 | ||||||
| def doCmkOutputDomains(): | #@debugLog | ||||||
|  | def doCmkOutputDomains() -> None: | ||||||
|     print("<<<mailcow_domains:sep(59)>>>") |     print("<<<mailcow_domains:sep(59)>>>") | ||||||
|     for dom in domain_data: |     for dom in domain_data: | ||||||
|         active = domain_data[dom]["active"] |         active = domain_data[dom]["active"] | ||||||
| @ -318,6 +390,7 @@ def doCmkOutputDomains(): | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def main(): | def main(): | ||||||
|  |     global debugLogFilename | ||||||
|     getOptions() |     getOptions() | ||||||
|     # do some parameter checks |     # do some parameter checks | ||||||
|     if (opt_hostname == ""): |     if (opt_hostname == ""): | ||||||
| @ -363,6 +436,7 @@ def main(): | |||||||
|     # now "port" contains the port number to use |     # now "port" contains the port number to use | ||||||
|     # now "verify" signals whether certificate checking will be done (True) or not (False) |     # now "verify" signals whether certificate checking will be done (True) or not (False) | ||||||
|     # now "headers" contains the accepted format (JSON) and the API key to use |     # now "headers" contains the accepted format (JSON) and the API key to use | ||||||
|  |     debugLogFilename = getDebugFilename(hostname) | ||||||
|     if DEBUG: |     if DEBUG: | ||||||
|         showOptions() |         showOptions() | ||||||
|         print(f"hostname: {hostname}, protocol: {protocol}, port: {port}, verify: {verify}") |         print(f"hostname: {hostname}, protocol: {protocol}, port: {port}, verify: {verify}") | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user