Skip to content

Commit

Permalink
Add BusyBox support to user module
Browse files Browse the repository at this point in the history
  • Loading branch information
samdoran committed Mar 20, 2019
1 parent b54fddb commit bb90450
Showing 1 changed file with 139 additions and 0 deletions.
139 changes: 139 additions & 0 deletions lib/ansible/modules/system/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -2613,6 +2613,145 @@ def modify_user(self):
return self.execute_command(cmd)


class BusyBox(User):
"""
This is the BusyBox class for use on systems that have adduser, deluser,
and delgroup commands. It overrides the following methods:
- create_user()
- remove_user()
- modify_user()
"""

def create_user(self):
cmd = [self.module.get_bin_path('adduser', True)]

cmd.append('-D')

if self.uid is not None:
cmd.append('-u')
cmd.append(self.uid)

if self.group is not None:
if not self.group_exists(self.group):
self.module.fail_json(msg='Group {0} does not exist'.format(self.group))
cmd.append('-G')
cmd.append(self.group)

if self.comment is not None:
cmd.append('-g')
cmd.append(self.comment)

if self.home is not None:
cmd.append('-h')
cmd.append(self.home)

if self.shell is not None:
cmd.append('-s')
cmd.append(self.shell)

if not self.create_home:
cmd.append('-H')

if self.skeleton is not None:
cmd.append('-k')
cmd.append(self.skeleton)

if self.system:
cmd.append('-S')

cmd.append(self.name)

rc, out, err = self.execute_command(cmd)

if rc is not None and rc != 0:
self.module.fail_json(name=self.name, msg=err, rc=rc)

if self.password is not None:
cmd = [self.module.get_bin_path('chpasswd', True)]
cmd.append('--encrypted')
data = '{name}:{password}'.format(name=self.name, password=self.password)
rc, out, err = self.execute_command(cmd, data=data)

if rc is not None and rc != 0:
self.module.fail_json(name=self.name, msg=err, rc=rc)

# Add to additional groups
if self.groups is not None and len(self.groups):
groups = self.get_groups_set()
add_cmd_bin = self.module.get_bin_path('adduser', True)
for group in groups:
cmd = [add_cmd_bin, self.name, group]
rc, out, err = self.execute_command(cmd)
if rc is not None and rc != 0:
self.module.fail_json(name=self.name, msg=err, rc=rc)

return rc, out, err

def remove_user(self):

cmd = [
self.module.get_bin_path('deluser', True),
self.name
]

if self.remove:
cmd.append('--remove-home')

return self.execute_command(cmd)

def modify_user(self):
current_groups = self.user_group_membership()
groups = []
rc = None
out = ''
err = ''
info = self.user_info()
add_cmd_bin = self.module.get_bin_path('adduser', True)
remove_cmd_bin = self.module.get_bin_path('delgroup', True)

# Manage group membership
if self.groups is not None and len(self.groups):
groups = self.get_groups_set()
group_diff = set(current_groups).symmetric_difference(groups)

if group_diff:
for g in groups:
if g in group_diff:
add_cmd = [add_cmd_bin, self.name, g]
rc, out, err = self.execute_command(add_cmd)
if rc is not None and rc != 0:
self.module.fail_json(name=self.name, msg=err, rc=rc)

for g in group_diff:
if g not in groups and not self.append:
remove_cmd = [remove_cmd_bin, self.name, g]
rc, out, err = self.execute_command(remove_cmd)
if rc is not None and rc != 0:
self.module.fail_json(name=self.name, msg=err, rc=rc)

# Manage password
if self.password is not None:
if info[1] != self.password:
cmd = [self.module.get_bin_path('chpasswd', True)]
cmd.append('--encrypted')
data = '{name}:{password}'.format(name=self.name, password=self.password)
rc, out, err = self.execute_command(cmd, data=data)

if rc is not None and rc != 0:
self.module.fail_json(name=self.name, msg=err, rc=rc)

return rc, out, err


class Alpine(BusyBox):
"""
This is the Alpine User manipulation class. It inherits the BusyBox class
behaviors such as using adduser and deluser commands.
"""
platform = 'Linux'
distribution = 'Alpine'


def main():
ssh_defaults = dict(
bits=0,
Expand Down

0 comments on commit bb90450

Please sign in to comment.