#!/usr/bin/python3

import argparse
from http.server import BaseHTTPRequestHandler, HTTPServer


def quote(s):
    return s.replace('"', '\\"')


class HTTPRequestHandler(BaseHTTPRequestHandler):
    """HTTP request handler with additional properties and functions"""

    def do_GET(self):
        binds = dict()
        with open("/proc/self/mountinfo", "r") as mountinfo:
            self.send_response(200)
            self.send_header("Content-Type", "text/plain; version=0.0.4")
            self.end_headers()
            for line in mountinfo:
                _, _, majmin, _, mntpnt, opts, shropts, _, fstype, rest = line.split(" ", maxsplit=9)
                maj, min = majmin.split(":")
                mntpnt = mntpnt.encode().decode('unicode_escape')
                key = f"{maj}:{min}:{fstype}"
                labels = {
                    "major": maj,
                    "minor": min,
                    "fstype": fstype,
                    "mountpoint": mntpnt,
                    "is_bind": "yes" if key in binds else "no",
                }
                binds[key] = True
                labelset = ",".join(
                    f"{k}=\"{quote(v)}\""
                    for k, v in labels.items()
                )
                self.wfile.write(("mountpoint_info{%s} 1\n" % labelset).encode("utf-8"))

    def log_request(self, *args, **kwargs):
        pass

def run(host, port):
    server_address = (host, int(port))
    httpd = HTTPServer(server_address, HTTPRequestHandler)
    httpd.serve_forever()

parser = argparse.ArgumentParser("mountpoint_exporter")
parser.add_argument("-p", "--port", type=int, help="Port to listen on (default 9200)", default="9200")
parser.add_argument("-a", "--host-address", help="Host address to listen on (default empty string which means all addresses)", default="")

opts = parser.parse_args()

run(opts.host_address, opts.port)
