diff --git a/plugins/adduser/adduser.plugin.zsh b/plugins/adduser/adduser.plugin.zsh index f6b2f35b7..aa89528f3 100644 --- a/plugins/adduser/adduser.plugin.zsh +++ b/plugins/adduser/adduser.plugin.zsh @@ -1,63 +1,70 @@ # Copyright (c) 2021 Nikolas Garofil -adduser() { - local returncode - local result_string="Installation of 'Oh My Zsh' " - local temp_installscript - local path_installscript="$ZSH/tools/install.sh" +_adduser_result() { + local result_string="Installation of 'Oh My Zsh' for '$new_user'" - - #Create user, errors will be reported by the 'real' adduser - #Use which/tail combination to call the binary instead of this function - command adduser $@ || return 1 - - - echo "\nUser '${@[$#]}' has been created. I will now try to install 'Oh My Zsh'" - if [[ -f $path_installscript ]] ; then - - #copy install.sh to a new file in temp that we can give the right owner to execute - #and also make sure that after the install script we are no longer the new user - temp_installscript=$(mktemp) - cp $path_installscript $temp_installscript - chown ${@[$#]} $temp_installscript && chmod +x $temp_installscript - - #try installing with sudo or su when not available - if [[ -x "$commands[sudo]" ]] ; then - sudo -u ${@[$#]} sh -c "$temp_installscript --unattended" - returncode=$? - if [[ -x "$commands[chsh]" ]] ; then - sudo chsh -s $commands[zsh] ${@[$#]} - else - echo "'chsh' is not available, change the shell manually." > /dev/stderr - fi - returncode=$? - else - if [[ -x "$commands[su]" ]] ; then - su -l ${@[$#]} -c "$temp_installscript --unattended" - returncode=$? - if [[ -x "$commands[chsh]" ]] ; then - su -c "chsh -s $commands[zsh] ${@[$#]}" - else - echo "'chsh' is not available, change the shell manually." > /dev/stderr - fi - else - echo "You can't become ${@[$#]} (no 'sudo' or 'su' available)" > /dev/stderr; - returncode=1 - fi - fi - #cleanup + #Erase the temporary copy of the installscript when necessary + if [[ ! -z $temp_installscript ]] ; then rm $temp_installscript - else - echo "Installationscript '$path_installscript' not available" > /dev/stderr; - returncode=1 fi #mention the result - if [[ $returncode -eq 0 ]]; then + if [[ $1 -eq 0 ]]; then echo "$result_string succeeded." else echo "$result_string failed." > /dev/stderr fi - return $returncode +} + +adduser() { + local path_installscript="$ZSH/tools/install.sh" + local unattended_options=" --unattended" + + local new_user=${@[$#]} + local temp_installscript; local unattended_installer; local install_as_user; local change_shell; + + #Create user, errors will be reported by the 'real' adduser + #Don't use $new_user so that we have all args + command adduser $@ || return 1 + + echo "\nUser '$new_user' has been created. I will now try to install 'Oh My Zsh'" + + if [[ ! -f $path_installscript ]] ; then + echo "Installationscript '$path_installscript' not available" > /dev/stderr; + _adduser_result 1 + return 1; + fi + + #copy install.sh to a new file in temp that we can give the right owner to execute + #and also make sure that after the install script we are no longer the new user + temp_installscript=$(mktemp) + cp $path_installscript $temp_installscript + chown $new_user $temp_installscript && chmod +x $temp_installscript + unattended_installer="$temp_installscript $unattended_options" + + if [[ ( ! -x "$commands[sudo]" ) && ( ! -x "$commands[su]" ) ]] ; then + echo "You can't become $new_user (no 'sudo' or 'su' available)" > /dev/stderr; + _adduser_result 1 + return 1; + fi + if [[ -x "$commands[sudo]" ]] ; then + install_as_user="sudo -u $new_user sh -c '$unattended_installer'" + change_shell="sudo chsh -s $commands[zsh] $new_user" + else + install_as_user="su -l $new_user -c '$unattended_installer'" + change_shell="su -c 'chsh -s $commands[zsh] $new_user'" + fi + + eval ${install_as_user} + #mention the result before changing the shell (even with a bad result it's still installed) + if [ ! $? -eq 0 ] ; then + _adduser_result 1 + return 1 + fi + + if [[ ! -x "$commands[chsh]" ]] ; then + echo "'chsh' is not available, change the shell manually." > /dev/stderr + fi + eval ${change_shell} }