This file is indexed.

/usr/share/crmsh/scripts/health/report.py is in crmsh 2.2.0-1.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  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
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#! /usr/bin/python
import crm_script
data = crm_script.get_input()
health_report = data[1]

print "Processing collected information..."

CORE_PACKAGES = ['corosync', 'pacemaker', 'resource-agents']

warnings = []
errors = []

def warn(fmt, *args):
    warnings.append(fmt % args)

def error(fmt, *args):
    errors.append(fmt % args)

# sort {package: {version: [host]}}
rpm_versions = {}

LOW_UPTIME = 60.0
HIGH_LOAD = 1.0

for node, info in health_report.iteritems():
    if node != info['system']['hostname']:
        error("Hostname mismatch: %s is not %s" %
              (node, info['system']['hostname']))

    if float(info['system']['uptime']) < LOW_UPTIME:
        warn("%s: Uptime is low: %ss" % (node, info['system']['uptime']))

    if float(info['system']['loadavg']) > HIGH_LOAD:
        warn("%s: 15 minute load average is %s" % (node, info['system']['loadavg']))

    for rpm in info['rpm']:
        if 'error' in rpm:
            if rpm['name'] not in rpm_versions:
                rpm_versions[rpm['name']] = {rpm['error']: [node]}
            else:
                versions = rpm_versions[rpm['name']]
                if rpm['error'] in versions:
                    versions[rpm['error']].append(node)
                else:
                    versions[rpm['error']] = [node]
        else:
            if rpm['name'] not in rpm_versions:
                rpm_versions[rpm['name']] = {rpm['version']: [node]}
            else:
                versions = rpm_versions[rpm['name']]
                if rpm['version'] in versions:
                    versions[rpm['version']].append(node)
                else:
                    versions[rpm['version']] = [node]
    for disk, use in info['disk']:
        use = int(use[:-1])
        if use > 90:
            warn("On %s, disk %s usage is %s%%", node, disk, use)

    for logfile, state in info['logrotate'].iteritems():
        if not state:
            warn("%s: No log rotation configured for %s" % (node, logfile))

for cp in CORE_PACKAGES:
    if cp not in rpm_versions:
        error("Core package '%s' not installed on any node", cp)

for name, versions in rpm_versions.iteritems():
    if len(versions) > 1:
        desc = ', '.join('%s (%s)' % (v, ', '.join(nodes)) for v, nodes in versions.items())
        warn("Package %s: Versions differ! %s", name, desc)

    all_hosts = set(sum([hosts for hosts in versions.values()], []))
    for node in health_report.keys():
        if len(all_hosts) > 0 and node not in all_hosts:
            warn("Package '%s' not installed on host '%s'" % (name, node))


def compare_system(systems):
    def check(value, msg):
        vals = set([system[value] for host, system in systems])
        if len(vals) > 1:
            info = ', '.join('%s: %s' % (h, system[value]) for h, system in systems)
            warn("%s: %s" % (msg, info))

    check('machine', 'Architecture differs')
    check('release', 'Kernel release differs')
    check('distname', 'Distribution differs')
    check('distver', 'Distribution version differs')
    #check('version', 'Kernel version differs')

def compare_files(systems):
    keys = set()
    for host, files in systems:
        keys.update(files.keys())
    for filename in keys:
        vals = set([files.get(filename) for host, files in systems])
        if len(vals) > 1:
            info = ', '.join('%s: %s' % (h, files.get(filename)) for h, files in systems)
            warn("%s: %s" % ("Files differ", info))

compare_system((h, info['system']) for h, info in health_report.iteritems())
compare_files((h, info['files']) for h, info in health_report.iteritems())

if crm_script.output(2):
    report = crm_script.output(2)
    status = report.get('status')
    analysis = report.get('analysis')
    if status and not analysis:
        warn("Cluster report: %s" % (status))
    elif analysis:
        print "INFO: Cluster report:"
        print analysis
    else:
        warn("No cluster report generated")

if errors:
    for e in errors:
        print "ERROR:", e
if warnings:
    for w in warnings:
        print "WARNING:", w

if not errors and not warnings:
    print "No issues found."