diff options
author | Joshua Harlow <harlowja@yahoo-inc.com> | 2012-09-28 18:39:46 -0700 |
---|---|---|
committer | Joshua Harlow <harlowja@yahoo-inc.com> | 2012-09-28 18:39:46 -0700 |
commit | f255d068c5d4251762b83467d1927ab72da57482 (patch) | |
tree | 59a9b075ef8dbc5e0fe0900c951e56199dae6a9a /cloudinit | |
parent | d285a0463b6d16487eb5859373ccfd27eaec8b90 (diff) | |
download | vyos-cloud-init-f255d068c5d4251762b83467d1927ab72da57482.tar.gz vyos-cloud-init-f255d068c5d4251762b83467d1927ab72da57482.zip |
Ensure that the directory where the sudoers
file is being added actually exists before it
is written into and ensure that the directory
is included in the main sudoers file.
Diffstat (limited to 'cloudinit')
-rw-r--r-- | cloudinit/distros/__init__.py | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/cloudinit/distros/__init__.py b/cloudinit/distros/__init__.py index 86ab557c..11422644 100644 --- a/cloudinit/distros/__init__.py +++ b/cloudinit/distros/__init__.py @@ -296,6 +296,38 @@ class Distro(object): return True + def ensure_sudo_dir(self, path, sudo_base='/etc/sudoers'): + # Ensure the dir is included and that + # it actually exists as a directory + sudoers_contents = '' + if os.path.exists(sudo_base): + sudoers_contents = util.load_file(sudo_base) + found_include = False + for line in sudoers_contents.splitlines(): + line = line.strip() + mtch = re.search(r"#includedir\s+(.*)$", line) + if not mtch: + continue + included_dir = mtch.group(1).strip() + if not included_dir: + continue + included_dir = os.path.abspath(included_dir) + if included_dir == path: + found_include = True + break + if not found_include: + sudoers_contents += "\n#includedir %s\n" % (path) + try: + if not os.path.exists(sudo_base): + util.write_file(sudo_base, sudoers_contents, 0440) + else: + with open(sudo_base, 'a') as f: + f.write(sudoers_contents) + except IOError as e: + util.logexc(LOG, "Failed to write %s" % sudo_base, e) + raise e + util.ensure_dir(path, 0440) + def write_sudo_rules(self, user, rules, @@ -311,9 +343,10 @@ class Distro(object): content += "%s %s\n" % (user, rule) content += "\n" + self.ensure_sudo_dir(os.path.dirname(sudo_file)) + if not os.path.exists(sudo_file): util.write_file(sudo_file, content, 0440) - else: try: with open(sudo_file, 'a') as f: |