summaryrefslogtreecommitdiff
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
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.
-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: