initial commit
This commit is contained in:
Executable
+241
@@ -0,0 +1,241 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# ============================================================
|
||||
# Pinned versions — update manually
|
||||
# ============================================================
|
||||
NVIM_VERSION="0.12.4"
|
||||
GO_VERSION="1.27.0"
|
||||
FZF_VERSION="0.61.1"
|
||||
JUST_VERSION="1.40.0"
|
||||
|
||||
# ============================================================
|
||||
# Global wget options
|
||||
# ============================================================
|
||||
export WGET_OPTS="--quiet --timeout=30 --tries=3"
|
||||
|
||||
# ============================================================
|
||||
# Cleanup trap
|
||||
# ============================================================
|
||||
TMP_DIRS=()
|
||||
cleanup() {
|
||||
for d in "${TMP_DIRS[@]}"; do
|
||||
rm -rf "$d"
|
||||
done
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
# ============================================================
|
||||
# apt packages
|
||||
# ============================================================
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
APT_PACKAGES=(
|
||||
build-essential
|
||||
clang
|
||||
curl
|
||||
fd-find
|
||||
findutils
|
||||
gawk
|
||||
git
|
||||
jq
|
||||
make
|
||||
ripgrep
|
||||
sqlite3
|
||||
tmux
|
||||
unzip
|
||||
zip
|
||||
util-linux
|
||||
ncurses-base
|
||||
libheif-examples
|
||||
libheif1
|
||||
libtiff-dev
|
||||
libwebp-dev
|
||||
libopenjp2-7
|
||||
libopenjp2-7-dev
|
||||
ffmpeg
|
||||
libreoffice
|
||||
libgs-dev
|
||||
imagemagick
|
||||
libgl-dev
|
||||
libxcursor-dev
|
||||
libxrandr-dev
|
||||
libxinerama-dev
|
||||
libxi-dev
|
||||
libxxf86vm-dev
|
||||
openjdk-21-jdk
|
||||
maven
|
||||
qemu-system
|
||||
libvirt-daemon-system
|
||||
libvirt-clients
|
||||
virt-manager
|
||||
bridge-utils
|
||||
apt-transport-https
|
||||
nodejs
|
||||
openssh-server
|
||||
npm
|
||||
)
|
||||
|
||||
echo "=== apt packages ==="
|
||||
sudo apt-get update -y
|
||||
sudo apt-get upgrade -y
|
||||
sudo apt-get install -y "${APT_PACKAGES[@]}"
|
||||
|
||||
# ============================================================
|
||||
# Add user to libvirt groups
|
||||
# ============================================================
|
||||
echo "=== Add user to libvirt groups ==="
|
||||
sudo usermod -aG libvirt,libvirt-qemu "$USER" || true
|
||||
echo "*** Added $USER to libvirt groups — log out/in required for effect. ***"
|
||||
|
||||
# ============================================================
|
||||
# SQL Server (commented out — uncomment when running on 24.04)
|
||||
# ============================================================
|
||||
# if ! dpkg -s mssql-server >/dev/null 2>&1; then
|
||||
# curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc
|
||||
# curl -fsSL https://packages.microsoft.com/config/ubuntu/24.04/mssql-server-2025.list \
|
||||
# | sudo tee /etc/apt/sources.list.d/mssql-server-2025.list
|
||||
# sudo apt-get update -y
|
||||
# sudo apt-get install -y mssql-server
|
||||
# echo "*** mssql-server installed. Run: sudo /opt/mssql/bin/mssql-conf setup ***"
|
||||
# fi
|
||||
#
|
||||
# if ! dpkg -s mssql-tools18 >/dev/null 2>&1; then
|
||||
# wget -qO /tmp/packages-microsoft-prod.deb https://packages.microsoft.com/config/ubuntu/24.04/packages-microsoft-prod.deb
|
||||
# sudo apt-get install -y /tmp/packages-microsoft-prod.deb
|
||||
# sudo apt-get update -y
|
||||
# ACCEPT_EULA=Y sudo apt-get install -y mssql-tools18 unixodbc-dev
|
||||
# rm -f /tmp/packages-microsoft-prod.deb
|
||||
# echo 'export PATH=$PATH:/opt/mssql-tools18/bin' | sudo tee /etc/profile.d/mssql-tools.sh
|
||||
# fi
|
||||
|
||||
# ============================================================
|
||||
# Go
|
||||
# ============================================================
|
||||
echo "=== Go ==="
|
||||
GO_NEEDS_INSTALL=1
|
||||
if [[ -x /usr/local/go/bin/go ]]; then
|
||||
INSTALLED_GO=$(/usr/local/go/bin/go version | awk '{print $3}' | sed 's/^go//')
|
||||
if [[ "$INSTALLED_GO" == "$GO_VERSION" ]]; then
|
||||
GO_NEEDS_INSTALL=0
|
||||
fi
|
||||
fi
|
||||
if [[ "$GO_NEEDS_INSTALL" -eq 1 ]]; then
|
||||
sudo rm -rf /usr/local/go
|
||||
wget ${WGET_OPTS} -O "/tmp/go${GO_VERSION}.linux-amd64.tar.gz" \
|
||||
"https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz"
|
||||
sudo tar -C /usr/local -xzf "/tmp/go${GO_VERSION}.linux-amd64.tar.gz"
|
||||
rm -f "/tmp/go${GO_VERSION}.linux-amd64.tar.gz"
|
||||
if [[ ! -f /etc/profile.d/go.sh ]]; then
|
||||
printf '%s\n' \
|
||||
'export PATH=$PATH:/usr/local/go/bin' \
|
||||
'export GOPATH=$HOME/go' \
|
||||
'export PATH=$PATH:$GOPATH/bin' \
|
||||
| sudo tee /etc/profile.d/go.sh
|
||||
fi
|
||||
fi
|
||||
|
||||
# ============================================================
|
||||
# Rust
|
||||
# ============================================================
|
||||
echo "=== Rust ==="
|
||||
if [[ ! -x "$HOME/.cargo/bin/rustup" ]]; then
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path
|
||||
fi
|
||||
[[ -f "$HOME/.cargo/env" ]] && source "$HOME/.cargo/env"
|
||||
rustup default stable
|
||||
|
||||
# ============================================================
|
||||
# just
|
||||
# ============================================================
|
||||
echo "=== just ==="
|
||||
JUST_NEEDS_INSTALL=1
|
||||
if [[ -x "$HOME/.cargo/bin/just" ]]; then
|
||||
INSTALLED_JUST=$("$HOME/.cargo/bin/just" --version | awk '{print $2}')
|
||||
if [[ "$INSTALLED_JUST" == "$JUST_VERSION" ]]; then
|
||||
JUST_NEEDS_INSTALL=0
|
||||
fi
|
||||
fi
|
||||
if [[ "$JUST_NEEDS_INSTALL" -eq 1 ]]; then
|
||||
"$HOME/.cargo/bin/cargo" install just --version "${JUST_VERSION}" --locked --force
|
||||
fi
|
||||
|
||||
# ============================================================
|
||||
# fzf
|
||||
# ============================================================
|
||||
echo "=== fzf ==="
|
||||
FZF_NEEDS_INSTALL=1
|
||||
if [[ -x /usr/local/bin/fzf ]]; then
|
||||
INSTALLED_FZF=$(/usr/local/bin/fzf --version | awk '{print $1}')
|
||||
if [[ "$INSTALLED_FZF" == "$FZF_VERSION" ]]; then
|
||||
FZF_NEEDS_INSTALL=0
|
||||
fi
|
||||
fi
|
||||
if [[ "$FZF_NEEDS_INSTALL" -eq 1 ]]; then
|
||||
TMPDIR=$(mktemp -d)
|
||||
TMP_DIRS+=("$TMPDIR")
|
||||
wget ${WGET_OPTS} -O "$TMPDIR/fzf.tar.gz" \
|
||||
"https://github.com/junegunn/fzf/releases/download/v${FZF_VERSION}/fzf-${FZF_VERSION}-linux_amd64.tar.gz"
|
||||
tar -xzf "$TMPDIR/fzf.tar.gz" -C "$TMPDIR"
|
||||
sudo cp "$TMPDIR/fzf" /usr/local/bin/fzf
|
||||
sudo chmod 0755 /usr/local/bin/fzf
|
||||
fi
|
||||
|
||||
# ============================================================
|
||||
# Neovim
|
||||
# ============================================================
|
||||
echo "=== Neovim v${NVIM_VERSION} ==="
|
||||
NVIM_NEEDS_INSTALL=1
|
||||
if [[ -x /usr/local/bin/nvim ]]; then
|
||||
INSTALLED_NVIM=$(/usr/local/bin/nvim --version | head -1 | awk '{print $2}' | sed 's/^v//')
|
||||
if [[ "$INSTALLED_NVIM" == "$NVIM_VERSION" ]]; then
|
||||
NVIM_NEEDS_INSTALL=0
|
||||
fi
|
||||
fi
|
||||
if [[ "$NVIM_NEEDS_INSTALL" -eq 1 ]]; then
|
||||
wget ${WGET_OPTS} -O /tmp/nvim.tar.gz \
|
||||
"https://github.com/neovim/neovim/releases/download/v${NVIM_VERSION}/nvim-linux-x86_64.tar.gz"
|
||||
sudo rm -rf /usr/local/nvim-linux-x86_64
|
||||
sudo tar -C /usr/local -xzf /tmp/nvim.tar.gz
|
||||
sudo ln -sf /usr/local/nvim-linux-x86_64/bin/nvim /usr/local/bin/nvim
|
||||
rm -f /tmp/nvim.tar.gz
|
||||
fi
|
||||
|
||||
echo "=== Neovim init.lua ==="
|
||||
mkdir -p "$HOME/.config/nvim"
|
||||
if [[ ! -f "$HOME/.config/nvim/init.lua" ]]; then
|
||||
wget ${WGET_OPTS} -O "$HOME/.config/nvim/init.lua" \
|
||||
"https://git.flo.fo/FLO/dotfiles/raw/branch/main/nvim/.config/nvim/init.lua"
|
||||
fi
|
||||
|
||||
# ============================================================
|
||||
# Taskfile
|
||||
# ============================================================
|
||||
echo "=== Taskfile ==="
|
||||
if ! command -v task >/dev/null 2>&1; then
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/task/task/setup.deb.sh' | sudo bash
|
||||
sudo apt-get install -y task
|
||||
fi
|
||||
|
||||
# ============================================================
|
||||
# Services
|
||||
# ============================================================
|
||||
echo "=== Services ==="
|
||||
sudo systemctl enable --now ssh.service 2>/dev/null \
|
||||
|| sudo systemctl enable --now sshd.service 2>/dev/null \
|
||||
|| true
|
||||
sudo systemctl enable --now libvirtd.service
|
||||
|
||||
# ============================================================
|
||||
# Ensure cargo is in PATH
|
||||
# ============================================================
|
||||
if ! grep -q 'export PATH="$HOME/.cargo/bin:$PATH"' "$HOME/.bashrc"; then
|
||||
printf '\nexport PATH="$HOME/.cargo/bin:$PATH"\n' >> "$HOME/.bashrc"
|
||||
source "$HOME/.bashrc"
|
||||
fi
|
||||
|
||||
# ============================================================
|
||||
echo "=== Done ==="
|
||||
echo "Log out and back in for libvirt group to take effect."
|
||||
echo "Rust and Cargo are at ~/.cargo/bin — add to PATH if not already:"
|
||||
echo ' export PATH="$HOME/.cargo/bin:$PATH"'
|
||||
Reference in New Issue
Block a user