dotfiles/bootstrap

258 lines
8.5 KiB
Bash

#!/usr/bin/env bash
set -e
echo "Dotfiles Bootstrap Script by Andrei Jiroh"
echo "Starting up in 3 seconds..."
sleep 3
useColor() {
# Only use colors if connected to a terminal
if [ -t 1 ]; then
RED=$(printf '\033[31m')
GREEN=$(printf '\033[32m')
YELLOW=$(printf '\033[33m')
BLUE=$(printf '\033[34m')
MAGENTA=$(printf '\033[35m')
BOLD=$(printf '\033[1m')
RESET=$(printf '\033[m')
else
RED=""
GREEN=""
YELLOW=""
BLUE=""
MAGENTA=""
BOLD=""
RESET=""
fi
}
echoStageName() {
echo "$(${BOLD})----> $*$(${RESET})"
}
warn() {
echo "$(${YELLOW})! $*$(${YELLOW})"
}
error() {
# this will be long, so I must do "&& exit 1" manually
echo "$(${RED})X $*$(${RED})"
}
checkOs() {
if echo $OSTYPE | grep -qE "linux-android.*"; then
export DOTFILES_OS_NAME=android-termux
elif echo $OSTYPE | grep -qE '^linux-gnu.*' && [ -f '/etc/debian_version' ]; then
# Since Ubuntu is an major Debian fork, they're both LSB-complaint, so
# we might need to just use grep for this one in the future.
export DOTFILES_OS_NAME=debian-ubuntu
# TODO: Write stuff for Arch users and macOS.
# For WSL, that's an WIP.
else
error "Script unsupported for this machine. See the online README for guide on manual bootstrapping." && exit 1
fi
}
installDeps() {
echoStageName "Installating essiential dependencies"
if [[ $DOTFILES_OS_NAME == "android-termux" ]]; then
pkg install -y man git nano gnupg openssh proot resolv-conf asciinema openssl-tool
echo "info: Essientials are installed, if you need Node.js just do 'pkg install nodejs' (we recommend installing the LTS one for stability) anytime"
elif [[ $DOTFILES_OS_NAME == "debian-ubuntu" ]]; then
sudo apt install gnupg git nano -y
if [[ $USE_PYENV != "" ]]; then
# we'll use the pyenv stuff
echoStageName "Installing Pyenv with pyenv-installer"
curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
elif [[ $UPDATE_SYSTEM_PYTHON_INSTALL != "" ]]; then
echoStageName "Updating Python install"
sudo apt install python3 python3-pip
fi
fi
}
cloneRepo() {
if [ ! -d "$HOME/.dotfiles" ]; then
git clone https://github.com/AndreiJirohHaliliDev2006/dotfiles.git $HOME/.dotfiles
else
git -C "$HOME/.dotfiles" fetch --all
git -C "$HOME/.dotfiles" pull origin
fi
if [[ $GITLAB_TOKEN == "" ]] && [[ $GITLAB_LOGIN == "" ]]; then
error "GitLab login and token can't be blank!" && exit 1
# Probably change my GitLab SaaS username with yours
elif [[ $GITLAB_LOGIN != "AndreiJirohHaliliDev2006" ]]; then
error "Only Andrei Jiroh can do this!" && exit 1
elif [[ $GITLAB_LOGIN == "AndreiJirohHaliliDev2006" ]] && [[ $GITLAB_TOKEN == "" ]]; then
error "Missing GitLab SaaS PAT! Check your Bitwarden vault for that key." && exit 1
fi
if [ ! -d "$HOME/.dotfiles/secrets" ]; then
git clone https://$GITLAB_LOGIN:$GITLAB_TOKEN@gitlab.com/AndreiJirohHaliliDev2006/dotfiles-secrets $HOME/.dotfiles/secrets
[ $? == "0" ] && echo "error: That kinda sus, but either only Andrei Jiroh can proceed or maybe the PAT you used is invalid." && exit 1
chmod 600 $HOME/.dotfiles/secrets/{ssh,pgp}
sleep 5
else
git -C "$HOME/.dotfiles/secrets" fetch --all
fi
}
cleanup() {
echoStageName "----> Bootstrapper successfully ran, cleaning up to ensure no secrets are leaked on env vars..."
# just add chaos to these secrets to avoid leaks
export GH_USERNAME=gildedguy
export GH_PAT=build-guid-sus-among-computers-moment
if echo $OSTYPE | grep -qE "linux-android.*"; then
rm -rfv ~/{shellcheck,flarectl,LICENSE,README.txt,README.md}
pkg uninstall clang --yes && apt autoremove --yes
fi
echo "info: Please also cleanup your shell history with 'history -c' to ensure your GitLab SaaS PAT is safe. Enjoy your day!"
echo "info: Exiting..."
sleep 2
exit
}
copyKeysSSH() {
echoStageName "Copying SSH keys"
if [ ! -d "$HOME/.ssh" ]; then
mkdir -p $HOME/.ssh
cp $HOME/.dotfiles/secrets/ssh/launchpad ~/.ssh/launchpad
cp $HOME/.dotfiles/secrets/ssh/launchpad.pub ~/.ssh/launchpad.pub
chmod 600 ~/.ssh/launchpad
chmod 600 ~/.ssh/github-personal
else
cp $HOME/.dotfiles/secrets/ssh/launchpad ~/.ssh/launchpad
cp $HOME/.dotfiles/secrets/ssh/launchpad.pub ~/.ssh/launchpad.pub
chmod 600 ~/.ssh/launchpad
chmod 600 ~/.ssh/github-personal
fi
echoStageName "Linking config files"
if echo $OSTYPE | grep -qE "linux-android.*"; then
[ ! -f "$HOME/.ssh/config" ] && ln -s $HOME/.dotfiles/ssh-client/termux ~/.ssh/config
# TODO: Write checks if it's Ubuntu or Debian
# See https://superuser.com/a/741610/1124908 for details
elif echo $OSTYPE | grep -qE '^linux-gnu.*' && [ -f '/etc/debian_version' ]; then
[ ! -f "$HOME/.ssh/config" ] && ln -s $HOME/.dotfiles/ssh-client/ubuntu ~/.ssh/config
fi
sleep 5
}
copyBashrc() {
if [[ $DOTFILES_OS_NAME == "android-termux" ]]; then
ln -s $HOME/.dotfiles/termux.gitconfig ~/.gitconfig
elif [[ $DOTFILES_OS_NAME == "debian-ubuntu" ]]; then
if [[ $SKIP_BASHRC_LINKING == "" ]] && [ ! -f "$HOME/.bashrc" ]; then
ln -s "$HOME/.dotfiles/ubuntu.bashrc" ~/.bashrc
elif [[ $SKIP_CONFIG_LINKING == "" ]] && [ -f "$HOME/.bashrc" ]; then
mv ~/.bashrc ~/.bashrc.bak
ln -s "$HOME/.dotfiles/ubuntu.bashrc" ~/.bashrc
fi
fi
}
copyGitConfig() {
echoStageName "Symlinking Git config"
if [[ $DOTFILES_OS_NAME == "android-termux" ]]; then
[ ! -f "$HOME/.ssh/config" ] && ln -s $HOME/.dotfiles/gitconfig/termux ~/.gitconfig || warn "Git configuration on userspace found, please merge them manually!"
# TODO: Write checks if it's Ubuntu or Debian
# See https://superuser.com/a/741610/1124908 for details
elif [[ $DOTFILES_OS_NAME == "debian-ubuntu" ]]; then
[ ! -f "$HOME/.ssh/config" ] && ln -s $HOME/.dotfiles/linux/ubuntu ~/.gitconfig || warn "Git configuration on userspace found, please merge them manually!"
fi
}
copyNanoConfig() {
if [[ $DOTFILES_OS_NAME == "android-termux" ]]; then
[ "$SKIP_CONFIG_LINKING" == "" ] && ln -s $HOME/.dotfiles/nanorc/config/termux $HOME/.nanorc
fi
}
installShellCheck() {
echoStageName "Installing Shellcheck"
scversion="stable" # or "v0.4.7", or "latest"
current_shellcheck_path=$(command -v shellcheck)
isOwnedByUser=$(find $PREFIX/bin -user $USER -file shellcheck)
wget -qO- "https://github.com/koalaman/shellcheck/releases/download/${scversion?}/shellcheck-${scversion?}.linux.x86_64.tar.xz" | tar -xJv
if [[ $current_shellcheck_path == "" ]]; then
cp "shellcheck-${scversion}/shellcheck" $PREFIX/bin
else
if [[ $isOwnedByUser == "" ]]; then
sudo rm "${PREFIX}/bin/shellcheck"
else
rm "${PREFIX}/bin/shellcheck"
fi
fi
}
installAscinema() {
if command -v python3 | grep -qE '^/usr/bin.*'; then
sudo "$(which python3)" -m pip install asciinema
elif command -v python3>>/dev/null && [ -f "$HOME/.pyenv/shims/python3" ]; then
$(which python3) -m pip install asciinema
else
if [[ $DOTFILES_OS_NAME == "android-termux" ]]; then
pkg install asciinema --yes
else
sudo apt install asciinema --yes
fi
fi
}
installTF() {
if [[ $DOTFILES_OS_NAME == "android-termux" ]]; then
pkg install clang -y && pip install thefuck -U
else
if command -v python3>>/dev/null && [ -f "$HOME/.pyenv/shims/python3" ]; then
pip3 install thefuck
else
pip3 install thefuck -U
fi
fi
}
installFilterRepo() {
if [[ $DOTFILES_OS_NAME == "android-termux" ]]; then
pip install git-filter-repo
else
if command -v python3>>/dev/null && [ -f "$HOME/.pyenv/shims/python3" ]; then
pip3 install git-filter-repo
else
pip3 install git-filter-repo -U
fi
fi
}
main() {
useColor
# step 1: check the OS first
checkOs
# step 2: install needed tools
installDeps
# step 3: then clone the repo
cloneRepo
# step 4: install additional needed tools
installAscinema
installTF
installFilterRepo
# step 5: copy and symlink files
copyGitConfig
copyNanoConfig
copyBashrc
copyKeysSSH
# step 6: finally clean up bullshit
cleanup
}
main "$@"