Commit bd226eb8 by Aaron Brady

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.
parent d2e457f8
...@@ -319,15 +319,7 @@ class AnsibleModule(object): ...@@ -319,15 +319,7 @@ class AnsibleModule(object):
st = os.stat(filename) st = os.stat(filename)
uid = st.st_uid uid = st.st_uid
gid = st.st_gid gid = st.st_gid
try: return (uid, gid)
user = pwd.getpwuid(uid)[0]
except KeyError:
user = str(uid)
try:
group = grp.getgrgid(gid)[0]
except KeyError:
group = str(gid)
return (user, group)
def set_default_selinux_context(self, path, changed): def set_default_selinux_context(self, path, changed):
if not HAVE_SELINUX or not self.selinux_enabled(): if not HAVE_SELINUX or not self.selinux_enabled():
...@@ -366,8 +358,7 @@ class AnsibleModule(object): ...@@ -366,8 +358,7 @@ class AnsibleModule(object):
path = os.path.expanduser(path) path = os.path.expanduser(path)
if owner is None: if owner is None:
return changed return changed
user, group = self.user_and_group(path) orig_uid, orig_gid = self.user_and_group(path)
if owner != user:
try: try:
uid = int(owner) uid = int(owner)
except ValueError: except ValueError:
...@@ -377,6 +368,7 @@ class AnsibleModule(object): ...@@ -377,6 +368,7 @@ class AnsibleModule(object):
self.fail_json(path=path, msg='chown failed: failed to look up user %s' % owner) self.fail_json(path=path, msg='chown failed: failed to look up user %s' % owner)
if self.check_mode: if self.check_mode:
return True return True
if orig_uid != uid:
try: try:
os.chown(path, uid, -1) os.chown(path, uid, -1)
except OSError: except OSError:
...@@ -388,10 +380,7 @@ class AnsibleModule(object): ...@@ -388,10 +380,7 @@ class AnsibleModule(object):
path = os.path.expanduser(path) path = os.path.expanduser(path)
if group is None: if group is None:
return changed return changed
old_user, old_group = self.user_and_group(path) orig_uid, orig_gid = self.user_and_group(path)
if old_group != group:
if self.check_mode:
return True
try: try:
gid = int(group) gid = int(group)
except ValueError: except ValueError:
...@@ -399,6 +388,9 @@ class AnsibleModule(object): ...@@ -399,6 +388,9 @@ class AnsibleModule(object):
gid = grp.getgrnam(group).gr_gid gid = grp.getgrnam(group).gr_gid
except KeyError: except KeyError:
self.fail_json(path=path, msg='chgrp failed: failed to look up group %s' % group) 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: try:
os.chown(path, -1, gid) os.chown(path, -1, gid)
except OSError: except OSError:
...@@ -478,7 +470,17 @@ class AnsibleModule(object): ...@@ -478,7 +470,17 @@ class AnsibleModule(object):
if path is None: if path is None:
return kwargs return kwargs
if os.path.exists(path): if os.path.exists(path):
(user, group) = self.user_and_group(path) (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['owner'] = user
kwargs['group'] = group kwargs['group'] = group
st = os.stat(path) st = os.stat(path)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment