Statistics
| Branch: | Tag: | Revision:

root / lib / tools / ensure_dirs.py @ 2958c56e

History | View | Annotate | Download (8.3 kB)

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

23 0d2bf835 René Nussbaumer
"""
24 0d2bf835 René Nussbaumer
25 0d2bf835 René Nussbaumer
import os
26 0d2bf835 René Nussbaumer
import os.path
27 0d2bf835 René Nussbaumer
import optparse
28 0d2bf835 René Nussbaumer
import sys
29 961226f6 Michael Hanselmann
import logging
30 0d2bf835 René Nussbaumer
31 0d2bf835 René Nussbaumer
from ganeti import constants
32 0d2bf835 René Nussbaumer
from ganeti import errors
33 0d2bf835 René Nussbaumer
from ganeti import runtime
34 0d2bf835 René Nussbaumer
from ganeti import ssconf
35 cb66225d Michael Hanselmann
from ganeti import utils
36 961226f6 Michael Hanselmann
from ganeti import cli
37 3329f4de Michael Hanselmann
from ganeti import pathutils
38 0d2bf835 René Nussbaumer
39 0d2bf835 René Nussbaumer
40 cb66225d Michael Hanselmann
(DIR,
41 cb66225d Michael Hanselmann
 FILE,
42 cb66225d Michael Hanselmann
 QUEUE_DIR) = range(1, 4)
43 cb66225d Michael Hanselmann
44 cb66225d Michael Hanselmann
ALL_TYPES = frozenset([
45 cb66225d Michael Hanselmann
  DIR,
46 cb66225d Michael Hanselmann
  FILE,
47 cb66225d Michael Hanselmann
  QUEUE_DIR,
48 cb66225d Michael Hanselmann
  ])
49 0d2bf835 René Nussbaumer
50 0d2bf835 René Nussbaumer
51 0d2bf835 René Nussbaumer
def RecursiveEnsure(path, uid, gid, dir_perm, file_perm):
52 0d2bf835 René Nussbaumer
  """Ensures permissions recursively down a directory.
53 0d2bf835 René Nussbaumer

54 0d2bf835 René Nussbaumer
  This functions walks the path and sets permissions accordingly.
55 0d2bf835 René Nussbaumer

56 0d2bf835 René Nussbaumer
  @param path: The absolute path to walk
57 0d2bf835 René Nussbaumer
  @param uid: The uid used as owner
58 0d2bf835 René Nussbaumer
  @param gid: The gid used as group
59 0d2bf835 René Nussbaumer
  @param dir_perm: The permission bits set for directories
60 0d2bf835 René Nussbaumer
  @param file_perm: The permission bits set for files
61 0d2bf835 René Nussbaumer

62 0d2bf835 René Nussbaumer
  """
63 0d2bf835 René Nussbaumer
  assert os.path.isabs(path), "Path %s is not absolute" % path
64 0d2bf835 René Nussbaumer
  assert os.path.isdir(path), "Path %s is not a dir" % path
65 0d2bf835 René Nussbaumer
66 961226f6 Michael Hanselmann
  logging.debug("Recursively processing %s", path)
67 961226f6 Michael Hanselmann
68 0d2bf835 René Nussbaumer
  for root, dirs, files in os.walk(path):
69 0d2bf835 René Nussbaumer
    for subdir in dirs:
70 b81b3c96 René Nussbaumer
      utils.EnforcePermission(os.path.join(root, subdir), dir_perm, uid=uid,
71 b81b3c96 René Nussbaumer
                              gid=gid)
72 0d2bf835 René Nussbaumer
73 0d2bf835 René Nussbaumer
    for filename in files:
74 b81b3c96 René Nussbaumer
      utils.EnforcePermission(os.path.join(root, filename), file_perm, uid=uid,
75 b81b3c96 René Nussbaumer
                              gid=gid)
76 0d2bf835 René Nussbaumer
77 0d2bf835 René Nussbaumer
78 cb66225d Michael Hanselmann
def EnsureQueueDir(path, mode, uid, gid):
79 cb66225d Michael Hanselmann
  """Sets the correct permissions on all job files in the queue.
80 cb66225d Michael Hanselmann

81 cb66225d Michael Hanselmann
  @param path: Directory path
82 cb66225d Michael Hanselmann
  @param mode: Wanted file mode
83 cb66225d Michael Hanselmann
  @param uid: Wanted user ID
84 cb66225d Michael Hanselmann
  @param gid: Wanted group ID
85 cb66225d Michael Hanselmann

86 cb66225d Michael Hanselmann
  """
87 cb66225d Michael Hanselmann
  for filename in utils.ListVisibleFiles(path):
88 cb66225d Michael Hanselmann
    if constants.JOB_FILE_RE.match(filename):
89 b81b3c96 René Nussbaumer
      utils.EnforcePermission(utils.PathJoin(path, filename), mode, uid=uid,
90 b81b3c96 René Nussbaumer
                              gid=gid)
91 cb66225d Michael Hanselmann
92 cb66225d Michael Hanselmann
93 0d2bf835 René Nussbaumer
def ProcessPath(path):
94 0d2bf835 René Nussbaumer
  """Processes a path component.
95 0d2bf835 René Nussbaumer

96 0d2bf835 René Nussbaumer
  @param path: A tuple of the path component to process
97 0d2bf835 René Nussbaumer

98 0d2bf835 René Nussbaumer
  """
99 0d2bf835 René Nussbaumer
  (pathname, pathtype, mode, uid, gid) = path[0:5]
100 0d2bf835 René Nussbaumer
101 0d2bf835 René Nussbaumer
  assert pathtype in ALL_TYPES
102 0d2bf835 René Nussbaumer
103 cb66225d Michael Hanselmann
  if pathtype in (DIR, QUEUE_DIR):
104 0d2bf835 René Nussbaumer
    # No additional parameters
105 0d2bf835 René Nussbaumer
    assert len(path[5:]) == 0
106 cb66225d Michael Hanselmann
    if pathtype == DIR:
107 b81b3c96 René Nussbaumer
      utils.MakeDirWithPerm(pathname, mode, uid, gid)
108 cb66225d Michael Hanselmann
    elif pathtype == QUEUE_DIR:
109 cb66225d Michael Hanselmann
      EnsureQueueDir(pathname, mode, uid, gid)
110 0d2bf835 René Nussbaumer
  elif pathtype == FILE:
111 0d2bf835 René Nussbaumer
    (must_exist, ) = path[5:]
112 b81b3c96 René Nussbaumer
    utils.EnforcePermission(pathname, mode, uid=uid, gid=gid,
113 b81b3c96 René Nussbaumer
                            must_exist=must_exist)
114 0d2bf835 René Nussbaumer
115 0d2bf835 René Nussbaumer
116 0d2bf835 René Nussbaumer
def GetPaths():
117 0d2bf835 René Nussbaumer
  """Returns a tuple of path objects to process.
118 0d2bf835 René Nussbaumer

119 0d2bf835 René Nussbaumer
  """
120 0d2bf835 René Nussbaumer
  getent = runtime.GetEnts()
121 3a6a89d7 Michael Hanselmann
  masterd_log = constants.DAEMONS_LOGFILES[constants.MASTERD]
122 3a6a89d7 Michael Hanselmann
  noded_log = constants.DAEMONS_LOGFILES[constants.NODED]
123 3a6a89d7 Michael Hanselmann
  confd_log = constants.DAEMONS_LOGFILES[constants.CONFD]
124 3a6a89d7 Michael Hanselmann
  rapi_log = constants.DAEMONS_LOGFILES[constants.RAPI]
125 0d2bf835 René Nussbaumer
126 7e97aca4 Michael Hanselmann
  rapi_dir = os.path.join(pathutils.DATA_DIR, "rapi")
127 2958c56e Michael Hanselmann
  cleaner_log_dir = os.path.join(pathutils.LOG_DIR, "cleaner")
128 2958c56e Michael Hanselmann
  master_cleaner_log_dir = os.path.join(pathutils.LOG_DIR, "master-cleaner")
129 0d2bf835 René Nussbaumer
130 0d2bf835 René Nussbaumer
  paths = [
131 7e97aca4 Michael Hanselmann
    (pathutils.DATA_DIR, DIR, 0755, getent.masterd_uid,
132 0d2bf835 René Nussbaumer
     getent.masterd_gid),
133 7e97aca4 Michael Hanselmann
    (pathutils.CLUSTER_DOMAIN_SECRET_FILE, FILE, 0640,
134 0d2bf835 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid, False),
135 7e97aca4 Michael Hanselmann
    (pathutils.CLUSTER_CONF_FILE, FILE, 0640, getent.masterd_uid,
136 0d2bf835 René Nussbaumer
     getent.confd_gid, False),
137 7e97aca4 Michael Hanselmann
    (pathutils.CONFD_HMAC_KEY, FILE, 0440, getent.confd_uid,
138 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
139 7e97aca4 Michael Hanselmann
    (pathutils.SSH_KNOWN_HOSTS_FILE, FILE, 0644, getent.masterd_uid,
140 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
141 7e97aca4 Michael Hanselmann
    (pathutils.RAPI_CERT_FILE, FILE, 0440, getent.rapi_uid,
142 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
143 7e97aca4 Michael Hanselmann
    (pathutils.SPICE_CERT_FILE, FILE, 0440, getent.noded_uid,
144 bfe86c76 Andrea Spadaccini
     getent.masterd_gid, False),
145 7e97aca4 Michael Hanselmann
    (pathutils.SPICE_CACERT_FILE, FILE, 0440, getent.noded_uid,
146 bfe86c76 Andrea Spadaccini
     getent.masterd_gid, False),
147 7e97aca4 Michael Hanselmann
    (pathutils.NODED_CERT_FILE, FILE, 0440, getent.masterd_uid,
148 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
149 0d2bf835 René Nussbaumer
    ]
150 0d2bf835 René Nussbaumer
151 0d2bf835 René Nussbaumer
  ss = ssconf.SimpleStore()
152 0d2bf835 René Nussbaumer
  for ss_path in ss.GetFileList():
153 cd57bab6 Michael Hanselmann
    paths.append((ss_path, FILE, constants.SS_FILE_PERMS,
154 6a5e841d Michael Hanselmann
                  getent.noded_uid, getent.noded_gid, False))
155 0d2bf835 René Nussbaumer
156 0d2bf835 René Nussbaumer
  paths.extend([
157 7e97aca4 Michael Hanselmann
    (pathutils.QUEUE_DIR, DIR, 0700, getent.masterd_uid,
158 0d2bf835 René Nussbaumer
     getent.masterd_gid),
159 7e97aca4 Michael Hanselmann
    (pathutils.QUEUE_DIR, QUEUE_DIR, 0600, getent.masterd_uid,
160 cb66225d Michael Hanselmann
     getent.masterd_gid),
161 7e97aca4 Michael Hanselmann
    (pathutils.JOB_QUEUE_LOCK_FILE, FILE, 0600,
162 247ee81f Michael Hanselmann
     getent.masterd_uid, getent.masterd_gid, False),
163 7e97aca4 Michael Hanselmann
    (pathutils.JOB_QUEUE_SERIAL_FILE, FILE, 0600,
164 0d2bf835 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid, False),
165 7e97aca4 Michael Hanselmann
    (pathutils.JOB_QUEUE_VERSION_FILE, FILE, 0600,
166 69f78cf7 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid, False),
167 7e97aca4 Michael Hanselmann
    (pathutils.JOB_QUEUE_ARCHIVE_DIR, DIR, 0700,
168 0d2bf835 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid),
169 0d2bf835 René Nussbaumer
    (rapi_dir, DIR, 0750, getent.rapi_uid, getent.masterd_gid),
170 7e97aca4 Michael Hanselmann
    (pathutils.RAPI_USERS_FILE, FILE, 0640, getent.rapi_uid,
171 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
172 7e97aca4 Michael Hanselmann
    (pathutils.RUN_DIR, DIR, 0775, getent.masterd_uid,
173 0d2bf835 René Nussbaumer
     getent.daemons_gid),
174 7e97aca4 Michael Hanselmann
    (pathutils.SOCKET_DIR, DIR, 0750, getent.masterd_uid,
175 0d2bf835 René Nussbaumer
     getent.daemons_gid),
176 7e97aca4 Michael Hanselmann
    (pathutils.MASTER_SOCKET, FILE, 0770, getent.masterd_uid,
177 0d2bf835 René Nussbaumer
     getent.daemons_gid, False),
178 7e97aca4 Michael Hanselmann
    (pathutils.BDEV_CACHE_DIR, DIR, 0755, getent.noded_uid,
179 0d2bf835 René Nussbaumer
     getent.masterd_gid),
180 7e97aca4 Michael Hanselmann
    (pathutils.UIDPOOL_LOCKDIR, DIR, 0750, getent.noded_uid,
181 0d2bf835 René Nussbaumer
     getent.masterd_gid),
182 7e97aca4 Michael Hanselmann
    (pathutils.DISK_LINKS_DIR, DIR, 0755, getent.noded_uid,
183 0d2bf835 René Nussbaumer
     getent.masterd_gid),
184 7e97aca4 Michael Hanselmann
    (pathutils.CRYPTO_KEYS_DIR, DIR, 0700, getent.noded_uid,
185 0d2bf835 René Nussbaumer
     getent.masterd_gid),
186 7e97aca4 Michael Hanselmann
    (pathutils.IMPORT_EXPORT_DIR, DIR, 0755, getent.noded_uid,
187 0d2bf835 René Nussbaumer
     getent.masterd_gid),
188 7e97aca4 Michael Hanselmann
    (pathutils.LOG_DIR, DIR, 0770, getent.masterd_uid,
189 0d2bf835 René Nussbaumer
     getent.daemons_gid),
190 0d2bf835 René Nussbaumer
    (masterd_log, FILE, 0600, getent.masterd_uid, getent.masterd_gid,
191 0d2bf835 René Nussbaumer
     False),
192 0d2bf835 René Nussbaumer
    (confd_log, FILE, 0600, getent.confd_uid, getent.masterd_gid, False),
193 0d2bf835 René Nussbaumer
    (noded_log, FILE, 0600, getent.noded_uid, getent.masterd_gid, False),
194 0d2bf835 René Nussbaumer
    (rapi_log, FILE, 0600, getent.rapi_uid, getent.masterd_gid, False),
195 7e97aca4 Michael Hanselmann
    (pathutils.LOG_OS_DIR, DIR, 0750, getent.masterd_uid,
196 0d2bf835 René Nussbaumer
     getent.daemons_gid),
197 2958c56e Michael Hanselmann
    (cleaner_log_dir, DIR, 0750, getent.noded_uid, getent.noded_gid),
198 2958c56e Michael Hanselmann
    (master_cleaner_log_dir, DIR, 0750, getent.masterd_uid, getent.masterd_gid),
199 0d2bf835 René Nussbaumer
    ])
200 0d2bf835 René Nussbaumer
201 39b8cd94 Michael Hanselmann
  return paths
202 0d2bf835 René Nussbaumer
203 0d2bf835 René Nussbaumer
204 961226f6 Michael Hanselmann
def SetupLogging(opts):
205 961226f6 Michael Hanselmann
  """Configures the logging module.
206 961226f6 Michael Hanselmann

207 961226f6 Michael Hanselmann
  """
208 961226f6 Michael Hanselmann
  formatter = logging.Formatter("%(asctime)s: %(message)s")
209 961226f6 Michael Hanselmann
210 961226f6 Michael Hanselmann
  stderr_handler = logging.StreamHandler()
211 961226f6 Michael Hanselmann
  stderr_handler.setFormatter(formatter)
212 961226f6 Michael Hanselmann
  if opts.debug:
213 961226f6 Michael Hanselmann
    stderr_handler.setLevel(logging.NOTSET)
214 961226f6 Michael Hanselmann
  elif opts.verbose:
215 961226f6 Michael Hanselmann
    stderr_handler.setLevel(logging.INFO)
216 961226f6 Michael Hanselmann
  else:
217 961226f6 Michael Hanselmann
    stderr_handler.setLevel(logging.WARNING)
218 961226f6 Michael Hanselmann
219 961226f6 Michael Hanselmann
  root_logger = logging.getLogger("")
220 961226f6 Michael Hanselmann
  root_logger.setLevel(logging.NOTSET)
221 961226f6 Michael Hanselmann
  root_logger.addHandler(stderr_handler)
222 961226f6 Michael Hanselmann
223 961226f6 Michael Hanselmann
224 0d2bf835 René Nussbaumer
def ParseOptions():
225 0d2bf835 René Nussbaumer
  """Parses the options passed to the program.
226 0d2bf835 René Nussbaumer

227 0d2bf835 René Nussbaumer
  @return: Options and arguments
228 0d2bf835 René Nussbaumer

229 0d2bf835 René Nussbaumer
  """
230 0d2bf835 René Nussbaumer
  program = os.path.basename(sys.argv[0])
231 0d2bf835 René Nussbaumer
232 0d2bf835 René Nussbaumer
  parser = optparse.OptionParser(usage="%%prog [--full-run]",
233 0d2bf835 René Nussbaumer
                                 prog=program)
234 961226f6 Michael Hanselmann
  parser.add_option(cli.DEBUG_OPT)
235 961226f6 Michael Hanselmann
  parser.add_option(cli.VERBOSE_OPT)
236 0d2bf835 René Nussbaumer
  parser.add_option("--full-run", "-f", dest="full_run", action="store_true",
237 297657a2 Michael Hanselmann
                    default=False, help=("Make a full run and set permissions"
238 297657a2 Michael Hanselmann
                                         " on archived jobs (time consuming)"))
239 0d2bf835 René Nussbaumer
240 0d2bf835 René Nussbaumer
  return parser.parse_args()
241 0d2bf835 René Nussbaumer
242 0d2bf835 René Nussbaumer
243 0d2bf835 René Nussbaumer
def Main():
244 0d2bf835 René Nussbaumer
  """Main routine.
245 0d2bf835 René Nussbaumer

246 0d2bf835 René Nussbaumer
  """
247 0d2bf835 René Nussbaumer
  (opts, _) = ParseOptions()
248 0d2bf835 René Nussbaumer
249 961226f6 Michael Hanselmann
  SetupLogging(opts)
250 961226f6 Michael Hanselmann
251 961226f6 Michael Hanselmann
  if opts.full_run:
252 961226f6 Michael Hanselmann
    logging.info("Running in full mode")
253 961226f6 Michael Hanselmann
254 961226f6 Michael Hanselmann
  getent = runtime.GetEnts()
255 961226f6 Michael Hanselmann
256 0d2bf835 René Nussbaumer
  try:
257 0d2bf835 René Nussbaumer
    for path in GetPaths():
258 0d2bf835 René Nussbaumer
      ProcessPath(path)
259 0d2bf835 René Nussbaumer
260 0d2bf835 René Nussbaumer
    if opts.full_run:
261 7e97aca4 Michael Hanselmann
      RecursiveEnsure(pathutils.JOB_QUEUE_ARCHIVE_DIR, getent.masterd_uid,
262 0d2bf835 René Nussbaumer
                      getent.masterd_gid, 0700, 0600)
263 b81b3c96 René Nussbaumer
  except errors.GenericError, err:
264 961226f6 Michael Hanselmann
    logging.error("An error occurred while setting permissions: %s", err)
265 0d2bf835 René Nussbaumer
    return constants.EXIT_FAILURE
266 0d2bf835 René Nussbaumer
267 0d2bf835 René Nussbaumer
  return constants.EXIT_SUCCESS