#!/bin/sh set -eu # Parse options nicetohave=true deoplete=true go=false rust=false rootzsh=false desktop=false while [ $# != 0 ]; do case "$1" in nonicetohave) nicetohave=false;; nicetohave) nicetohave=true;; nodeoplete) deoplete=false;; deoplete) deoplete=true;; nogo) go=false;; go) go=true;; norust) rust=false;; rust) rust=true;; norootzsh) rootzsh=false;; rootzsh) rootzsh=true;; nodesktop) desktop=false;; desktop) desktop=true;; *) echo "Unknown flag: $1"; exit 1;; esac shift done # Parse platforms into a friendly format case "$(uname -s)" in Darwin) PLATFORM=macos ID=macos VERSION_ID=$(sw_vers -productVersion) ;; Linux) PLATFORM=linux . /etc/os-release ;; *) PLATFORM=unsupported ID=unsupported VERSION_ID=unsupported ;; esac if [ "$ID" = fedora ] && [ "${VARIANT_ID:-}" = coreos ]; then ID=coreos # Fedora CoreOS fi # Package installation helpers packages="" packages_add() { packages="$packages $@" } packages_install() { if [ -z "$packages" ]; then return fi case $ID in macos) brew install --formulae $packages ;; alpine) sudo apk add --no-cache --update $packages ;; fedora) sudo dnf install -y $packages sudo dnf clean all sudo rm -rf /var/cache/dnf ;; debian|ubuntu) sudo apt-get update sudo apt-get install -y $packages sudo rm -rf /var/lib/apt/lists/* ;; esac packages="" } # Installation into user folder download_bin_path="$HOME/.local/bin" mkdir -p $download_bin_path download_dust() { version=v0.5.4 arch=x86_64 case $ID in macos) system=apple-darwin;; alpine) system=unknown-linux-musl;; *) system=unknown-linux-gnu;; esac wget \ --output-document /tmp/dust.tar.gz \ https://github.com/bootandy/dust/releases/download/$version/dust-$version-$arch-$system.tar.gz tar -x \ --gunzip \ --file /tmp/dust.tar.gz \ --to-stdout \ dust-$version-$arch-$system/dust > $download_bin_path/dust rm /tmp/dust.tar.gz } download_kubectl() { version=$(wget --quiet --output-document - https://dl.k8s.io/release/stable.txt) arch=amd64 case $PLATFORM in macos) system=darwin;; linux) system=linux;; esac wget \ --output-document $download_bin_path/kubectl \ https://dl.k8s.io/release/$version/bin/$system/$arch/kubectl chmod +x $download_bin_path/kubectl } download_minio_client() { arch=amd64 case $PLATFORM in macos) system=darwin;; linux) system=linux;; esac wget \ --output-document $download_bin_path/mc \ https://minio.mirror.makerforce.io/client/mc/release/$system-$arch/mc #https://dl.min.io/client/mc/release/$system-$arch/mc chmod +x $download_bin_path/mc } download_nvim_plug() { mkdir -p $HOME/.config/nvim/autoload wget \ --output-document $HOME/.config/nvim/autoload/plug.vim \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim } download_go() { version=1.16.2 arch=amd64 case $PLATFORM in macos) system=darwin;; linux) system=linux;; esac wget \ --output-document /tmp/go.tar.gz \ https://golang.org/dl/go$version.$system-$arch.tar.gz sudo tar -x \ --gunzip \ --directory /usr/local \ --file /tmp/go.tar.gz sudo ln -s /usr/local/go/bin/go /usr/local/bin/go sudo ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt rm /tmp/go.tar.gz } download_rust() { wget --output-document - https://sh.rustup.rs | sh -s -- -y } download_font_path="$HOME/.local/share/fonts" mkdir -p $download_font_path download_font_firacode() { version=5.2 wget \ --output-document /tmp/firacode.zip \ https://github.com/tonsky/FiraCode/releases/download/$version/Fira_Code_v$version.zip unzip /tmp/firacode.zip -d /tmp/firacode mv /tmp/firacode/ttf/* $download_font_path/ rm -r /tmp/firacode.zip /tmp/firacode } download_font_ibmplex() { version=5.1.3 wget \ --output-document /tmp/ibmplex.zip \ https://github.com/IBM/plex/releases/download/v$version/TrueType.zip unzip /tmp/ibmplex.zip -d /tmp/ibmplex for family in Sans Serif Mono; do mv /tmp/ibmplex/TrueType/IBM-Plex-$family/*.ttf $download_font_path/ done rm -r /tmp/ibmplex.zip /tmp/ibmplex } # Install basics packages_add openssl wget upx case $PLATFORM in linux) packages_add tar gzip;; esac case $PLATFORM in macos|alpine|fedora) packages_add xz;; debian|ubuntu) packages_add xz-utils;; esac # Install shell packages_add zsh zsh-autosuggestions zsh-syntax-highlighting case $ID in alpine) packages_add zsh-vcs ncurses;; fedora) packages_add ncurses;; debian|ubuntu) packages_add ncurses-bin;; esac # Install editor, management and security tools packages_add neovim git $nicetohave && packages_add pass gnupg case $ID in macos) packages_add pinentry-mac;; alpine) packages_add dropbear-ssh;; fedora) packages_add openssh-clients;; debian|ubuntu) packages_add openssh-client;; esac packages_add exa jq # Install C compilers case $ID in alpine) $nicetohave && packages_add alpine-sdk linux-headers;; fedora) $nicetohave && packages_add kernel-headers;; debian|ubuntu) $nicetohave && packages_add build-essential;; esac # Install Python 3 case $ID in macos) packages_add python@3;; alpine|fedora|debian|ubuntu) packages_add python3;; esac case $ID in alpine|debian|ubuntu) $nicetohave && packages_add python3-dev;; fedora) $nicetohave && packages_add python3-devel;; esac case $ID in alpine) $nicetohave && packages_add py3-pip;; fedora|debian|ubuntu) $nicetohave && packages_add python3-pip;; esac packages_install # Install Python 3 packages case $ID in macos) $nicetohave && packages_add httpie;; alpine) packages_add httpie;; *) pip3 install --no-cache-dir --user httpie;; esac case $ID in macos|fedora|debian|ubuntu) $nicetohave && packages_add thefuck;; *) $nicetohave && pip3 install --no-cache-dir --user thefuck;; esac # Install Golang case $ID in #macos) $go && packages_add go;; #alpine) $go && packages_add go;; #fedora) $go && packages_add golang;; *) $go && download_go;; esac # Install Rust $rust && download_rust # Install dust case $ID in macos|alpine) $nicetohave && packages_add dust;; *) $nicetohave && download_dust;; esac # Install deployment utilities $nicetohave && download_kubectl $nicetohave && download_minio_client # Install editor plugins # Neovim bindings, Deoplete Python case $ID in macos) $deoplete && pip3 install --no-cache-dir --user neovim jedi;; alpine) $deoplete && packages_add py3-pynvim py3-jedi;; fedora|debian|ubuntu) $deoplete && packages_add python3-neovim python3-jedi;; esac # Deoplete clang case $ID in macos) $deoplete && brew install llvm --with-clang;; alpine) $deoplete && packages_add clang clang-extra-tools;; fedora) $deoplete && packages_add clang clang-tools-extra;; debian|ubuntu) $deoplete && packages_add clang clang-format;; esac # Deoplete Go $deoplete && $go && go get -u github.com/stamblerre/gocode $deoplete && touch ~/.config/deoplete $deoplete || rm -f ~/.config/deoplete # Plug install download_nvim_plug nvim +PlugInstall +qa || true # Final packages installation packages_install # Give root a ZSH prompt sudo cp $HOME/.zshrc /root/.zshrc if $desktop; then case $ID in debian) if ! grep --quiet 'unstable' /etc/apt/sources.list; then echo "WARN: debian unstable required" exit 1 fi if ! grep --quiet 'contrib' /etc/apt/sources.list; then echo "WARN: contrib required" echo "WARN: enabling contrib" echo "deb http://deb.debian.org/debian unstable contrib" | sudo tee /etc/apt/sources.list fi ;; fedora) if ! rpm -qa | grep --quiet 'rpmfusion-free'; then echo "WARN: rpmfusion free requried" echo "WARN: enabling rpmfusion free" sudo dnf install -y \ "https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm" fi ;; esac # desktop: Install sway case $ID in alpine|fedora|debian|ubuntu) packages_add \ sway swaybg swayidle swaylock \ waybar wofi \ \ lxpolkit \ grim slurp \ playerctl \ ;; esac case $ID in alpine|fedora) packages_add mako;; debian|ubuntu) packages_add mako-notifier;; esac case $ID in fedora) echo "WARN: $ID has no stable wf-recorder package";; alpine|debian|ubuntu) packages_add wf-recorder;; esac case $ID in alpine) echo "WARN: $ID has no stable ddcutil and kitty packages";; fedora|debian|ubuntu) packages_add ddcutil kitty;; esac case $ID in alpine|fedora) packages_add pinentry-gtk;; debian|ubuntu) packages_add pinentry-gtk2;; esac case $ID in alpine) packages_add \ font-noto font-noto-cjk font-noto-emoji download_font_firacode download_font_ibmplex ;; fedora) packages_add \ ibm-plex-sans-fonts ibm-plex-serif-fonts ibm-plex-mono-fonts \ fira-code-fonts \ google-noto-sans-fonts google-noto-serif-fonts google-noto-emoji-color-fonts google-noto-cjk-fonts \ ;; debian|ubuntu) packages_add \ fonts-ibm-plex \ fonts-firacode \ fonts-noto-core fonts-noto-color-emoji fonts-noto-cjk \ ;; esac # desktop: Final packages installation packages_install fi