root / lib / tools / ensure_dirs.py @ 18397489
History | View | Annotate | Download (9 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 | 9eac61f8 | Michael Hanselmann | (pathutils.WATCHER_PAUSEFILE, FILE, 0644,
|
155 | 9eac61f8 | Michael Hanselmann | getent.masterd_uid, getent.masterd_gid, False),
|
156 | 0d2bf835 | René Nussbaumer | ] |
157 | 0d2bf835 | René Nussbaumer | |
158 | 0d2bf835 | René Nussbaumer | ss = ssconf.SimpleStore() |
159 | 0d2bf835 | René Nussbaumer | for ss_path in ss.GetFileList(): |
160 | cd57bab6 | Michael Hanselmann | paths.append((ss_path, FILE, constants.SS_FILE_PERMS, |
161 | 6a5e841d | Michael Hanselmann | getent.noded_uid, getent.noded_gid, False))
|
162 | 0d2bf835 | René Nussbaumer | |
163 | 0d2bf835 | René Nussbaumer | paths.extend([ |
164 | fe05a931 | Michele Tartara | (pathutils.QUEUE_DIR, DIR, 0750, getent.masterd_uid, getent.daemons_gid),
|
165 | fe05a931 | Michele Tartara | (pathutils.QUEUE_DIR, QUEUE_DIR, constants.JOB_QUEUE_FILES_PERMS, |
166 | fe05a931 | Michele Tartara | getent.masterd_uid, getent.daemons_gid), |
167 | 9eac61f8 | Michael Hanselmann | (pathutils.JOB_QUEUE_DRAIN_FILE, FILE, 0644,
|
168 | fe05a931 | Michele Tartara | getent.masterd_uid, getent.daemons_gid, False),
|
169 | fe05a931 | Michele Tartara | (pathutils.JOB_QUEUE_LOCK_FILE, FILE, constants.JOB_QUEUE_FILES_PERMS, |
170 | fe05a931 | Michele Tartara | getent.masterd_uid, getent.daemons_gid, False),
|
171 | fe05a931 | Michele Tartara | (pathutils.JOB_QUEUE_SERIAL_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_VERSION_FILE, FILE, constants.JOB_QUEUE_FILES_PERMS, |
174 | fe05a931 | Michele Tartara | getent.masterd_uid, getent.daemons_gid, False),
|
175 | cb474ee4 | Guido Trotter | (pathutils.JOB_QUEUE_ARCHIVE_DIR, DIR, 0750,
|
176 | fe05a931 | Michele Tartara | getent.masterd_uid, getent.daemons_gid), |
177 | 0d2bf835 | René Nussbaumer | (rapi_dir, DIR, 0750, getent.rapi_uid, getent.masterd_gid),
|
178 | af8f2fbf | Michael Hanselmann | (pathutils.RAPI_USERS_FILE, FILE, 0640,
|
179 | af8f2fbf | Michael Hanselmann | getent.rapi_uid, getent.masterd_gid, False),
|
180 | af8f2fbf | Michael Hanselmann | (pathutils.RUN_DIR, DIR, 0775, getent.masterd_uid, getent.daemons_gid),
|
181 | af8f2fbf | Michael Hanselmann | (pathutils.SOCKET_DIR, DIR, 0770, getent.masterd_uid, getent.daemons_gid),
|
182 | af8f2fbf | Michael Hanselmann | (pathutils.MASTER_SOCKET, FILE, 0660,
|
183 | af8f2fbf | Michael Hanselmann | getent.masterd_uid, getent.daemons_gid, False),
|
184 | 8526052d | Guido Trotter | (pathutils.QUERY_SOCKET, FILE, 0660,
|
185 | 3695a4e0 | Thomas Thrainer | getent.luxid_uid, getent.daemons_gid, False),
|
186 | af8f2fbf | Michael Hanselmann | (pathutils.BDEV_CACHE_DIR, DIR, 0755,
|
187 | af8f2fbf | Michael Hanselmann | getent.noded_uid, getent.masterd_gid), |
188 | af8f2fbf | Michael Hanselmann | (pathutils.UIDPOOL_LOCKDIR, DIR, 0750,
|
189 | af8f2fbf | Michael Hanselmann | getent.noded_uid, getent.masterd_gid), |
190 | af8f2fbf | Michael Hanselmann | (pathutils.DISK_LINKS_DIR, DIR, 0755,
|
191 | af8f2fbf | Michael Hanselmann | getent.noded_uid, getent.masterd_gid), |
192 | af8f2fbf | Michael Hanselmann | (pathutils.CRYPTO_KEYS_DIR, DIR, 0700,
|
193 | af8f2fbf | Michael Hanselmann | getent.noded_uid, getent.masterd_gid), |
194 | af8f2fbf | Michael Hanselmann | (pathutils.IMPORT_EXPORT_DIR, DIR, 0755,
|
195 | af8f2fbf | Michael Hanselmann | getent.noded_uid, getent.masterd_gid), |
196 | af8f2fbf | Michael Hanselmann | (pathutils.LOG_DIR, DIR, 0770, getent.masterd_uid, getent.daemons_gid),
|
197 | af8f2fbf | Michael Hanselmann | (masterd_log, FILE, 0600, getent.masterd_uid, getent.masterd_gid, False), |
198 | 0d2bf835 | René Nussbaumer | (confd_log, FILE, 0600, getent.confd_uid, getent.masterd_gid, False), |
199 | d08a8359 | Thomas Thrainer | (luxid_log, FILE, 0600, getent.luxid_uid, getent.masterd_gid, False), |
200 | 0d2bf835 | René Nussbaumer | (noded_log, FILE, 0600, getent.noded_uid, getent.masterd_gid, False), |
201 | 0d2bf835 | René Nussbaumer | (rapi_log, FILE, 0600, getent.rapi_uid, getent.masterd_gid, False), |
202 | d08a8359 | Thomas Thrainer | (mond_log, FILE, 0600, getent.mond_uid, getent.masterd_gid, False), |
203 | 6b3f0d7e | Balazs Lecz | (pathutils.LOG_OS_DIR, DIR, 0750, getent.noded_uid, getent.daemons_gid),
|
204 | 48bba9de | Balazs Lecz | (pathutils.LOG_XEN_DIR, DIR, 0750, getent.noded_uid, getent.daemons_gid),
|
205 | 2958c56e | Michael Hanselmann | (cleaner_log_dir, DIR, 0750, getent.noded_uid, getent.noded_gid),
|
206 | 2958c56e | Michael Hanselmann | (master_cleaner_log_dir, DIR, 0750, getent.masterd_uid, getent.masterd_gid),
|
207 | a59d5fa1 | Michele Tartara | (pathutils.INSTANCE_REASON_DIR, DIR, 0755, getent.noded_uid,
|
208 | a59d5fa1 | Michele Tartara | getent.noded_gid), |
209 | 0d2bf835 | René Nussbaumer | ]) |
210 | 0d2bf835 | René Nussbaumer | |
211 | 39b8cd94 | Michael Hanselmann | return paths
|
212 | 0d2bf835 | René Nussbaumer | |
213 | 0d2bf835 | René Nussbaumer | |
214 | 0d2bf835 | René Nussbaumer | def ParseOptions(): |
215 | 0d2bf835 | René Nussbaumer | """Parses the options passed to the program.
|
216 | 0d2bf835 | René Nussbaumer |
|
217 | 0d2bf835 | René Nussbaumer | @return: Options and arguments
|
218 | 0d2bf835 | René Nussbaumer |
|
219 | 0d2bf835 | René Nussbaumer | """
|
220 | 0d2bf835 | René Nussbaumer | program = os.path.basename(sys.argv[0])
|
221 | 0d2bf835 | René Nussbaumer | |
222 | 8d77ac10 | Michael Hanselmann | parser = optparse.OptionParser(usage="%prog [--full-run]",
|
223 | 0d2bf835 | René Nussbaumer | prog=program) |
224 | 961226f6 | Michael Hanselmann | parser.add_option(cli.DEBUG_OPT) |
225 | 961226f6 | Michael Hanselmann | parser.add_option(cli.VERBOSE_OPT) |
226 | 0d2bf835 | René Nussbaumer | parser.add_option("--full-run", "-f", dest="full_run", action="store_true", |
227 | 297657a2 | Michael Hanselmann | default=False, help=("Make a full run and set permissions" |
228 | 297657a2 | Michael Hanselmann | " on archived jobs (time consuming)"))
|
229 | 0d2bf835 | René Nussbaumer | |
230 | 0d2bf835 | René Nussbaumer | return parser.parse_args()
|
231 | 0d2bf835 | René Nussbaumer | |
232 | 0d2bf835 | René Nussbaumer | |
233 | 0d2bf835 | René Nussbaumer | def Main(): |
234 | 0d2bf835 | René Nussbaumer | """Main routine.
|
235 | 0d2bf835 | René Nussbaumer |
|
236 | 0d2bf835 | René Nussbaumer | """
|
237 | fca74633 | Michael Hanselmann | (opts, args) = ParseOptions() |
238 | 0d2bf835 | René Nussbaumer | |
239 | 796b5152 | Michael Hanselmann | utils.SetupToolLogging(opts.debug, opts.verbose) |
240 | 961226f6 | Michael Hanselmann | |
241 | fca74633 | Michael Hanselmann | if args:
|
242 | fca74633 | Michael Hanselmann | logging.error("No arguments are expected")
|
243 | fca74633 | Michael Hanselmann | return constants.EXIT_FAILURE
|
244 | fca74633 | Michael Hanselmann | |
245 | 961226f6 | Michael Hanselmann | if opts.full_run:
|
246 | 961226f6 | Michael Hanselmann | logging.info("Running in full mode")
|
247 | 961226f6 | Michael Hanselmann | |
248 | 961226f6 | Michael Hanselmann | getent = runtime.GetEnts() |
249 | 961226f6 | Michael Hanselmann | |
250 | 0d2bf835 | René Nussbaumer | try:
|
251 | 0d2bf835 | René Nussbaumer | for path in GetPaths(): |
252 | 0d2bf835 | René Nussbaumer | ProcessPath(path) |
253 | 0d2bf835 | René Nussbaumer | |
254 | 0d2bf835 | René Nussbaumer | if opts.full_run:
|
255 | 7e97aca4 | Michael Hanselmann | RecursiveEnsure(pathutils.JOB_QUEUE_ARCHIVE_DIR, getent.masterd_uid, |
256 | fe05a931 | Michele Tartara | getent.daemons_gid, 0750, constants.JOB_QUEUE_FILES_PERMS)
|
257 | b81b3c96 | René Nussbaumer | except errors.GenericError, err:
|
258 | 961226f6 | Michael Hanselmann | logging.error("An error occurred while setting permissions: %s", err)
|
259 | 0d2bf835 | René Nussbaumer | return constants.EXIT_FAILURE
|
260 | 0d2bf835 | René Nussbaumer | |
261 | 0d2bf835 | René Nussbaumer | return constants.EXIT_SUCCESS |