diff --git a/plugins/adduser/README.md b/plugins/adduser/README.md new file mode 100644 index 000000000..836459405 --- /dev/null +++ b/plugins/adduser/README.md @@ -0,0 +1,26 @@ +# adduser + +This plugin adds support for installing "Oh My ZSH" when adding new users. + +To use it, add `adduser` to the plugins array of your `~/.zshrc` file: + +```zsh +plugins=(... adduser) +``` + +## Usage + +Just run `adduser` as you normally would do and now: + +1. The regular `adduser` command will run. +2. The shell of the new user will switch to zsh +3. "Oh My zsh will be installed (as if he would have ran `install.sh` himself). + +## NOTES + +- It is assumed that the last argument will be the username.
*(In rare cases people provide the group as last argument)* +- `useradd` behaviour is not changed. + +## Author + +[Nikolas Garofil](https://github.com/ngaro) diff --git a/plugins/adduser/adduser.plugin.zsh b/plugins/adduser/adduser.plugin.zsh new file mode 100644 index 000000000..aa89528f3 --- /dev/null +++ b/plugins/adduser/adduser.plugin.zsh @@ -0,0 +1,70 @@ +# Copyright (c) 2021 Nikolas Garofil + +_adduser_result() { + local result_string="Installation of 'Oh My Zsh' for '$new_user'" + + #Erase the temporary copy of the installscript when necessary + if [[ ! -z $temp_installscript ]] ; then + rm $temp_installscript + fi + + #mention the result + if [[ $1 -eq 0 ]]; then + echo "$result_string succeeded." + else + echo "$result_string failed." > /dev/stderr + fi + +} + +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} +}