aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore127
-rw-r--r--README.md27
-rw-r--r--nextcloud_shares62
-rw-r--r--nextcloud_users52
4 files changed, 268 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..64562bd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,127 @@
+### Python ###
+# Byte-compiled / optimized / DLL files
+__pycache__/
+.idea/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+### Python Patch ###
+.venv/
+
+### Python.VirtualEnv Stack ###
+# Virtualenv
+# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
+[Bb]in
+[Ii]nclude
+[Ll]ib
+[Ll]ib64
+[Ll]ocal
+[Ss]cripts
+pyvenv.cfg
+pip-selfcheck.json
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..500dd75
--- /dev/null
+++ b/README.md
@@ -0,0 +1,27 @@
+# Nextcloud Munin Plugin
+Some basic Munin Plugins gathering information from the NextCloud external API.
+
+## install
+To use these Plugins one has to add his specific URL and credential to the script.
+```
+URL = 'https://URL.TO.YOUR.NEXTCLOUD.tld/ocs/v2.php/apps/serverinfo/api/v1/info'
+auth = ('username', 'password or logintoken')
+```
+If these are correct the script needs to be placed in the munin directory eg. `/etc/munin/plugins/`
+
+The munin-node needs to be restarted to facilitate the new plugins.
+`systemctl restart munin-node`
+
+### everything working?
+To check if everything is working as expected check if the plugins actually gather data.
+```
+telnet localhost 4949 # localhost or IP the munin-node
+list
+fetch nextcloud_shares
+fetch nextcloud_users
+```
+
+If everything works as it should, list will return `nextcloud_shares` and `nextcloud_users` within the list of other active plugins. The `fetch` commands will run the script and return the gathered values. As long as none of them are NaN everything works as expected.
+
+### uninstall
+To remove the plugins from munin remove both plugins from the directory and restart the node.
diff --git a/nextcloud_shares b/nextcloud_shares
new file mode 100644
index 0000000..b2e858e
--- /dev/null
+++ b/nextcloud_shares
@@ -0,0 +1,62 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import re
+import requests
+import sys
+
+URL = 'https://URL.TO.YOUR.NEXTCLOUD.tld/ocs/v2.php/apps/serverinfo/api/v1/info'
+auth = ('username', 'password or logintoken')
+
+
+class NextcloudShares:
+ if (sys.argv.__len__() == 2) and (sys.argv[1] == "config"):
+ print('graph_title Nextcloud Shares')
+ print('graph_args --base 1024 -l 0')
+ print('graph_vlabel number of shares')
+ print('graph_info graph showing the number of shares')
+ print('graph_category nextcloud')
+
+ print('num_fed_shares_received.label federated shares recieved')
+ print('num_fed_shares_sent.label federated shares sent')
+ print('num_shares.label total number of shares')
+ print('num_shares_groups.label group shares')
+ print('num_shares_link.label link shares')
+ print('num_shares_link_no_password.label link shares without a password')
+ print('num_shares_user.label user shares')
+ else:
+ # init requests session with specific header and credentials
+ s = requests.Session()
+ s.auth = auth
+ s.headers.update({'Accept': 'application/json'})
+
+ # request data from api
+ r = s.get(URL)
+
+ # if status code is successful continue
+ if r.status_code == 200:
+ api_response = r.json()
+ shares = api_response['ocs']['data']['nextcloud']['shares']
+
+ # use regex to remove permission stats from api response
+ reg = re.compile("num.*")
+ share_keys = shares.keys()
+ sharelist = list(filter(reg.match, share_keys))
+
+ result = list()
+ for key in sharelist:
+ result.append(str(key) + ".value " + str(shares[key]))
+ print("\n".join(result))
+
+ elif r.status_code == 996:
+ print('server error')
+ elif r.status_code == 997:
+ print('not authorized')
+ elif r.status_code == 998:
+ print('not found')
+ else:
+ print('unknown error')
+
+
+if __name__ == "__main__":
+ NextcloudShares()
+ quit(0)
diff --git a/nextcloud_users b/nextcloud_users
new file mode 100644
index 0000000..fce9c73
--- /dev/null
+++ b/nextcloud_users
@@ -0,0 +1,52 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import requests
+import sys
+
+URL = 'https://URL.TO.YOUR.NEXTCLOUD.tld/ocs/v2.php/apps/serverinfo/api/v1/info'
+auth = ('username', 'password or logintoken')
+
+
+class NextcloudUsers:
+ if (sys.argv.__len__() == 2) and (sys.argv[1] == "config"):
+ print('graph_title Nextcloud User Activity')
+ print('graph_args --base 1024 -l 0')
+ print('graph_vlabel connected users')
+ print('graph_info graph showing the number of connected user')
+ print('graph_category nextcloud')
+
+ print('last5minutes.label last 5 minutes')
+ print('last1hour.label last hour')
+ print('last24hours.label last 24 hours')
+ else:
+ # init requests session with specific header and credentials
+ s = requests.Session()
+ s.auth = auth
+ s.headers.update({'Accept': 'application/json'})
+
+ # request data from api
+ r = s.get(URL)
+
+ # if status code is successful continue
+ if r.status_code == 200:
+ api_response = r.json()
+ users = api_response['ocs']['data']['activeUsers']
+
+ result = list()
+ for key in users.keys():
+ result.append(str(key) + ".value " + str(users[key]))
+ print("\n".join(result))
+
+ elif r.status_code == 996:
+ print('server error')
+ elif r.status_code == 997:
+ print('not authorized')
+ elif r.status_code == 998:
+ print('not found')
+ else:
+ print('unknown error')
+
+
+if __name__ == "__main__":
+ NextcloudUsers()
+ quit(0)