Repository
Munin (contrib)
Last change
2020-11-26
Graph Categories
Family
contrib
Capabilities
Keywords
Language
Python (3.x)
License
GPL-3.0-only
Authors

lighttpd_

Name

Munin plugin to monitor lighttpd web-server.

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.

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

Author

Copyright Igor Borodikhin

License

GNU General Public License v3.0 only

SPDX-License-Identifier: GPL-3.0-only

Magic Markers

#%# family=contrib
#%# capabilities=autoconf suggest
#!/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()
    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"])