Merge pull request #1635 from romeotheriault/classify-group-module

convert group module to be platform sub-classable
This commit is contained in:
Michael DeHaan 2012-11-17 07:38:32 -08:00
commit fdb4e3538a

161
group
View file

@ -55,59 +55,90 @@ examples:
''' '''
import grp import grp
import syslog
import platform
def group_del(module, group): class Group(object):
cmd = [module.get_bin_path('groupdel', True), group] """
p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) This is a generic Group manipulation class that is subclassed
(out, err) = p.communicate() based on platform.
rc = p.returncode
return (rc, out, err)
def group_add(module, group, **kwargs): A subclass may wish to override the following action methods:-
cmd = [module.get_bin_path('groupadd', True)] - group_del()
for key in kwargs: - group_add()
if key == 'gid' and kwargs[key] is not None: - group_mod()
cmd.append('-g')
cmd.append(kwargs[key])
elif key == 'system' and kwargs[key] == 'yes':
cmd.append('-r')
cmd.append(group)
p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(out, err) = p.communicate()
rc = p.returncode
return (rc, out, err)
def group_mod(module, group, **kwargs): All subclasses MUST define platform and distribution (which may be None).
cmd = [module.get_bin_path('groupmod', True)] """
info = group_info(group)
for key in kwargs: platform = 'Generic'
if key == 'gid': distribution = None
if kwargs[key] is not None and info[2] != int(kwargs[key]): GROUPFILE = '/etc/group'
def __new__(cls, *args, **kwargs):
return load_platform_subclass(Group, args, kwargs)
def __init__(self, module):
self.module = module
self.state = module.params['state']
self.name = module.params['name']
self.gid = module.params['gid']
self.system = module.params['system']
self.syslogging = False
def execute_command(self, cmd):
if self.syslogging:
syslog.openlog('ansible-%s' % os.path.basename(__file__))
syslog.syslog(syslog.LOG_NOTICE, 'Command %s' % '|'.join(cmd))
p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(out, err) = p.communicate()
rc = p.returncode
return (rc, out, err)
def group_del(self):
cmd = [self.module.get_bin_path('groupdel', True), self.name]
return self.execute_command(cmd)
def group_add(self, **kwargs):
cmd = [self.module.get_bin_path('groupadd', True)]
for key in kwargs:
if key == 'gid' and kwargs[key] is not None:
cmd.append('-g') cmd.append('-g')
cmd.append(kwargs[key]) cmd.append(kwargs[key])
if len(cmd) == 1: elif key == 'system' and kwargs[key] == 'yes':
return (None, '', '') cmd.append('-r')
cmd.append(group) cmd.append(self.name)
p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) return self.execute_command(cmd)
(out, err) = p.communicate()
rc = p.returncode
return (rc, out, err)
def group_exists(group): def group_mod(self, **kwargs):
try: cmd = [self.module.get_bin_path('groupmod', True)]
if grp.getgrnam(group): info = self.group_info()
return True for key in kwargs:
except KeyError: if key == 'gid':
return False if kwargs[key] is not None and info[2] != int(kwargs[key]):
cmd.append('-g')
cmd.append(kwargs[key])
if len(cmd) == 1:
return (None, '', '')
cmd.append(self.name)
return self.execute_command(cmd)
def group_info(group): def group_exists(self):
if not group_exists(group): try:
return False if grp.getgrnam(self.name):
try: return True
info = list(grp.getgrnam(group)) except KeyError:
except KeyError: return False
return False
return info def group_info(self):
if not self.group_exists():
return False
try:
info = list(grp.getgrnam(self.name))
except KeyError:
return False
return info
# =========================================== # ===========================================
@ -121,29 +152,33 @@ def main():
) )
) )
state = module.params['state'] group = Group(module)
name = module.params['name']
gid = module.params['gid'] if group.syslogging:
system = module.params['system'] syslog.openlog('ansible-%s' % os.path.basename(__file__))
syslog.syslog(syslog.LOG_NOTICE, 'Group instantiated - platform %s' % group.platform)
if user.distribution:
syslog.syslog(syslog.LOG_NOTICE, 'Group instantiated - distribution %s' % group.distribution)
rc = None rc = None
out = '' out = ''
err = '' err = ''
result = {} result = {}
result['name'] = name result['name'] = group.name
result['state'] = state result['state'] = group.state
if state == 'absent': if group.state == 'absent':
if group_exists(name): if group.group_exists():
(rc, out, err) = group_del(module, name) (rc, out, err) = group.group_del()
if rc != 0: if rc != 0:
module.fail_json(name=name, msg=err) module.fail_json(name=name, msg=err)
elif state == 'present': elif group.state == 'present':
if not group_exists(name): if not group.group_exists():
(rc, out, err) = group_add(module, name, gid=gid, system=system) (rc, out, err) = group.group_add(gid=group.gid, system=group.system)
else: else:
(rc, out, err) = group_mod(module, name, gid=gid) (rc, out, err) = group.group_mod(gid=group.gid)
if rc is not None and rc != 0: if rc is not None and rc != 0:
module.fail_json(name=name, msg=err) module.fail_json(name=group.name, msg=err)
if rc is None: if rc is None:
result['changed'] = False result['changed'] = False
@ -154,9 +189,9 @@ def main():
if err: if err:
result['stderr'] = err result['stderr'] = err
if group_exists(name): if group.group_exists():
info = group_info(name) info = group.group_info()
result['system'] = system result['system'] = group.system
result['gid'] = info[2] result['gid'] = info[2]
module.exit_json(**result) module.exit_json(**result)