From 9e5768aa4dd7353d65bbd577b0367029302aca96 Mon Sep 17 00:00:00 2001 From: David Kebler Date: Sun, 20 Dec 2020 17:20:50 -0800 Subject: [PATCH] added hugo and golang install functions as module --- all/modules/install/golang-install.func | 218 ++++++++++++++++++++++++ all/modules/install/hugo-install.func | 139 +++++++++++++++ 2 files changed, 357 insertions(+) create mode 100755 all/modules/install/golang-install.func create mode 100755 all/modules/install/hugo-install.func diff --git a/all/modules/install/golang-install.func b/all/modules/install/golang-install.func new file mode 100755 index 0000000..402cfdc --- /dev/null +++ b/all/modules/install/golang-install.func @@ -0,0 +1,218 @@ +#!/bin/bash +# shellcheck disable=SC2016 +# set -e + + # golang_install remove + # golang_ install -e m + +function get_platform () { + + local OS + local ARCH + local PLATFORM + + OS="$(uname -s)" + ARCH="$(uname -m)" + + case $OS in + "Linux") + case $ARCH in + "x86_64") + ARCH=amd64 + ;; + "aarch64") + ARCH=arm64 + ;; + "armv6") + ARCH=armv6l + ;; + "armv8") + ARCH=arm64 + ;; + .*386.*) + ARCH=386 + ;; + esac + PLATFORM="linux-$ARCH" + ;; + "Darwin") + PLATFORM="darwin-amd64" + ;; + esac + + echo $PLATFORM +} + +golang_install () { + +## START INSTALL +PLATFORM=$(get_platform) +if [ -z "$PLATFORM" ]; then + echo "Your operating system is not supported by this install script." + exit 1 +fi + +module_load block +[ ! "$(module_loaded block)" ] && echo unable to load block module, exiting && exit 1 +module_load confirm + +declare ENV_TYPE="u" # Which shell repo for the block +declare ENV_FILE # override shell repo location +# u=user h=host n=network b=base +# by default it is installed in userspace +# local versions of these +declare goroot +declare gopath + +declare OPTION +declare OPTARG +declare OPTIND + +while getopts 'e:f:r:p:' OPTION; do + # echo $OPTION $OPTARG + case "$OPTION" in + f) + ENV_FILE=$OPTARG + echo explicing setting block to $ENV_FILE + ;; + e) + ENV_TYPE=$OPTARG + echo + ;; + r) + goroot=$OPTARG + echo setting root $goroot + ;; + p) + gopath=$OPTARG + echo setting path $gopath + ;; + *) + echo unknown option $OPTION + ;; + esac +done + +shift $(( OPTIND - 1 )) + +if [[ ! $ENV_FILE ]]; then + FILE=lang/go + case $ENV_TYPE in + # h=host n=network b=base + "h") + [[ -d $BASH_SHELL_HOST/$(hostname) ]] && ENV_FILE=$BASH_SHELL_HOST/$(hostname)/$FILE + ;& + "m") + [[ -d $BASH_SHELL_HOST/all ]] && ENV_FILE=$BASH_SHELL_HOST/all/$FILE + ;& + "n") + ([[ -d $BASH_SHELL_NETWORK/$NETWORKNAME ]] && [[ ! $ENV_FILE ]]) && ENV_FILE=$BASH_SHELL_NETWORK/$NETWORKNAME/$FILE + ;& + "b") + ([[ -d $BASH_SHELL_BASE ]] && [[ ! $ENV_FILE ]]) && ENV_FILE=$BASH_SHELL_BASE/$FILE + ;; + esac + [[ ! $ENV_FILE ]] && ENV_FILE=$HOME/.bashrc # default is userspace +fi + +if [[ ! $goroot ]]; then + goroot=$GOROOT + if [[ ! $goroot ]]; then + [[ $ENV_TYPE = "u" ]] && goroot="$HOME/go" || goroot="/opt/go" + fi +fi + +if [[ ! $gopath ]]; then + gopath=$GOPATH + if [[ ! $gopath ]]; then + [[ $ENV_TYPE = "u" ]] && gopath="$HOME/go/apps" || gopath="/opt/go/apps" + fi +fi + +echo --- go environment settings are ----- +echo GOROOT: $goroot +echo GOPATH: $gopath +echo --------------------------------------- + +goenv=('export GOROOT='"$goroot"'\n' +'export PATH=$PATH:'"$goroot"'/bin\n' +'export GOPATH='"$gopath"'\n' +'export PATH=$PATH:'"$gopath"'/bin') + +echo ==== envionrment block is ==== +printf "${goenv[*]}\n" +echo ========================================= +echo environment block file is $ENV_FILE +confirm Do you want to continue || exit 1 + +set_block -f $ENV_FILE -n "Go Language Environment" + +if [[ $1 = remove ]]; then + confirm Do you really want to remove the go installation? || exit + remove_block + confirm Delete directory $gopath??? && rm -rf $gopath + confirm Delete directory $goroot??? && rm -rf $goroot + exit +fi + + # the github api doesn't show any release records to had to grab this way +VERSION=$(echo "$(wget -qO- https://github.com/golang/go/tags)" | sed -e 's/<[^>]*>//g'| sed '/^\s*$/d'| grep release-branch| awk '{ print $2 }'|grep -v runtime|sort -V|tail -1|cut -c 3-) +if [[ $(which go) ]]; then + INSTALLED_VERSION=$(echo $(go version)| awk '{print $3}' | cut -c 3-) + # INSTALLED_VERSION=1.15.2 # this is for testing, comment out for production + echo installed: $INSTALLED_VERSION available: $VERSION + if [ "$INSTALLED_VERSION" == "$VERSION" ]; then + echo Installed Version $INSTALLED_VERSION is current nothing to do, exiting + exit 0 + fi +fi + +if [ -d "$goroot" ]; then + echo "The Go install directory ($goroot) already exists. " + confirm Do you want to upgrade to $VERSION? || exit +fi + +echo installing version $VERSION ...... + +PACKAGE_NAME="go$VERSION.$PLATFORM.tar.gz" +TEMP_DIRECTORY=$(mktemp -d) + +echo "Downloading $PACKAGE_NAME ..." +if hash wget 2>/dev/null; then + wget https://storage.googleapis.com/golang/$PACKAGE_NAME -O "$TEMP_DIRECTORY/go.tar.gz" +else + curl -o "$TEMP_DIRECTORY/go.tar.gz" https://storage.googleapis.com/golang/$PACKAGE_NAME +fi + +if [ $? -ne 0 ]; then + echo "Download failed! Exiting." + exit 1 +fi + +echo "Extracting File..." +mkdir -p "$goroot" +# TODO set correct permissions here if necessary + +tar -C "$goroot" --strip-components=1 -xzf "$TEMP_DIRECTORY/go.tar.gz" + + +echo done installing go binary and support files +rm -rf $TEMP_DIRECTORY +echo making go workspace directories + +mkdir -p "${gopath}/"{src,pkg,bin} +# TODO set correct permission if all have access + +echo "Configuring GO environment in: $ENV_FILE" + +mkdir -p "$(dirname $ENV_FILE)" +touch "$ENV_FILE" +add_block +block_add_line "${goenv[*]}" +# echo ---------contents of $ENV_FILE------------------ +# cat $ENV_FILE +# echo ------------------------------------------------ + +echo -e "\nGo $VERSION was installed into $goroot.\n(re)start a new shell environment to take effect" + +} diff --git a/all/modules/install/hugo-install.func b/all/modules/install/hugo-install.func new file mode 100755 index 0000000..40bf3ce --- /dev/null +++ b/all/modules/install/hugo-install.func @@ -0,0 +1,139 @@ +#!/bin/bash + +hugo_install () { +# inspried from this forum post https://discourse.gohugo.io/t/script-to-install-latest-hugo-release-on-macos-and-ubuntu/14774/10 +# if you have run into github api anonymous access limits which happens during debugging/dev then add user and token here or sourced from a separate file +# . ~/githubapitoken +#GITHUB_USER="" +#GITHUB_TOKEN="" + +if [ "$GITHUB_TOKEN" != "" ]; then +echo using access token with script +echo $GITHUB_USER $GITHUB_TOKEN +fi + +EXTENDED=false +FORCE=false +EFILE="" + + +# options +# e - download and install the extended version +# c - use 'hugoe' as the install command for extended version otherwise 'hugo' will launch extended version +# f - force download/overwrite of same version + + +while getopts 'ecf' OPTION; do + case "$OPTION" in + e) + echo "installing extended hugo" + EXTENDED=true + ;; + c) + if [ $EXTENDED = true ]; then + EFILE="e" + echo using hugoe for extended command + fi + ;; + f) + echo "FORCING download/overwrite" + FORCE=true + ;; + esac +done + +shift $(( OPTIND - 1 )) + +DEFAULT_BIN_DIR="/usr/local/bin" +# Single optional argument is directory in which to install hugo +BIN_DIR=${1:-"$DEFAULT_BIN_DIR"} + +BIN_PATH="$(which hugo$EFILE)" +declare -A ARCHES +ARCHES=( ["arm64"]="ARM64" ["aarch64"]="ARM64" ["x86_64"]="64bit" ["arm32"]="ARM" ["armhf"]="ARM" ) +ARCH=$(arch) + +if [ -z "${ARCHES[$ARCH]}" ]; then + echo Your machine kernel architecture $ARCH is not supported by this script, aborting + exit 1 +fi + + +INSTALLED="$(hugo$EFILE version 2>/dev/null | cut -d'v' -f2 | cut -c 1-6)" +CUR_VERSION=${INSTALLED:-"None"} +echo $(curl -u $GITHUB_USER:$GITHUB_TOKEN -s https://api.github.com/repos/gohugoio/hugo/releases/latest | grep tag_name) +NEW_VERSION="$(curl -u $GITHUB_USER:$GITHUB_TOKEN -s https://api.github.com/repos/gohugoio/hugo/releases/latest \ + | grep tag_name \ + | cut -d'v' -f2 | cut -c 1-6)" + +echo "Hugo `[ $EXTENDED == true ] && echo "Extended"`: Current Version : $CUR_VERSION => New Version: $NEW_VERSION" + +if [ -z "$NEW_VERSION" ]; then + echo Unable to retrieve new version number - Likely you have reached github anonymous limit + echo set environment variable `$GITHUB_USER` and `$GITHUB_TOKEN` and try again + exit 1 +fi + +if ! [ $NEW_VERSION = $CUR_VERSION ] || [ $FORCE = true ]; then + + pushd /tmp/ > /dev/null + + URL=$(curl -u $GITHUB_USER:$GITHUB_TOKEN -s https://api.github.com/repos/gohugoio/hugo/releases/latest \ + | grep "browser_download_url.*hugo.*._Linux-${ARCHES[$ARCH]}\.tar\.gz" \ + | \ + if [ $EXTENDED = true ]; then + grep "_extended" + else + grep -v "_extended" + fi \ + | cut -d ":" -f 2,3 \ + | tr -d \" \ + ) + + echo $URL + + echo "Installing version $NEW_VERSION `[ $EXTENDED == true ] && echo "Extended"` " + echo "This machine's architecture is $ARCH" + echo "Downloading Tarball $URL" + + wget --user=-u $GITHUB_USER --password=$GITHUB_TOKEN -q $URL + + TARBALL=$(basename $URL) + # TARBALL="$(find . -name "*Linux-${ARCHES[$ARCH]}.tar.gz" 2>/dev/null)" + echo Expanding Tarball, $TARBALL + tar -xzf $TARBALL hugo + + chmod +x hugo + +if [ -w $BIN_DIR ]; then + echo "Installing hugo to $BIN_DIR" + mv hugo -f $BIN_DIR/hugo$EFILE +else + echo "installing hugo to $BIN_DIR (sudo)" + sudo mv -f hugo $BIN_DIR/hugo$EFILE +fi + +rm $TARBALL + + popd > /dev/null + + echo Installing hugo `[ $EXTENDED == true ] && echo "extended"` as hugo$EFILE + + BIN_PATH="$(which hugo$EFILE)" + if [ -z "$BIN_PATH" ]; then + printf "WARNING: Installed Hugo Binary in $BIN_DIR is not in your environment path\nPATH=$PATH\n" +else + if [ "$BIN_DIR/hugo$EFILE" != "$BIN_PATH" ]; then + echo "WARNING: Just installed Hugo binary hugo$EFILE to, $BIN_DIR , conflicts with existing Hugo in $BIN_PATH" + echo "add $BIN_DIR to path and delete $BIN_PATH" +else + echo "--- Installation Confirmation ---" + printf "New Hugo binary version at $BIN_PATH is\n $($BIN_PATH version)\n" + fi +fi + +else + echo Latest version already installed at $BIN_PATH +fi + +}