2023-08-19 14:23:00 +02:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
import getopt
|
|
|
|
import sys
|
|
|
|
import requests
|
|
|
|
import urllib3
|
|
|
|
import json
|
|
|
|
import os
|
|
|
|
from pprint import pprint
|
|
|
|
from requests.structures import CaseInsensitiveDict
|
|
|
|
from requests.auth import HTTPBasicAuth
|
|
|
|
|
|
|
|
def showUsage():
|
2023-08-19 14:53:19 +02:00
|
|
|
sys.stderr.write("""CheckMK Mailcow Special Agent
|
2023-08-19 14:23:00 +02:00
|
|
|
|
2023-08-19 14:53:19 +02:00
|
|
|
USAGE: agent_nextcloud -H [hostname] -k [apikey]
|
|
|
|
agent_nextcloud -h
|
2023-08-19 14:23:00 +02:00
|
|
|
|
|
|
|
OPTIONS:
|
|
|
|
-H, --hostname Hostname (FQDN or IP) of Nextcloud server
|
2023-08-19 14:53:19 +02:00
|
|
|
-k, --apikey API Key
|
2023-08-19 14:23:00 +02:00
|
|
|
-P, --port Port
|
|
|
|
--no-https True|False If "True": Disable HTTPS, use HTTP (not recommended!)
|
|
|
|
--no-cert-check True|False If "True": Disable TLS certificate check (not recommended!)
|
|
|
|
-h, --help Show this help message and exit
|
|
|
|
""")
|
|
|
|
|
|
|
|
# set this to true to produce debug output (this clutters the agent output)
|
|
|
|
# be aware: activating this logs very sensitive information to debug files in ~/tmp
|
|
|
|
# !!DO NOT FORGET to delete these files after debugging is done!!
|
|
|
|
|
2023-08-19 14:53:19 +02:00
|
|
|
DEBUG = True
|
2023-08-19 14:23:00 +02:00
|
|
|
|
2023-08-19 14:53:19 +02:00
|
|
|
mc_api_base = "api/v1/get"
|
2023-08-19 14:23:00 +02:00
|
|
|
|
|
|
|
opt_hostname = ""
|
2023-08-19 14:53:19 +02:00
|
|
|
opt_apikey = ""
|
2023-08-19 14:23:00 +02:00
|
|
|
opt_port = ""
|
|
|
|
opt_no_https = False
|
|
|
|
opt_no_cert_check = False
|
|
|
|
|
2023-08-19 14:53:19 +02:00
|
|
|
short_options = 'hH:k:P:'
|
2023-08-19 14:23:00 +02:00
|
|
|
long_options = [
|
2023-08-19 14:53:19 +02:00
|
|
|
'hostname=', 'apikey=', 'port=', 'no-https=', 'no-cert-check=', 'help'
|
2023-08-19 14:23:00 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
def getOptions():
|
|
|
|
global opt_hostname
|
2023-08-19 14:53:19 +02:00
|
|
|
global opt_apikey
|
2023-08-19 14:23:00 +02:00
|
|
|
global opt_port
|
|
|
|
global opt_no_https
|
|
|
|
global opt_no_cert_check
|
|
|
|
|
|
|
|
opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
|
|
|
|
for opt, arg in opts:
|
|
|
|
if opt in ['-H', '--hostname']:
|
|
|
|
opt_hostname = arg
|
2023-08-19 14:53:19 +02:00
|
|
|
elif opt in ['-k', '--apikey']:
|
|
|
|
opt_apikey = arg
|
2023-08-19 14:23:00 +02:00
|
|
|
elif opt in ['-P', '--port']:
|
|
|
|
opt_port = arg
|
|
|
|
elif opt in ['--no-https']:
|
|
|
|
if arg == 'True':
|
|
|
|
opt_no_https = True
|
|
|
|
else:
|
|
|
|
opt_no_https = False
|
|
|
|
elif opt in ['--no-cert-check']:
|
|
|
|
if arg == 'True':
|
|
|
|
opt_no_cert_check = True
|
|
|
|
else:
|
|
|
|
opt_no_cert_check = False
|
|
|
|
elif opt in ['-h', '--help']:
|
|
|
|
showUsage()
|
|
|
|
sys.exit(0)
|
|
|
|
if DEBUG:
|
|
|
|
home_path = os.getenv("HOME")
|
|
|
|
tmp_path = f"{home_path}/tmp"
|
2023-08-19 14:53:19 +02:00
|
|
|
help_file = f"{tmp_path}/mailcow_{opt_hostname}_debug.txt"
|
2023-08-19 14:23:00 +02:00
|
|
|
with open(help_file, "a") as file:
|
|
|
|
file.write(f"Number of Arguments: {len(sys.argv)}, Argument List: {str(sys.argv)}\n")
|
|
|
|
|
|
|
|
def showOptions():
|
|
|
|
print(f"Hostname: {opt_hostname}")
|
2023-08-19 14:53:19 +02:00
|
|
|
print(f"Username: {opt_apikey}")
|
2023-08-19 14:23:00 +02:00
|
|
|
print(f"Port: {opt_port}")
|
|
|
|
print(f"No HTTPS: {opt_no_https}")
|
|
|
|
print(f"No TLS Check: {opt_no_cert_check}")
|
|
|
|
home_path = os.getenv("HOME")
|
|
|
|
tmp_path = f"{home_path}/tmp"
|
2023-08-19 14:53:19 +02:00
|
|
|
help_file = f"{tmp_path}/mailcow_{opt_hostname}_debug.txt"
|
2023-08-19 14:23:00 +02:00
|
|
|
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")
|
|
|
|
|
|
|
|
def main():
|
|
|
|
getOptions()
|
|
|
|
if (opt_hostname == ""):
|
|
|
|
sys.stderr.write(f"No hostname given.\n")
|
|
|
|
showUsage()
|
|
|
|
sys.exit(1)
|
2023-08-19 14:53:19 +02:00
|
|
|
if (opt_apikey == ""):
|
|
|
|
sys.stderr.write(f"No API key given.\n")
|
|
|
|
showUsage()
|
|
|
|
sys.exit(1)
|
2023-08-19 14:23:00 +02:00
|
|
|
if (opt_no_cert_check):
|
|
|
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
|
|
verify = False
|
|
|
|
else:
|
|
|
|
verify = True
|
|
|
|
if (opt_port == ""):
|
|
|
|
if (opt_no_https):
|
|
|
|
protocol = "http"
|
|
|
|
port = "80"
|
|
|
|
else:
|
|
|
|
protocol = "https"
|
|
|
|
port = "443"
|
|
|
|
else:
|
|
|
|
if (opt_no_https):
|
|
|
|
protocol = "http"
|
|
|
|
else:
|
|
|
|
protocol = "https"
|
|
|
|
port = opt_port
|
|
|
|
if DEBUG:
|
|
|
|
showOptions()
|
|
|
|
if (protocol == "http" and port == "443"):
|
|
|
|
sys.stderr.write(f"Combining HTTP with port 443 is not supported.\n")
|
|
|
|
sys.exit(1)
|
|
|
|
if (protocol == "https" and port == "80"):
|
|
|
|
sys.stderr.write(f"Combining HTTPS with port 80 is not supported.\n")
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|