inital commit
This commit is contained in:
177
auto.
Executable file
177
auto.
Executable file
@ -0,0 +1,177 @@
|
||||
#!/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
|
||||
[ $install ] && cp -rv -- "$sourcef" "$destf"
|
||||
[ $uninstall ] && rm -rv -- "$destf"
|
||||
fi
|
||||
done < "$topography"
|
Reference in New Issue
Block a user