Statistics
| Branch: | Tag: | Revision:

root / lib / tools / ensure_dirs.py @ 596b2459

History | View | Annotate | Download (10.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 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 0d2bf835 René Nussbaumer
    (constants.NODED_CERT_FILE, FILE, 0440, getent.masterd_uid,
213 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
214 0d2bf835 René Nussbaumer
    ]
215 0d2bf835 René Nussbaumer
216 0d2bf835 René Nussbaumer
  ss = ssconf.SimpleStore()
217 0d2bf835 René Nussbaumer
  for ss_path in ss.GetFileList():
218 cd57bab6 Michael Hanselmann
    paths.append((ss_path, FILE, constants.SS_FILE_PERMS,
219 cd57bab6 Michael Hanselmann
                  getent.noded_uid, 0, False))
220 0d2bf835 René Nussbaumer
221 0d2bf835 René Nussbaumer
  paths.extend([
222 0d2bf835 René Nussbaumer
    (constants.QUEUE_DIR, DIR, 0700, getent.masterd_uid,
223 0d2bf835 René Nussbaumer
     getent.masterd_gid),
224 cb66225d Michael Hanselmann
    (constants.QUEUE_DIR, QUEUE_DIR, 0600, getent.masterd_uid,
225 cb66225d Michael Hanselmann
     getent.masterd_gid),
226 247ee81f Michael Hanselmann
    (constants.JOB_QUEUE_LOCK_FILE, FILE, 0600,
227 247ee81f Michael Hanselmann
     getent.masterd_uid, getent.masterd_gid, False),
228 0d2bf835 René Nussbaumer
    (constants.JOB_QUEUE_SERIAL_FILE, FILE, 0600,
229 0d2bf835 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid, False),
230 69f78cf7 René Nussbaumer
    (constants.JOB_QUEUE_VERSION_FILE, FILE, 0600,
231 69f78cf7 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid, False),
232 0d2bf835 René Nussbaumer
    (constants.JOB_QUEUE_ARCHIVE_DIR, DIR, 0700,
233 0d2bf835 René Nussbaumer
     getent.masterd_uid, getent.masterd_gid),
234 0d2bf835 René Nussbaumer
    (rapi_dir, DIR, 0750, getent.rapi_uid, getent.masterd_gid),
235 0d2bf835 René Nussbaumer
    (constants.RAPI_USERS_FILE, FILE, 0640, getent.rapi_uid,
236 0d2bf835 René Nussbaumer
     getent.masterd_gid, False),
237 0d2bf835 René Nussbaumer
    (constants.RUN_GANETI_DIR, DIR, 0775, getent.masterd_uid,
238 0d2bf835 René Nussbaumer
     getent.daemons_gid),
239 0d2bf835 René Nussbaumer
    (constants.SOCKET_DIR, DIR, 0750, getent.masterd_uid,
240 0d2bf835 René Nussbaumer
     getent.daemons_gid),
241 0d2bf835 René Nussbaumer
    (constants.MASTER_SOCKET, FILE, 0770, getent.masterd_uid,
242 0d2bf835 René Nussbaumer
     getent.daemons_gid, False),
243 0d2bf835 René Nussbaumer
    (constants.BDEV_CACHE_DIR, DIR, 0755, getent.noded_uid,
244 0d2bf835 René Nussbaumer
     getent.masterd_gid),
245 0d2bf835 René Nussbaumer
    (constants.UIDPOOL_LOCKDIR, DIR, 0750, getent.noded_uid,
246 0d2bf835 René Nussbaumer
     getent.masterd_gid),
247 0d2bf835 René Nussbaumer
    (constants.DISK_LINKS_DIR, DIR, 0755, getent.noded_uid,
248 0d2bf835 René Nussbaumer
     getent.masterd_gid),
249 0d2bf835 René Nussbaumer
    (constants.CRYPTO_KEYS_DIR, DIR, 0700, getent.noded_uid,
250 0d2bf835 René Nussbaumer
     getent.masterd_gid),
251 0d2bf835 René Nussbaumer
    (constants.IMPORT_EXPORT_DIR, DIR, 0755, getent.noded_uid,
252 0d2bf835 René Nussbaumer
     getent.masterd_gid),
253 0d2bf835 René Nussbaumer
    (constants.LOG_DIR, DIR, 0770, getent.masterd_uid,
254 0d2bf835 René Nussbaumer
     getent.daemons_gid),
255 0d2bf835 René Nussbaumer
    (masterd_log, FILE, 0600, getent.masterd_uid, getent.masterd_gid,
256 0d2bf835 René Nussbaumer
     False),
257 0d2bf835 René Nussbaumer
    (confd_log, FILE, 0600, getent.confd_uid, getent.masterd_gid, False),
258 0d2bf835 René Nussbaumer
    (noded_log, FILE, 0600, getent.noded_uid, getent.masterd_gid, False),
259 0d2bf835 René Nussbaumer
    (rapi_log, FILE, 0600, getent.rapi_uid, getent.masterd_gid, False),
260 0d2bf835 René Nussbaumer
    (constants.LOG_OS_DIR, DIR, 0750, getent.masterd_uid,
261 0d2bf835 René Nussbaumer
     getent.daemons_gid),
262 0d2bf835 René Nussbaumer
    ])
263 0d2bf835 René Nussbaumer
264 0d2bf835 René Nussbaumer
  return tuple(paths)
265 0d2bf835 René Nussbaumer
266 0d2bf835 René Nussbaumer
267 961226f6 Michael Hanselmann
def SetupLogging(opts):
268 961226f6 Michael Hanselmann
  """Configures the logging module.
269 961226f6 Michael Hanselmann

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

290 0d2bf835 René Nussbaumer
  @return: Options and arguments
291 0d2bf835 René Nussbaumer

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

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