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

165
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) A subclass may wish to override the following action methods:-
- group_del()
- group_add()
- group_mod()
def group_add(module, group, **kwargs): All subclasses MUST define platform and distribution (which may be None).
cmd = [module.get_bin_path('groupadd', True)] """
for key in kwargs:
if key == 'gid' and kwargs[key] is not None:
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): platform = 'Generic'
cmd = [module.get_bin_path('groupmod', True)] distribution = None
info = group_info(group) GROUPFILE = '/etc/group'
for key in kwargs:
if key == 'gid': def __new__(cls, *args, **kwargs):
if kwargs[key] is not None and info[2] != int(kwargs[key]): 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 def group_mod(self, **kwargs):
return (rc, out, err) cmd = [self.module.get_bin_path('groupmod', True)]
info = self.group_info()
def group_exists(group): for key in kwargs:
try: if key == 'gid':
if grp.getgrnam(group): if kwargs[key] is not None and info[2] != int(kwargs[key]):
return True cmd.append('-g')
except KeyError: cmd.append(kwargs[key])
return False if len(cmd) == 1:
return (None, '', '')
def group_info(group): cmd.append(self.name)
if not group_exists(group): return self.execute_command(cmd)
return False
try: def group_exists(self):
info = list(grp.getgrnam(group)) try:
except KeyError: if grp.getgrnam(self.name):
return False return True
return info except KeyError:
return False
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)