#/bin/bash # golang Bootstrap installer script # Bash expansions to get the name and location of this script when run scriptname="${BASH_SOURCE[0]##*/}" script_title="${grn}Go${blu}la${red}n${ylw}g${dfl}" rundir="${BASH_SOURCE[0]%/*}" sys_arch=$(uname -m) req_go_ver="1.19" golang_bashrc="# Golang system path setup export PATH=\$PATH:/usr/local/go/bin " # Source PRbL Functions locally or retrieve from online if [ ! -z $prbl_functions ] ; then source $prbl_functions else if [ -f ${rundir}/functions ] ; then source ${rundir}/functions else # Iterate through get commands and fall back on next if unavailable if command -v curl >/dev/null 2>&1; then source <(curl -ks 'https://raw.githubusercontent.com/pyr0ball/PRbL/main/functions') elif command -v wget >/dev/null 2>&1; then source <(wget -qO- 'https://raw.githubusercontent.com/pyr0ball/PRbL/main/functions') elif command -v fetch >/dev/null 2>&1; then source <(fetch -qo- 'https://raw.githubusercontent.com/pyr0ball/PRbL/main/functions') else echo "Error: curl, wget, and fetch commands are not available. Please install one to retrieve PRbL functions." exit 1 fi fi fi logfile="${rundir}/${pretty_date}_${scriptname}.log" installdir="$HOME/devl" # Dependencies sys_packages=( cmake libunwind-dev libgtk3-dev libgmp3-dev ) pip_packages=() repo_packages=() codedog_bashrc="# Golang system path setup export PATH=\"\$PATH:/usr/local/go/bin/\" " strip-html-tags() { local input="$1" local stripped=$(echo "$input" | sed 's/<[^>]*>//g' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') echo "$stripped" } # Functions check-deps(){ # Iterate through the list of required packages and check if installed for pkg in ${packages[@]} ; do local _pkg=$(dpkg -l $pkg 2>&1 >/dev/null ; echo $?) # If not installed, add it to the list of missing bins if [[ $_pkg != 0 ]] ; then bins_missing+=($pkg) fi done # Count the number of entries in bins_missing local _bins_missing=${#bins_missing[@]} # If higher than 0, return a fail (1) if [[ $_bins_missing != 0 ]] ; then return 1 else return 0 fi } check-go(){ if [[ -x /usr/bin/go ]] ; then # TODO: Add version checking rather than just whether the binary is executible #inst_go_ver=$(/usr/bin/go version | awl {'print $3'} | cut -c 3-) #if [[ $(vercomp )]] return 0 else return 1 fi } install-deps(){ logger echo "Installing packages $sys_packages" run "for $_package in $sys_packages ; do sudo apt-get install -y $_package ; done" if [ -f ${rundir}/requirements.txt ] ; then pip install -y ${rundir}/requirements.txt else if [ ! -z $pip_packages ] ; then pip install -y ${pip_packages[@]} fi fi # Sets dependency installed flag to true depsinstalled=true } dry-run-report(){ box-rounded boxborder "${grn}Dry-run Report:${dfl}" box-norm boxborder \ "bins_missing= " \ "${bins_missing[@]}" \ "backup_files= " \ "${backup_files[@]}" \ "installed_files= " \ "${installed_files[@]}" \ "installed_dirs= " \ "${installed_dirs[@]}" } install(){ if check-go ; then boxline "golang already installed!" return 0 fi if ! check-deps ; then warn "Some of the utilities needed by this script are missing" boxlinelog "Missing utilities:" boxlinelog "${bins_missing[@]}" boxlinelog "Would you like to install them? (this will require root password)" utilsmissing_menu=( "$(boxline "${green_check} Yes")" "$(boxline "${red_x} No")" ) case `select_opt "${utilsmissing_menu[@]}"` in 0) boxlinelog "${grn}Installing dependencies...${dfl}" install-deps ;; 1) warn "Dependent Utilities missing: $bins_missing" ;; esac fi local _golang_html=$(/usr/bin/curl -ks "https://go.dev/dl/" | grep $sys_arch | grep $req_go_ver | head -n 1) local golang_current=$(strip-html-tags "$_golang_html") #golang_current=$(echo "$golang_current" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//') export tmp_dir=`mktemp -d /tmp/selfextract.XXXXXX` logger boxborder "Pulling golang v$req_go_ver for installation" run wget "https://go.dev/dl/${golang_current}" -O $tmp_dir/$golang_current run sudo rm -rf /usr/local/go run sudo tar -C /usr/local -xzf $tmp_dir/$golang_current if [ ! -f $HOME/.bashrc.d/11-golang.bashrc ] ; then echo -e "$codedog_bashrc" >> $HOME/.bashrc.d/11-golang.bashrc && \ logger boxborder ".bashrc.d/11-golang.bashrc installed..." fi export PATH=$PATH:/usr/local/go/bin if [ ! -x /usr/bin/go ] ; then run sudo ln -s /usr/local/go/bin/go /usr/bin/go && \ logger boxborder "golang symlink created at /usr/bin/go" fi return 0 } # Function for displaying the usage of this script usage(){ boxborder \ "${lbl}Usage:${dfl}" \ "${lyl}./$scriptname ${bld}[args]${dfl}" \ "$(boxseparator)" \ "[args:]" \ " -i [--install]" \ " -d [--dependencies]" \ " -D [--dry-run]" \ " -r [--remove]" \ " -f [--force]" \ " -F [--force-remove]" \ " -u [--update]" \ " -h [--help]" } case $1 in -i | --install) install && success " [${script_title} ${lyl}Installed${dfl}]" ;; -r | --remove) remove && success " [${script_title} ${lyl}Removed${dfl}]" ;; -d | --dependencies) install-deps && success "${script_title} ${dfl} Dependencies installed!" ;; -D | --dry-run) export dry_run=true install dry-run-report usage unset dry_run success "${script_title} ${lyl}Installer Dry-Run Complete!${dfl}" ;; -u | --update) export update_run=true update && unset update_run && success " [${script_title} ${lyl}Updated${dfl}]" ;; -f | --force) remove-arbitrary install && success " [${script_title} ${lyl}Installed${dfl}]" ;; -F | --force-remove) remove-arbitrary && success " [${script_title} ${lyl}Force-Removed${dfl}]" ;; -h | --help) usage ;; *) warn "Invalid argument $@" usage #exit 2 ;; esac #------------------------------------------------------# # Script begins here #------------------------------------------------------# #install