#!/usr/bin/env bash testUser=osyncsudo testUserHome=/home/osyncsudo function CreateUser { local remoteUser"${1}" local homedir="${2}" if type getent > /dev/null 2>&1; then if ! getent passwd | grep "$remoteUser" > /dev/null; then echo "Manual creation of $remoteUser with homedir $homedir" if type adduser >/dev/null 2>&1; then adduser "$remoteUser" else echo "Cannot create user $remoteUser. Don't know what tool to use !" fi else echo "It seems that $remoteUser already exists" fi elif type dscl > /dev/null 2>&1; then if ! dscl . -search /Users name $remoteUser | grep "$remoteUser" > /dev/null; then echo "Manual creation of $remoteUser with homedir $homedir" dscl . -create /Users/$remoteUser else echo "It seems that $remoteUser already exists" fi else echo "Well, I don't know what tool to use to create that user for you" fi } function SetupSSH { local remoteUser="${1}" local homedir="${2}" if [ ! -d "$homedir/.ssh" ]; then mkdir "$homedir/.ssh" if [ $? != 0 ]; then echo "Cannot create [$homedir/.ssh]." exit 1 fi fi chmod 700 "$homedir/.ssh" if [ $? != 0 ]; then echo "Cannot chmod [$homedir/.ssh]." exit 1 fi chown $remoteUser "$homedir/.ssh" if [ $? != 0 ]; then echo "Cannot chown [$homedir/.ssh]." exit 1 fi echo -e 'y\n'| ssh-keygen -t rsa -b 2048 -N "" -f "$homedir/.ssh/id_rsa_local" if ! grep "$(cat $homedir/.ssh/id_rsa_local.pub)" "$homedir/.ssh/authorized_keys"; then cat "$homedir/.ssh/id_rsa_local.pub" >> "$homedir/.ssh/authorized_keys" fi chmod 600 "$homedir/.ssh/authorized_keys" chown $remoteUser "$homedir/.ssh/authorized_keys" chown $remoteUser "$homedir/.ssh/id_rsa_local" chown $remoteUser "$homedir/.ssh/id_rsa_local.pub" # Add localhost to known hosts so self connect works if [ -z "$(ssh-keygen -F localhost)" ]; then ssh-keyscan -H localhost >> "$homedir/.ssh/known_hosts" fi if [ -f "$homedir/.ssh/known_hosts" ]; then chown $remoteUser "$homedir/.ssh/known_hosts" fi } function PrepareSudoers { local remoteUser="${1}" local bashPath local rsyncPath if ! type bash > /dev/null 2>&1; then echo "No bash available" exit 1 else bashPath=$(type -p bash) fi if ! type rsync > /dev/null 2>&1; then echo "No rsync available" exit 1 else rsyncPath=$(type -p rsync) fi RemoveSudoers $remoteUser if [ -f "/etc/sudoers" ]; then echo "$remoteUser ALL=NOPASSWD:SETENV:$rsyncPath,$bashPath" >> "/etc/sudoers" echo "Defaults:$remoteUser !requiretty" >> "/etc/sudoers" elif [ -f "/usr/local/etc/sudoers" ]; then echo "$remoteUser ALL=NOPASSWD:SETENV:$rsyncPath,$bashPath" >> "/usr/local/etc/sudoers" echo "Defaults:$remoteUser !requiretty" >> "usr/local/etc/sudoers" else echo "No sudoers file found." echo "copy the following lines to /etc/sudoers (or /usr/local/etc/sudoers) and adjust /usr/bin path to the target system" echo "$remoteUser ALL=NOPASSWD:SETENV:$rsyncPath,$bashPath" echo "Defaults:$remoteUser !requiretty" fi } function RemoveUser { local remoteUser="${1}" if type rmuser > /dev/null 2>&1; then rmuser -y $remoteUser elif type userdel > /dev/null 2>&1; then userdel -fr $remoteUser elif type dscl > /dev/null 2>&1; then dscl . -delete "Users/$remoteUser" else echo "Please remove $remoteUser manually" fi } function RemoveSudoers { local remoteUser="${1}" if [ -f "/etc/sudoers" ]; then cp "/etc/sudoers" "/etc/sudoers.old" grep -v "$remoteUser" "/etc/sudoers.old" > "/etc/sudoers" elif [ -f "/usr/local/etc/sudoers" ]; then cp "/usr/local/etc/sudoers" "/usr/local/etc/sudoers.old" grep -v "$remoteUser" "/usr/local/etc/sudoers.old" > "/usr/local/etc/sudoers" else echo "Please remove lines containing $remoteUser from sudoers file manualle" fi } if [ "$1" == "set" ]; then CreateUser "$testUser" "$testUserHome" SetupSSH "$testUser" "$testUserHome" PrepareSudoers "$testUser" echo "" echo "Now feel free to run osync sudo test with" echo "su osyncsudo" echo "SUDO_EXEC=yes osync.sh --initiator=/home/osyncsudo --target=ssh://osyncsudo@localhost:22//root/osync-tests --rsakey=/home/osyncsudo/.ssh/id_rsa_local" echo "Don't forget to run $0 unset later" elif [ "$1" == "unset" ]; then RemoveUser "$testUser" RemoveSudoers "$testUser" else echo "usage: $0 [set] [unset]" fi