From 3f2f23a446e18b002a57a4de522eb604f924688c Mon Sep 17 00:00:00 2001 From: "T. R. Bernstein" <137705289+trbernstein@users.noreply.github.com> Date: Thu, 16 Oct 2025 23:25:54 +0200 Subject: [PATCH] Create setup-user command --- bin/azw-setup-user | 168 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100755 bin/azw-setup-user diff --git a/bin/azw-setup-user b/bin/azw-setup-user new file mode 100755 index 0000000..825e498 --- /dev/null +++ b/bin/azw-setup-user @@ -0,0 +1,168 @@ +#!/usr/bin/env zsh +# vi: set ft=zsh tw=80 ts=2 + +function getExecPrerequisites() { + cmds+=( + [launchctl]='' + [git]='' + [mkdir]='' + [chmod]='' + []='' + ) +} + +function hideFolders() { + chflags hidden ${HOME}/bin +} + +function checkExecPrerequisites() { + local -A cmds + getExecPrerequisites || return + checkCommands -m 'This script needs %1$s to work. Please install and retry.' ${(k)cmds} || return +} + +function configureInstallPrefix() { + local dirPath= desc= + for dirPath desc in ${homebrew_prefix} 'Creating install prefix' ${homebrew_directory} 'Creating Homebrew directory'; do + if [[ ! -d ${dirPath} ]]; then + indicateActivity -- ${desc} createDirAndLogOnFailure ${dirPath} + fi + done +} + +function createDirAndLogOnFailure() { + local dirPath=$1 + mkdir -p ${dirPath} 2> /dev/null || { + loptty -- -e 'Could not create directory' -e $dirPath + return 10 + } + chmod 744 ${dirPath} +} + +function downloadHomebrew() { + local git_homebrew_remote=`getDefaultGitHomebrewURL` + pushd -q ${homebrew_directory} || return 10 + test -d ".git" && return + git init -q + git config remote.origin.url "${git_homebrew_remote}" + git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*' + git config core.autocrlf false + git config --replace-all homebrew.analyticsmessage false + git config --replace-all homebrew.caskanalyticsmessage false + git fetch --quiet --force origin > /dev/null + git fetch --quiet --force --tags origin > /dev/null + git reset --hard origin/master + popd -q +} + +function createBrewCallerScript() { + local cmdPath=${HOME}/bin/brew + local brewPath=${homebrew_directory}/bin/brew + [[ -f ${cmdPath} ]] && rm ${cmdPath} + mkdir -p ${cmdPath:h} + cat <<- BREWCALLER > ${cmdPath} + #!/usr/bin/env zsh + export HOMEBREW_CASK_OPTS="--no-quarantine \${HOMEBREW_CASK_OPTS}" + export HOMEBREW_NO_AUTO_UPDATE=1 + export HOMEBREW_NO_ANALYTICS=1 + export HOMEBREW_NO_ANALYTICS_THIS_RUN=1 + export HOMEBREW_NO_ANALYTICS_MESSAGE_OUTPUT=1 + "${brewPath}" "\$@" + BREWCALLER + chown $(id -un):$(id -gn) ${cmdPath} + chmod u=rwx,go=r ${cmdPath} +} + +function createBrewPeriodicScript() { + local brewCallerPath=${HOME}/bin/brew + local cmdPath=${HOME}/bin/brew-periodic + [[ -f ${cmdPath} ]] && rm ${cmdPath} + mkdir -p ${cmdPath:h} + cat <<- BREWCALLER > ${cmdPath} + #!/usr/bin/env zsh + local brew='${brewCallerPath}' + \$brew update + \$brew upgrade --greedy + \$brew cleanup + BREWCALLER + chown $(id -un):$(id -gn) ${cmdPath} + chmod u=rwx,go=r ${cmdPath} +} + +function updateBrew() { + local brewPath=${homebrew_directory}/bin/brew + ${brewPath} update --force --quiet + chmod go-w "${homebrew_directory}/share/zsh" +} + +function createLaunchDaemonsPlist() { + local uid=`id -u` + local serviceName="de.astzweig.macos.launchagents.$1" + local launchAgentPath=${HOME}/Library/LaunchAgents + local launcherPath="${launchAgentPath}/${serviceName}.plist" + [[ -d ${launchAgentPath} ]] || mkdir ${launchAgentPath} || return + [[ -f ${launcherPath} ]] && { + launchctl disable gui/${uid}/${serviceName} + rm ${launcherPath} + } + cat <<- LAUNCHDPLIST > ${launcherPath} + + + + + Label + ${serviceName} + ProgramArguments + + ${HOME}/bin/brew-periodic + + StartInterval + 1800 + + + LAUNCHDPLIST + chmod u=rw,go=r ${launcherPath} + launchctl enable gui/${uid}/${serviceName} &> /dev/null + launchctl bootstrap gui/${uid}/ ${launcherPath} &> /dev/null || true +} + +function installHomebrewUpdater() { + createLaunchDaemonsPlist brew-updater +} + +function getDefaultHomebrewPrefix() { + print -- ${HOMEBREW_PREFIX:-${HOME}/Library/Application Support} +} + +function getHomebrewDirectoryPath() { + print -- ${homebrew_prefix:-$(getDefaultHomebrewPrefix)}/Homebrew +} + +function configure_folders() { + local dirPath + for dirPath in ${HOME}/bin ${HOME}/.vim/{backups,swaps}; do + [[ ! -d ${dirPath} ]] && indicateActivity -- "Creating ${dirPath}" mkdir ${dirPath} + done + indicateActivity -- 'Hide folders' hideFolders +} + +function main() { + lop -y h1 -- -i 'Setup User' + [[ $(id -u) -eq 0 ]] && { loptty -- -e 'Command must not be run as root.' -e $dirPath; return 16 } + configure_folders + local homebrew_prefix=`getDefaultHomebrewPrefix` + local homebrew_directory=`getHomebrewDirectoryPath` + checkExecPrerequisites || return 17 + configureInstallPrefix || return 10 + indicateActivity -- 'Downloading Homebrew' downloadHomebrew || return 11 + indicateActivity -- 'Create brew caller script' createBrewCallerScript || return 12 + indicateActivity -- 'Create brew periodic script' createBrewPeriodicScript || return 13 + indicateActivity -- 'Update brew' updateBrew || return 14 + indicateActivity -- 'Install Homebrew updater' installHomebrewUpdater || return 15 +} + +if [[ "${ZSH_EVAL_CONTEXT}" == toplevel || "${ZSH_EVAL_CONTEXT}" == cmdarg ]]; then + _DIR="${0:A:h}" + source autoload-zshlib + main "$@" +fi