Statistics
| Branch: | Tag: | Revision:

root / lib / tools / ensure_dirs.py @ a629ecb9

History | View | Annotate | Download (10.2 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 errno
26 0d2bf835 René Nussbaumer
import os
27 0d2bf835 René Nussbaumer
import os.path
28 0d2bf835 René Nussbaumer
import optparse
29 0d2bf835 René Nussbaumer
import sys
30 0d2bf835 René Nussbaumer
import stat
31 961226f6 Michael Hanselmann
import logging
32 0d2bf835 René Nussbaumer
33 0d2bf835 René Nussbaumer
from ganeti import constants
34 0d2bf835 René Nussbaumer
from ganeti import errors
35 0d2bf835 René Nussbaumer
from ganeti import runtime
36 0d2bf835 René Nussbaumer
from ganeti import ssconf
37 cb66225d Michael Hanselmann
from ganeti import utils
38 961226f6 Michael Hanselmann
from ganeti import cli
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 cb66225d Michael Hanselmann
ALL_TYPES = frozenset([
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
class EnsureError(errors.GenericError):
53 0d2bf835 René Nussbaumer
  """Top-level error class related to this script.
54 0d2bf835 René Nussbaumer

55 0d2bf835 René Nussbaumer
  """
56 0d2bf835 René Nussbaumer
57 0d2bf835 René Nussbaumer
58 0d2bf835 René Nussbaumer
def EnsurePermission(path, mode, uid=-1, gid=-1, must_exist=True,
59 c3f54085 Michael Hanselmann
                     _chmod_fn=os.chmod, _chown_fn=os.chown, _stat_fn=os.stat):
60 0d2bf835 René Nussbaumer
  """Ensures that given path has given mode.
61 0d2bf835 René Nussbaumer

62 0d2bf835 René Nussbaumer
  @param path: The path to the file
63 0d2bf835 René Nussbaumer
  @param mode: The mode of the file
64 0d2bf835 René Nussbaumer
  @param uid: The uid of the owner of this file
65 0d2bf835 René Nussbaumer
  @param gid: The gid of the owner of this file
66 0d2bf835 René Nussbaumer
  @param must_exist: Specifies if non-existance of path will be an error
67 0d2bf835 René Nussbaumer
  @param _chmod_fn: chmod function to use (unittest only)
68 0d2bf835 René Nussbaumer
  @param _chown_fn: chown function to use (unittest only)
69 0d2bf835 René Nussbaumer

70 0d2bf835 René Nussbaumer
  """
71 961226f6 Michael Hanselmann
  logging.debug("Checking %s", path)
72 0d2bf835 René Nussbaumer
  try:
73 c3f54085 Michael Hanselmann
    st = _stat_fn(path)
74 c3f54085 Michael Hanselmann
75 c3f54085 Michael Hanselmann
    fmode = stat.S_IMODE(st[stat.ST_MODE])
76 c3f54085 Michael Hanselmann
    if fmode != mode:
77 c3f54085 Michael Hanselmann
      logging.debug("Changing mode of %s from %#o to %#o", path, fmode, mode)
78 c3f54085 Michael Hanselmann
      _chmod_fn(path, mode)
79 0d2bf835 René Nussbaumer
80 0d2bf835 René Nussbaumer
    if max(uid, gid) > -1:
81 c3f54085 Michael Hanselmann
      fuid = st[stat.ST_UID]
82 c3f54085 Michael Hanselmann
      fgid = st[stat.ST_GID]
83 c3f54085 Michael Hanselmann
      if fuid != uid or fgid != gid:
84 c3f54085 Michael Hanselmann
        logging.debug("Changing owner of %s from UID %s/GID %s to"
85 c3f54085 Michael Hanselmann
                      " UID %s/GID %s", path, fuid, fgid, uid, gid)
86 c3f54085 Michael Hanselmann
        _chown_fn(path, uid, gid)
87 0d2bf835 René Nussbaumer
  except EnvironmentError, err:
88 0d2bf835 René Nussbaumer
    if err.errno == errno.ENOENT:
89 0d2bf835 René Nussbaumer
      if must_exist:
90 297657a2 Michael Hanselmann
        raise EnsureError("Path %s should exist, but does not" % path)
91 0d2bf835 René Nussbaumer
    else:
92 297657a2 Michael Hanselmann
      raise EnsureError("Error while changing permissions on %s: %s" %
93 0d2bf835 René Nussbaumer
                        (path, err))
94 0d2bf835 René Nussbaumer
95 0d2bf835 René Nussbaumer
96 d00a730d Michael Hanselmann
def EnsureDir(path, mode, uid, gid, _lstat_fn=os.lstat, _mkdir_fn=os.mkdir,
97 0d2bf835 René Nussbaumer
              _ensure_fn=EnsurePermission):
98 0d2bf835 René Nussbaumer
  """Ensures that given path is a dir and has given mode, uid and gid set.
99 0d2bf835 René Nussbaumer

100 0d2bf835 René Nussbaumer
  @param path: The path to the file
101 0d2bf835 René Nussbaumer
  @param mode: The mode of the file
102 0d2bf835 René Nussbaumer
  @param uid: The uid of the owner of this file
103 0d2bf835 René Nussbaumer
  @param gid: The gid of the owner of this file
104 a95f19d7 Michael Hanselmann
  @param _lstat_fn: Stat function to use (unittest only)
105 0d2bf835 René Nussbaumer
  @param _mkdir_fn: mkdir function to use (unittest only)
106 0d2bf835 René Nussbaumer
  @param _ensure_fn: ensure function to use (unittest only)
107 0d2bf835 René Nussbaumer

108 0d2bf835 René Nussbaumer
  """
109 961226f6 Michael Hanselmann
  logging.debug("Checking directory %s", path)
110 0d2bf835 René Nussbaumer
  try:
111 0d2bf835 René Nussbaumer
    # We don't want to follow symlinks
112 d00a730d Michael Hanselmann
    st = _lstat_fn(path)
113 0d2bf835 René Nussbaumer
  except EnvironmentError, err:
114 d00a730d Michael Hanselmann
    if err.errno != errno.ENOENT:
115 d00a730d Michael Hanselmann
      raise EnsureError("stat(2) on %s failed: %s" % (path, err))
116 d00a730d Michael Hanselmann
    _mkdir_fn(path)
117 d00a730d Michael Hanselmann
  else:
118 d00a730d Michael Hanselmann
    if not stat.S_ISDIR(st[stat.ST_MODE]):
119 d00a730d Michael Hanselmann
      raise EnsureError("Path %s is expected to be a directory, but isn't" %
120 d00a730d Michael Hanselmann
                        path)
121 0d2bf835 René Nussbaumer
122 0d2bf835 René Nussbaumer
  _ensure_fn(path, mode, uid=uid, gid=gid)
123 0d2bf835 René Nussbaumer
124 0d2bf835 René Nussbaumer
125 0d2bf835 René Nussbaumer
def RecursiveEnsure(path, uid, gid, dir_perm, file_perm):
126 0d2bf835 René Nussbaumer
  """Ensures permissions recursively down a directory.
127 0d2bf835 René Nussbaumer

128 0d2bf835 René Nussbaumer
  This functions walks the path and sets permissions accordingly.
129 0d2bf835 René Nussbaumer

130 0d2bf835 René Nussbaumer
  @param path: The absolute path to walk
131 0d2bf835 René Nussbaumer
  @param uid: The uid used as owner
132 0d2bf835 René Nussbaumer
  @param gid: The gid used as group
133 0d2bf835 René Nussbaumer
  @param dir_perm: The permission bits set for directories
134 0d2bf835 René Nussbaumer
  @param file_perm: The permission bits set for files
135 0d2bf835 René Nussbaumer

136 0d2bf835 René Nussbaumer
  """
137 0d2bf835 René Nussbaumer
  assert os.path.isabs(path), "Path %s is not absolute" % path
138 0d2bf835 René Nussbaumer
  assert os.path.isdir(path), "Path %s is not a dir" % path
139 0d2bf835 René Nussbaumer
140 961226f6 Michael Hanselmann
  logging.debug("Recursively processing %s", path)
141 961226f6 Michael Hanselmann
142 0d2bf835 René Nussbaumer
  for root, dirs, files in os.walk(path):
143 0d2bf835 René Nussbaumer
    for subdir in dirs:
144 0d2bf835 René Nussbaumer
      EnsurePermission(os.path.join(root, subdir), dir_perm, uid=uid, gid=gid)
145 0d2bf835 René Nussbaumer
146 0d2bf835 René Nussbaumer
    for filename in files:
147 0d2bf835 René Nussbaumer
      EnsurePermission(os.path.join(root, filename), file_perm, uid=uid,
148 0d2bf835 René Nussbaumer
                       gid=gid)
149 0d2bf835 René Nussbaumer
150 0d2bf835 René Nussbaumer
151 cb66225d Michael Hanselmann
def EnsureQueueDir(path, mode, uid, gid):
152 cb66225d Michael Hanselmann
  """Sets the correct permissions on all job files in the queue.
153 cb66225d Michael Hanselmann

154 cb66225d Michael Hanselmann
  @param path: Directory path
155 cb66225d Michael Hanselmann
  @param mode: Wanted file mode
156 cb66225d Michael Hanselmann
  @param uid: Wanted user ID
157 cb66225d Michael Hanselmann
  @param gid: Wanted group ID
158 cb66225d Michael Hanselmann

159 cb66225d Michael Hanselmann
  """
160 cb66225d Michael Hanselmann
  for filename in utils.ListVisibleFiles(path):
161 cb66225d Michael Hanselmann
    if constants.JOB_FILE_RE.match(filename):
162 cb66225d Michael Hanselmann
      EnsurePermission(utils.PathJoin(path, filename), mode, uid=uid, gid=gid)
163 cb66225d Michael Hanselmann
164 cb66225d Michael Hanselmann
165 0d2bf835 René Nussbaumer
def ProcessPath(path):
166 0d2bf835 René Nussbaumer
  """Processes a path component.
167 0d2bf835 René Nussbaumer

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

170 0d2bf835 René Nussbaumer
  """
171 0d2bf835 René Nussbaumer
  (pathname, pathtype, mode, uid, gid) = path[0:5]
172 0d2bf835 René Nussbaumer
173 0d2bf835 René Nussbaumer
  assert pathtype in ALL_TYPES
174 0d2bf835 René Nussbaumer
175 cb66225d Michael Hanselmann
  if pathtype in (DIR, QUEUE_DIR):
176 0d2bf835 René Nussbaumer
    # No additional parameters
177 0d2bf835 René Nussbaumer
    assert len(path[5:]) == 0
178 cb66225d Michael Hanselmann
    if pathtype == DIR:
179 cb66225d Michael Hanselmann
      EnsureDir(pathname, mode, uid, gid)
180 cb66225d Michael Hanselmann
    elif pathtype == QUEUE_DIR:
181 cb66225d Michael Hanselmann
      EnsureQueueDir(pathname, mode, uid, gid)
182 0d2bf835 René Nussbaumer
  elif pathtype == FILE:
183 0d2bf835 René Nussbaumer
    (must_exist, ) = path[5:]
184 0d2bf835 René Nussbaumer
    EnsurePermission(pathname, mode, uid=uid, gid=gid, must_exist=must_exist)
185 0d2bf835 René Nussbaumer
186 0d2bf835 René Nussbaumer
187 0d2bf835 René Nussbaumer
def GetPaths():
188 0d2bf835 René Nussbaumer
  """Returns a tuple of path objects to process.
189 0d2bf835 René Nussbaumer

190 0d2bf835 René Nussbaumer
  """
191 0d2bf835 René Nussbaumer
  getent = runtime.GetEnts()
192 0d2bf835 René Nussbaumer
  masterd_log = constants.DAEMONS_LOGFILES[constants.MASTERD]
193 0d2bf835 René Nussbaumer
  noded_log = constants.DAEMONS_LOGFILES[constants.NODED]
194 0d2bf835 René Nussbaumer
  confd_log = constants.DAEMONS_LOGFILES[constants.CONFD]
195 0d2bf835 René Nussbaumer
  rapi_log = constants.DAEMONS_LOGFILES[constants.RAPI]
196 0d2bf835 René Nussbaumer
197 0d2bf835 René Nussbaumer
  rapi_dir = os.path.join(constants.DATA_DIR, "rapi")
198 0d2bf835 René Nussbaumer
199 0d2bf835 René Nussbaumer
  paths = [
200 0d2bf835 René Nussbaumer
    (constants.DATA_DIR, DIR, 0755, getent.masterd_uid,
201 0d2bf835 René Nussbaumer
     getent.masterd_gid),
202 0d2bf835 René Nussbaumer
    (constants.CLUSTER_DOMAIN_SECRET_FILE, FILE, 0640,
203 0d2bf835 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid, False),
204 0d2bf835 René Nussbaumer
    (constants.CLUSTER_CONF_FILE, FILE, 0640, getent.masterd_uid,
205 0d2bf835 René Nussbaumer
     getent.confd_gid, False),
206 0d2bf835 René Nussbaumer
    (constants.CONFD_HMAC_KEY, FILE, 0440, getent.confd_uid,
207 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
208 0d2bf835 René Nussbaumer
    (constants.SSH_KNOWN_HOSTS_FILE, FILE, 0644, getent.masterd_uid,
209 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
210 0d2bf835 René Nussbaumer
    (constants.RAPI_CERT_FILE, FILE, 0440, getent.rapi_uid,
211 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
212 bfe86c76 Andrea Spadaccini
    (constants.SPICE_CERT_FILE, FILE, 0440, getent.noded_uid,
213 bfe86c76 Andrea Spadaccini
     getent.masterd_gid, False),
214 bfe86c76 Andrea Spadaccini
    (constants.SPICE_CACERT_FILE, FILE, 0440, getent.noded_uid,
215 bfe86c76 Andrea Spadaccini
     getent.masterd_gid, False),
216 0d2bf835 René Nussbaumer
    (constants.NODED_CERT_FILE, FILE, 0440, getent.masterd_uid,
217 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
218 0d2bf835 René Nussbaumer
    ]
219 0d2bf835 René Nussbaumer
220 0d2bf835 René Nussbaumer
  ss = ssconf.SimpleStore()
221 0d2bf835 René Nussbaumer
  for ss_path in ss.GetFileList():
222 cd57bab6 Michael Hanselmann
    paths.append((ss_path, FILE, constants.SS_FILE_PERMS,
223 cd57bab6 Michael Hanselmann
                  getent.noded_uid, 0, False))
224 0d2bf835 René Nussbaumer
225 0d2bf835 René Nussbaumer
  paths.extend([
226 0d2bf835 René Nussbaumer
    (constants.QUEUE_DIR, DIR, 0700, getent.masterd_uid,
227 0d2bf835 René Nussbaumer
     getent.masterd_gid),
228 cb66225d Michael Hanselmann
    (constants.QUEUE_DIR, QUEUE_DIR, 0600, getent.masterd_uid,
229 cb66225d Michael Hanselmann
     getent.masterd_gid),
230 247ee81f Michael Hanselmann
    (constants.JOB_QUEUE_LOCK_FILE, FILE, 0600,
231 247ee81f Michael Hanselmann
     getent.masterd_uid, getent.masterd_gid, False),
232 0d2bf835 René Nussbaumer
    (constants.JOB_QUEUE_SERIAL_FILE, FILE, 0600,
233 0d2bf835 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid, False),
234 0d2bf835 René Nussbaumer
    (constants.JOB_QUEUE_ARCHIVE_DIR, DIR, 0700,
235 0d2bf835 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid),
236 0d2bf835 René Nussbaumer
    (rapi_dir, DIR, 0750, getent.rapi_uid, getent.masterd_gid),
237 0d2bf835 René Nussbaumer
    (constants.RAPI_USERS_FILE, FILE, 0640, getent.rapi_uid,
238 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
239 0d2bf835 René Nussbaumer
    (constants.RUN_GANETI_DIR, DIR, 0775, getent.masterd_uid,
240 0d2bf835 René Nussbaumer
     getent.daemons_gid),
241 0d2bf835 René Nussbaumer
    (constants.SOCKET_DIR, DIR, 0750, getent.masterd_uid,
242 0d2bf835 René Nussbaumer
     getent.daemons_gid),
243 0d2bf835 René Nussbaumer
    (constants.MASTER_SOCKET, FILE, 0770, getent.masterd_uid,
244 0d2bf835 René Nussbaumer
     getent.daemons_gid, False),
245 0d2bf835 René Nussbaumer
    (constants.BDEV_CACHE_DIR, DIR, 0755, getent.noded_uid,
246 0d2bf835 René Nussbaumer
     getent.masterd_gid),
247 0d2bf835 René Nussbaumer
    (constants.UIDPOOL_LOCKDIR, DIR, 0750, getent.noded_uid,
248 0d2bf835 René Nussbaumer
     getent.masterd_gid),
249 0d2bf835 René Nussbaumer
    (constants.DISK_LINKS_DIR, DIR, 0755, getent.noded_uid,
250 0d2bf835 René Nussbaumer
     getent.masterd_gid),
251 0d2bf835 René Nussbaumer
    (constants.CRYPTO_KEYS_DIR, DIR, 0700, getent.noded_uid,
252 0d2bf835 René Nussbaumer
     getent.masterd_gid),
253 0d2bf835 René Nussbaumer
    (constants.IMPORT_EXPORT_DIR, DIR, 0755, getent.noded_uid,
254 0d2bf835 René Nussbaumer
     getent.masterd_gid),
255 0d2bf835 René Nussbaumer
    (constants.LOG_DIR, DIR, 0770, getent.masterd_uid,
256 0d2bf835 René Nussbaumer
     getent.daemons_gid),
257 0d2bf835 René Nussbaumer
    (masterd_log, FILE, 0600, getent.masterd_uid, getent.masterd_gid,
258 0d2bf835 René Nussbaumer
     False),
259 0d2bf835 René Nussbaumer
    (confd_log, FILE, 0600, getent.confd_uid, getent.masterd_gid, False),
260 0d2bf835 René Nussbaumer
    (noded_log, FILE, 0600, getent.noded_uid, getent.masterd_gid, False),
261 0d2bf835 René Nussbaumer
    (rapi_log, FILE, 0600, getent.rapi_uid, getent.masterd_gid, False),
262 0d2bf835 René Nussbaumer
    (constants.LOG_OS_DIR, DIR, 0750, getent.masterd_uid,
263 0d2bf835 René Nussbaumer
     getent.daemons_gid),
264 0d2bf835 René Nussbaumer
    ])
265 0d2bf835 René Nussbaumer
266 0d2bf835 René Nussbaumer
  return tuple(paths)
267 0d2bf835 René Nussbaumer
268 0d2bf835 René Nussbaumer
269 961226f6 Michael Hanselmann
def SetupLogging(opts):
270 961226f6 Michael Hanselmann
  """Configures the logging module.
271 961226f6 Michael Hanselmann

272 961226f6 Michael Hanselmann
  """
273 961226f6 Michael Hanselmann
  formatter = logging.Formatter("%(asctime)s: %(message)s")
274 961226f6 Michael Hanselmann
275 961226f6 Michael Hanselmann
  stderr_handler = logging.StreamHandler()
276 961226f6 Michael Hanselmann
  stderr_handler.setFormatter(formatter)
277 961226f6 Michael Hanselmann
  if opts.debug:
278 961226f6 Michael Hanselmann
    stderr_handler.setLevel(logging.NOTSET)
279 961226f6 Michael Hanselmann
  elif opts.verbose:
280 961226f6 Michael Hanselmann
    stderr_handler.setLevel(logging.INFO)
281 961226f6 Michael Hanselmann
  else:
282 961226f6 Michael Hanselmann
    stderr_handler.setLevel(logging.WARNING)
283 961226f6 Michael Hanselmann
284 961226f6 Michael Hanselmann
  root_logger = logging.getLogger("")
285 961226f6 Michael Hanselmann
  root_logger.setLevel(logging.NOTSET)
286 961226f6 Michael Hanselmann
  root_logger.addHandler(stderr_handler)
287 961226f6 Michael Hanselmann
288 961226f6 Michael Hanselmann
289 0d2bf835 René Nussbaumer
def ParseOptions():
290 0d2bf835 René Nussbaumer
  """Parses the options passed to the program.
291 0d2bf835 René Nussbaumer

292 0d2bf835 René Nussbaumer
  @return: Options and arguments
293 0d2bf835 René Nussbaumer

294 0d2bf835 René Nussbaumer
  """
295 0d2bf835 René Nussbaumer
  program = os.path.basename(sys.argv[0])
296 0d2bf835 René Nussbaumer
297 0d2bf835 René Nussbaumer
  parser = optparse.OptionParser(usage="%%prog [--full-run]",
298 0d2bf835 René Nussbaumer
                                 prog=program)
299 961226f6 Michael Hanselmann
  parser.add_option(cli.DEBUG_OPT)
300 961226f6 Michael Hanselmann
  parser.add_option(cli.VERBOSE_OPT)
301 0d2bf835 René Nussbaumer
  parser.add_option("--full-run", "-f", dest="full_run", action="store_true",
302 297657a2 Michael Hanselmann
                    default=False, help=("Make a full run and set permissions"
303 297657a2 Michael Hanselmann
                                         " on archived jobs (time consuming)"))
304 0d2bf835 René Nussbaumer
305 0d2bf835 René Nussbaumer
  return parser.parse_args()
306 0d2bf835 René Nussbaumer
307 0d2bf835 René Nussbaumer
308 0d2bf835 René Nussbaumer
def Main():
309 0d2bf835 René Nussbaumer
  """Main routine.
310 0d2bf835 René Nussbaumer

311 0d2bf835 René Nussbaumer
  """
312 0d2bf835 René Nussbaumer
  (opts, _) = ParseOptions()
313 0d2bf835 René Nussbaumer
314 961226f6 Michael Hanselmann
  SetupLogging(opts)
315 961226f6 Michael Hanselmann
316 961226f6 Michael Hanselmann
  if opts.full_run:
317 961226f6 Michael Hanselmann
    logging.info("Running in full mode")
318 961226f6 Michael Hanselmann
319 961226f6 Michael Hanselmann
  getent = runtime.GetEnts()
320 961226f6 Michael Hanselmann
321 0d2bf835 René Nussbaumer
  try:
322 0d2bf835 René Nussbaumer
    for path in GetPaths():
323 0d2bf835 René Nussbaumer
      ProcessPath(path)
324 0d2bf835 René Nussbaumer
325 0d2bf835 René Nussbaumer
    if opts.full_run:
326 0d2bf835 René Nussbaumer
      RecursiveEnsure(constants.JOB_QUEUE_ARCHIVE_DIR, getent.masterd_uid,
327 0d2bf835 René Nussbaumer
                      getent.masterd_gid, 0700, 0600)
328 0d2bf835 René Nussbaumer
  except EnsureError, err:
329 961226f6 Michael Hanselmann
    logging.error("An error occurred while setting permissions: %s", err)
330 0d2bf835 René Nussbaumer
    return constants.EXIT_FAILURE
331 0d2bf835 René Nussbaumer
332 0d2bf835 René Nussbaumer
  return constants.EXIT_SUCCESS