Commit 8592b3b4 by Stephen Fromm Committed by Michael DeHaan

Update user module to support group name

This changes the gid option to group.  One may provide a primary group
as either a gid or a name.  The module will then check to verify that
the group already exists.  If the group does not already exist, the
module will fail.
parent 37f599ef
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
# Walk through account creation, modification, and deletion # Walk through account creation, modification, and deletion
- name: test basic user account creation - name: test basic user account creation
action: user name=tset comment=TsetUser gid=100 shell=/sbin/nologin createhome=no action: user name=tset comment=TsetUser group=100 shell=/sbin/nologin createhome=no
# the following is just a simple example of how you don't have to include # the following is just a simple example of how you don't have to include
# the 'name' element for each task # the 'name' element for each task
......
...@@ -23,6 +23,7 @@ except ImportError: ...@@ -23,6 +23,7 @@ except ImportError:
import simplejson as json import simplejson as json
import os import os
import pwd import pwd
import grp
import shlex import shlex
import spwd import spwd
import subprocess import subprocess
...@@ -54,7 +55,7 @@ def add_user_info(kwargs): ...@@ -54,7 +55,7 @@ def add_user_info(kwargs):
kwargs['state'] = 'present' kwargs['state'] = 'present'
info = user_info(name) info = user_info(name)
kwargs['uid'] = info[2] kwargs['uid'] = info[2]
kwargs['gid'] = info[3] kwargs['group'] = info[3]
kwargs['comment'] = info[4] kwargs['comment'] = info[4]
kwargs['home'] = info[5] kwargs['home'] = info[5]
kwargs['shell'] = info[6] kwargs['shell'] = info[6]
...@@ -84,9 +85,12 @@ def user_add(user, **kwargs): ...@@ -84,9 +85,12 @@ def user_add(user, **kwargs):
if key == 'uid' and kwargs[key] is not None: if key == 'uid' and kwargs[key] is not None:
cmd.append('-u') cmd.append('-u')
cmd.append(kwargs[key]) cmd.append(kwargs[key])
elif key == 'gid' and kwargs[key] is not None: elif key == 'group' and kwargs[key] is not None:
cmd.append('-g') if group_exists(kwargs[key]):
cmd.append(kwargs[key]) cmd.append('-g')
cmd.append(kwargs[key])
else:
fail_json(msg="Group %s does not exist" % (kwargs[key]))
elif key == 'comment' and kwargs[key] is not None: elif key == 'comment' and kwargs[key] is not None:
cmd.append('-c') cmd.append('-c')
cmd.append(kwargs[key]) cmd.append(kwargs[key])
...@@ -121,10 +125,14 @@ def user_mod(user, **kwargs): ...@@ -121,10 +125,14 @@ def user_mod(user, **kwargs):
if kwargs[key] is not None and info[2] != int(kwargs[key]): if kwargs[key] is not None and info[2] != int(kwargs[key]):
cmd.append('-u') cmd.append('-u')
cmd.append(kwargs[key]) cmd.append(kwargs[key])
elif key == 'gid': elif key == 'group' and kwargs[key] is not None:
if kwargs[key] is not None and info[3] != int(kwargs[key]): if group_exists(kwargs[key]):
cmd.append('-g') ginfo = group_info(group)
cmd.append(kwargs[key]) if info[3] != ginfo[2]:
cmd.append('-g')
cmd.append(kwargs[key])
else:
fail_json(msg="Group %s does not exist" % (kwargs[key]))
elif key == 'comment': elif key == 'comment':
if kwargs[key] is not None and info[4] != kwargs[key]: if kwargs[key] is not None and info[4] != kwargs[key]:
cmd.append('-c') cmd.append('-c')
...@@ -152,6 +160,25 @@ def user_mod(user, **kwargs): ...@@ -152,6 +160,25 @@ def user_mod(user, **kwargs):
else: else:
return False return False
def group_exists(group):
try:
if group.isdigit():
if grp.getgrgid(group):
return True
else:
if grp.getgrnam(group):
return True
except KeyError:
return False
def group_info(group):
if not group_exists(group):
return False
if group.isdigit():
return list(grp.getgrgid(group))
else:
return list(grp.getgrnam(group))
def user_exists(user): def user_exists(user):
try: try:
if pwd.getpwnam(user): if pwd.getpwnam(user):
...@@ -204,7 +231,7 @@ for x in items: ...@@ -204,7 +231,7 @@ for x in items:
state = params.get('state','present') state = params.get('state','present')
name = params.get('name', None) name = params.get('name', None)
uid = params.get('uid', None) uid = params.get('uid', None)
gid = params.get('gid', None) group = params.get('group', None)
comment = params.get('comment', None) comment = params.get('comment', None)
home = params.get('home', None) home = params.get('home', None)
shell = params.get('shell', None) shell = params.get('shell', None)
...@@ -234,11 +261,11 @@ if state == 'absent': ...@@ -234,11 +261,11 @@ if state == 'absent':
exit_json(name=name, changed=changed, force=force, remove=remove) exit_json(name=name, changed=changed, force=force, remove=remove)
elif state == 'present': elif state == 'present':
if not user_exists(name): if not user_exists(name):
changed = user_add(name, uid=uid, gid=gid, comment=comment, changed = user_add(name, uid=uid, group=group, comment=comment,
home=home, shell=shell, password=password, home=home, shell=shell, password=password,
createhome=createhome) createhome=createhome)
else: else:
changed = user_mod(name, uid=uid, gid=gid, comment=comment, changed = user_mod(name, uid=uid, group=group, comment=comment,
home=home, shell=shell, password=password) home=home, shell=shell, password=password)
if password is not None: if password is not None:
......
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