#!/usr/bin/env python3 """ =head1 NAME Munin plugin to monitor lighttpd web-server. =head1 CONFIGURATION Configuration parameters: [lighttpd_] env.status_url - url of lighty's server-status (optional, default is http://127.0.0.1/server-status) env.username - username to provide if status_url requires authentication (optional, default - no authentication) env.password - password to provide if status_url requires authentication (optional, default - no authentication) env.auth_type - the authentication mechanism to use -- either 'basic' (default) or 'digest'. Note: If HTTP authentication is required you should specify both username and password. =head1 INSTALLATION Copy file to directory /usr/share/munin/plugins/ Because this plugin has "suggest" capability the last step is to run munin-node-configure --suggest --shell | sh -x =head1 AUTHOR Copyright Igor Borodikhin =head1 LICENSE GNU General Public License v3.0 only SPDX-License-Identifier: GPL-3.0-only =head1 MAGIC MARKERS #%# family=contrib #%# capabilities=autoconf suggest =cut """ import os import sys import urllib.request program = sys.argv[0] graph_type = program[program.rfind("_") + 1:] graph_types = { "accesses": [ { "title": "Total accesses", "type": "COUNTER", "args": "--base 1000 -l 0", "fields": ["accesses"] } ], "kbytes": [ { "title": "Total kBytes", "type": "COUNTER", "args": "--base 1024 -l 0", "fields": ["kbytes"] } ], "uptime": [ { "title": "Uptime", "type": "GAUGE", "args": "--base 1000 -l 0", "fields": ["uptime"] } ], "status": [ { "title": "Status", "type": "GAUGE", "args": "--base 1000 -l 0", "fields": ["busy", "idle"] } ] } if len(sys.argv) == 2 and sys.argv[1] == "autoconf": print("yes") elif len(sys.argv) == 2 and sys.argv[1] == "config": if graph_type not in graph_types.keys(): raise Exception("Unknown graph type '%s'" % graph_type) params = graph_types[graph_type] for item in params: print("graph_title %s" % item["title"]) print("graph_category webserver") for field in item["fields"]: print("%s.label %s" % (field, field)) print("%s.type %s" % (field, item["type"])) print("graph_args %s" % item["args"]) elif len(sys.argv) == 2 and sys.argv[1] == "suggest": for item in graph_types.keys(): print(item) else: status_url = os.environ.get('status_url', 'http://127.0.0.1/server-status') request = urllib.request.Request("%s?auto" % status_url) if "username" in os.environ and "password" in os.environ: mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm() mgr.add_password(None, status_url, os.environ["username"], os.environ["password"]) if os.environ.get("auth_type", "basic") == "digest": auth = urllib.request.HTTPDigestAuthHandler(mgr) else: auth = urllib.request.HTTPBasicAuthHandler(mgr) opener = urllib.request.build_opener(auth) urllib.request.install_opener(opener) info = urllib.request.urlopen(request).read().decode('utf-8') data = {} for line in info.split("\n"): try: (title, value) = line.split(": ") data[title] = value except ValueError: pass if graph_type == "accesses": print("accesses.value %s" % data["Total Accesses"]) elif graph_type == "kbytes": print("kbytes.value %s" % data["Total kBytes"]) elif graph_type == "uptime": print("uptime.value %s" % str(float(data["Uptime"]) / 86400)) elif graph_type == "status": print("busy.value %s" % data["BusyServers"]) print("idle.value %s" % data["IdleServers"])