From 05415a8d1d420c692f93059fb868750f13926ccd Mon Sep 17 00:00:00 2001 From: mellis Date: Fri, 12 Jan 2024 14:12:05 +0100 Subject: [PATCH] MKP 2.4.1, removed token parameter, switch to app password parameter only --- .../check_mk/agents/special/agent_nextcloud | 36 ++++++++---------- local/share/check_mk/checks/agent_nextcloud | 3 +- .../web/plugins/wato/nextcloud_params.py | 16 ++++---- mkp/Nextcloud-2.4.1.mkp | Bin 0 -> 11641 bytes 4 files changed, 25 insertions(+), 30 deletions(-) create mode 100644 mkp/Nextcloud-2.4.1.mkp diff --git a/local/share/check_mk/agents/special/agent_nextcloud b/local/share/check_mk/agents/special/agent_nextcloud index 7a01523..ce32586 100755 --- a/local/share/check_mk/agents/special/agent_nextcloud +++ b/local/share/check_mk/agents/special/agent_nextcloud @@ -16,26 +16,24 @@ def showUsage(): USAGE: agent_nextcloud_info -u [username] -p [password] OR - agent_nextcloud_info -u [username] -t [token] agent_nextcloud_info -h OPTIONS: -H, --hostname Hostname (FQDN or IP) of Nextcloud server -u, --username Username - -p, --password Password + -p, --password App Password -P, --port Port -f, --folder Subfolder if not installed in web root - -t, --token Token (recommended) --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 +# be aware: activating this flag logs very sensitive information to debug files in ~/tmp # !!DO NOT FORGET to delete these files after debugging is done!! -DEBUG = True +DEBUG = False nc_api_endpoint = "ocs/v2.php/apps/serverinfo/api/v1/info?format=json" nc_api_endpoint_all_users = "ocs/v1.php/cloud/users?format=json" @@ -46,13 +44,12 @@ opt_username = "" opt_password = "" opt_port = "" opt_folder = "" -opt_token = "0" opt_no_https = False opt_no_cert_check = False -short_options = 'hH:u:p:P:f:t:' +short_options = 'hH:u:p:P:f:' long_options = [ - 'hostname=', 'username=', 'password=', 'port=', 'token=', 'folder=', 'no-https=', 'no-cert-check=', 'help' + 'hostname=', 'username=', 'password=', 'port=', 'folder=', 'no-https=', 'no-cert-check=', 'help' ] def logDebug(line): @@ -70,7 +67,6 @@ def getOptions(): global opt_password global opt_port global opt_folder - global opt_token global opt_no_https global opt_no_cert_check @@ -86,8 +82,6 @@ def getOptions(): opt_port = arg elif opt in ['-f', '--folder']: opt_folder = arg - elif opt in ['-t', '--token']: - opt_token = arg elif opt in ['--no-https']: if arg == 'True': opt_no_https = True @@ -109,13 +103,12 @@ def showOptions(): print(f"Password: {opt_password}") print(f"Port: {opt_port}") print(f"Folder: {opt_folder}") - print(f"Token: {opt_token}") print(f"No HTTPS: {opt_no_https}") print(f"No TLS Check: {opt_no_cert_check}") logDebug(f"showOptions - Hostname: {opt_hostname}, Port: {opt_port}, No HTTPS: {opt_no_https}, No Cert Check: {opt_no_cert_check}\n") def createUrl(endpoint, hostname, protocol, port, folder): - # these parameters are needed, otherwise no information about updates regarding apps and Nextcloud itself are not reported (since version 28) + # these parameters are needed, otherwise no information about updates regarding apps and Nextcloud itself are reported (since version 28) params = "skipApps=false&skipUpdate=false" if folder == "": url = f"{protocol}://{hostname}:{port}/{endpoint}" @@ -264,6 +257,14 @@ def main(): sys.stderr.write(f"No hostname given.\n") showUsage() sys.exit(1) + if (opt_username == ""): + sys.stderr.write(f"No username given.\n") + showUsage() + sys.exit(1) + if (opt_password == ""): + sys.stderr.write(f"No password given.\n") + showUsage() + sys.exit(1) if (opt_no_cert_check): urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) verify = False @@ -290,13 +291,8 @@ def main(): if (protocol == "https" and port == "80"): sys.stderr.write(f"Combining HTTPS with port 80 is not supported.\n") sys.exit(1) - if (opt_token == '0'): - # authenticate with username and password - pwd = opt_password - else: - # authenticate with token - pwd = opt_token - + pwd = opt_password + # create session session = getSession(opt_username, pwd) nc_url = createUrl(nc_api_endpoint, opt_hostname, protocol, port, opt_folder) diff --git a/local/share/check_mk/checks/agent_nextcloud b/local/share/check_mk/checks/agent_nextcloud index 9f653a1..b59e9ae 100644 --- a/local/share/check_mk/checks/agent_nextcloud +++ b/local/share/check_mk/checks/agent_nextcloud @@ -2,8 +2,7 @@ def agent_nextcloud_arguments(params, hostname, ipaddress): return [ "--hostname", params["hostname"], "--username", params["username"], - "--password", params["password"], - "--token", passwordstore_get_cmdline("%s", params["token"]), + "--password", passwordstore_get_cmdline("%s", params["password"]), "--port", params["port"], "--folder", params["folder"], "--no-https", params["no_https"], diff --git a/local/share/check_mk/web/plugins/wato/nextcloud_params.py b/local/share/check_mk/web/plugins/wato/nextcloud_params.py index 081d0d1..ae0923e 100644 --- a/local/share/check_mk/web/plugins/wato/nextcloud_params.py +++ b/local/share/check_mk/web/plugins/wato/nextcloud_params.py @@ -26,19 +26,19 @@ def _valuespec_special_agent_nextcloud(): elements=[ ("hostname", TextAscii(title=_("Hostname"), allow_empty=False, - help=_("Hostname of Nextcloud server (bare FQDN or IP, IP not tested), mandatory"))), + size = 40, + help=_("Hostname of Nextcloud server (bare FQDN or IP), mandatory, eg. nextcloud.yourdomain.tld"))), ("username", TextAscii(title=_("Username"), + size = 40, allow_empty=False, help=_("Username with administrative rights, mandatory"))), - ("password", Password(title=_("Password"), - allow_empty=True, - help=_("Specify password OR token, not both, token recommended"))), - ("token", IndividualOrStoredPassword(title=_("App Password"), - allow_empty=True, - help=_("Specify password OR token, not both, token recommended"))), + ("password", IndividualOrStoredPassword(title=_("App Password"), + size = 40, + allow_empty=False, + help=_("Specify app password, mandatory, use Personal Settings|Security|Devices and Sessions within the NC UI to create one for the given user"))), ("port", TextAscii(title=_("Port"), allow_empty=True, - help=_("Specify port if not listening to HTTPS, optional"))), + help=_("Specify port if not listening to HTTP(S), optional"))), ("folder", TextAscii(title=_("Folder"), allow_empty=True, help=_("Specify subfolder if your Nextcloud instance is not installed in the web root, no trailing/leading slashes, optional"))), diff --git a/mkp/Nextcloud-2.4.1.mkp b/mkp/Nextcloud-2.4.1.mkp new file mode 100644 index 0000000000000000000000000000000000000000..41ab8fda316ec800ff714861281f39d1abed3842 GIT binary patch literal 11641 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