183 lines
4.3 KiB
Bash
Executable File
183 lines
4.3 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# defaults
|
|
topography=.topography
|
|
|
|
help() {
|
|
printf "Usage: auto. [OPTION]\n\
|
|
-t,\tspecify the topography of your dotfiles (default: .topography)\n\
|
|
-i,\tinstall dotfiles specified by -t\n\
|
|
-u,\tuninstall dotfiles specified by -t\n\
|
|
-b,\texit as soon as a command errors\n\
|
|
-h,\tshows help text\n"
|
|
exit 0
|
|
}
|
|
|
|
# setup package management util
|
|
for file in\
|
|
/etc/os-release\
|
|
/etc/lsb-release\
|
|
/usr/lib/os-release\
|
|
/etc/openwrt_release
|
|
do
|
|
[ -f "$file" ] && . "$file" && break
|
|
done
|
|
|
|
#######################################
|
|
# do root - runs a command as root
|
|
# Arguments:
|
|
# ... command
|
|
#######################################
|
|
dort() {
|
|
if [ -x /bin/doas ] && [ -f /etc/doas.conf ]; then
|
|
doas "$@"
|
|
elif [ -x /bin/sudo ]; then
|
|
sudo "$@"
|
|
fi
|
|
}
|
|
|
|
case "$ID" in
|
|
void)
|
|
pkg_man=xbps
|
|
pkg_install() {
|
|
[ -z "$*" ] && return 1
|
|
printf "\033[31mRunning: xbps-install -y -- %s\033[m\n" "$*"
|
|
dort xbps-install -y -- $*
|
|
}
|
|
|
|
pkg_uninstall() {
|
|
[ -z "$*" ] && return 1
|
|
printf "\033[31mRunning: xbps-remove -Roy -- %s\033[m\n" "$*"
|
|
dort xbps-remove -Roy -- $*
|
|
}
|
|
|
|
pkg_search() {
|
|
xbps-query --search= | fzf -f "$1" | head -1 | cut -d ' ' -f 2
|
|
}
|
|
;;
|
|
arch)
|
|
pkg_man=pacman
|
|
pkg_install() {
|
|
[ -z "$*" ] && return 1
|
|
printf "\033[31mRunning: pacman -s --noconfirm -- %s\033[m\n" "$*"
|
|
dort pacman -S --noconfirm -- $*
|
|
}
|
|
|
|
pkg_uninstall() {
|
|
[ -z "$*" ] && return 1
|
|
printf "\033[31mRunning: pacman -Runs --noconfirm -- %s\033[m\n" "$*"
|
|
dort pacman -Runs --noconfirm -- $*
|
|
}
|
|
|
|
pkg_search() {
|
|
pacman -Slq | fzf -f "$1" | head -1
|
|
}
|
|
;;
|
|
pop|debian|ubuntu)
|
|
pkg_man=apt
|
|
pkg_install() {
|
|
[ -z "$*" ] && return 1
|
|
printf "\033[31mRunning: apt-get install -y -- %s\033[m\n" "$*"
|
|
dort apt-get install -y -- $*
|
|
}
|
|
|
|
pkg_uninstall() {
|
|
[ -z "$*" ] && return 1
|
|
printf "\033[31mRunning: apt-get purge --autoremove -y -- %s\033[m\n" "$*"
|
|
dort apt-get purge --autoremove -y -- $*
|
|
}
|
|
|
|
pkg_search() {
|
|
apt list | fzf -f "$1" | head -1 | cut -d '/' -f 1
|
|
}
|
|
;;
|
|
esac
|
|
|
|
# parse command line options
|
|
while getopts :biuht: c; do
|
|
case $c in
|
|
t)
|
|
topography="${OPTARG}"
|
|
|
|
[ ! -f "$topography" ] &&\
|
|
printf "invalid topography file\n" &&\
|
|
exit 1
|
|
;;
|
|
# only install if not already uninstalling
|
|
i) [ -z $uninstall ] && install=1 ;;
|
|
# only uninstall if not already installing
|
|
u) [ -z $install ] && uninstall=1 ;;
|
|
b)
|
|
set -e
|
|
bailout() {
|
|
[ $? -eq 0 ] && return # don't run when the script ends successfully
|
|
printf "\033[31mlast command failed, bailing out!\033[m\n"
|
|
}
|
|
|
|
trap bailout EXIT
|
|
;;
|
|
h|*) help ;;
|
|
esac
|
|
done
|
|
|
|
[ ! -f "$topography" ] &&\
|
|
printf "no '.topography' file found\n" &&\
|
|
exit 1
|
|
|
|
[ -z $install ] && [ -z $uninstall ] &&\
|
|
printf "no action specified\n" &&\
|
|
help
|
|
|
|
# parse topography file line by line
|
|
while read -r line || return 0; do
|
|
# skip lines starting with a # (comments)
|
|
if [ "$(printf "%s" "$line" | head -c1)" = "#" ]; then
|
|
continue
|
|
|
|
# run a command
|
|
elif [ "$(printf "%s" "$line" | head -c2)" = '$$' ]; then
|
|
eval "${line##*\$\$}"
|
|
|
|
# install/uninstall a package if on a supported distro
|
|
elif [ "$(printf "%s" "$line" | head -c2)" = '::' ] && [ -n "$pkg_man" ]; then
|
|
# get line without prefix
|
|
s=${line##*\:\:}
|
|
|
|
# get number of packages specified
|
|
npkgs=$(printf "%s" "$s" | grep -o ',' | wc -l)
|
|
npkgs=$((npkgs + 2))
|
|
|
|
i=1
|
|
while [ $i -lt $npkgs ]; do
|
|
pkgname="$(printf "%s" "$s" | cut -d ',' -f $i)"
|
|
|
|
pkg=$(pkg_search "$pkgname")
|
|
|
|
[ $install ] && ipkgs=${ipkgs:+$ipkgs }$pkg
|
|
[ $uninstall ] && upkgs=${upkgs:+$upkgs }$pkg
|
|
|
|
i=$((i + 1))
|
|
done
|
|
|
|
pkg_install $ipkgs
|
|
pkg_uninstall $upkgs
|
|
|
|
# remove/add a file
|
|
elif printf "%s" "$line" | grep -q -- "->"; then
|
|
# get the path of the file
|
|
sourcef=$(eval echo "${line%% *->*}")
|
|
|
|
# get the destination for the file
|
|
destf=$(eval echo "${line##*->* }")
|
|
|
|
# install/uninstall
|
|
if printf "%s" "$line" | grep -q -- "#->"; then
|
|
[ $install ] && dort cp -rv -- "$sourcef" "$destf"
|
|
[ $uninstall ] && dort rm -rv -- "$destf"
|
|
else
|
|
[ $install ] && cp -rv -- "$sourcef" "$destf"
|
|
[ $uninstall ] && rm -rv -- "$destf"
|
|
fi
|
|
fi
|
|
done < "$topography"
|