summaryrefslogtreecommitdiffstats
path: root/src/virtual/poweroffd.py
blob: 27286be003e4a70e810e6adc3e31b16282d13741 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#
# Copyright (C) 2020-2024 Soleta Networks <info@soleta.eu>
#
# This program is free software: you can redistribute it and/or modify it under
# the terms of the GNU Affero General Public License as published by the
# Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.

import logging

from src.virtual.qmp import QEMUMonitorProtocol
from src.virtual.qmp import QMPCapabilitiesError, QMPConnectError

QMP_DEFAULT_PORT = 4445
QMP_DEFAULT_HOST = "127.0.0.1"

def is_shutdown_event(qmp_ev):
    """
    """
    return qmp_ev.get('event') == 'SHUTDOWN'


def init(host=QMP_DEFAULT_HOST, port=QMP_DEFAULT_PORT):
    """
    """
    qmpconn = QEMUMonitorProtocol((host, port))
    try:
        qmpconn.connect()
    except ConnectionRefusedError:
        logging.critical('poweroffd: Connection refused')
        return None
    except QMPCapabilitiesError as e:
        logging.critical('poweroffd: Error negotiating capabilities')
        return None
    return qmpconn


def run(qmpconn):
    """
    """
    while(True):
        try:
            qmp_ev = qmpconn.pull_event(wait=True)
        except QMPConnectError as e:
            logging.critical('Error trying to pull an event')
            ret = -1
            break
        if is_shutdown_event(qmp_ev):
            logging.info('Detected guest shutdown, powering off')
            ret = 0
            break

    qmpconn.close()
    return ret