commit 170b73865224480fd4adf4ad48229c5cd46b3081 Author: Bartal Læarsson Date: Fri Aug 28 15:45:42 2026 +0100 initial commit diff --git a/ubuntu-provisioning.sh b/ubuntu-provisioning.sh new file mode 100755 index 0000000..c19f546 --- /dev/null +++ b/ubuntu-provisioning.sh @@ -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"'