#!/bin/bash set -e function showHelp() { cat << HELP 🧙 arkanum ✨🌌☄️💥 is used to install optional tools for developing in a code-server container environment. Syntax: arkanum COMMAND OPTION ARGUMENT COMMAND config The config command is used to modify arkanum itself. git The git command is a wrapper for git helpers. install The install command is used to add different tools help Shows this help text. OPTION config: disable-motd Disables hint in new bash terminal. install extensions Installs predefined recommended extensions. reset-codesettings Sets VS Code user setting with basic (Fira Code). git: setup Takes two arguments to setup the git client: 1) Username 2) Email address install: docker-cli Installs the latest docker-cli. dotnet Installs latest LTS dotnet core sdk + runtime. gitea Installs gitea tools like the changelog generator. golang Installs golang 1.19.3. nodejs Installs latest NodeJs LTS version using Volta. volta Installs Volta as NodeJS version manager. powershell Installs latest PowerShell LTS version. Example 1: arkanum git setup "my-name" "my-email" Example 2: arkanum install golang Example 3: arkanum config disable-motd HELP } function disableMotd() { if [[ -e "$HOME/enable_motd" ]]; then say "Disabling 'arkanum' motd..." "disableMotd" rm -f "$HOME/enable_motd" else sayW "Arkanum Motd already disabled" "disableMotd" fi } function say() { if [[ -n "$2" ]]; then echo -e "🧙 \e[32markanum\e[0m \e[34m[⚒️ $2]\e[0m: $1" else echo -e "🧙 \e[32markanum\e[0m: $1" fi } function sayE() { if [[ -n "$2" ]]; then echo -e "🧙 \e[31markanum\e[0m \e[34m[⚒️ $2]\e[0m: $1" 1>&2 else echo -e "🧙 \e[31markanum\e[0m: $1" 1>&2 fi } function sayW() { if [[ -n "$2" ]]; then echo -e "🧙 \e[33markanum\e[0m \e[34m[⚒️ $2]\e[0m: $1" 1>&2 else echo -e "🧙 \e[33markanum\e[0m: $1" 1>&2 fi } function instDockerCLI() { say "Installing docker-cli..." "docker-cli" say "Getting requires packages..." "docker-cli" sudo -E apt-get update > /dev/null sudo -E apt-get install ca-certificates curl gnupg say "Setting up docker repository..." "docker-cli" sudo -E install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo -E gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo -E chmod a+r /etc/apt/keyrings/docker.gpg # shellcheck disable=SC2046,SC2027 echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null say "Installing docker-ce-cli package" "docker-cli" sudo -E apt-get update > /dev/null sudo -E apt-get install --no-install-recommends -y \ docker-ce-cli say "docker-cli done." "docker-cli" } function instDotNet() { say "Installing dotnet requirements..." "dotnet" sudo -E apt-get update > /dev/null sudo -E apt-get install --no-install-recommends -y \ libicu70 say "Downloading latest install script..." "dotnet" curl -#fSL https://dot.net/v1/dotnet-install.sh -o /tmp/dotnet-install.sh chmod +x /tmp/dotnet-install.sh say "Installing latest .NET Core LTS release..." "dotnet" /tmp/dotnet-install.sh --channel LTS # shellcheck disable=SC2016 echo 'export PATH=$PATH:/config/.dotnet' | sudo tee -a /etc/bash.bashrc > /dev/null say "Cleaning up..." "dotnet" sudo -E apt-get clean sudo rm -rf \ /tmp/* \ /var/lib/apt/lists/* \ /var/tmp/* say "dotnet done. " "dotnet" } function instGoLang() { if [[ -z "$1" ]]; then GOVERSION="1.20.6" else GOVERSION="$1" fi say "Downloading golang ($GOVERSION)..." "GoLang" curl -#fSL "https://go.dev/dl/go$GOVERSION.linux-amd64.tar.gz" -o /tmp/golang.tar.gz say "Installing golang ($GOVERSION)...." "GoLang" sudo rm -rf /usr/local/go sudo tar -C /usr/local -xzf /tmp/golang.tar.gz # shellcheck disable=SC2016 echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee -a /etc/bash.bashrc > /dev/null say "Cleaning up..." "GoLang" rm -f /tmp/golang.tar.gz say "done." "GoLang" say "Please reload bash profile to finalize." "GoLang" } function instNodeJs() { say "Adding nodesource package source (NodeJS LTS)..." "NodeJs" curl -#fSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - say "Updating package lists and installing NodeJS LTS..." "NodeJs" sudo -E apt-get install --no-install-recommends -y \ nodejs say "Cleaning up..." "NodeJs" sudo -E apt-get clean sudo rm -rf \ /tmp/* \ /var/lib/apt/lists/* \ /var/tmp/* say "done." "NodeJs" } function instNodeJS2() { say "Installing NodeJS LTS via Volta..." "NodeJS" volta install node@lts say "done." "NodeJS" } function instVolta() { say "Installing Volta as NodeJS version manager..." "Volta" curl -#fSl https://get.volta.sh | bash # shellcheck disable=SC1090 source ~/.profile say "done." "Volta" } function instPwsh() { say "Installing PowerShell requirements..." "PowerShell" sudo -E apt-get update > /dev/null sudo -E apt-get install --no-install-recommends -y \ apt-transport-https \ software-properties-common say "Adding powershell package sources..." "PowerShell" # Download the Microsoft repository GPG keys curl -#fSL "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb" -o /tmp/packages-microsoft-prod.deb # Register the Microsoft repository GPG keys sudo dpkg -i /tmp/packages-microsoft-prod.deb # Update the list of packages after we added packages.microsoft.com sudo -E apt-get update say "Installing PowerShell..." "PowerShell" # Install PowerShell sudo -E apt-get install --no-install-recommends -y powershell say "done." "PowerShell" } function instGiteaTools() { TEA_VERSION="0.9.0" CHANGELOG_VERSION="main" say "Installing Gitea tools..." "Gitea" say "Downloading 'changelog' ($CHANGELOG_VERSION)..." "Gitea" sudo -E curl -#fSL "https://dl.gitea.io/changelog-tool/$CHANGELOG_VERSION/changelog-$CHANGELOG_VERSION-linux-amd64" -o /usr/bin/changelog sudo chmod +x /usr/bin/changelog say "'changelog' command installed." "Gitea" say "Downloading 'tea' ($TEA_VERSION)..." "Gitea" sudo -E curl -#fSL https://dl.gitea.io/tea/$TEA_VERSION/tea-$TEA_VERSION-linux-amd64 -o /usr/bin/tea sudo chmod +x /usr/bin/tea say "'tea' command installed." "Gitea" say "done." "Gitea" } function instCodeExtension() { say "Downloading required extensions...." "Extension" # Gitlens say "Downloading 'gitlens'..." "Extension" curl -#fSL https://open-vsx.org/api/eamodio/gitlens/14.0.1/file/eamodio.gitlens-14.0.1.vsix -o /tmp/eamodio.gitlens-13.1.1.vsix say "Installing 'gitlens'..." "Extension" install-extension /tmp/eamodio.gitlens-13.1.1.vsix say "Cleaning up 'gitlens' install files" "Extension" rm -f /tmp/eamodio.gitlens-13.1.1.vsix # OneDarkPro say "Downloading 'One Dark Pro' theme..." "Extension" curl -#fSL https://open-vsx.org/api/zhuangtongfa/material-theme/3.15.18/file/zhuangtongfa.material-theme-3.15.18.vsix -o /tmp/zhuangtongfa.material-theme-3.15.6.vsix say "Installing 'One Dark Pro' theme..." "Extension" install-extension /tmp/zhuangtongfa.material-theme-3.15.6.vsix say "Cleaning up 'One Dark Pro' install files" "Extension" rm -f /tmp/zhuangtongfa.material-theme-3.15.6.vsix # vscode-icons say "Downloading 'vscode-icons' theme..." "Extension" curl -#fSL https://open-vsx.org/api/vscode-icons-team/vscode-icons/12.4.0/file/vscode-icons-team.vscode-icons-12.4.0.vsix -o /tmp/vscode-icons-team.vscode-icons-12.0.1.vsix say "Installing 'vscode-icons' theme..." "Extension" install-extension /tmp/vscode-icons-team.vscode-icons-12.0.1.vsix say "Cleaning up 'vscode-icons' install files" "Extension" rm -f /tmp/vscode-icons-team.vscode-icons-12.0.1.vsix say "done." "Extension" } function setCodeSettings() { CODEFILE="$HOME/data/User/settings.json" # VSCode user settings file say "Setting VScode base settings.($CODEFILE)" "VSCode" cat <' and 'email'!" "Git" exit 1 fi say "Setting global git config..." "Git" git config --global user.name "$1" git config --global user.email "$2" say "Returning global config:" "Git" git config --list --global } function main() { if [[ "$#" == "0" ]]; then showHelp exit 0 fi # Command filter if [[ "$1" =~ ^help|-h|--h$ ]]; then showHelp exit 0 fi # CONFIG command if [[ "$1" == "config" ]]; then # disable-motd option if [[ "$2" == "disable-motd" ]]; then disableMotd exit 0 # install-extensions option elif [[ "$2" == "install-extensions" ]]; then instCodeExtension exit 0 # reset-codesetting option elif [[ "$2" == "reset-codesettings" ]]; then setCodeSettings exit 0 else sayE "Unknown option ($2) given for command 'config'!" fi # GIT command elif [[ "$1" == "git" ]]; then # setup option if [[ "$2" == "setup" ]]; then setGitConfig "$3" "$4" else sayE "Unknown option ($2) given for command 'git'!" fi # INSTALL command elif [[ "$1" == "install" ]]; then # docker-cli option if [[ "$2" == "docker-cli" ]]; then instDockerCLI elif [[ "$2" == "dotnet" ]]; then instDotNet elif [[ "$2" == "golang" ]]; then instGoLang "$3" elif [[ "$2" == "nodejs" ]]; then instVolta instNodeJs elif [[ "$2" == "volta" ]]; then instVolta elif [[ "$2" == "powershell" ]]; then instPwsh elif [[ "$2" == "gitea" ]]; then instGiteaTools fi else sayE "Unknown parameter value given!($1)." showHelp exit 1 fi } main "$@"