#!/usr/bin/env bash # Installs user preferences the way I like it # Configuration function prompt { # text while true; do read -p "$1 [yn] " yn case $yn in [Yy]* ) return 1;; [Nn]* ) return 0;; * ) echo "Please answer yes or no.";; esac done } # Don't ask for things that are already there TERMUX=0 if [ -d /data/data/com.termux/files ]; then TERMUX=1 GUI=0 fi if which i3 &> /dev/null; then GUI=1 fi if [ -z $ADMIN ]; then prompt "Are you a superuser on this machine?" ADMIN=$? fi if [ -z $GUI ]; then prompt "Do you want a X environment on this machine?" GUI=$? fi if [ -z $EXTRA ]; then prompt "Do you want not-so-needed software on this machine?" EXTRA=$? fi # TODO Verify if the package exists before installing it # System detection if which pacman &> /dev/null; then ARCH=1 if [ $ADMIN == 1 ]; then sudo pacman -Sy function installOne { # package pacman -Q $1 &> /dev/null if [ $? == 1 ]; then sudo pacman -S $1 --noconfirm --needed fi } function installFileOne { # file sudo pacman -U "$1" } if which aurman &> /dev/null; then function altInstallOne { # package pacman -Q $1 &> /dev/null if [ $? == 1 ]; then aurman -S "$1" --noconfirm --noedit fi } elif which pacaur &> /dev/null; then function altInstallOne { # package pacman -Q $1 &> /dev/null if [ $? == 1 ]; then pacaur -S "$1" --noconfirm --noedit fi } elif which yaourt &> /dev/null; then function altInstallOne { # package pacman -Q $1 &> /dev/null if [ $? == 1 ]; then yaourt -S "$1" --noconfirm fi } else # Install package from PKGBUILD file function installPKGBUILD { # url TMP_DIR="$(mktemp -d /tmp/pkgbuild.XXXXXXXXXX)" cd "$TMP_DIR" wget "$1" -O PKGBUILD makepkg -si cd - rm -rf "$TMP_DIR" } function altInstallOne { # package pacman -Q $1 &> /dev/null if [ $? == 1 ]; then installPKGBUILD "https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=$1" fi } fi else echo "You're on a Arch System but it's not yours? Did Arch got that popular?" return 42 fi elif which dpkg &> /dev/null; then DEBIAN=1 if [[ $ADMIN == 1 || $TERMUX == 1 ]]; then if [ $TERMUX == 1 ]; then DEBIAN=0 apt update -y else sudo apt-get update -y fi function installOne { # package # Finding out if it's already installed or not STATUS=$(mktemp) LANG=C dpkg-query --status $1 &> $STATUS installed=0 if [ $? == 0 ]; then cat $STATUS | grep '^Status:' | grep ' installed' --quiet if [ $? == 0 ]; then installed=1 fi fi rm -f $STATUS > /dev/null # Installing if it's not installed if [ $installed == 0 ]; then # TODO noconfirm if [ $TERMUX == 1 ]; then apt install $1 -y else sudo apt-get install $1 -y fi fi } function installFileOne { # file dpkg -i "$1" } else function installOne { # package debloc install $1 } function installFileOne { # file debloc deb "$1" } fi function altInstallOne { echo "[ERROR] There's no alternate installer for this distribution. Can't install $1." } else echo "Uuuh, what kind of distribution is this?" return 1 fi # Install package with the standard # package manager for the distribution function inst { for pkg in $*; do installOne $pkg done } # Install package FILE with the standard # package manager for the distribution function instFile { for pkg in $*; do installFileOne $pkg done } # Install package with the alternate # package manager for the distribution function altInst { for pkg in $*; do altInstallOne $pkg done } function systemdUserUnit { systemctl --user enable "$1" systemctl --user start "$1" } # Common CLI changeColors monokai # Utils if [ $TERMUX == 1 ]; then inst coreutils man openssl-tool grep sed sh tar inst termux-api if [ $ADMIN == 1 ]; then inst tsu fi fi inst moreutils screen ncdu lsof htop proxytunnel pv curl wget netcat mosh bash-completion rsync pwgen fzf highlight # TODO Test those who are on Debian machines and those who aren't if [ $ARCH == 1 ]; then inst bash-completion altInst gopass else inst pass fi # Dev if [ $DEBIAN == 1 ]; then inst build-essential elif [ $ARCH == 1 ]; then inst base-devel else inst make fi inst git # Text editor inst neovim if [ $DEBIAN == 1]; then inst python-neovim pyhon3-neovim elif [ $ARCH == 1]; then inst python2-neovim python-neovim fi if [ $DEBIAN == 1 ]; then inst exuberant-ctags else inst ctags fi vim +PlugUpgrade +PlugUpdate +PlugInstall +qall # Common GUI if [ $GUI == 1 ]; then .Xresources.d/configure # Desktop manager inst dunst feh i3-wm i3lock numlockx qutebrowser rofi rxvt-unicode scrot trayer unclutter xautolock xclip if [ $ARCH == 1 ]; then inst xorg-xinit xorg-xbacklight ttf-dejavu altInst lemonbar-xft-git autorandr-git keynav-enhanced pacmixer rofi-pass elif [ $DEBIAN == 1 ]; then # TODO autorandr pacmixer rofi-pass ttf-dejavu inst lemonbar keynav xbacklight fi # Screen filter if [ $ARCH == 1 ]; then altInst sct elif [ $TERMUX != 1 ]; then if [ ! -f $HOME/.local/bin/sct ]; then TMP=$(mktemp /tmp/XXXXXXXXXX.c) wget https://gist.githubusercontent.com/ajnirp/208c03d3aa7f02c743d2/raw/55bf3eed25739173d8be57b5179ed5542cf40ed6/sct.c -O $TMP cc $TMP --std=c99 -lX11 -lXrandr -o $HOME/.local/bin/sct rm $TMP fi fi fi if [ $EXTRA == 1 ]; then # Extra dev (not on mobile though ^^) if [ $TERMUX == 0 ]; then inst cmake clang llvm ccache python-pip gdb fi # Extra CLI inst ffmpeg optipng syncthing mutt msmtp notmuch mbsync jq lynx inst unzip unrar jdupes bedup p7zip inst youtube-dl megatools speedtest-cli systemdUserUnit syncthing if [ $ARCH == 1 ]; then insta pandoc youtube-dl translate-shell imagemagick altInst insect pdftk visidata # Orga # TODO For others inst vdirsyncer khard todoman offlineimap khal systemdUserUnit vdirsyncer.timer elif [ $DEBIAN == 1]; then inst pandoc pdftk visidata translate-shell youtube-dl else # translate-shell curl -L git.io/trans > ~/.local/bin/trans chmod +x ~/.local/bin/trans # TODO Others fi # FPGA goodness if [ $ARCH == 1 ]; then inst iverilog altInst ghdl fi # Extra GUI if [ $GUI == 1 ]; then inst vlc gimp inkscape mpd thunar musescore evince pdfpc texlive-{most,lang} if [ $ARCH == 1 ]; then inst simplescreenrecorder mpc altInst vimpc-git ashuffle-git ttf-emojione-color # FPGA goodness inst gtkwave fi # TODO Others fi fi