Files
macos-system/bin/azw-setup-user
2025-10-17 08:04:35 +02:00

174 lines
5.0 KiB
Bash
Executable File

#!/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}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>${serviceName}</string>
<key>ProgramArguments</key>
<array>
<string>${HOME}/bin/brew-periodic</string>
</array>
<key>StartInterval</key>
<integer>1800</integer>
</dict>
</plist>
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 configureFolders() {
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 installNode() {
volta install node
}
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 }
configureFolders
indicateActivity -- 'Install node' installNode
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