/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()
|