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 |