From 91e205f44e4cf5780afa06067d0757a11cce4389 Mon Sep 17 00:00:00 2001 From: Benie Date: Tue, 17 Sep 2019 18:33:43 +0100 Subject: [PATCH] Add bootstrap-Arch.sh usage: ./bootstrap-Arch.sh [-h] [-y] Bootstrap an Arch Linux based distribution with: * update pacman database * upgrade pacman packages * git - from pacman * python-pip - from pacman * python-virtualenv - from pacman * SSH key - from ssh-keygen * GitHub public key - with SSH key * GitLab public key - with SSH key * BitBucket Cloud public key - with SSH key * Gogs public key - with SSH key * conduit - configuration manager If any already exist they will not be reinstalled. optional arguments: -h show this help message and exit -y assume yes when prompted --- README.md | 6 +++ bootstrap-Arch.sh | 105 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100755 bootstrap-Arch.sh diff --git a/README.md b/README.md index 86decb3..1e89790 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,12 @@ To bootstrap a Debian based Linux instance: $ wget https://code.infektor.net/config/bootstrap/raw/master/bootstrap-Debian.sh && chmod +x bootstrap-Debian.sh && ./bootstrap-Debian.sh ``` +To bootstrap a Arch Linux based instance: + +```console +$ curl -O https://code.infektor.net/config/bootstrap/raw/master/bootstrap-Arch.sh && chmod +x bootstrap-Arch.sh && ./bootstrap-Arch.sh +``` + To bootstrap a Windows instance: ```console diff --git a/bootstrap-Arch.sh b/bootstrap-Arch.sh new file mode 100755 index 0000000..7b1080a --- /dev/null +++ b/bootstrap-Arch.sh @@ -0,0 +1,105 @@ +#!/bin/bash + +set -e + +show_usage() { + echo "usage: $0 [-h] [-y]" +} + +show_help() { + show_usage + echo + echo "Bootstrap a Debian based distribution with:" + echo + echo "* update pacman cache" + echo "* upgrade pacman packages" + echo "* git - from pacman" + echo "* python-pip - from pacman" + echo "* virtualenv - from pacman" + echo "* SSH key - from ssh-keygen" + echo "* GitHub public key - with SSH key" + echo "* GitLab public key - with SSH key" + echo "* BitBucket Cloud public key - with SSH key" + echo "* Gogs Cloud public key - with SSH key" + echo "* conduit - configuration manager" + echo + echo "If any already exist they will not be reinstalled." + echo + echo "optional arguments:" + echo " -h show this help message and exit" + echo " -y assume yes when prompted" +} + +yes=0 + +while getopts 'hy' opt; do + case $opt in + h) show_help; exit 0 ;; + y) yes=1 ;; + *) show_usage; exit 1 ;; + esac +done + +missing() { + which $1 &> /dev/null && return 1 || return 0 +} + +agree() { + local check=^[Nn]$ + [ $yes -eq 1 ] && [[ ! "$2" =~ $check ]] && return 0 + [[ "$2" =~ $check ]] && local default="[y/N]" || local default="[Y/n]" + read -p "$1 $default? " answer + case "$answer" in + y|Y|yes) return 0 ;; + n|N|no) return 1 ;; + '') [[ "$2" =~ $check ]] && return 1 || return 0 ;; + *) echo "invalid input: $answer" && return `agree "$1"` ;; + esac +} + +pacman_install() { + sudo pacman -S --needed --noconfirm $1 > /dev/null +} + +pip_install() { + pip install --user $1 > /dev/null +} + +export PATH=~/.local/bin:$PATH + +agree "Update pacman cache" && sudo pacman -Syy > /dev/null +agree "Upgrade pacman packages" "N" && sudo pacman -Syu > /dev/null + +missing git && agree "Install git" && pacman_install git + +if missing pip; then + agree "Install python-pip" && pacman_install python-pip + agree "Upgrade pip with pip" && \ + sudo -H pip_install --upgrade pip > /dev/null +fi + +missing virtualenv && agree "Install virtualenv" && pip_install virtualenv + +if [ ! -f ~/.ssh/id_rsa ] && agree "Generate SSH key"; then + read -rp "SSH email: " email + [ ! -d ~/.ssh ] && mkdir -p ~/.ssh + ssh-keygen -t rsa -b 4096 -C "$email" -N "" -f ~/.ssh/id_rsa +fi + +if ! missing virtualenv && agree "Set SSH keys on remote Git servers"; then + env=$(mktemp -d) + virtualenv $env > /dev/null + source $env/bin/activate + pip install git+https://code.infektor.net/config/bootstrap.git > /dev/null + python -c 'import bootstrap; bootstrap.set_ssh_keys()' + deactivate + rm -r $env +fi + +missing conduit && agree "Install conduit" && \ + pip_install git+ssh://git@github.com/kbenzie/conduit.git + +echo "To use installed pip packages update your PATH:" +echo 'export PATH=~/.local/bin:$PATH' + +[ -f $0 ] && agree "Remove $0" "N" && rm $0 || exit 0