#!/bin/sh set -eu # Parse options base=true nicetohave=true go=false rust=false rootzsh=false desktopbase=false desktop=false pwn=false while [ $# != 0 ]; do case "$1" in nobase) base=false;; base) base=true;; nonicetohave) nicetohave=false;; nicetohave) nicetohave=true;; nogo) go=false;; go) go=true;; norust) rust=false;; rust) rust=true;; norootzsh) rootzsh=false;; rootzsh) rootzsh=true;; nodesktopbase) desktopbase=false;; desktopbase) desktopbase=true;; nodesktop) desktopbase=false desktop=false;; desktop) desktopbase=true desktop=true;; nopwn) pwn=false;; pwn) pwn=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 DEBIAN_FRONTEND=noninteractive 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;; fedora|debian|ubuntu) 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;; *) return 1;; 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;; *) return 1;; 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;; *) return 1;; 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 -q /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 -q /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 } download_cutter_re() { version=2.0.2 case $PLATFORM in linux) system=Linux;; *) return 1;; esac wget \ --output-document $download_bin_path/cutter \ https://github.com/rizinorg/cutter/releases/download/v$version/Cutter-v$version-x64.$system.AppImage chmod +x $download_bin_path/cutter } # 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 if $base; then # 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 case $ID in alpine|debain|ubuntu) packages_add xxd;; fedora) packages_add vim-common;; esac $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|alpine|fedora|debian|ubuntu) $nicetohave && packages_add httpie;; *) $nicetohave && 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 case $ID in macos|alpine|fedora|debian|ubuntu) $nicetohave && packages_add black;; *) $nicetohave && pip3 install --no-cache-dir --user black;; 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 $rust && source $HOME/.cargo/env && rustup component add rls rust-analysis rust-src # 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 # Plug install download_nvim_plug nvim +PlugInstall +qa || true # Install graphics tools case $ID in fedora) $nicetohave && packages_add GraphicsMagick;; *) $nicetohave && packages_add graphicsmagick;; esac # Final packages installation packages_install # Give root a ZSH prompt sudo cp $HOME/.zshrc /root/.zshrc fi if $desktopbase; 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 # desktopbase: Fonts case $ID in alpine) packages_add \ 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-emoji-color-fonts \ ;; debian|ubuntu) packages_add \ fonts-ibm-plex \ fonts-firacode \ fonts-noto-color-emoji \ ;; esac case $ID in alpine) $nicetohave && packages_add \ font-noto \ font-noto-cjk \ ;; fedora) $nicetohave && packages_add \ google-noto-sans-fonts google-noto-serif-fonts \ google-noto-cjk-fonts \ ;; debian|ubuntu) $nicetohave && packages_add \ fonts-noto-core \ fonts-noto-cjk \ ;; esac # desktopbase: Desktop theme case $ID in alpine|fedora|debian|ubuntu) packages_add \ gsettings-desktop-schemas \ gnome-themes-extra \ adwaita-icon-theme \ ;; esac case $ID in debian|ubuntu) packages_add adwaita-qt;; fedora) packages_add adwaita-qt5;; esac # desktopbase: Final packages installation packages_install fi if $desktopbase && $desktop; then # 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|fedora) packages_add pinentry-gtk;; debian|ubuntu) packages_add pinentry-gtk2;; esac # desktop: Install applications 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 macos) brew install --cask \ firefox \ iterm2 docker paw \ coolterm \ ;; *) packages_add \ firefox \ ;; esac # desktop: Final packages installation packages_install fi if $pwn; then case $ID in debian) if ! grep --quiet 'unstable' /etc/apt/sources.list; then echo "WARN: debian unstable required" exit 1 fi ;; esac # pwn: Build dependencies for most case $ID in alpine|fedora|debian|ubuntu) packages_add cmake make gcc g++;; esac # pwn: Build dependencies for stegseek case $ID in alpine) packages_add libmhash-dev libmcrypt-dev libjpeg-turbo-dev zlib-dev;; fedora) packages_add mhash-devel libmcrypt-devel libjpeg-turbo-devel zlib-devel;; debian|ubuntu) packages_add libmhash-dev libmcrypt-dev libjpeg-dev zlib1g-dev;; esac # pwn: Build dependencies for cryptography case $ID in alpine) packages_add libffi-dev openssl-dev;; fedora) packages_add libffi-devel openssl-devel;; debian|ubuntu) packages_add libffi-dev libssl-dev;; esac packages_install case $ID in alpine) download_rust && export PATH="$HOME/.cargo/bin:$PATH" && pip3 install --no-cache-dir --user pwntools;; *) pip3 install --no-cache-dir --user pwntools;; esac # pwn: Tools case $ID in alpine|fedora|debian|ubuntu|macos) packages_add radare2 testdisk socat nasm john binutils;; esac case $ID in alpine|fedora|debian|ubuntu) packages_add file squashfs-tools strace zip unzip p7zip;; macos) packages_add squashfs;; esac case $ID in alpine|macos) packages_add exiftool;; fedora) packages_add perl-Image-ExifTool;; debain|ubuntu) packages_add libimage-exiftool-perl;; esac case $ID in alpine|debian|ubuntu) packages_add netcat-openbsd;; fedora) packages_add netcat;; esac # pwn: Tools (Ruby) case $ID in alpine|debian|ubuntu) packages_add ruby;; fedora) packages_add ruby rubygems;; esac packages_install sudo gem install one_gadget # pwn: Tools (desktop) case $ID in alpine|fedora|debian|ubuntu) $desktop && download_cutter_re;; macos) $desktop && brew install --cask cutter;; esac # pwn: Final packages installation packages_install fi