From ecc5aab0e747fd33597bc286b0ba2cc6458021d6 Mon Sep 17 00:00:00 2001 From: Nikolas Garofil Date: Tue, 21 Dec 2021 19:40:46 +0100 Subject: [PATCH] feat(adduser): add adduser plugin (#10441) Automatic "Oh My ZSH" installation when adding new users --- plugins/adduser/README.md | 26 ++++++++++++++ plugins/adduser/adduser.plugin.zsh | 55 ++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 plugins/adduser/README.md create mode 100644 plugins/adduser/adduser.plugin.zsh 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..f6b8a4daf --- /dev/null +++ b/plugins/adduser/adduser.plugin.zsh @@ -0,0 +1,55 @@ +# 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" + + + #Create user, errors will be reported by the 'real' adduser + #Use which/tail combination to call the binary instead of this function + $(which -a adduser | tail -1) $@ || 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) + cat $path_installscript | \ + sed 's/exec zsh -l//' | + sed 's/read -r opt/opt=y; echo "\n--- This time I am answering \\"yes\\" for you, but you will still have to type in the password of that user ---"/' \ + > $temp_installscript + chown ${@[$#]} $temp_installscript && chmod +x $temp_installscript + + #try installing with sudo or su when not available + if [[ -x $(which sudo) ]] ; then + sudo -u ${@[$#]} $temp_installscript + returncode=$? + else + if [[ -x $(which su) ]] ; then + su -l ${@[$#]} -c $temp_installscript + returncode=$? + else + echo "You can't become ${@[$#]} (no 'sudo' or 'su' available)" > /dev/stderr; + returncode=1 + fi + fi + #cleanup + rm $temp_installscript + else + echo "Installationscript '$path_installscript' not available" 2> /dev/stderr; + returncode=1 + fi + + #mention the result + if [[ $returncode -eq 0 ]]; then + echo "$result_string succeeded." + else + echo "$result_string failed." 2> /dev/stderr + fi + + return $returncode +}