From 96ec850d2106db190b43c527f1222def6a882c0a Mon Sep 17 00:00:00 2001 From: Sebastian L Date: Sat, 29 May 2021 16:14:03 +0200 Subject: [PATCH] nextcloud_groupfolders_: Monitor sizes of groupfolders --- plugins/nextcloud/nextcloud_groupfolders_ | 136 ++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100755 plugins/nextcloud/nextcloud_groupfolders_ diff --git a/plugins/nextcloud/nextcloud_groupfolders_ b/plugins/nextcloud/nextcloud_groupfolders_ new file mode 100755 index 00000000..515d90ad --- /dev/null +++ b/plugins/nextcloud/nextcloud_groupfolders_ @@ -0,0 +1,136 @@ +#!/bin/sh +# shellcheck shell=dash + +set -e + +: << =cut + +=head1 NAME + +nextcloud_groupfolders - Monitor usage of nextcloud groupfolders + +=head1 APPLICABLE SYSTEMS + +Nexcloud instances with enabled groupfolders app + +=head1 CONFIGURATION + +Requires installed curl and jq, a command-line json processor. + +This is a wildcard plugin. To monitor a groupfolders of a nextcloud +instance, link nextcloud_groupfolders_ to this file. +You can even append a port (:8443) to the file if needed. For example, + + ln -s /usr/share/munin/plugins/nextcloud_groupfolders_ \ + /etc/munin/plugins/nextcloud_groupfolders_cloud.domain.tld + +Set username and password in your munin-node configuration + + [nextcloud_groupfolders_cloud.domain.tld] + env.username + env.password + env.path + env.scheme + env.timeout + +It's advised to set an app password (for this plugin) in your nextcloud +instance and not to use the "real" password of your nextcloud user. + +=head1 AUTHOR + +Copyright (C) 2020 Sebastian L. (https://momou.ch), + Olivier Mehani + +=head1 LICENSE + +GPLv2 + +=head1 MAGIC MARKERS + + #%# family=manual + #%# capabilities=autoconf + +=cut + +# shellcheck disable=SC1090 +. "$MUNIN_LIBDIR/plugins/plugin.sh" + +if [ "${MUNIN_DEBUG:-0}" = 1 ]; then + set -x +fi + +API_PATH="${api_path:-/apps/groupfolders/folders}?format=json" +DOMAIN="${0##*nextcloud_groupfolders_}" +SCHEME="${scheme:-https}://" +TIMEOUT="${timeout:-2}" +CLEANDOMAIN="$(clean_fieldname "${DOMAIN}")" +USERNAME="${username:-}" +PASSWORD="${password:-}" + +fetch_url () { + curl -s -f -m "${TIMEOUT}" "$@" -H "OCS-APIRequest: true" +} + +case $1 in + + autoconf) + if [ ! -x "$(command -v curl)" ]; then + echo "no (curl not found)" + elif [ ! -x "$(command -v jq)" ]; then + echo "no (jq not found)" + else + fetch_url -I -u "${USERNAME}:${PASSWORD}" -I "${SCHEME}${DOMAIN}${API_PATH}" \ + | grep -iq "Content-Type: application/json" \ + && echo "yes" \ + || echo "no (invalid or empty response from nextcloud groupfolder rest api)" + fi + exit 0 + ;; + config) + + DATA=$(fetch_url -u "${USERNAME}:${PASSWORD}" "${SCHEME}${DOMAIN}${API_PATH}" | sed 's/\\/\\\\/g' | jq -r '.ocs.data' ) + +cat << EOM +multigraph nextcloud_groupfolders_${CLEANDOMAIN} +graph_title Nextcloud groupfolders on ${DOMAIN} +graph_args --base 1000 -l 0 +graph_printf %.0lf +graph_vlabel Groupfolders +graph_info Number of groupfolders +graph_category cloud +number.label Number of groupfolders +number.info number of groupfolders +number.min 0 +multigraph nextcloud_groupfolders_usage_${CLEANDOMAIN} +graph_title Nextcloud groupfolders usage on ${DOMAIN} +graph_args --base 1000 -l 0 +graph_printf %.0lf +graph_vlabel Groupfolders usage +graph_info Sizes of groupfolders +graph_category cloud +EOM + + for FOLDER in $(echo "$DATA" | jq -c 'keys | .[]') + do + MOUNTPOINT=$(echo "$DATA" | jq -r ".$FOLDER.mount_point") + ID=$(echo "$DATA" | jq -r ".$FOLDER.id") + echo size"$ID".label "$MOUNTPOINT" folder size + echo size"$ID".info size of groupfolder "$MOUNTPOINT" + echo size"$ID".draw AREA + echo size"$ID".min 0 + done + + exit 0 + ;; + +esac + +DATA=$(fetch_url -u "${USERNAME}:${PASSWORD}" "${SCHEME}${DOMAIN}${API_PATH}" | sed 's/\\/\\\\/g' | jq -r '.ocs.data' ) +echo multigraph nextcloud_groupfolders_"${CLEANDOMAIN}" +echo number.value "$(echo "$DATA" | jq length)" +echo multigraph nextcloud_groupfolders_usage_"${CLEANDOMAIN}" +for FOLDER in $(echo "$DATA" | jq -c 'keys | .[]') +do + ID=$(echo "$DATA" | jq -r ".$FOLDER.id") + echo size"$ID".value "$(echo "$DATA" | jq -r ".$FOLDER.size" | sed 's/ null$/ U/')" +done