@ -295,8 +295,12 @@ class User(object):
self . ssh_file = os . path . join ( ' .ssh ' , ' id_ %s ' % self . ssh_type )
def execute_command ( self , cmd , use_unsafe_shell = False , data = None ) :
return self . module . run_command ( cmd , use_unsafe_shell = use_unsafe_shell , data = data )
def execute_command ( self , cmd , use_unsafe_shell = False , data = None , obey_checkmode = True ) :
if self . module . check_mode and obey_checkmode :
self . module . debug ( ' In check mode, would have run: " %s " ' % cmd )
return ( 0 , ' ' , ' ' )
else :
return self . module . run_command ( cmd , use_unsafe_shell = use_unsafe_shell , data = data )
def remove_user_userdel ( self ) :
cmd = [ self . module . get_bin_path ( ' userdel ' , True ) ]
@ -391,9 +395,8 @@ class User(object):
if not os . access ( usermod_path , os . X_OK ) :
return False
cmd = [ usermod_path ]
cmd . append ( ' --help ' )
rc , data1 , data2 = self . execute_command ( cmd )
cmd = [ usermod_path , ' --help ' ]
( rc , data1 , data2 ) = self . execute_command ( cmd , obey_checkmode = False )
helpout = data1 + data2
# check if --append exists
@ -483,8 +486,6 @@ class User(object):
# skip if no changes to be made
if len ( cmd ) == 1 :
return ( None , ' ' , ' ' )
elif self . module . check_mode :
return ( 0 , ' ' , ' ' )
cmd . append ( self . name )
return self . execute_command ( cmd )
@ -591,8 +592,6 @@ class User(object):
return ( 1 , ' ' , ' Failed to create %s : %s ' % ( ssh_dir , str ( e ) ) )
if os . path . exists ( ssh_key_file ) :
return ( None , ' Key already exists ' , ' ' )
if self . module . check_mode :
return ( 0 , ' ' , ' ' )
cmd = [ self . module . get_bin_path ( ' ssh-keygen ' , True ) ]
cmd . append ( ' -t ' )
cmd . append ( self . ssh_type )
@ -625,7 +624,7 @@ class User(object):
cmd . append ( ' -f ' )
cmd . append ( ssh_key_file )
return self . execute_command ( cmd )
return self . execute_command ( cmd , obey_checkmode = False )
def get_ssh_public_key ( self ) :
ssh_public_key_file = ' %s .pub ' % self . get_ssh_key_path ( )
@ -863,8 +862,6 @@ class FreeBsdUser(User):
# modify the user if cmd will do anything
if cmd_len != len ( cmd ) :
if self . module . check_mode :
return ( 0 , ' ' , ' ' )
( 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 )
@ -873,8 +870,6 @@ class FreeBsdUser(User):
# we have to set the password in a second command
if self . update_password == ' always ' and self . password is not None and info [ 1 ] != self . password :
if self . module . check_mode :
return ( 0 , ' ' , ' ' )
cmd = [
self . module . get_bin_path ( ' chpass ' , True ) ,
' -p ' ,
@ -1026,7 +1021,7 @@ class OpenBSDUser(User):
# find current login class
user_login_class = None
userinfo_cmd = [ self . module . get_bin_path ( ' userinfo ' , True ) , self . name ]
( rc , out , err ) = self . execute_command ( userinfo_cmd )
( rc , out , err ) = self . execute_command ( userinfo_cmd , obey_checkmode = False )
for line in out . splitlines ( ) :
tokens = line . split ( )
@ -1047,8 +1042,6 @@ class OpenBSDUser(User):
# skip if no changes to be made
if len ( cmd ) == 1 :
return ( None , ' ' , ' ' )
elif self . module . check_mode :
return ( 0 , ' ' , ' ' )
cmd . append ( self . name )
return self . execute_command ( cmd )
@ -1206,8 +1199,6 @@ class NetBSDUser(User):
# skip if no changes to be made
if len ( cmd ) == 1 :
return ( None , ' ' , ' ' )
elif self . module . check_mode :
return ( 0 , ' ' , ' ' )
cmd . append ( self . name )
return self . execute_command ( cmd )
@ -1282,14 +1273,12 @@ class SunOS(User):
cmd . append ( self . name )
if self . module . check_mode :
return ( 0 , ' ' , ' ' )
else :
( 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 )
( 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 )
# we have to set the password by editing the /etc/shadow file
if not self . module . check_mode :
# we have to set the password by editing the /etc/shadow file
if self . password is not None :
try :
lines = [ ]
@ -1306,7 +1295,7 @@ class SunOS(User):
except Exception , err :
self . module . fail_json ( msg = " failed to update users password: %s " % str ( err ) )
return ( rc , out , err )
return ( rc , out , err )
def modify_user_usermod ( self ) :
cmd = [ self . module . get_bin_path ( ' usermod ' , True ) ]
@ -1366,16 +1355,14 @@ class SunOS(User):
# modify the user if cmd will do anything
if cmd_len != len ( cmd ) :
( rc , out , err ) = ( 0 , ' ' , ' ' )
if not self . module . check_mode :
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 )
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 )
else :
( rc , out , err ) = ( None , ' ' , ' ' )
# we have to set the password by editing the /etc/shadow file
# we have to set the password by editing the /etc/shadow file
if self . update_password == ' always ' and self . password is not None and info [ 1 ] != self . password :
( rc , out , err ) = ( 0 , ' ' , ' ' )
if not self . module . check_mode :
@ -1387,7 +1374,7 @@ class SunOS(User):
lines . append ( line )
continue
fields [ 1 ] = self . password
fields [ 2 ] = str ( int ( time . time ( ) / 86400 ) )
fields [ 2 ] = str ( int ( time . time ( ) / 86400 ) )
line = ' : ' . join ( fields )
lines . append ( ' %s \n ' % line )
open ( self . SHADOWFILE , ' w+ ' ) . writelines ( lines )
@ -1435,7 +1422,7 @@ class DarwinUser(User):
def _list_user_groups ( self ) :
cmd = self . _get_dscl ( )
cmd + = [ ' -search ' , ' /Groups ' , ' GroupMembership ' , self . name ]
( rc , out , err ) = self . execute_command ( cmd )
( rc , out , err ) = self . execute_command ( cmd , obey_checkmode = False )
groups = [ ]
for line in out . splitlines ( ) :
if line . startswith ( ' ' ) or line . startswith ( ' ) ' ) :
@ -1447,7 +1434,7 @@ class DarwinUser(User):
''' Return user PROPERTY as given my dscl(1) read or None if not found. '''
cmd = self . _get_dscl ( )
cmd + = [ ' -read ' , ' /Users/ %s ' % self . name , property ]
( rc , out , err ) = self . execute_command ( cmd )
( rc , out , err ) = self . execute_command ( cmd , obey_checkmode = False )
if rc != 0 :
return None
# from dscl(1)
@ -1470,7 +1457,7 @@ class DarwinUser(User):
''' Return the next available uid '''
cmd = self . _get_dscl ( )
cmd + = [ ' -list ' , ' /Users ' , ' UniqueID ' ]
( rc , out , err ) = self . execute_command ( cmd )
( rc , out , err ) = self . execute_command ( cmd , obey_checkmode = False )
if rc != 0 :
self . module . fail_json (
msg = " Unable to get the next available uid " ,
@ -1503,8 +1490,7 @@ class DarwinUser(User):
cmd + = [ ' -create ' , ' /Users/ %s ' % self . name , ' Password ' , ' * ' ]
( rc , out , err ) = self . execute_command ( cmd )
if rc != 0 :
self . module . fail_json ( msg = ' Error when changing password ' ,
err = err , out = out , rc = rc )
self . module . fail_json ( msg = ' Error when changing password ' , err = err , out = out , rc = rc )
return ( rc , out , err )
def _make_group_numerical ( self ) :
@ -1525,13 +1511,11 @@ class DarwinUser(User):
option = ' -a '
else :
option = ' -d '
cmd = [ ' dseditgroup ' , ' -o ' , ' edit ' , option , self . name ,
' -t ' , ' user ' , group ]
cmd = [ ' dseditgroup ' , ' -o ' , ' edit ' , option , self . name , ' -t ' , ' user ' , group ]
( rc , out , err ) = self . execute_command ( cmd )
if rc != 0 :
self . module . fail_json ( msg = ' Cannot %s user " %s " to group " %s " . '
% ( action , self . name , group ) ,
err = err , out = out , rc = rc )
% ( action , self . name , group ) , err = err , out = out , rc = rc )
return ( rc , out , err )
def _modify_group ( self ) :
@ -1550,8 +1534,6 @@ class DarwinUser(User):
target = set ( [ ] )
for remove in current - target :
if self . module . check_mode :
return ( 0 , ' ' , ' ' , True )
( _rc , _err , _out ) = self . __modify_group ( remove , ' delete ' )
rc + = rc
out + = _out
@ -1559,8 +1541,6 @@ class DarwinUser(User):
changed = True
for add in target - current :
if self . module . check_mode :
return ( 0 , ' ' , ' ' , True )
( _rc , _err , _out ) = self . __modify_group ( add , ' add ' )
rc + = _rc
out + = _out
@ -1578,7 +1558,7 @@ class DarwinUser(User):
# http://support.apple.com/kb/HT5017?viewlocale=en_US
cmd = [ ' defaults ' , ' read ' , plist_file , ' HiddenUsersList ' ]
( rc , out , err ) = self . execute_command ( cmd )
( rc , out , err ) = self . execute_command ( cmd , obey_checkmode = False )
# returned value is
# (
# "_userA",
@ -1597,34 +1577,25 @@ class DarwinUser(User):
if not self . name in hidden_users :
cmd = [ ' defaults ' , ' write ' , plist_file ,
' HiddenUsersList ' , ' -array-add ' , self . name ]
if self . module . check_mode :
return 0
( rc , out , err ) = self . execute_command ( cmd )
if rc != 0 :
self . module . fail_json (
msg = ' Cannot user " %s " to hidden user list. '
% self . name , err = err , out = out , rc = rc )
self . module . fail_json ( msg = ' Cannot user " %s " to hidden user list. ' % self . name , err = err , out = out , rc = rc )
return 0
else :
if self . name in hidden_users :
del ( hidden_users [ hidden_users . index ( self . name ) ] )
cmd = [ ' defaults ' , ' write ' , plist_file ,
' HiddenUsersList ' , ' -array ' ] + hidden_users
if self . module . check_mode :
return 0
cmd = [ ' defaults ' , ' write ' , plist_file , ' HiddenUsersList ' , ' -array ' ] + hidden_users
( rc , out , err ) = self . execute_command ( cmd )
if rc != 0 :
self . module . fail_json (
msg = ' Cannot remove user " %s " from hidden user list. '
% self . name , err = err , out = out , rc = rc )
self . module . fail_json ( msg = ' Cannot remove user " %s " from hidden user list. ' % self . name , err = err , out = out , rc = rc )
return 0
def user_exists ( self ) :
''' Check is SELF.NAME is a known user on the system. '''
cmd = self . _get_dscl ( )
cmd + = [ ' -list ' , ' /Users/ %s ' % self . name ]
( rc , out , err ) = self . execute_command ( cmd )
( rc , out , err ) = self . execute_command ( cmd , obey_checkmode = False )
return rc == 0
def remove_user ( self ) :
@ -1636,9 +1607,7 @@ class DarwinUser(User):
( rc , out , err ) = self . execute_command ( cmd )
if rc != 0 :
self . module . fail_json (
msg = ' Cannot delete user " %s " . '
% self . name , err = err , out = out , rc = rc )
self . module . fail_json ( msg = ' Cannot delete user " %s " . ' % self . name , err = err , out = out , rc = rc )
if self . force :
if os . path . exists ( info [ 5 ] ) :
@ -1652,9 +1621,7 @@ class DarwinUser(User):
cmd + = [ ' -create ' , ' /Users/ %s ' % self . name ]
( rc , err , out ) = self . execute_command ( cmd )
if rc != 0 :
self . module . fail_json (
msg = ' Cannot create user " %s " . '
% self . name , err = err , out = out , rc = rc )
self . module . fail_json ( msg = ' Cannot create user " %s " . ' % self . name , err = err , out = out , rc = rc )
self . _make_group_numerical ( )
@ -1665,20 +1632,19 @@ class DarwinUser(User):
if self . createhome :
if self . home is None :
self . home = ' /Users/ %s ' % self . name
if not os . path . exists ( self . home ) :
os . makedirs ( self . home )
self . chown_homedir ( int ( self . uid ) , int ( self . group ) , self . home )
if not self . module . check_mode :
if not os . path . exists ( self . home ) :
os . makedirs ( self . home )
self . chown_homedir ( int ( self . uid ) , int ( self . group ) , self . home )
for field in self . fields :
if self . __dict__ . has_key ( field [ 0 ] ) and self . __dict__ [ field [ 0 ] ] :
cmd = self . _get_dscl ( )
cmd + = [ ' -create ' , ' /Users/ %s ' % self . name ,
field [ 1 ] , self . __dict__ [ field [ 0 ] ] ]
cmd + = [ ' -create ' , ' /Users/ %s ' % self . name , field [ 1 ] , self . __dict__ [ field [ 0 ] ] ]
( rc , _err , _out ) = self . execute_command ( cmd )
if rc != 0 :
self . module . fail_json (
msg = ' Cannot add property " %s " to user " %s " . '
self . module . fail_json ( msg = ' Cannot add property " %s " to user " %s " . '
% ( field [ 0 ] , self . name ) , err = err , out = out , rc = rc )
out + = _out
@ -1713,10 +1679,7 @@ class DarwinUser(User):
current = self . _get_user_property ( field [ 1 ] )
if current is None or current != self . __dict__ [ field [ 0 ] ] :
cmd = self . _get_dscl ( )
cmd + = [ ' -create ' , ' /Users/ %s ' % self . name ,
field [ 1 ] , self . __dict__ [ field [ 0 ] ] ]
if self . module . check_mode :
return ( 0 , ' ' , ' ' )
cmd + = [ ' -create ' , ' /Users/ %s ' % self . name , field [ 1 ] , self . __dict__ [ field [ 0 ] ] ]
( rc , _err , _out ) = self . execute_command ( cmd )
if rc != 0 :
self . module . fail_json (
@ -1726,8 +1689,6 @@ class DarwinUser(User):
out + = _out
err + = _err
if self . update_password == ' always ' and self . password is not None :
if self . module . check_mode :
return ( 0 , ' ' , ' ' )
( rc , _err , _out ) = self . _change_user_password ( )
out + = _out
err + = _err
@ -1879,16 +1840,12 @@ class AIX(User):
# skip if no changes to be made
if len ( cmd ) == 1 :
( rc , out , err ) = ( None , ' ' , ' ' )
elif self . module . check_mode :
return ( 0 , ' ' , ' ' )
else :
cmd . append ( self . name )
( rc , out , err ) = self . execute_command ( cmd )
# set password with chpasswd
if self . update_password == ' always ' and self . password is not None and info [ 1 ] != self . password :
if self . module . check_mode :
return ( 0 , ' ' , ' ' )
cmd = [ ]
cmd . append ( self . module . get_bin_path ( ' chpasswd ' , True ) )
cmd . append ( ' -e ' )
@ -2048,8 +2005,6 @@ class HPUX(User):
# skip if no changes to be made
if len ( cmd ) == 1 :
return ( None , ' ' , ' ' )
elif self . module . check_mode :
return ( 0 , ' ' , ' ' )
cmd . append ( self . name )
return self . execute_command ( cmd )
@ -2127,8 +2082,11 @@ def main():
if module . check_mode :
module . exit_json ( changed = True )
( rc , out , err ) = user . create_user ( )
result [ ' system ' ] = user . system
result [ ' createhome ' ] = user . createhome
if module . check_mode :
result [ ' system ' ] = user . name
else :
result [ ' system ' ] = user . system
result [ ' createhome ' ] = user . createhome
else :
# modify user (note: this function is check mode aware)
( rc , out , err ) = user . modify_user ( )