From bd226eb826a396e5cab60330b0ce1ed9741a7f3c Mon Sep 17 00:00:00 2001 From: Aaron Brady Date: Tue, 23 Apr 2013 15:29:35 +0100 Subject: [PATCH] Refactor user_and_group so it works off of numbers There are various cases where a UID to username to UID mapping breaks down. One UID can be used by two usernames, or no username. If we always use UIDs internally, then these ambiguous cases won't be a problem. --- lib/ansible/module_common.py | 64 +++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/lib/ansible/module_common.py b/lib/ansible/module_common.py index a57033910b7..9d5efdef7fc 100644 --- a/lib/ansible/module_common.py +++ b/lib/ansible/module_common.py @@ -319,15 +319,7 @@ class AnsibleModule(object): st = os.stat(filename) uid = st.st_uid gid = st.st_gid - try: - user = pwd.getpwuid(uid)[0] - except KeyError: - user = str(uid) - try: - group = grp.getgrgid(gid)[0] - except KeyError: - group = str(gid) - return (user, group) + return (uid, gid) def set_default_selinux_context(self, path, changed): if not HAVE_SELINUX or not self.selinux_enabled(): @@ -366,17 +358,17 @@ class AnsibleModule(object): path = os.path.expanduser(path) if owner is None: return changed - user, group = self.user_and_group(path) - if owner != user: + orig_uid, orig_gid = self.user_and_group(path) + try: + uid = int(owner) + except ValueError: try: - uid = int(owner) - except ValueError: - try: - uid = pwd.getpwnam(owner).pw_uid - except KeyError: - self.fail_json(path=path, msg='chown failed: failed to look up user %s' % owner) - if self.check_mode: - return True + uid = pwd.getpwnam(owner).pw_uid + except KeyError: + self.fail_json(path=path, msg='chown failed: failed to look up user %s' % owner) + if self.check_mode: + return True + if orig_uid != uid: try: os.chown(path, uid, -1) except OSError: @@ -388,17 +380,17 @@ class AnsibleModule(object): path = os.path.expanduser(path) if group is None: return changed - old_user, old_group = self.user_and_group(path) - if old_group != group: - if self.check_mode: - return True + orig_uid, orig_gid = self.user_and_group(path) + try: + gid = int(group) + except ValueError: try: - gid = int(group) - except ValueError: - try: - gid = grp.getgrnam(group).gr_gid - except KeyError: - self.fail_json(path=path, msg='chgrp failed: failed to look up group %s' % group) + gid = grp.getgrnam(group).gr_gid + except KeyError: + self.fail_json(path=path, msg='chgrp failed: failed to look up group %s' % group) + if self.check_mode: + return True + if orig_gid != gid: try: os.chown(path, -1, gid) except OSError: @@ -478,8 +470,18 @@ class AnsibleModule(object): if path is None: return kwargs if os.path.exists(path): - (user, group) = self.user_and_group(path) - kwargs['owner'] = user + (uid, gid) = self.user_and_group(path) + kwargs['uid'] = uid + kwargs['gid'] = gid + try: + user = pwd.getpwuid(uid)[0] + except KeyError: + user = str(uid) + try: + group = grp.getgrgid(gid)[0] + except KeyError: + group = str(gid) + kwargs['owner'] = user kwargs['group'] = group st = os.stat(path) kwargs['mode'] = oct(stat.S_IMODE(st[stat.ST_MODE]))