#!/usr/bin/python3

import xml.etree.ElementTree as etree
import subprocess
import sys

valid_roles = ['Started', 'Master', 'Slave']

def check_resources(resources):
    for resource in resources:
        a = resource.attrib
        if a['managed'] != 'true' or a['failed'] != 'false' or a['active'] != 'true' or a['role'] not in valid_roles:
            return (2, 'Resource {0} has problems!'.format(a['id']))
    return (0, 'ok')

def check_nodes(nodes):
    for node in nodes:
        a = node.attrib
        if a['online'] != 'true' or a['shutdown'] != 'false' or a['standby'] != 'false':
            return (2, 'Node {0} is not online!'.format(a['name']))
    return (0, 'ok')

def check_clones(clones):
    for clone in clones:
        a = clone.attrib
        if a['managed'] != 'true' or a['failed'] != 'false':
            return (2, 'Clone {0} has problems!'.format(a['id']))
        res = check_resources(clone.findall('./resource'))
        if res[0] != 0:
            return res
    return (0, 'ok')

def run_pcs():
    cmdline = ['/usr/sbin/pcs', 'status', 'xml']
    proc = subprocess.Popen(
        cmdline,
        shell=False,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE
    )
    out, err = proc.communicate()
    return (proc, out, err)

try:
    proc, out, err = run_pcs()
    if proc.returncode != 0:
        print("pcs returned an error: {0}".format(out))
        sys.exit(2)

    root = etree.fromstring(out)

    nodes = root.findall('./nodes/node')
    code, msg = check_nodes(nodes)
    if code != 0:
        print(msg)
        sys.exit(code)

    resources = root.findall('./resources/resource')
    code, msg = check_resources(resources)
    if code != 0:
        print(msg)
        sys.exit(code)

    clones = root.findall('./resources/clone')
    code, msg = check_clones(clones)
    if code != 0:
        print(msg)
        sys.exit(code)

except Exception as e:
    print("Error while trying to call pcs: {0}".format(e))
    sys.exit(2)

print('Pacemaker status ok')
sys.exit(0)

