#!/usr/bin/env python3
#
# A plugin for requesting perfmon actions via the xe host-call-plugin mechanism

import os
import socket
import XenAPIPlugin

# TODO: Document this information and all supported commands
cmdsockname = "\0perfmon"  # an af_unix socket name (the "\0" stops socket.bind() creating a fs node)
cmdmaxlen = 256

def send_perfmon_cmd(cmd):
    "Return True for success, or ERROR_%d: <msg> otherwise"
    if len(cmd) >= cmdmaxlen:
        return "ERROR_0: command too long"
    cmd_bytes = cmd.encode()
    try:
        sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
        rc = sock.sendto(cmd_bytes, cmdsockname)
    except socket.error as e:
        err, msg = e.args
        return "ERROR_%d: %s" % (err, msg)
    except Exception:
        return "ERROR_1: unknown error"

    return str(rc == len(cmd_bytes))

def refresh(session, args):
    return send_perfmon_cmd("refresh")

def debug_mem(session,args):
    return send_perfmon_cmd("debug_mem")

if __name__ == "__main__":
    XenAPIPlugin.dispatch({"refresh": refresh, "debug_mem": debug_mem})
