This file is indexed.

/usr/share/ganeti/2.15/molly-guard-helper is in ganeti-2.15 2.15.2-3.

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
#!/usr/bin/python
#
# molly-guard helper script to detect running Ganeti instances.
#
# Copyright (c) 2014 Apollon Oikonomopoulos <apoikos@debian.org>
#
# This program is free software; you can redistribute it
# and/or modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public
# License along with this package; if not, write to the Free
# Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA  02110-1301 USA
#

import os
import sys
import signal
import socket


try:
    from ganeti.ssconf import SimpleStore
    from ganeti.hypervisor import GetHypervisor
    from ganeti.errors import HypervisorError, ConfigurationError
except ImportError:
    sys.stderr.write("W: unable to import Ganeti code\n")
    sys.exit(0)


def sigh(action, hostname):
    """ Exit with an error code to prevent system shutdown/reboot """
    sys.stdout.write("Good thing I asked; I won't %s %s ...\n" %
                     (action, hostname))
    sys.exit(1)


def main():
    action = os.environ.get("MOLLYGUARD_CMD", "?")
    hostname = socket.gethostname()

    for sig in (signal.SIGHUP, signal.SIGTERM, signal.SIGQUIT):
        signal.signal(sig, lambda frame, stack: sigh(action, hostname))

    conf = SimpleStore()

    instances = []
    try:
        enabled_hvs = conf.GetHypervisorList()
    except ConfigurationError:
        # Cluster is probably not initialized
        sys.stderr.write("W: failed to get hypervisor list"
                         " (not part of a cluster?)\n")
        sys.exit(0)

    for hv_type in enabled_hvs:
        hv = GetHypervisor(hv_type)

        try:
            instances += hv.ListInstances()
        except HypervisorError as err:
            sys.stderr.write("W: unable to list %s instances: %s\n" %
                             (hv_type, str(err)))

    current_master = conf.GetMasterNode()

    node_is_current_master = False
    if hostname == current_master:
        node_is_current_master = True

    if instances or node_is_current_master:
        if instances:
            sys.stdout.write("W: The following Ganeti instances will be"
                             " terminated abnormally if you %s this system:\n" %
                             action)
            for instance in sorted(instances):
                sys.stdout.write("   - %s\n" % instance)

        if node_is_current_master:
            sys.stdout.write("W: This system is the current Ganeti master"
                             " for this cluster\n")

        try:
            response = raw_input("Type YES to %s the system: " % action)
        except KeyboardInterrupt:
            sigh(action, hostname)

        if response.lower().strip() != "yes":
            sigh(action, hostname)

    sys.exit(0)


if __name__ == "__main__":
    if not sys.stdin.isatty():
        sys.exit(0)

    main()