Statistics
| Branch: | Tag: | Revision:

root / lib / tools / ensure_dirs.py @ 22114677

History | View | Annotate | Download (9.1 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 b8028dcf Michael Hanselmann
from ganeti import compat
39 0d2bf835 René Nussbaumer
40 0d2bf835 René Nussbaumer
41 cb66225d Michael Hanselmann
(DIR,
42 cb66225d Michael Hanselmann
 FILE,
43 cb66225d Michael Hanselmann
 QUEUE_DIR) = range(1, 4)
44 cb66225d Michael Hanselmann
45 b8028dcf Michael Hanselmann
ALL_TYPES = compat.UniqueFrozenset([
46 cb66225d Michael Hanselmann
  DIR,
47 cb66225d Michael Hanselmann
  FILE,
48 cb66225d Michael Hanselmann
  QUEUE_DIR,
49 cb66225d Michael Hanselmann
  ])
50 0d2bf835 René Nussbaumer
51 0d2bf835 René Nussbaumer
52 0d2bf835 René Nussbaumer
def RecursiveEnsure(path, uid, gid, dir_perm, file_perm):
53 0d2bf835 René Nussbaumer
  """Ensures permissions recursively down a directory.
54 0d2bf835 René Nussbaumer

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

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

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

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

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

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

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

120 0d2bf835 René Nussbaumer
  """
121 0d2bf835 René Nussbaumer
  getent = runtime.GetEnts()
122 3a6a89d7 Michael Hanselmann
  masterd_log = constants.DAEMONS_LOGFILES[constants.MASTERD]
123 3a6a89d7 Michael Hanselmann
  noded_log = constants.DAEMONS_LOGFILES[constants.NODED]
124 3a6a89d7 Michael Hanselmann
  confd_log = constants.DAEMONS_LOGFILES[constants.CONFD]
125 d08a8359 Thomas Thrainer
  luxid_log = constants.DAEMONS_LOGFILES[constants.LUXID]
126 3a6a89d7 Michael Hanselmann
  rapi_log = constants.DAEMONS_LOGFILES[constants.RAPI]
127 d08a8359 Thomas Thrainer
  mond_log = constants.DAEMONS_LOGFILES[constants.MOND]
128 0d2bf835 René Nussbaumer
129 7e97aca4 Michael Hanselmann
  rapi_dir = os.path.join(pathutils.DATA_DIR, "rapi")
130 2958c56e Michael Hanselmann
  cleaner_log_dir = os.path.join(pathutils.LOG_DIR, "cleaner")
131 2958c56e Michael Hanselmann
  master_cleaner_log_dir = os.path.join(pathutils.LOG_DIR, "master-cleaner")
132 0d2bf835 René Nussbaumer
133 e37f47d3 Michael Hanselmann
  # A note on the ordering: The parent directory (type C{DIR}) must always be
134 e37f47d3 Michael Hanselmann
  # listed before files (type C{FILE}) in that directory. Once the directory is
135 e37f47d3 Michael Hanselmann
  # set, only files directly in that directory can be listed.
136 0d2bf835 René Nussbaumer
  paths = [
137 af8f2fbf Michael Hanselmann
    (pathutils.DATA_DIR, DIR, 0755, getent.masterd_uid, getent.masterd_gid),
138 7e97aca4 Michael Hanselmann
    (pathutils.CLUSTER_DOMAIN_SECRET_FILE, FILE, 0640,
139 0d2bf835 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid, False),
140 af8f2fbf Michael Hanselmann
    (pathutils.CLUSTER_CONF_FILE, FILE, 0640,
141 af8f2fbf Michael Hanselmann
     getent.masterd_uid, getent.confd_gid, False),
142 af8f2fbf Michael Hanselmann
    (pathutils.CONFD_HMAC_KEY, FILE, 0440,
143 af8f2fbf Michael Hanselmann
     getent.confd_uid, getent.masterd_gid, False),
144 af8f2fbf Michael Hanselmann
    (pathutils.SSH_KNOWN_HOSTS_FILE, FILE, 0644,
145 af8f2fbf Michael Hanselmann
     getent.masterd_uid, getent.masterd_gid, False),
146 af8f2fbf Michael Hanselmann
    (pathutils.RAPI_CERT_FILE, FILE, 0440,
147 af8f2fbf Michael Hanselmann
     getent.rapi_uid, getent.masterd_gid, False),
148 af8f2fbf Michael Hanselmann
    (pathutils.SPICE_CERT_FILE, FILE, 0440,
149 af8f2fbf Michael Hanselmann
     getent.noded_uid, getent.masterd_gid, False),
150 af8f2fbf Michael Hanselmann
    (pathutils.SPICE_CACERT_FILE, FILE, 0440,
151 af8f2fbf Michael Hanselmann
     getent.noded_uid, getent.masterd_gid, False),
152 c9f79949 Michael Hanselmann
    (pathutils.NODED_CERT_FILE, FILE, pathutils.NODED_CERT_MODE,
153 c9f79949 Michael Hanselmann
     getent.masterd_uid, getent.masterd_gid, False),
154 22114677 Helga Velroyen
    (pathutils.NODED_CLIENT_CERT_FILE, FILE, pathutils.NODED_CERT_MODE,
155 22114677 Helga Velroyen
     getent.masterd_uid, getent.masterd_gid, False),
156 9eac61f8 Michael Hanselmann
    (pathutils.WATCHER_PAUSEFILE, FILE, 0644,
157 9eac61f8 Michael Hanselmann
     getent.masterd_uid, getent.masterd_gid, False),
158 0d2bf835 René Nussbaumer
    ]
159 0d2bf835 René Nussbaumer
160 0d2bf835 René Nussbaumer
  ss = ssconf.SimpleStore()
161 0d2bf835 René Nussbaumer
  for ss_path in ss.GetFileList():
162 cd57bab6 Michael Hanselmann
    paths.append((ss_path, FILE, constants.SS_FILE_PERMS,
163 6a5e841d Michael Hanselmann
                  getent.noded_uid, getent.noded_gid, False))
164 0d2bf835 René Nussbaumer
165 0d2bf835 René Nussbaumer
  paths.extend([
166 fe05a931 Michele Tartara
    (pathutils.QUEUE_DIR, DIR, 0750, getent.masterd_uid, getent.daemons_gid),
167 fe05a931 Michele Tartara
    (pathutils.QUEUE_DIR, QUEUE_DIR, constants.JOB_QUEUE_FILES_PERMS,
168 fe05a931 Michele Tartara
     getent.masterd_uid, getent.daemons_gid),
169 9eac61f8 Michael Hanselmann
    (pathutils.JOB_QUEUE_DRAIN_FILE, FILE, 0644,
170 fe05a931 Michele Tartara
     getent.masterd_uid, getent.daemons_gid, False),
171 fe05a931 Michele Tartara
    (pathutils.JOB_QUEUE_LOCK_FILE, FILE, constants.JOB_QUEUE_FILES_PERMS,
172 fe05a931 Michele Tartara
     getent.masterd_uid, getent.daemons_gid, False),
173 fe05a931 Michele Tartara
    (pathutils.JOB_QUEUE_SERIAL_FILE, FILE, constants.JOB_QUEUE_FILES_PERMS,
174 fe05a931 Michele Tartara
     getent.masterd_uid, getent.daemons_gid, False),
175 fe05a931 Michele Tartara
    (pathutils.JOB_QUEUE_VERSION_FILE, FILE, constants.JOB_QUEUE_FILES_PERMS,
176 fe05a931 Michele Tartara
     getent.masterd_uid, getent.daemons_gid, False),
177 cb474ee4 Guido Trotter
    (pathutils.JOB_QUEUE_ARCHIVE_DIR, DIR, 0750,
178 fe05a931 Michele Tartara
     getent.masterd_uid, getent.daemons_gid),
179 0d2bf835 René Nussbaumer
    (rapi_dir, DIR, 0750, getent.rapi_uid, getent.masterd_gid),
180 af8f2fbf Michael Hanselmann
    (pathutils.RAPI_USERS_FILE, FILE, 0640,
181 af8f2fbf Michael Hanselmann
     getent.rapi_uid, getent.masterd_gid, False),
182 af8f2fbf Michael Hanselmann
    (pathutils.RUN_DIR, DIR, 0775, getent.masterd_uid, getent.daemons_gid),
183 af8f2fbf Michael Hanselmann
    (pathutils.SOCKET_DIR, DIR, 0770, getent.masterd_uid, getent.daemons_gid),
184 af8f2fbf Michael Hanselmann
    (pathutils.MASTER_SOCKET, FILE, 0660,
185 af8f2fbf Michael Hanselmann
     getent.masterd_uid, getent.daemons_gid, False),
186 8526052d Guido Trotter
    (pathutils.QUERY_SOCKET, FILE, 0660,
187 3695a4e0 Thomas Thrainer
     getent.luxid_uid, getent.daemons_gid, False),
188 af8f2fbf Michael Hanselmann
    (pathutils.BDEV_CACHE_DIR, DIR, 0755,
189 af8f2fbf Michael Hanselmann
     getent.noded_uid, getent.masterd_gid),
190 af8f2fbf Michael Hanselmann
    (pathutils.UIDPOOL_LOCKDIR, DIR, 0750,
191 af8f2fbf Michael Hanselmann
     getent.noded_uid, getent.masterd_gid),
192 af8f2fbf Michael Hanselmann
    (pathutils.DISK_LINKS_DIR, DIR, 0755,
193 af8f2fbf Michael Hanselmann
     getent.noded_uid, getent.masterd_gid),
194 af8f2fbf Michael Hanselmann
    (pathutils.CRYPTO_KEYS_DIR, DIR, 0700,
195 af8f2fbf Michael Hanselmann
     getent.noded_uid, getent.masterd_gid),
196 af8f2fbf Michael Hanselmann
    (pathutils.IMPORT_EXPORT_DIR, DIR, 0755,
197 af8f2fbf Michael Hanselmann
     getent.noded_uid, getent.masterd_gid),
198 af8f2fbf Michael Hanselmann
    (pathutils.LOG_DIR, DIR, 0770, getent.masterd_uid, getent.daemons_gid),
199 af8f2fbf Michael Hanselmann
    (masterd_log, FILE, 0600, getent.masterd_uid, getent.masterd_gid, False),
200 0d2bf835 René Nussbaumer
    (confd_log, FILE, 0600, getent.confd_uid, getent.masterd_gid, False),
201 d08a8359 Thomas Thrainer
    (luxid_log, FILE, 0600, getent.luxid_uid, getent.masterd_gid, False),
202 0d2bf835 René Nussbaumer
    (noded_log, FILE, 0600, getent.noded_uid, getent.masterd_gid, False),
203 0d2bf835 René Nussbaumer
    (rapi_log, FILE, 0600, getent.rapi_uid, getent.masterd_gid, False),
204 d08a8359 Thomas Thrainer
    (mond_log, FILE, 0600, getent.mond_uid, getent.masterd_gid, False),
205 6b3f0d7e Balazs Lecz
    (pathutils.LOG_OS_DIR, DIR, 0750, getent.noded_uid, getent.daemons_gid),
206 48bba9de Balazs Lecz
    (pathutils.LOG_XEN_DIR, DIR, 0750, getent.noded_uid, getent.daemons_gid),
207 2958c56e Michael Hanselmann
    (cleaner_log_dir, DIR, 0750, getent.noded_uid, getent.noded_gid),
208 2958c56e Michael Hanselmann
    (master_cleaner_log_dir, DIR, 0750, getent.masterd_uid, getent.masterd_gid),
209 a59d5fa1 Michele Tartara
    (pathutils.INSTANCE_REASON_DIR, DIR, 0755, getent.noded_uid,
210 a59d5fa1 Michele Tartara
     getent.noded_gid),
211 0d2bf835 René Nussbaumer
    ])
212 0d2bf835 René Nussbaumer
213 39b8cd94 Michael Hanselmann
  return paths
214 0d2bf835 René Nussbaumer
215 0d2bf835 René Nussbaumer
216 0d2bf835 René Nussbaumer
def ParseOptions():
217 0d2bf835 René Nussbaumer
  """Parses the options passed to the program.
218 0d2bf835 René Nussbaumer

219 0d2bf835 René Nussbaumer
  @return: Options and arguments
220 0d2bf835 René Nussbaumer

221 0d2bf835 René Nussbaumer
  """
222 0d2bf835 René Nussbaumer
  program = os.path.basename(sys.argv[0])
223 0d2bf835 René Nussbaumer
224 8d77ac10 Michael Hanselmann
  parser = optparse.OptionParser(usage="%prog [--full-run]",
225 0d2bf835 René Nussbaumer
                                 prog=program)
226 961226f6 Michael Hanselmann
  parser.add_option(cli.DEBUG_OPT)
227 961226f6 Michael Hanselmann
  parser.add_option(cli.VERBOSE_OPT)
228 0d2bf835 René Nussbaumer
  parser.add_option("--full-run", "-f", dest="full_run", action="store_true",
229 297657a2 Michael Hanselmann
                    default=False, help=("Make a full run and set permissions"
230 297657a2 Michael Hanselmann
                                         " on archived jobs (time consuming)"))
231 0d2bf835 René Nussbaumer
232 0d2bf835 René Nussbaumer
  return parser.parse_args()
233 0d2bf835 René Nussbaumer
234 0d2bf835 René Nussbaumer
235 0d2bf835 René Nussbaumer
def Main():
236 0d2bf835 René Nussbaumer
  """Main routine.
237 0d2bf835 René Nussbaumer

238 0d2bf835 René Nussbaumer
  """
239 fca74633 Michael Hanselmann
  (opts, args) = ParseOptions()
240 0d2bf835 René Nussbaumer
241 796b5152 Michael Hanselmann
  utils.SetupToolLogging(opts.debug, opts.verbose)
242 961226f6 Michael Hanselmann
243 fca74633 Michael Hanselmann
  if args:
244 fca74633 Michael Hanselmann
    logging.error("No arguments are expected")
245 fca74633 Michael Hanselmann
    return constants.EXIT_FAILURE
246 fca74633 Michael Hanselmann
247 961226f6 Michael Hanselmann
  if opts.full_run:
248 961226f6 Michael Hanselmann
    logging.info("Running in full mode")
249 961226f6 Michael Hanselmann
250 961226f6 Michael Hanselmann
  getent = runtime.GetEnts()
251 961226f6 Michael Hanselmann
252 0d2bf835 René Nussbaumer
  try:
253 0d2bf835 René Nussbaumer
    for path in GetPaths():
254 0d2bf835 René Nussbaumer
      ProcessPath(path)
255 0d2bf835 René Nussbaumer
256 0d2bf835 René Nussbaumer
    if opts.full_run:
257 7e97aca4 Michael Hanselmann
      RecursiveEnsure(pathutils.JOB_QUEUE_ARCHIVE_DIR, getent.masterd_uid,
258 fe05a931 Michele Tartara
                      getent.daemons_gid, 0750, constants.JOB_QUEUE_FILES_PERMS)
259 b81b3c96 René Nussbaumer
  except errors.GenericError, err:
260 961226f6 Michael Hanselmann
    logging.error("An error occurred while setting permissions: %s", err)
261 0d2bf835 René Nussbaumer
    return constants.EXIT_FAILURE
262 0d2bf835 René Nussbaumer
263 0d2bf835 René Nussbaumer
  return constants.EXIT_SUCCESS