From dfa0fb92a51f408a678887138371eceb1b633c02 Mon Sep 17 00:00:00 2001 From: Mathias Gruber Date: Fri, 1 Jan 2021 12:32:48 +0100 Subject: [PATCH 1/3] Mac OS X Service support files Added Mac OS X support files to install urbackup service. --- org.urbackup.plist | 50 +++++++++++++++++ post_install_osx_server.sh | 107 +++++++++++++++++++++++++++++++++++++ pre_install_osx_server.sh | 81 ++++++++++++++++++++++++++++ 3 files changed, 238 insertions(+) create mode 100644 org.urbackup.plist create mode 100755 post_install_osx_server.sh create mode 100755 pre_install_osx_server.sh diff --git a/org.urbackup.plist b/org.urbackup.plist new file mode 100644 index 00000000..9c34acf5 --- /dev/null +++ b/org.urbackup.plist @@ -0,0 +1,50 @@ + + + + + + Disabled + + Label + org.urbackup + KeepAlive + + Crashed + + + + ProgramArguments + + /usr/local/bin/urbackupsrv + run + -l /var/log/urbackup/urbackup.log + + + WorkingDirectory /usr/local/var/urbackup + RunAtLoad + UserName urbackup + + + diff --git a/post_install_osx_server.sh b/post_install_osx_server.sh new file mode 100755 index 00000000..9033f05b --- /dev/null +++ b/post_install_osx_server.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env sh +# Run this after each "sudo make install" to verify permissions + +USERNAME=urbackup +GROUPNAME=urbackup +PLISTFILE=org.urbackup.plist + + +if [ $EUID -ne 0 ]; then + echo "This script must be run as root" + exit 1 +fi + +src_dir=$(dirname $0) + +# Create urbackup group +GROUPID=$(dscl . -read /Groups/$GROUPNAME PrimaryGroupID 2> /dev/null | awk '{print $2}') +if [ -z "$GROUPID" ]; then + echo "Could not find group $GROUPNAME. Please run ./preinstall_osx_server.sh before 'make install'." + exit 1 +else + echo "Found group '$GROUPNAME' with ID $GROUPID" +fi + +# Create urbackup user +USERID=$(dscl . -read /Users/$USERNAME UniqueID 2> /dev/null | awk '{print $2}') +if [ -z "$USERID" ]; then + echo "Could not find user $USERNAME. Please run ./preinstall_osx_server.sh before 'make install'." + exit 1 +else + echo "Found user '$USERNAME' with ID $USERID" +fi + +# Create log folder +if [ ! -d "/var/log/$USERNAME" ]; then + echo "Creating directory for log files /var/log/$USERNAME" + mkdir /var/log/$USERNAME +fi + +# Update permissions +echo "Updating permissions..." +chown $USERNAME:$GROUPNAME /var/log/$USERNAME +chown -R $USERNAME:$GROUPNAME /usr/local/var/urbackup + +if [ ! -f /usr/local/var/urbackup/backupfolder ]; then + echo "Could not find '/usr/local/var/urbackup/backupfolder' file. Please specify your backup folder in this file." + exit 1 +fi + +echo "Verifying permissions..." +BACKUPDIR=$(cat /usr/local/var/urbackup/backupfolder) +parts=$(echo $BACKUPDIR/ | awk 'BEGIN{FS="/"}{for (i=1; i < NF; i++) print $i}') + +unset path +for part in $parts +do + path="$path/$part" + printf " Testing access to $path... " + if ! sudo -u $USERNAME test -d $path ; then + echo "ERROR!" + echo "Could not walk into folder '$path' using user '$USERNAME'. Please verify permissions." + exit 1 + else + echo "OK" + fi +done + +# Generate unique name +TMPFILE=$BACKUPDIR/test_file.$$ + +# Try harder if a clash (a bit paranoid) +if [ -f $TMPFILE ]; then + TMPFILE=$TMPFILE.1 +fi + +printf "Testing file write permission in '$BACKUPDIR'... " + +if ! sudo -u $USERNAME touch "$TMPFILE" ; then +#if ! touch $TMPFILE ; then + echo "ERROR!" + echo "No write permission for folder '$BACKUPDIR' using user '$USERNAME'. Please verify permissions." + exit 1 +else + echo "OK" + rm $TMPFILE +fi + +echo "Verifying Launchd plist file..." + +if [ ! -f $src_dir/$PLISTFILE ]; then + echo "ERROR! Could not find launchd plist file: $src_dir/$PLISTFILE" + exit 1 +fi + +if [ -f /Library/LaunchDaemons/$PLISTFILE ]; then + echo "Launchd plist file found in '/Library/LaunchDaemons/$PLISTFILE'. Keeping it." +else + echo "Installing a template Launchd plist file in '/Library/LaunchDaemons/$PLISTFILE'..." + cp "$src_dir/$PLISTFILE" /Library/LaunchDaemons/ +fi + +echo "All steps done!" +echo +echo "General commands to be done:" +echo " Start Service: sudo launchctl load -w /Library/LaunchDaemons/$PLISTFILE" +echo " Stop Service: sudo launchctl unload -w /Library/LaunchDaemons/$PLISTFILE" +echo " Customize Launchd: sudo nano /Library/LaunchDaemons/$PLISTFILE" diff --git a/pre_install_osx_server.sh b/pre_install_osx_server.sh new file mode 100755 index 00000000..3d1b1f7b --- /dev/null +++ b/pre_install_osx_server.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env sh +# Run this before the first "sudo make install" to create 'urbackup' user in OS X + +USERNAME=urbackup +USERLONGNAME=urbackup.org +GROUPNAME=urbackup +GROUPLONGNAME=urbackup.org + + +if [ $EUID -ne 0 ]; then + echo "This script must be run as root" + exit 1 +fi + +getHiddenUserUid () { + local __UIDS=$(dscl . -list /Users UniqueID | awk '{print $2}' | sort -ugr) + + local __NewUID + for __NewUID in $__UIDS + do + if [[ $__NewUID -lt 499 ]] ; then + break; + fi + done + + echo $((__NewUID+1)) +} + +getGroupUid () { + local __UIDS=$(dscl . -list /Groups PrimaryGroupID | awk '{print $2}' | sort -ugr) + + local __NewUID + for __NewUID in $__UIDS + do + if [[ $__NewUID -lt 390 ]] ; then + break; + fi + done + + echo $((__NewUID+1)) +} + + +# Create urbackup group +GROUPID=$(dscl . -read /Groups/$GROUPNAME PrimaryGroupID 2> /dev/null | awk '{print $2}') +if [ -z "$GROUPID" ]; then + GROUPID=$(getGroupUid) + echo "Creating group '$GROUPNAME' with ID $GROUPID" + dseditgroup -i $GROUPID -r "$GROUPLONGNAME" -o create "$GROUPNAME" +else + echo "Found $GROUPNAME group with ID $GROUPID" +fi + +# Create urbackup user +USERID=$(dscl . -read /Users/$USERNAME UniqueID 2> /dev/null | awk '{print $2}') +if [ -z "$USERID" ]; then + USERID=$(getHiddenUserUid) + echo "Creating user '$USERNAME' with ID $USERID" + dscl . -create /Users/$USERNAME UniqueID "$USERID" + dscl . -append /Users/$USERNAME RealName "$USERLONGNAME" + dscl . -append /Users/$USERNAME PrimaryGroupID "$GROUPID" + dscl . -append /Users/$USERNAME NFSHomeDirectory "/usr/local/var/urbackup" + dscl . -append /Users/$USERNAME UserShell /usr/bin/false + dscl . -append /Users/$USERNAME IsHidden "1" + dseditgroup -o edit -t user -a $USERNAME $GROUPNAME + dseditgroup -o edit -t user -a $USERNAME daemon +else + echo "Found $USERNAME group with ID $USERID" +fi + +# Create log folder +if [ ! -d "/var/log/$USERNAME" ] +then + echo "Creating directory for log files /var/log/$USERNAME" + mkdir /var/log/$USERNAME +fi + +# Update permissions +echo "Updating permissions..." +chown $USERNAME:$GROUPNAME /var/log/$USERNAME + From 3553fe392d4b4bb5819ddaac9315942504f23510 Mon Sep 17 00:00:00 2001 From: Mathias Gruber Date: Sun, 3 Jan 2021 23:41:46 +0100 Subject: [PATCH 2/3] Rename server plist file Rename server plist file to conform to same name template of the client backend --- org.urbackup.plist => org.urbackup.server.plist | 0 post_install_osx_server.sh | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename org.urbackup.plist => org.urbackup.server.plist (100%) diff --git a/org.urbackup.plist b/org.urbackup.server.plist similarity index 100% rename from org.urbackup.plist rename to org.urbackup.server.plist diff --git a/post_install_osx_server.sh b/post_install_osx_server.sh index 9033f05b..9ffa775b 100755 --- a/post_install_osx_server.sh +++ b/post_install_osx_server.sh @@ -3,7 +3,7 @@ USERNAME=urbackup GROUPNAME=urbackup -PLISTFILE=org.urbackup.plist +PLISTFILE=org.urbackup.server.plist if [ $EUID -ne 0 ]; then From e5489e4ea7b30e57524513d9ada70e9f688e730a Mon Sep 17 00:00:00 2001 From: Mathias Gruber Date: Mon, 4 Jan 2021 00:00:45 +0100 Subject: [PATCH 3/3] Rename server plist tag --- org.urbackup.server.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.urbackup.server.plist b/org.urbackup.server.plist index 9c34acf5..d9eb12e0 100644 --- a/org.urbackup.server.plist +++ b/org.urbackup.server.plist @@ -14,7 +14,7 @@ Disabled Label - org.urbackup + org.urbackup.server KeepAlive Crashed