Statistics
| Branch: | Tag: | Revision:

root / lib / tools / node_cleanup.py @ d08a8359

History | View | Annotate | Download (3.4 kB)

1 d5fe5fa9 Michael Hanselmann
#
2 d5fe5fa9 Michael Hanselmann
#
3 d5fe5fa9 Michael Hanselmann
4 d5fe5fa9 Michael Hanselmann
# Copyright (C) 2012 Google Inc.
5 d5fe5fa9 Michael Hanselmann
#
6 d5fe5fa9 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 d5fe5fa9 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 d5fe5fa9 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 d5fe5fa9 Michael Hanselmann
# (at your option) any later version.
10 d5fe5fa9 Michael Hanselmann
#
11 d5fe5fa9 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 d5fe5fa9 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 d5fe5fa9 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 d5fe5fa9 Michael Hanselmann
# General Public License for more details.
15 d5fe5fa9 Michael Hanselmann
#
16 d5fe5fa9 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 d5fe5fa9 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 d5fe5fa9 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 d5fe5fa9 Michael Hanselmann
# 02110-1301, USA.
20 d5fe5fa9 Michael Hanselmann
21 d5fe5fa9 Michael Hanselmann
"""Script to configure the node daemon.
22 d5fe5fa9 Michael Hanselmann

23 d5fe5fa9 Michael Hanselmann
"""
24 d5fe5fa9 Michael Hanselmann
25 d5fe5fa9 Michael Hanselmann
import os
26 d5fe5fa9 Michael Hanselmann
import os.path
27 d5fe5fa9 Michael Hanselmann
import optparse
28 d5fe5fa9 Michael Hanselmann
import sys
29 d5fe5fa9 Michael Hanselmann
import logging
30 d5fe5fa9 Michael Hanselmann
31 d5fe5fa9 Michael Hanselmann
from ganeti import cli
32 d5fe5fa9 Michael Hanselmann
from ganeti import constants
33 d5fe5fa9 Michael Hanselmann
from ganeti import pathutils
34 d5fe5fa9 Michael Hanselmann
from ganeti import ssconf
35 d5fe5fa9 Michael Hanselmann
from ganeti import utils
36 d5fe5fa9 Michael Hanselmann
37 d5fe5fa9 Michael Hanselmann
38 d5fe5fa9 Michael Hanselmann
def ParseOptions():
39 d5fe5fa9 Michael Hanselmann
  """Parses the options passed to the program.
40 d5fe5fa9 Michael Hanselmann

41 d5fe5fa9 Michael Hanselmann
  @return: Options and arguments
42 d5fe5fa9 Michael Hanselmann

43 d5fe5fa9 Michael Hanselmann
  """
44 d5fe5fa9 Michael Hanselmann
  parser = optparse.OptionParser(usage="%prog [--no-backup]",
45 d5fe5fa9 Michael Hanselmann
                                 prog=os.path.basename(sys.argv[0]))
46 d5fe5fa9 Michael Hanselmann
  parser.add_option(cli.DEBUG_OPT)
47 d5fe5fa9 Michael Hanselmann
  parser.add_option(cli.VERBOSE_OPT)
48 d5fe5fa9 Michael Hanselmann
  parser.add_option(cli.YES_DOIT_OPT)
49 d5fe5fa9 Michael Hanselmann
  parser.add_option("--no-backup", dest="backup", default=True,
50 d5fe5fa9 Michael Hanselmann
                    action="store_false",
51 d5fe5fa9 Michael Hanselmann
                    help="Whether to create backup copies of deleted files")
52 d5fe5fa9 Michael Hanselmann
53 d5fe5fa9 Michael Hanselmann
  (opts, args) = parser.parse_args()
54 d5fe5fa9 Michael Hanselmann
55 d5fe5fa9 Michael Hanselmann
  return VerifyOptions(parser, opts, args)
56 d5fe5fa9 Michael Hanselmann
57 d5fe5fa9 Michael Hanselmann
58 d5fe5fa9 Michael Hanselmann
def VerifyOptions(parser, opts, args):
59 d5fe5fa9 Michael Hanselmann
  """Verifies options and arguments for correctness.
60 d5fe5fa9 Michael Hanselmann

61 d5fe5fa9 Michael Hanselmann
  """
62 d5fe5fa9 Michael Hanselmann
  if args:
63 d5fe5fa9 Michael Hanselmann
    parser.error("No arguments are expected")
64 d5fe5fa9 Michael Hanselmann
65 d5fe5fa9 Michael Hanselmann
  return opts
66 d5fe5fa9 Michael Hanselmann
67 d5fe5fa9 Michael Hanselmann
68 d5fe5fa9 Michael Hanselmann
def Main():
69 d5fe5fa9 Michael Hanselmann
  """Main routine.
70 d5fe5fa9 Michael Hanselmann

71 d5fe5fa9 Michael Hanselmann
  """
72 d5fe5fa9 Michael Hanselmann
  opts = ParseOptions()
73 d5fe5fa9 Michael Hanselmann
74 d5fe5fa9 Michael Hanselmann
  utils.SetupToolLogging(opts.debug, opts.verbose)
75 d5fe5fa9 Michael Hanselmann
76 d5fe5fa9 Michael Hanselmann
  try:
77 d5fe5fa9 Michael Hanselmann
    # List of files to delete. Contains tuples consisting of the absolute path
78 d5fe5fa9 Michael Hanselmann
    # and a boolean denoting whether a backup copy should be created before
79 d5fe5fa9 Michael Hanselmann
    # deleting.
80 d5fe5fa9 Michael Hanselmann
    clean_files = [
81 d5fe5fa9 Michael Hanselmann
      (pathutils.CONFD_HMAC_KEY, True),
82 d5fe5fa9 Michael Hanselmann
      (pathutils.CLUSTER_CONF_FILE, True),
83 d5fe5fa9 Michael Hanselmann
      (pathutils.CLUSTER_DOMAIN_SECRET_FILE, True),
84 d5fe5fa9 Michael Hanselmann
      ]
85 d5fe5fa9 Michael Hanselmann
    clean_files.extend(map(lambda s: (s, True), pathutils.ALL_CERT_FILES))
86 d5fe5fa9 Michael Hanselmann
    clean_files.extend(map(lambda s: (s, False),
87 d5fe5fa9 Michael Hanselmann
                           ssconf.SimpleStore().GetFileList()))
88 d5fe5fa9 Michael Hanselmann
89 d5fe5fa9 Michael Hanselmann
    if not opts.yes_do_it:
90 d5fe5fa9 Michael Hanselmann
      cli.ToStderr("Cleaning a node is irreversible. If you really want to"
91 d5fe5fa9 Michael Hanselmann
                   " clean this node, supply the --yes-do-it option.")
92 d5fe5fa9 Michael Hanselmann
      return constants.EXIT_FAILURE
93 d5fe5fa9 Michael Hanselmann
94 d5fe5fa9 Michael Hanselmann
    logging.info("Stopping daemons")
95 d5fe5fa9 Michael Hanselmann
    result = utils.RunCmd([pathutils.DAEMON_UTIL, "stop-all"],
96 d5fe5fa9 Michael Hanselmann
                          interactive=True)
97 d5fe5fa9 Michael Hanselmann
    if result.failed:
98 d5fe5fa9 Michael Hanselmann
      raise Exception("Could not stop daemons, command '%s' failed: %s" %
99 d5fe5fa9 Michael Hanselmann
                      (result.cmd, result.fail_reason))
100 d5fe5fa9 Michael Hanselmann
101 d5fe5fa9 Michael Hanselmann
    for (filename, backup) in clean_files:
102 d5fe5fa9 Michael Hanselmann
      if os.path.exists(filename):
103 d5fe5fa9 Michael Hanselmann
        if opts.backup and backup:
104 d5fe5fa9 Michael Hanselmann
          logging.info("Backing up %s", filename)
105 d5fe5fa9 Michael Hanselmann
          utils.CreateBackup(filename)
106 d5fe5fa9 Michael Hanselmann
107 d5fe5fa9 Michael Hanselmann
        logging.info("Removing %s", filename)
108 d5fe5fa9 Michael Hanselmann
        utils.RemoveFile(filename)
109 d5fe5fa9 Michael Hanselmann
110 d5fe5fa9 Michael Hanselmann
    logging.info("Node successfully cleaned")
111 d5fe5fa9 Michael Hanselmann
  except Exception, err: # pylint: disable=W0703
112 d5fe5fa9 Michael Hanselmann
    logging.debug("Caught unhandled exception", exc_info=True)
113 d5fe5fa9 Michael Hanselmann
114 d5fe5fa9 Michael Hanselmann
    (retcode, message) = cli.FormatError(err)
115 d5fe5fa9 Michael Hanselmann
    logging.error(message)
116 d5fe5fa9 Michael Hanselmann
117 d5fe5fa9 Michael Hanselmann
    return retcode
118 d5fe5fa9 Michael Hanselmann
  else:
119 d5fe5fa9 Michael Hanselmann
    return constants.EXIT_SUCCESS