Compare commits
44 Commits
96a4d2ce5f
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
689a2dc079 | ||
|
|
87fb89a6b7 | ||
|
|
d41626190d | ||
|
|
f359bb68eb | ||
|
|
69f7a5d4d5 | ||
|
|
b0db2dfaf6 | ||
|
|
7743665917 | ||
|
|
3ba98e21ad | ||
|
|
28027b31ab | ||
|
|
75ffecbfb6 | ||
|
|
d3830840c2 | ||
|
|
ece7ac7a0b | ||
|
|
cf670488ac | ||
|
|
afd6481ec6 | ||
|
|
10f55ec25c | ||
|
|
45cd93d43d | ||
|
|
1301064929 | ||
|
|
0a62e7ac13 | ||
|
|
c0e84b6dfd | ||
|
|
7f51e6a20f | ||
|
|
367b92b596 | ||
|
|
044ffd46a1 | ||
|
|
00c57cbd65 | ||
|
|
a04065a56c | ||
|
|
ab0e0a31e8 | ||
|
|
a8fd0ae556 | ||
|
|
d8ec7b5d8f | ||
|
|
909b0ac3b8 | ||
|
|
727de31733 | ||
|
|
eb137c6b1d | ||
|
|
e008025a83 | ||
|
|
b41e5378e6 | ||
|
|
8e3b131910 | ||
|
|
3acc78e3b6 | ||
|
|
8fe499e6ce | ||
|
|
9bf3bf0d3d | ||
|
|
45194602b8 | ||
|
|
4806f7a6b7 | ||
|
|
4ac11a8dd4 | ||
|
|
056a59a07b | ||
|
|
a36c347b4c | ||
|
|
735a23be7e | ||
|
|
b14dccdae0 | ||
|
|
c5ce8107ac |
43
.zsh_aliases
43
.zsh_aliases
@@ -1,5 +1,7 @@
|
||||
# .zsh_aliases
|
||||
|
||||
alias mpset="make -C ~/Config/Dot-Zsh"
|
||||
|
||||
# Aliases
|
||||
alias c="clear"
|
||||
|
||||
@@ -53,13 +55,40 @@ if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then
|
||||
alias open="/mnt/c/Windows/explorer.exe" # Mac-style 'open' command
|
||||
|
||||
# 2. VS Code (Dynamic Alias)
|
||||
# This finds the username automatically so it works on any Windows machine
|
||||
_WIN_USER=$(cmd.exe /c 'echo %USERNAME%' 2>/dev/null | tr -d '\r')
|
||||
if [ -f "/mnt/c/Windows/System32/cmd.exe" ]; then
|
||||
_WIN_USER=$(/mnt/c/Windows/System32/cmd.exe /c 'echo %USERNAME%' 2>/dev/null | tr -d '\r')
|
||||
|
||||
if [ -d "/mnt/c/Users/$_WIN_USER/AppData/Local/Programs/Microsoft VS Code/bin" ]; then
|
||||
alias code="/mnt/c/Users/$_WIN_USER/AppData/Local/Programs/Microsoft\ VS\ Code/bin/code"
|
||||
elif [ -d "/mnt/c/Program Files/Microsoft VS Code/bin" ]; then
|
||||
alias code="/mnt/c/Program\ Files/Microsoft\ VS\ Code/bin/code"
|
||||
# Only proceed if we actually got a username back
|
||||
if [ -n "$_WIN_USER" ]; then
|
||||
USER_CODE="/mnt/c/Users/$_WIN_USER/AppData/Local/Programs/Microsoft VS Code/bin/code"
|
||||
SYS_CODE="/mnt/c/Program Files/Microsoft VS Code/bin/code"
|
||||
|
||||
if [ -f "$USER_CODE" ]; then
|
||||
# We use single quotes for the alias definition to handle the spaces safely
|
||||
alias code="'$USER_CODE'"
|
||||
elif [ -f "$SYS_CODE" ]; then
|
||||
alias code="'$SYS_CODE'"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
fi
|
||||
alias local-stt="python ~/Application/STT/stt.py"
|
||||
|
||||
# Vault
|
||||
alias vl="vault login -method=userpass username=mangopig"
|
||||
alias vs="vault status"
|
||||
alias vkv="vault kv get"
|
||||
alias vkvl="vault kv list"
|
||||
|
||||
# Proxy
|
||||
proxy_on() {
|
||||
export ALL_PROXY=socks5h://192.168.1.26:1080
|
||||
export HTTP_PROXY=socks5h://192.168.1.26:1080
|
||||
export HTTPS_PROXY=socks5h://192.168.1.26:1080
|
||||
echo "Proxy ON (Mullvad NL)"
|
||||
}
|
||||
proxy_off() {
|
||||
unset ALL_PROXY HTTP_PROXY HTTPS_PROXY
|
||||
echo "Proxy OFF (direct)"
|
||||
}
|
||||
15
.zshenv
Normal file
15
.zshenv
Normal file
@@ -0,0 +1,15 @@
|
||||
# ENV File
|
||||
|
||||
export GOGC=500
|
||||
|
||||
# CodeGraphContext defaults
|
||||
export CGC_RUNTIME_DB_TYPE=kuzudb
|
||||
export KUZUDB_PATH="$HOME/.codegraphcontext/kuzudb"
|
||||
|
||||
export PATH=/home/mangopig/.opencode/bin:$PATH
|
||||
export OPENCHAMBER_HOST=0.0.0.0
|
||||
export AZURE_COGNITIVE_SERVICES_RESOURCE_NAME="$AZURE_URL"
|
||||
export VAULT_ADDR="http://192.168.30.53:8200"
|
||||
export OPENCHAMBER_UI_PASSWORD="$VM_SUDO_PASS"
|
||||
export AZURE_RESOURCE_NAME="$AZURE_URL"
|
||||
export PLANNOTATOR_PORT=9999
|
||||
62
.zshrc
62
.zshrc
@@ -1,26 +1,30 @@
|
||||
# .zshrc
|
||||
|
||||
# Path to your Oh My Zsh installation.
|
||||
# Zsh Configuration
|
||||
export ZSH="$HOME/.oh-my-zsh"
|
||||
|
||||
PROMPT="%B%~%b :: "
|
||||
RPROMPT="%n@%m"
|
||||
|
||||
# Plugins
|
||||
plugins=(git zsh-syntax-highlighting zsh-autosuggestions)
|
||||
plugins=(git zsh-syntax-highlighting zsh-autosuggestions sudo rclone rust nvm golang conda pyenv)
|
||||
|
||||
source $ZSH/oh-my-zsh.sh
|
||||
|
||||
# Golang and GVM
|
||||
[[ -s "$HOME/.gvm/scripts/gvm" ]] && source "$HOME/.gvm/scripts/gvm"
|
||||
# Programming Languages Root
|
||||
export PROG_DIR="$HOME/.programming"
|
||||
|
||||
# Go and GVM (Black Box)
|
||||
export GVM_ROOT="$PROG_DIR/go"
|
||||
[[ -s "$GVM_ROOT/scripts/gvm" ]] && source "$GVM_ROOT/scripts/gvm"
|
||||
|
||||
# Node and NVM (Lazy Load)
|
||||
export NVM_DIR="$HOME/.nvm"
|
||||
export NVM_DIR="$PROG_DIR/node"
|
||||
|
||||
nvm_load() {
|
||||
echo "💤 Waking up NVM..."
|
||||
unset -f nvm node npm npx
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
|
||||
"$@"
|
||||
}
|
||||
|
||||
@@ -30,7 +34,27 @@ npm() { nvm_load "npm" "$@"; }
|
||||
npx() { nvm_load "npx" "$@"; }
|
||||
|
||||
# Rust and Cargo
|
||||
[ -f "$HOME/.cargo/env" ] && source "$HOME/.cargo/env"
|
||||
export RUSTUP_HOME="$PROG_DIR/rust/multirust"
|
||||
export CARGO_HOME="$PROG_DIR/rust/cargo"
|
||||
|
||||
# Python (Pyenv + Miniconda)
|
||||
export PYENV_ROOT="$PROG_DIR/python/pyenv"
|
||||
export PATH="$PYENV_ROOT/bin:$PATH"
|
||||
|
||||
if command -v pyenv 1>/dev/null 2>&1; then
|
||||
eval "$(pyenv init -)"
|
||||
fi
|
||||
|
||||
if command -v conda >/dev/null 2>&1; then
|
||||
CONDA_BASE=$(conda info --base)
|
||||
[ -f "$CONDA_BASE/etc/profile.d/conda.sh" ] && source "$CONDA_BASE/etc/profile.d/conda.sh"
|
||||
fi
|
||||
|
||||
# R and Rig
|
||||
export RIG_HOME="$PROG_DIR/r"
|
||||
if [ -d "$RIG_HOME/bin" ]; then
|
||||
export PATH="$RIG_HOME/bin:$PATH"
|
||||
fi
|
||||
|
||||
# Zoxide
|
||||
eval "$(zoxide init --cmd cd zsh)"
|
||||
@@ -39,18 +63,14 @@ eval "$(zoxide init --cmd cd zsh)"
|
||||
[ -f ~/.zsh_aliases ] && source ~/.zsh_aliases
|
||||
[ -f ~/.zsh_secrets ] && source ~/.zsh_secrets
|
||||
|
||||
# Conda (Dynamic Path)
|
||||
# __conda_setup="$('$HOME/Programming/miniconda3/bin/conda' 'shell.zsh' 'hook' 2> /dev/null)"
|
||||
# if [ $? -eq 0 ]; then
|
||||
# eval "$__conda_setup"
|
||||
# else
|
||||
# if [ -f "$HOME/Programming/miniconda3/etc/profile.d/conda.sh" ]; then
|
||||
# . "$HOME/Programming/miniconda3/etc/profile.d/conda.sh"
|
||||
# else
|
||||
# export PATH="$HOME/Programming/miniconda3/bin:$PATH"
|
||||
# fi
|
||||
# fi
|
||||
# unset __conda_setup
|
||||
|
||||
# Add to PATH
|
||||
export PATH="$HOME/.local/bin:$PATH"
|
||||
export PATH="$HOME/.local/bin:$CARGO_HOME/bin:$PATH"
|
||||
export PATH="$GOPATH/bin:$PATH"
|
||||
|
||||
# opencode
|
||||
if ! pgrep -f "openchamber.*7891" > /dev/null; then
|
||||
openchamber --port 7891 >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
# direnv
|
||||
eval "$(direnv hook zsh)"
|
||||
|
||||
48
Makefile
48
Makefile
@@ -1,18 +1,27 @@
|
||||
# Makefile for Dotfiles
|
||||
# Makefile
|
||||
|
||||
# Tells Make that these targets are not actual files
|
||||
.PHONY: all setup stow clean update docker-test
|
||||
|
||||
# Default target (runs when you just type 'make')
|
||||
# Default target
|
||||
all: stow
|
||||
|
||||
# Full Setup
|
||||
setup:
|
||||
bash setup.sh
|
||||
bash ./scripts/base.sh
|
||||
bash ./scripts/node.sh
|
||||
bash ./scripts/go.sh
|
||||
bash ./scripts/rust.sh
|
||||
bash ./scripts/python.sh
|
||||
bash ./scripts/r.sh
|
||||
make clean
|
||||
make stow
|
||||
@echo "Full setup completed."
|
||||
|
||||
base:
|
||||
bash ./scripts/base.sh
|
||||
@echo "Base setup completed."
|
||||
|
||||
# Just stow the dotfiles
|
||||
stow:
|
||||
stow . --target=$$HOME --ignore="setup.sh" --ignore=".git" --ignore=".gitignore" --ignore="README.md" --ignore=".zsh_secrets" --ignore=".zsh_secrets.example" --ignore="LICENSE" --ignore="Makefile"
|
||||
stow . --target=$$HOME --ignore=".git" --ignore=".gitignore" --ignore="README.md" --ignore=".zsh_secrets" --ignore=".zsh_secrets.example" --ignore="LICENSE" --ignore="Makefile" --ignore="bin" --ignore="scripts"
|
||||
@echo "Dotfiles linked."
|
||||
|
||||
# Clean old files and links
|
||||
@@ -25,6 +34,31 @@ update:
|
||||
git pull origin main
|
||||
make setup
|
||||
|
||||
base:
|
||||
bash ./scripts/base.sh
|
||||
|
||||
# Language Setups
|
||||
node:
|
||||
bash ./scripts/node.sh
|
||||
|
||||
go:
|
||||
bash ./scripts/go.sh
|
||||
|
||||
rust:
|
||||
bash ./scripts/rust.sh
|
||||
|
||||
python:
|
||||
bash ./scripts/python.sh
|
||||
|
||||
r:
|
||||
bash ./scripts/r.sh
|
||||
|
||||
cpp:
|
||||
bash ./scripts/cpp.sh
|
||||
|
||||
storagebox:
|
||||
bash ./scripts/storagebox.sh
|
||||
|
||||
# Docker Tests
|
||||
test-ubuntu:
|
||||
@echo "Ubuntu Test"
|
||||
|
||||
22
scripts/azure.sh
Normal file
22
scripts/azure.sh
Normal file
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Path: scripts/azure.sh
|
||||
|
||||
echo "Checking disks..."
|
||||
lsblk | grep nvme
|
||||
|
||||
sudo mkfs.xfs -f /dev/nvme0n1
|
||||
|
||||
sudo mkdir -p /mnt/nvme
|
||||
|
||||
sudo mount /dev/nvme0n1 /mnt/nvme
|
||||
|
||||
sudo chown -R $USER:$USER /mnt/nvme
|
||||
|
||||
echo "NVMe mounted at /mnt/nvme"
|
||||
|
||||
df -h /mnt/nvme
|
||||
|
||||
# rclone sync -P --transfers=16 hetzner-box:models/Qwen3-30B-A3B-Instruct-2507 /mnt/nvme/Qwen3-30B-A3B-Instruct-2507
|
||||
|
||||
# rclone sync -P --transfers=16 /mnt/nvme/Qwen3-70B-Instruct-2024-12-04 hetzner-box:models/Qwen3-70B-Instruct-2024-12-04
|
||||
173
scripts/base.sh
Executable file
173
scripts/base.sh
Executable file
@@ -0,0 +1,173 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Path: scripts/base.sh
|
||||
|
||||
set -e
|
||||
|
||||
BLUE='\033[1;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
GREEN='\033[1;32m'
|
||||
RED='\033[1;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
DOTFILES_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
REPO_ROOT="$(dirname "$DOTFILES_DIR")"
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Initializing Base System Layer...${NC}"
|
||||
|
||||
# OS Detection
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
OS=$ID
|
||||
fi
|
||||
|
||||
# Confirm Architecture
|
||||
ARCH=$(uname -m)
|
||||
if [ "$ARCH" != "x86_64" ] && [ "$ARCH" != "aarch64" ]; then
|
||||
echo -e "${RED} ERROR: Unsupported architecture: $ARCH${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Package Installation
|
||||
PACKAGES=(
|
||||
curl wget git sudo
|
||||
zsh tmux
|
||||
unzip tar gzip
|
||||
build-essential
|
||||
openssl
|
||||
python bison mercurial
|
||||
ripgrep fd bat fzf jq
|
||||
btop httpie gnupg
|
||||
zoxide stow
|
||||
bind nmap socat tcpdump net-tools
|
||||
strace gdb hexyl
|
||||
ninja-build libcurl4-openssl-dev
|
||||
)
|
||||
|
||||
FINAL_LIST=""
|
||||
|
||||
for pkg in "${PACKAGES[@]}"; do
|
||||
case "$pkg" in
|
||||
"build-essential")
|
||||
[ "$OS" == "arch" ] && pkg="base-devel"
|
||||
[ "$OS" == "ubuntu" ] && pkg="build-essential"
|
||||
;;
|
||||
"python")
|
||||
[ "$OS" == "arch" ] && pkg="python"
|
||||
[ "$OS" == "ubuntu" ] && pkg="python3 python3-pip python3-venv"
|
||||
;;
|
||||
"fd")
|
||||
[ "$OS" == "arch" ] && pkg="fd"
|
||||
[ "$OS" == "ubuntu" ] && pkg="fd-find"
|
||||
;;
|
||||
"bat")
|
||||
[ "$OS" == "arch" ] && pkg="bat"
|
||||
[ "$OS" == "ubuntu" ] && pkg="bat"
|
||||
;;
|
||||
"openssl")
|
||||
[ "$OS" == "arch" ] && pkg="openssl"
|
||||
[ "$OS" == "ubuntu" ] && pkg="libssl-dev"
|
||||
;;
|
||||
"bind")
|
||||
[ "$OS" == "arch" ] && pkg="bind"
|
||||
[ "$OS" == "ubuntu" ] && pkg="dnsutils"
|
||||
;;
|
||||
"ninja-build")
|
||||
[ "$OS" == "arch" ] && pkg="ninja"
|
||||
[ "$OS" == "ubuntu" ] && pkg="ninja-build"
|
||||
;;
|
||||
"libcurl4-openssl-dev")
|
||||
[ "$OS" == "arch" ] && pkg="curl"
|
||||
[ "$OS" == "ubuntu" ] && pkg="libcurl4-openssl-dev"
|
||||
;;
|
||||
*)
|
||||
esac
|
||||
|
||||
FINAL_LIST="$FINAL_LIST $pkg"
|
||||
done
|
||||
|
||||
if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then
|
||||
FINAL_LIST="$FINAL_LIST"
|
||||
fi
|
||||
|
||||
if [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
FINAL_LIST="$FINAL_LIST ca-certificates bsdmainutils pkg-config cmake"
|
||||
fi
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing: ${NC}$FINAL_LIST"
|
||||
|
||||
if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then
|
||||
sudo pacman -S --noconfirm --needed $FINAL_LIST
|
||||
|
||||
elif [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get update
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y $FINAL_LIST
|
||||
fi
|
||||
|
||||
if [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Fixing Ubuntu binary names...${NC}"
|
||||
[ -f /usr/bin/fdfind ] && sudo ln -sf /usr/bin/fdfind /usr/local/bin/fd
|
||||
[ -f /usr/bin/batcat ] && sudo ln -sf /usr/bin/batcat /usr/local/bin/bat
|
||||
fi
|
||||
|
||||
# Moving Pre-Built bin to .local/bin
|
||||
mkdir -p "$HOME/.local/bin"
|
||||
cp -f "$REPO_ROOT/bin/"* "$HOME/.local/bin/"
|
||||
chmod +x "$HOME/.local/bin/"*
|
||||
|
||||
if ! command -v rclone &> /dev/null; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Rclone (Latest)...${NC}"
|
||||
curl https://rclone.org/install.sh | sudo bash
|
||||
fi
|
||||
|
||||
# Docker Installation
|
||||
if command -v docker &> /dev/null; then
|
||||
echo -e "${GREEN} LOG: Docker is already installed.${NC}"
|
||||
else
|
||||
if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then
|
||||
echo -e "${RED} LOG: WSL Detected! Skipping Native Docker.${NC}"
|
||||
echo -e "${RED} >>> Please install Docker Desktop on Windows.${NC}"
|
||||
else
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Native Docker...${NC}"
|
||||
if [ "$OS" == "arch" ]; then
|
||||
sudo pacman -S --noconfirm --needed docker docker-compose
|
||||
sudo systemctl enable --now docker
|
||||
elif [ "$OS" == "ubuntu" ]; then
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
fi
|
||||
|
||||
# Add user to group
|
||||
sudo usermod -aG docker $(whoami)
|
||||
fi
|
||||
fi
|
||||
|
||||
# 4. Zsh & Configuration
|
||||
if [ ! -d "$HOME/.oh-my-zsh" ]; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Oh My Zsh...${NC}"
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
|
||||
fi
|
||||
|
||||
# Plugins
|
||||
ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
|
||||
mkdir -p "$ZSH_CUSTOM/plugins"
|
||||
[ ! -d "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" ] && git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting"
|
||||
[ ! -d "$ZSH_CUSTOM/plugins/zsh-autosuggestions" ] && git clone https://github.com/zsh-users/zsh-autosuggestions "$ZSH_CUSTOM/plugins/zsh-autosuggestions"
|
||||
|
||||
# 5. Git Credentials (WSL Bridge)
|
||||
if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then
|
||||
GCM_WIN="/mnt/c/Program Files/Git/mingw64/bin/git-credential-manager.exe"
|
||||
[ -f "$GCM_WIN" ] && git config --global credential.helper "! \"$GCM_WIN\""
|
||||
else
|
||||
git config --global credential.helper 'cache --timeout=43200'
|
||||
fi
|
||||
|
||||
# 6. Cleanup & Secrets
|
||||
rm -f "$HOME/.zshrc" "$HOME/.zsh_aliases"
|
||||
touch "$HOME/.zsh_secrets"
|
||||
|
||||
# 7. Set Shell
|
||||
if [ "$SHELL" != "$(which zsh)" ]; then
|
||||
sudo chsh -s "$(which zsh)" $(whoami)
|
||||
fi
|
||||
|
||||
echo -e "${GREEN} LOG: Base System Setup Complete.${NC}"
|
||||
29
scripts/cpp.sh
Normal file
29
scripts/cpp.sh
Normal file
@@ -0,0 +1,29 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Path: scripts/cpp.sh
|
||||
|
||||
set -e
|
||||
|
||||
BLUE='\033[1;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
GREEN='\033[1;32m'
|
||||
NC='\033[0m'
|
||||
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
OS=$ID
|
||||
fi
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Setting up C++ Tooling (LLVM/Clang)...${NC}"
|
||||
|
||||
if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then
|
||||
sudo pacman -S --noconfirm --needed clang cmake ninja lldb gdb
|
||||
elif [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get update
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y clang cmake ninja-build lldb gdb
|
||||
fi
|
||||
|
||||
echo -e "${GREEN} SUCCESS:${NC} C++ Environment Ready."
|
||||
echo -e " - Compiler: $(clang --version | head -n 1)"
|
||||
echo -e " - Builder: $(cmake --version | head -n 1)"
|
||||
echo -e " - Debugger: $(lldb --version | head -n 1)"
|
||||
66
scripts/go.sh
Normal file
66
scripts/go.sh
Normal file
@@ -0,0 +1,66 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Path: scripts/go.sh
|
||||
|
||||
set -e
|
||||
|
||||
BLUE='\033[1;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
GREEN='\033[1;32m'
|
||||
RED='\033[1;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
export GVM_ROOT="$HOME/.programming/go"
|
||||
BOOTSTRAP_GO="$GVM_ROOT/bootstrap"
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Setting up Go and GVM in ${GVM_ROOT}...${NC}"
|
||||
|
||||
if [ ! -d "$GVM_ROOT/scripts" ]; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Cloning GVM...${NC}"
|
||||
git clone https://github.com/moovweb/gvm.git "$GVM_ROOT"
|
||||
rm -rf "$GVM_ROOT/.git"
|
||||
echo -e "${BLUE} LOG:${YELLOW} Configuring GVM scripts...${NC}"
|
||||
cp "$GVM_ROOT/scripts/gvm-default" "$GVM_ROOT/scripts/gvm"
|
||||
sed -i "s|^GVM_ROOT=.*|GVM_ROOT=\"$GVM_ROOT\"|" "$GVM_ROOT/scripts/gvm"
|
||||
|
||||
echo -e "${GREEN} SUCCESS:${NC} GVM cloned and configured."
|
||||
else
|
||||
echo -e "${GREEN} SKIP:${NC} GVM already installed."
|
||||
fi
|
||||
|
||||
if [ ! -d "$BOOTSTRAP_GO" ]; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Downloading Bootstrap Go...${NC}"
|
||||
mkdir -p "$BOOTSTRAP_GO"
|
||||
|
||||
wget -q https://go.dev/dl/go1.20.5.linux-amd64.tar.gz -O /tmp/go-bootstrap.tar.gz
|
||||
tar -C "$BOOTSTRAP_GO" -xzf /tmp/go-bootstrap.tar.gz --strip-components=1
|
||||
rm /tmp/go-bootstrap.tar.gz
|
||||
|
||||
echo -e "${GREEN} SUCCESS:${NC} Bootstrap Go installed."
|
||||
else
|
||||
echo -e "${GREEN} SKIP:${NC} Bootstrap Go already exists."
|
||||
fi
|
||||
|
||||
export PATH="$BOOTSTRAP_GO/bin:$PATH"
|
||||
export GOROOT_BOOTSTRAP="$BOOTSTRAP_GO"
|
||||
|
||||
set +e
|
||||
source "$GVM_ROOT/scripts/gvm"
|
||||
set -e
|
||||
|
||||
if ! command -v gvm &> /dev/null; then
|
||||
echo -e "${RED} ERROR:${NC} GVM failed to load."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TARGET_VER="go1.24.11"
|
||||
|
||||
if ! gvm list | grep -q "$TARGET_VER"; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing ${TARGET_VER}...${NC}"
|
||||
gvm install "$TARGET_VER" --prefer-binary
|
||||
fi
|
||||
|
||||
gvm use "$TARGET_VER" --default
|
||||
|
||||
echo -e "${GREEN} SUCCESS:${NC} Go setup completed."
|
||||
|
||||
38
scripts/node.sh
Normal file
38
scripts/node.sh
Normal file
@@ -0,0 +1,38 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Path: scripts/node.sh
|
||||
|
||||
set -e
|
||||
|
||||
BLUE='\033[1;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
GREEN='\033[1;32m'
|
||||
NC='\033[0m'
|
||||
|
||||
export NVM_DIR="$HOME/.programming/node"
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Setting up Node.js (NVM) in ${NVM_DIR}...${NC}"
|
||||
|
||||
if [ ! -d "$NVM_DIR" ]; then
|
||||
mkdir -p "$NVM_DIR"
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing NVM to custom path...${NC}"
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | PROFILE=/dev/null bash
|
||||
fi
|
||||
|
||||
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
|
||||
|
||||
if command -v nvm &> /dev/null; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Node LTS...${NC}"
|
||||
nvm install --lts --no-progress
|
||||
nvm use --lts
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Enabling Corepack (pnpm/yarn)...${NC}"
|
||||
|
||||
corepack enable
|
||||
|
||||
echo -e "${GREEN} LOG: Node setup complete. $(node -v)${NC}"
|
||||
echo -e "${GREEN} LOG: Package Managers: pnpm $(pnpm -v), yarn $(yarn -v)${NC}"
|
||||
else
|
||||
echo -e "${RED} ERROR: NVM failed to load from $NVM_DIR${NC}"
|
||||
exit 1
|
||||
fi
|
||||
109
scripts/provision.sh
Executable file
109
scripts/provision.sh
Executable file
@@ -0,0 +1,109 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Path: scripts/provision.sh
|
||||
|
||||
set -e
|
||||
|
||||
GREEN='\033[1;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[1;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
DEFAULT_USER="mangopig"
|
||||
DEFAULT_UID="1000"
|
||||
DEFAULT_GID="1000"
|
||||
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo -e "${RED}Please run this script as root.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}LOG: Detecting OS...${NC}"
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
OS=$ID
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}LOG: Determining primary IPv4 address...${NC}"
|
||||
if command -v hostname >/dev/null 2>&1 && hostname -I >/dev/null 2>&1; then
|
||||
IP=$(hostname -I | awk '{print $1}')
|
||||
elif command -v ip >/dev/null 2>&1; then
|
||||
IP=$(ip route get 1.1.1.1 2>/dev/null | awk '/src/ {print $NF; exit}')
|
||||
elif command -v ifconfig >/dev/null 2>&1; then
|
||||
IP=$(ifconfig | awk '/inet /{print $2}' | grep -v '^127' | head -n1)
|
||||
else
|
||||
IP="127.0.0.1"
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}LOG: Updating system and installing base tools...${NC}"
|
||||
|
||||
if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then
|
||||
pacman -Sy --noconfirm git make curl zsh sudo
|
||||
SUDO_GROUP="wheel"
|
||||
elif [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
apt-get update
|
||||
apt-get install -y git make curl sudo zsh
|
||||
SUDO_GROUP="sudo"
|
||||
else
|
||||
echo -e "${RED}Unsupported OS: $OS${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -t 0 ]; then
|
||||
echo -e "${GREEN}---------------------------------------${NC}"
|
||||
echo -e "${GREEN} USER PROVISIONING WIZARD ${NC}"
|
||||
echo -e "${GREEN}---------------------------------------${NC}"
|
||||
|
||||
read -p "Enter Username (default: $DEFAULT_USER): " INPUT_USER
|
||||
USERNAME=${INPUT_USER:-$DEFAULT_USER}
|
||||
|
||||
read -p "Enter UID (default: $DEFAULT_UID): " INPUT_UID
|
||||
USER_UID=${INPUT_UID:-$DEFAULT_UID}
|
||||
|
||||
read -p "Enter GID (default: $DEFAULT_GID): " INPUT_GID
|
||||
USER_GID=${INPUT_GID:-$DEFAULT_GID}
|
||||
else
|
||||
echo -e "${YELLOW}LOG: Non-interactive session detected. Using defaults.${NC}"
|
||||
USERNAME=${USERNAME:-$DEFAULT_USER}
|
||||
USER_UID=${USER_UID:-$DEFAULT_UID}
|
||||
USER_GID=${USER_GID:-$DEFAULT_GID}
|
||||
fi
|
||||
|
||||
if getent group "$USER_GID" >/dev/null; then
|
||||
echo -e "${YELLOW}LOG: Group with GID $USER_GID already exists. Using it.${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}LOG: Creating group $USERNAME with GID $USER_GID...${NC}"
|
||||
groupadd -g "$USER_GID" "$USERNAME"
|
||||
fi
|
||||
|
||||
if id "$USERNAME" &>/dev/null; then
|
||||
echo -e "${YELLOW}LOG: User $USERNAME already exists. Skipping creation.${NC}"
|
||||
else
|
||||
echo -e "${YELLOW}LOG: Creating user $USERNAME...${NC}"
|
||||
useradd -m -u "$USER_UID" -g "$USER_GID" -G "$SUDO_GROUP" -s "$ZSH_PATH" "$USERNAME"
|
||||
echo -e "${GREEN}LOG: Setting password for $USERNAME...${NC}"
|
||||
|
||||
if [ -t 0 ]; then
|
||||
echo -e "${GREEN}LOG: Setting password for $USERNAME...${NC}"
|
||||
passwd "$USERNAME"
|
||||
else
|
||||
echo -e "${YELLOW}LOG: Non-interactive: Setting password to '$USERNAME'...${NC}"
|
||||
echo "$USERNAME:$USERNAME" | chpasswd
|
||||
fi
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}LOG: Configuring passwordless sudo...${NC}"
|
||||
echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" > "/etc/sudoers.d/90-$USERNAME"
|
||||
chmod 0440 "/etc/sudoers.d/90-$USERNAME"
|
||||
|
||||
if [ "$OS" == "arch" ]; then
|
||||
sed -i 's/^# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/' /etc/sudoers
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}LOG: Cloning dotfiles for $USERNAME...${NC}"
|
||||
sudo -u "$USERNAME" git clone https://git.mangopig.tech/MangoPig/Dot-Zsh.git "/home/$USERNAME/Config/Dot-Zsh"
|
||||
|
||||
|
||||
echo -e "${GREEN}✅ Server Provisioned!"
|
||||
echo -e "${GREEN} sudo su - $USERNAME${NC} OR logout and SSH back in as $USERNAME@$IP.${NC}"
|
||||
echo -e "${GREEN} Then run cd ~/Config/Dot-Zsh && make setup ${NC}"
|
||||
69
scripts/python.sh
Normal file
69
scripts/python.sh
Normal file
@@ -0,0 +1,69 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Path: scripts/python.sh
|
||||
set -e
|
||||
|
||||
BLUE='\033[1;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
GREEN='\033[1;32m'
|
||||
RED='\033[1;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
# OS Detection
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
OS=$ID
|
||||
fi
|
||||
|
||||
# Install Build Dependencies
|
||||
if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Arch build dependencies...${NC}"
|
||||
sudo pacman -S --noconfirm --needed base-devel openssl zlib xz tk libffi bzip2 git
|
||||
elif [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Debian build dependencies...${NC}"
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get update
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y make build-essential libssl-dev zlib1g-dev \
|
||||
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev \
|
||||
libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev git
|
||||
fi
|
||||
|
||||
# Define the Black Box Location
|
||||
export PYENV_ROOT="$HOME/.programming/python/pyenv"
|
||||
export PATH="$PYENV_ROOT/bin:$PATH"
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Setting up Pyenv in ${PYENV_ROOT}...${NC}"
|
||||
|
||||
# Install Pyenv
|
||||
if [ ! -d "$PYENV_ROOT" ]; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Cloning Pyenv...${NC}"
|
||||
git clone https://github.com/pyenv/pyenv.git "$PYENV_ROOT"
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Compiling Pyenv dynamic bash extension...${NC}"
|
||||
cd "$PYENV_ROOT" && src/configure && make -C src
|
||||
|
||||
echo -e "${GREEN} SUCCESS:${NC} Pyenv installed."
|
||||
else
|
||||
echo -e "${GREEN} SKIP:${NC} Pyenv already installed."
|
||||
fi
|
||||
|
||||
# Initialize Pyenv for this script session
|
||||
eval "$(pyenv init -)"
|
||||
|
||||
# Install Miniforge (The Community Standard)
|
||||
TARGET_VER="miniforge3-latest"
|
||||
|
||||
if ! pyenv versions | grep -q "$TARGET_VER"; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing ${TARGET_VER}...${NC}"
|
||||
echo -e "${YELLOW} NOTE: This avoids Anaconda licensing issues and uses conda-forge default.${NC}"
|
||||
|
||||
pyenv install "$TARGET_VER"
|
||||
|
||||
echo -e "${GREEN} SUCCESS:${NC} Miniforge installed."
|
||||
else
|
||||
echo -e "${GREEN} SKIP:${NC} Miniforge already installed."
|
||||
fi
|
||||
|
||||
# Set Global Default
|
||||
pyenv global "$TARGET_VER"
|
||||
|
||||
echo -e "${GREEN} SUCCESS:${NC} Python setup completed. Default is now Miniforge (Conda)."
|
||||
78
scripts/r.sh
Normal file
78
scripts/r.sh
Normal file
@@ -0,0 +1,78 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Path: scripts/r.sh
|
||||
set -e
|
||||
|
||||
BLUE='\033[1;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
GREEN='\033[1;32m'
|
||||
RED='\033[1;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
# OS Detection
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
OS=$ID
|
||||
fi
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Detecting R installation strategy for $OS...${NC}"
|
||||
|
||||
if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Arch Linux detected. Using system R (Pacman)...${NC}"
|
||||
|
||||
# Install R + Build Tools
|
||||
sudo pacman -S --noconfirm --needed r gcc-fortran curl tar
|
||||
|
||||
echo -e "${GREEN} SUCCESS:${NC} R installed via Pacman."
|
||||
|
||||
R_BIN="R"
|
||||
|
||||
elif [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Debian build dependencies...${NC}"
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get update
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y gfortran curl tar ca-certificates
|
||||
|
||||
if ! command -v rig >/dev/null 2>&1; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Rig for Debian/Ubuntu...${NC}"
|
||||
|
||||
DEB_ARCH=$(dpkg --print-architecture)
|
||||
case "$DEB_ARCH" in
|
||||
amd64|arm64)
|
||||
;;
|
||||
*)
|
||||
echo -e "${RED} ERROR:${NC} Unsupported Debian architecture for Rig: $DEB_ARCH"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
LATEST_REL_DATA=$(curl -fsSL https://api.github.com/repos/r-lib/rig/releases/latest)
|
||||
RIG_URL=$(echo "$LATEST_REL_DATA" | grep -o "https://[^\"]*r-rig_[^\"]*_${DEB_ARCH}\.deb" | head -n 1)
|
||||
|
||||
if [ -z "$RIG_URL" ]; then
|
||||
echo -e "${RED} ERROR:${NC} Could not find Rig .deb download URL for architecture: $DEB_ARCH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TEMP_DEB=$(mktemp --suffix=.deb)
|
||||
curl -fLsS "$RIG_URL" -o "$TEMP_DEB"
|
||||
sudo apt-get install -y "$TEMP_DEB"
|
||||
rm -f "$TEMP_DEB"
|
||||
fi
|
||||
|
||||
TARGET_VER="release"
|
||||
if ! rig list | grep -q "release"; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing R (${TARGET_VER})...${NC}"
|
||||
sudo rig add "$TARGET_VER" --without-cran-mirror
|
||||
sudo rig default "$TARGET_VER"
|
||||
fi
|
||||
|
||||
R_BIN="rig run"
|
||||
fi
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing 'renv' package globally...${NC}"
|
||||
|
||||
$R_BIN -e 'if (!require("renv", quietly=TRUE)) install.packages("renv", repos="https://cloud.r-project.org")'
|
||||
|
||||
echo -e "${GREEN} SUCCESS:${NC} R setup completed."
|
||||
41
scripts/rust.sh
Normal file
41
scripts/rust.sh
Normal file
@@ -0,0 +1,41 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Path: scripts/rust.sh
|
||||
|
||||
set -e
|
||||
|
||||
BLUE='\033[1;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
GREEN='\033[1;32m'
|
||||
NC='\033[0m'
|
||||
|
||||
export RUSTUP_HOME="$HOME/.programming/rust/multirust"
|
||||
export CARGO_HOME="$HOME/.programming/rust/cargo"
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Setting up Rust (Rustup) in ${CARGO_HOME}...${NC}"
|
||||
|
||||
if [ ! -f "$CARGO_HOME/bin/rustup" ]; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Rustup to custom path...${NC}"
|
||||
mkdir -p "$RUSTUP_HOME" "$CARGO_HOME"
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path
|
||||
else
|
||||
echo -e "${GREEN} LOG: Rustup already installed in custom path.${NC}"
|
||||
fi
|
||||
|
||||
if [ -f "$CARGO_HOME/env" ]; then
|
||||
source "$CARGO_HOME/env"
|
||||
fi
|
||||
|
||||
if command -v cargo &> /dev/null; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Updating toolchain...${NC}"
|
||||
rustup default stable
|
||||
rustup update
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing rust-src for 'Go to Definition'...${NC}"
|
||||
rustup component add rust-src
|
||||
|
||||
echo -e "${GREEN} LOG: Rust setup complete. $(cargo --version)${NC}"
|
||||
else
|
||||
echo -e "${RED} ERROR: Cargo not found in PATH. Check CARGO_HOME.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
116
scripts/storagebox.sh
Normal file
116
scripts/storagebox.sh
Normal file
@@ -0,0 +1,116 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Colors
|
||||
BLUE='\033[1;34m'
|
||||
YELLOW='\033[1;33m'
|
||||
GREEN='\033[1;32m'
|
||||
RED='\033[1;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
SECRETS_FILE="$HOME/.zsh_secrets"
|
||||
REMOTE_NAME="hetzner-box"
|
||||
|
||||
# Dependency Check
|
||||
if ! command -v rclone &> /dev/null; then
|
||||
echo -e "${RED}Error: rclone is not installed.${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Load Secrets
|
||||
if [ -f "$SECRETS_FILE" ]; then
|
||||
source "$SECRETS_FILE"
|
||||
fi
|
||||
|
||||
# Configure Remote (If missing)
|
||||
if ! rclone listremotes | grep -q "^${REMOTE_NAME}:$"; then
|
||||
echo -e "${BLUE}Configuration missing. Starting setup...${NC}"
|
||||
|
||||
if [ -z "$HETZNER_USER" ]; then
|
||||
DEFAULT_USER="u513875"
|
||||
read -p "Enter Username [$DEFAULT_USER]: " INPUT_USER
|
||||
HETZNER_USER="${INPUT_USER:-$DEFAULT_USER}"
|
||||
fi
|
||||
|
||||
if [ -z "$HETZNER_HOST" ]; then
|
||||
DEFAULT_HOST="${HETZNER_USER}.your-storagebox.de"
|
||||
read -p "Enter Host [$DEFAULT_HOST]: " INPUT_HOST
|
||||
HETZNER_HOST="${INPUT_HOST:-$DEFAULT_HOST}"
|
||||
fi
|
||||
|
||||
if [ -z "$HETZNER_PASS" ]; then
|
||||
echo -e "${YELLOW}Note: Passwords are obscured in config, but saving to secrets file uses plain text.${NC}"
|
||||
read -s -p "Enter Password: " HETZNER_PASS
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Save to secrets
|
||||
if ! grep -q "HETZNER_USER" "$SECRETS_FILE" 2>/dev/null; then
|
||||
echo -e "${BLUE}Saving credentials to $SECRETS_FILE...${NC}"
|
||||
{
|
||||
echo ""
|
||||
echo "# Hetzner Storage Box"
|
||||
echo "export HETZNER_USER=\"$HETZNER_USER\""
|
||||
echo "export HETZNER_HOST=\"$HETZNER_HOST\""
|
||||
echo "export HETZNER_PASS=\"$HETZNER_PASS\""
|
||||
} >> "$SECRETS_FILE"
|
||||
fi
|
||||
|
||||
OBSCURED_PASS=$(rclone obscure "$HETZNER_PASS")
|
||||
rclone config create "$REMOTE_NAME" sftp \
|
||||
host "$HETZNER_HOST" \
|
||||
user "$HETZNER_USER" \
|
||||
pass "$OBSCURED_PASS" \
|
||||
port 23 \
|
||||
--non-interactive
|
||||
|
||||
echo -e "${GREEN}Configuration created!${NC}"
|
||||
fi
|
||||
|
||||
# Interactive Menu
|
||||
echo -e "${BLUE}--- Hetzner Storage Box Manager ---${NC}"
|
||||
echo "1) List files (ls)"
|
||||
echo "2) Upload (Copy LOCAL -> REMOTE)"
|
||||
echo "3) Download (Copy REMOTE -> LOCAL)"
|
||||
echo "q) Quit"
|
||||
|
||||
read -p "Select option: " OPTION
|
||||
|
||||
case $OPTION in
|
||||
1)
|
||||
read -p "Enter depth [1]: " INPUT_DEPTH
|
||||
DEPTH="${INPUT_DEPTH:-1}"
|
||||
echo -e "${BLUE}Listing files on Hetzner...${NC}"
|
||||
rclone ls "${REMOTE_NAME}:" --max-depth "$DEPTH"
|
||||
;;
|
||||
2)
|
||||
read -p "Enter local folder/file to upload: " LOCAL_PATH
|
||||
LOCAL_PATH=${LOCAL_PATH%/}
|
||||
|
||||
read -p "Enter remote destination folder (e.g. Backup): " REMOTE_FOLDER
|
||||
REMOTE_FOLDER=${REMOTE_FOLDER#/}
|
||||
REMOTE_FOLDER=${REMOTE_FOLDER%/}
|
||||
|
||||
echo -e "${YELLOW}Uploading '$LOCAL_PATH' to '${REMOTE_NAME}:$REMOTE_FOLDER'...${NC}"
|
||||
rclone copy "$LOCAL_PATH" "${REMOTE_NAME}:$REMOTE_FOLDER" -P
|
||||
;;
|
||||
3)
|
||||
echo -e "${BLUE}Contents of Root:${NC}"
|
||||
rclone lsd "${REMOTE_NAME}:"
|
||||
|
||||
read -p "Enter remote path to download (e.g. models/Test): " REMOTE_PATH
|
||||
REMOTE_PATH=${REMOTE_PATH#/}
|
||||
|
||||
read -p "Enter local destination folder: " LOCAL_DEST
|
||||
mkdir -p "$LOCAL_DEST"
|
||||
|
||||
echo -e "${YELLOW}Downloading '${REMOTE_NAME}:$REMOTE_PATH' to '$LOCAL_DEST'...${NC}"
|
||||
rclone copy "${REMOTE_NAME}:$REMOTE_PATH" "$LOCAL_DEST" -P
|
||||
;;
|
||||
q)
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Invalid option"
|
||||
;;
|
||||
esac
|
||||
223
setup.sh
223
setup.sh
@@ -1,223 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Variables
|
||||
ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
|
||||
DOTFILES_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
|
||||
# Bold Colors
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[1;34m'
|
||||
RED='\033[1;31m'
|
||||
GREEN='\033[1;32m'
|
||||
NC='\033[0m'
|
||||
|
||||
# OS Detection
|
||||
echo -e "${BLUE} LOG:${YELLOW} Checking System...${NC}"
|
||||
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
OS=$ID
|
||||
fi
|
||||
|
||||
# Package Installation
|
||||
PACKAGES=(
|
||||
curl wget git sudo
|
||||
zsh tmux
|
||||
unzip tar gzip
|
||||
build-essential
|
||||
openssl
|
||||
python bison mercurial
|
||||
ripgrep fd bat fzf jq
|
||||
btop httpie gnupg
|
||||
zoxide stow
|
||||
bind nmap socat tcpdump net-tools
|
||||
strace gdb hexyl
|
||||
)
|
||||
|
||||
FINAL_LIST=""
|
||||
|
||||
for pkg in "${PACKAGES[@]}"; do
|
||||
case "$pkg" in
|
||||
"build-essential")
|
||||
[ "$OS" == "arch" ] && pkg="base-devel"
|
||||
[ "$OS" == "ubuntu" ] && pkg="build-essential"
|
||||
;;
|
||||
"python")
|
||||
[ "$OS" == "arch" ] && pkg="python"
|
||||
[ "$OS" == "ubuntu" ] && pkg="python3 python3-pip python3-venv"
|
||||
;;
|
||||
"fd")
|
||||
[ "$OS" == "arch" ] && pkg="fd"
|
||||
[ "$OS" == "ubuntu" ] && pkg="fd-find"
|
||||
;;
|
||||
"bat")
|
||||
[ "$OS" == "arch" ] && pkg="bat"
|
||||
[ "$OS" == "ubuntu" ] && pkg="bat"
|
||||
;;
|
||||
"openssl")
|
||||
[ "$OS" == "arch" ] && pkg="openssl"
|
||||
[ "$OS" == "ubuntu" ] && pkg="libssl-dev"
|
||||
;;
|
||||
"bind")
|
||||
[ "$OS" == "arch" ] && pkg="bind"
|
||||
[ "$OS" == "ubuntu" ] && pkg="dnsutils"
|
||||
;;
|
||||
*)
|
||||
esac
|
||||
|
||||
FINAL_LIST="$FINAL_LIST $pkg"
|
||||
done
|
||||
|
||||
# Extra packages for specific distros
|
||||
if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then
|
||||
FINAL_LIST="$FINAL_LIST eza"
|
||||
fi
|
||||
|
||||
if [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
FINAL_LIST="$FINAL_LIST ca-certificates bsdmainutils pkg-config cmake"
|
||||
fi
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing: ${NC}$FINAL_LIST"
|
||||
|
||||
if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then
|
||||
sudo pacman -S --noconfirm --needed $FINAL_LIST
|
||||
elif [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get update
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y $FINAL_LIST
|
||||
fi
|
||||
|
||||
if [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Fixing Ubuntu binary names...${NC}"
|
||||
[ -f /usr/bin/fdfind ] && sudo ln -sf /usr/bin/fdfind /usr/local/bin/fd
|
||||
[ -f /usr/bin/batcat ] && sudo ln -sf /usr/bin/batcat /usr/local/bin/bat
|
||||
fi
|
||||
|
||||
# Docker Installation
|
||||
if command -v docker &> /dev/null; then
|
||||
echo -e "${GREEN} LOG: Docker is already installed. Skipping...${NC}"
|
||||
else
|
||||
# Check if we are running in WSL
|
||||
if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then
|
||||
echo -e "${RED} LOG: WSL Detected! Skipping Native Docker installation.${NC}"
|
||||
echo -e "${RED} >>> ACTION REQUIRED: Please install Docker Desktop for Windows.${NC}"
|
||||
echo -e "${RED} >>> Ensure 'Use WSL 2 based engine' is enabled in Docker settings.${NC}"
|
||||
else
|
||||
echo -e "${BLUE} LOG:${YELLOW} Docker not found. Installing Native Docker Engine...${NC}"
|
||||
|
||||
# ARCH LINUX
|
||||
if [ "$OS" == "arch" ] || [ "$OS" == "manjaro" ]; then
|
||||
sudo pacman -S --noconfirm --needed docker docker-compose
|
||||
sudo systemctl enable --now docker
|
||||
fi
|
||||
|
||||
# UBUNTU / DEBIAN
|
||||
if [ "$OS" == "ubuntu" ] || [ "$OS" == "debian" ]; then
|
||||
echo -e "${BLUE} LOG:${YELLOW} Setting up Official Docker Repository...${NC}"
|
||||
sudo install -m 0755 -d /etc/apt/keyrings
|
||||
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
|
||||
sudo chmod a+r /etc/apt/keyrings/docker.asc
|
||||
|
||||
echo \
|
||||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
|
||||
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
|
||||
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get update
|
||||
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Install NVM, GVM, Rustup
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing NVM, GVM and Rustup...${NC}"
|
||||
|
||||
# NVM
|
||||
if [ ! -d "$HOME/.nvm" ]; then
|
||||
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
|
||||
fi
|
||||
|
||||
# Go and GVM
|
||||
wget https://go.dev/dl/go1.25.4.linux-amd64.tar.gz -O /tmp/go1.25.4.linux-amd64.tar.gz
|
||||
sudo rm -rf /usr/local/go
|
||||
sudo tar -C /usr/local -xzf /tmp/go1.25.4.linux-amd64.tar.gz
|
||||
rm -f /tmp/go1.25.4.linux-amd64.tar.gz
|
||||
|
||||
if [ ! -d "$HOME/.gvm" ]; then
|
||||
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
|
||||
fi
|
||||
|
||||
# Rustup
|
||||
if ! command -v rustup &> /dev/null; then
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
||||
fi
|
||||
|
||||
# Install Eza with Cargo
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Eza via Cargo...${NC}"
|
||||
if ! command -v eza &> /dev/null; then
|
||||
source "$HOME/.cargo/env"
|
||||
cargo install eza
|
||||
fi
|
||||
|
||||
# ---------------------------------------------------------------------
|
||||
# GIT CREDENTIAL CONFIGURATION
|
||||
# ---------------------------------------------------------------------
|
||||
echo -e "${BLUE} LOG:${YELLOW} Configuring Git Credentials...${NC}"
|
||||
|
||||
if grep -qEi "(Microsoft|WSL)" /proc/version &> /dev/null; then
|
||||
GCM_WIN="/mnt/c/Program Files/Git/mingw64/bin/git-credential-manager.exe"
|
||||
if [ -f "$GCM_WIN" ]; then
|
||||
git config --global credential.helper "\"$GCM_WIN\""
|
||||
fi
|
||||
else
|
||||
# Linux Server: Cache credentials for 12 hour
|
||||
git config --global credential.helper 'cache --timeout=43200'
|
||||
fi
|
||||
|
||||
# Docker Group
|
||||
echo -e "${BLUE} LOG:${YELLOW} Setting up Docker group...${NC}"
|
||||
if ! getent group docker > /dev/null 2>&1; then
|
||||
sudo groupadd docker
|
||||
fi
|
||||
sudo usermod -aG docker $(whoami)
|
||||
|
||||
# Zsh and Oh My Zsh Setup
|
||||
echo -e "${BLUE} LOG:${YELLOW} Setting up Oh My Zsh...${NC}"
|
||||
if [ ! -d "$HOME/.oh-my-zsh" ]; then
|
||||
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
|
||||
fi
|
||||
|
||||
echo -e "${BLUE} LOG:${YELLOW} Installing Zsh plugins...${NC}"
|
||||
if [ ! -d "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting" ]; then
|
||||
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$ZSH_CUSTOM/plugins/zsh-syntax-highlighting"
|
||||
fi
|
||||
|
||||
if [ ! -d "$ZSH_CUSTOM/plugins/zsh-autosuggestions" ]; then
|
||||
git clone https://github.com/zsh-users/zsh-autosuggestions "$ZSH_CUSTOM/plugins/zsh-autosuggestions"
|
||||
fi
|
||||
|
||||
# Making Zsh the default shell
|
||||
echo -e "${BLUE} LOG:${YELLOW} Setting Zsh as the default shell...${NC}"
|
||||
if [ "$SHELL" != "$(which zsh)" ]; then
|
||||
sudo chsh -s "$(which zsh)" $(whoami)
|
||||
fi
|
||||
|
||||
# File Cleanup
|
||||
echo -e "${BLUE} LOG:${YELLOW} Cleaning up old configs...${NC}"
|
||||
rm -f "$HOME/.zshrc" "$HOME/.zsh_aliases"
|
||||
|
||||
# Ensure secrets file exists
|
||||
echo -e "${BLUE} LOG:${YELLOW} Ensuring secrets file exists...${NC}"
|
||||
touch "$HOME/.zsh_secrets"
|
||||
|
||||
# Stow Dotfiles
|
||||
echo -e "${BLUE} LOG:${YELLOW} Stowing dotfiles...${NC}"
|
||||
cd "$DOTFILES_DIR"
|
||||
stow . --target="$HOME" --ignore="setup.sh" --ignore=".git" --ignore=".gitignore" --ignore="README.md" --ignore=".zsh_secrets" --ignore=".zsh_secrets.example" --ignore="LICENSE" --ignore="Makefile"
|
||||
|
||||
# Finish
|
||||
echo -e "${GREEN} LOG: Setup Complete! Please restart your terminal to apply all changes.${NC}"
|
||||
echo -e "${GREEN} You may need to log out and back in for Docker group changes to take effect.${NC}"
|
||||
echo -e "${GREEN} Setup GVM by running 'gvm listall' then 'gvm install [version], and 'gvm use [version] --default'.${NC}"
|
||||
echo -e "${GREEN} Setup NVM by running 'nvm install --lts' and 'nvm use --lts'${NC}"
|
||||
echo -e "${GREEN} Setup Rust by running 'rustup default stable'${NC}"
|
||||
Reference in New Issue
Block a user