#!/usr/bin/env bash #set -e # TODO: Make this better banner() { 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}! $* ${RESET}" } error() { # this will be long, so I must do "&& exit 1" manually echo "${RED}X $* ${RESET}" } 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" ]] && [[ $SKIP_DEPENDENCY_INSTALL == "" ]]; 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" ]] && [[ $SKIP_DEPENDENCY_INSTALL == "" ]]; 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 --yes fi else warn "Dependency installs are being skipped" fi sleep 5 } cloneRepo() { if [ ! -d "$HOME/.dotfiles" ]; then echoStageName "Cloning the dotfiles repo" git clone https://github.com/ajhalili2006/dotfiles.git $HOME/.dotfiles else echoStageName "Dotfiles repo found, pulling remote changes instead" git -C "$HOME/.dotfiles" fetch --all git -C "$HOME/.dotfiles" pull origin fi slepp 5 if [[ $GITLAB_TOKEN == "" ]] && [[ $GITLAB_LOGIN == "" ]] && [ ! -d "$HOME/.dotfiles/secrets" ]; then error "GitLab login and token can't be blank!" && exit 1 # Probably change my GitLab SaaS username with yours elif [[ $GITLAB_LOGIN != "ajhalili2006" ]]; then error "Only Andrei Jiroh can do this!" && exit 1 elif [[ $GITLAB_LOGIN == "ajhalili2006" ]] && [[ $GITLAB_TOKEN == "" ]]; then error "Missing GitLab SaaS PAT! Check your Bitwarden vault for that key." && exit 1 fi if [ ! -d "$HOME/.dotfiles/secrets" ]; then echoStageName "Cloning secrets repo" git clone https://$GITLAB_LOGIN:$GITLAB_TOKEN@gitlab.com/ajhalili2006/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 git -C "$HOME/.dotfiles/secrets" pull sleep 5 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 GITLAB_LOGIN=gildedguy export GITLAB_TOKEN=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 unset DOTFILES_OS_NAME 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 else cp $HOME/.dotfiles/secrets/ssh/launchpad ~/.ssh/launchpad cp $HOME/.dotfiles/secrets/ssh/launchpad.pub ~/.ssh/launchpad.pub chmod 600 ~/.ssh/launchpad 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.bashrc ~/.bashrc elif [[ $DOTFILES_OS_NAME == "debian-ubuntu" ]]; then if [[ $SKIP_CONFIG_LINKING == "" ]] && [ ! -f "$HOME/.bashrc" ]; then ln -s "$HOME/.dotfiles/ubuntu.bashrc" ~/.bashrc elif [[ $SKIP_CONFIG_LINKING == "" ]] && [ -f "$HOME/.bashrc" ]; then warn mv ~/.bashrc ~/.bashrc.bak ln -s "$HOME/.dotfiles/ubuntu.bashrc" ~/.bashrc fi fi } copyGitConfig() { echoStageName "Symlinking Git config" if [[ $DOTFILES_OS_NAME == "android-termux" ]] && [[ $SKIP_CONFIG_LINKING == "" ]]; then [ ! -f "$HOME/.gitconfig" ] && 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" ]] && [[ $SKIP_CONFIG_LINKING == "" ]]; then [ ! -f "$HOME/.gitconfig" ] && 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 } # usage stuff usage() { echo "Accepted bootstrap script arguments are:" echo "* --help|-d - Show this text." echo "* --skip-dependency-install, -d - Skip inst" } main() { # check if the help flag is here [[ $DEBUG != "" ]] && echo "flags: $*" while [[ $# -gt 0 ]]; do case $1 in "--help"|-h) shift usage exit ;; *) shift error "Invalid arguments, add the help flag for usage." && exit 1 esac shift done # import colors and show the banner useColor banner # 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 "$@"