summaryrefslogtreecommitdiff
path: root/cloudinit/distros
diff options
context:
space:
mode:
authorJoshua Harlow <harlowja@yahoo-inc.com>2012-09-28 18:39:46 -0700
committerJoshua Harlow <harlowja@yahoo-inc.com>2012-09-28 18:39:46 -0700
commitf255d068c5d4251762b83467d1927ab72da57482 (patch)
tree59a9b075ef8dbc5e0fe0900c951e56199dae6a9a /cloudinit/distros
parentd285a0463b6d16487eb5859373ccfd27eaec8b90 (diff)
downloadvyos-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/distros')
-rw-r--r--cloudinit/distros/__init__.py35
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: