Compare commits
51 Commits
main
...
v2.3.7-pre
| Author | SHA1 | Date | |
|---|---|---|---|
| 85dd236772 | |||
| 04713782a0 | |||
| 583fd0476c | |||
| 9bc9bde9bd | |||
| 7ab37d67c3 | |||
| 77ea378d7e | |||
| 7bb3628840 | |||
| cb77ee4461 | |||
| 0fb4de853f | |||
| 2bdfb51831 | |||
| 9de1189e02 | |||
| 6beed01409 | |||
| 85cee3b236 | |||
| 06f6d9d5d6 | |||
| c45c2ddbcc | |||
| 6dbf2dd9c2 | |||
| 9974b836c7 | |||
| 18c76f4663 | |||
| b43f199df3 | |||
| 501de81a94 | |||
| 92a01dee96 | |||
| b0b0d05206 | |||
| 55c55c85c8 | |||
| 0eeac30fe3 | |||
| 916d047304 | |||
| 7f643b53fb | |||
| 3cebef4422 | |||
| 26e33e16d9 | |||
| cad6c4c547 | |||
| 4c747546e3 | |||
| ce3de74cc2 | |||
| 931555af5c | |||
| ebf8871e80 | |||
| e157cac123 | |||
| faa2f6534d | |||
| 16feb6955a | |||
| fb9cde4b80 | |||
| 8dabd5506b | |||
| b05bf26bf9 | |||
| 153d8e3b29 | |||
| f0d263992a | |||
| 68617341c6 | |||
| d22e0759af | |||
| bc7976d3b9 | |||
| d7918d84da | |||
| d261abddc9 | |||
| c44ef9a81d | |||
| 4ded7a9bc9 | |||
| 3a397bfffa | |||
| 80c08ee18a | |||
| 8da7ae9408 |
@@ -11,6 +11,8 @@ Licensed under MIT
|
||||
* **Non-Evasive:** Installs to `/opt/dynr` to keep your system clean.
|
||||
* **Aesthetic:** High-contrast Dynasty color palette (#1fd9f0, #9c16ba, #dba608).
|
||||
|
||||
---
|
||||
[](https://donate.stripe.com/7sIbIW0Yeb3k9rOdQY) [](https://forum.dynastyrevolution.com)
|
||||
---
|
||||
|
||||
## 🚀 Installation
|
||||
|
||||
187
install.sh
187
install.sh
@@ -1,128 +1,85 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------
|
||||
# Dynasty Revolution Universal Installer v2.3.6
|
||||
# Dynasty Revolution Universal Installer v2.3.7-pre (Smart-Sync Edition)
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
# --- Brighter 256-Color Palette ---
|
||||
# --- 1. ENVIRONMENT & STYLING ---
|
||||
[[ "$OSTYPE" == "darwin"* ]] && { OS="macOS"; DP="$HOME/.dynr"; } || { OS="Linux"; DP="/opt/dynr"; }
|
||||
VERSION="2.3.7-pre"
|
||||
REPO="https://git.dynastyrevolution.com/DYNR/DynastyRevolution-Scripts/raw/branch/v2.3.7-pre"
|
||||
BLUE='\033[38;5;45m'; PURPLE='\033[38;5;127m'; GOLD='\033[38;5;178m'; RED='\033[38;5;196m'; NC='\033[0m'
|
||||
|
||||
# --- THE SOURCE OF TRUTH ---
|
||||
VERSION="2.3.6"
|
||||
REPO_RAW="https://git.dynastyrevolution.com/DYNR/DynastyRevolution-Scripts/raw/branch/main"
|
||||
CURRENT_DATE=$(date +"%m-%d-%Y")
|
||||
|
||||
clear
|
||||
echo -e "${BLUE}🐉 Dynasty Revolution Systems Initializing...${NC}"
|
||||
echo -e "${GOLD}Current Era: ${NC}$CURRENT_DATE"
|
||||
echo -e "${PURPLE}-------------------------------------------------${NC}"
|
||||
|
||||
# --- News Dispatch Logic ---
|
||||
echo -e "${GOLD}📜 LATEST ARCHIVE DISPATCHES:${NC}"
|
||||
NEWS_DATA=$(curl -sL -A "Mozilla/5.0" "$REPO_RAW/dispatches.txt")
|
||||
|
||||
if [[ -z "$NEWS_DATA" || "$NEWS_DATA" == *"404"* ]]; then
|
||||
echo -e " ${RED}The Archives are currently silent.${NC}"
|
||||
else
|
||||
echo "$NEWS_DATA" | sed "s/^/ /"
|
||||
# --- 2. INITIAL MANIFEST (BOOTSTRAP) ---
|
||||
if [ ! -f "/usr/local/bin/dynr" ]; then
|
||||
clear; echo -e "${BLUE}🐉 Dynasty Revolution Systems Initializing...${NC}"
|
||||
read -p "📥 Manifest Framework? (y/n): " CF < /dev/tty
|
||||
if [[ "$CF" =~ ^[Yy]$ ]]; then
|
||||
[[ "$OS" == "macOS" ]] && mkdir -p "$DP/modules" || sudo mkdir -p "$DP/modules"
|
||||
sudo curl -sSL "$REPO/install.sh" -o /usr/local/bin/dynr && sudo chmod +x /usr/local/bin/dynr
|
||||
echo -e "${GOLD}✅ System Manifested! Type 'dynr' to begin.${NC}"
|
||||
fi; exit 0
|
||||
fi
|
||||
echo -e "${PURPLE}-------------------------------------------------${NC}"
|
||||
|
||||
# --- Version & Existing Install Detection ---
|
||||
if [ -f "/usr/local/bin/dynr" ]; then
|
||||
CURRENT_VER=$(grep -m 1 "VERSION=" /usr/local/bin/dynr | sed -E 's/.*VERSION="?([0-9.]+)"?.*/\1/')
|
||||
[[ -z "$CURRENT_VER" ]] && CURRENT_VER="Unknown"
|
||||
# --- 3. MAIN INTERFACE LOOP ---
|
||||
while true; do
|
||||
clear
|
||||
echo -e "${BLUE}🐉 Dynasty Revolution Systems | v$VERSION${NC}"
|
||||
echo -e "${PURPLE}📡 Pulse Check:${NC}"
|
||||
echo -e " [${GOLD}OK${NC}] OS: $OS ($(uname -m))"
|
||||
ping -c 1 1.1.1.1 &>/dev/null && echo -e " [${GOLD}OK${NC}] Network: Cloudflare Reachable" || echo -e " [${RED}!!${NC}] Network: Offline"
|
||||
|
||||
# --- NEW: Self-Update Check ---
|
||||
REMOTE_VER=$(curl -sL "$REPO_RAW/install.sh" | grep -m 1 "VERSION=" | sed -E 's/.*VERSION="?([0-9.]+)"?.*/\1/')
|
||||
|
||||
if [[ "$REMOTE_VER" != "$CURRENT_VER" && "$REMOTE_VER" != "" ]]; then
|
||||
echo -e "${RED}✨ A NEW ERA HAS DAWNED: v$REMOTE_VER IS AVAILABLE! (Current: v$CURRENT_VER)${NC}"
|
||||
echo -e "${RED} Select option 2 below to manifest the latest scrolls.${NC}"
|
||||
echo -e "${PURPLE}-------------------------------------------------${NC}"
|
||||
fi
|
||||
echo -e "${PURPLE}-------------------------------------------------${NC}"
|
||||
echo -e "${GOLD}📜 LATEST ARCHIVE DISPATCHES:${NC}"
|
||||
curl -sL --connect-timeout 1 "$REPO/dispatches.txt" | sed "s/^/ /"
|
||||
echo -e "${PURPLE}-------------------------------------------------${NC}"
|
||||
|
||||
echo -e "${GOLD}⚠️ Dynasty Framework detected (v$CURRENT_VER)${NC}"
|
||||
echo -e "Select your path:"
|
||||
echo -e "1) ${BLUE}Quick Strike${NC} (Run or Manifest Modules)"
|
||||
echo -e "2) ${BLUE}Reinstall / Update${NC} (Overwrite)"
|
||||
echo -e "3) ${RED}Uninstall${NC} (Remove)"
|
||||
echo "4) Cancel"
|
||||
echo ""
|
||||
read -p "Selection [1-4]: " ALREADY_OPT < /dev/tty
|
||||
echo -e "1) ${BLUE}Quick Strike${NC} (Modules)\n2) ${GOLD}Proxmox Commander${NC}\n3) ${PURPLE}Remove Modules${NC} (Multi-Select)\n4) ${BLUE}Update & Sync${NC}\n5) ${RED}Uninstall${NC}\n6) Exit"
|
||||
read -p "Selection [1-6]: " OPT < /dev/tty
|
||||
|
||||
case $ALREADY_OPT in
|
||||
1)
|
||||
# --- Local Modules ---
|
||||
echo -e "\n${PURPLE}📜 Locally Manifested Scrolls:${NC}"
|
||||
ls /opt/dynr/modules 2>/dev/null | sed 's/^/ ↓ /' || echo " (Empty)"
|
||||
|
||||
# --- Cloud Modules ---
|
||||
echo -e "\n${BLUE}☁️ Cloud Manifest (Available):${NC}"
|
||||
CLOUD_DATA=$(curl -sL -A "Mozilla/5.0" "$REPO_RAW/modules_list.txt" | grep -v "Not found")
|
||||
|
||||
if [[ -z "$CLOUD_DATA" ]]; then
|
||||
echo -e " ${GOLD}Scanning the heavens... (No remote modules found)${NC}"
|
||||
case $OPT in
|
||||
1) # MODULE LOADER
|
||||
echo -e "\n${PURPLE}📜 Local Scrolls:${NC}"
|
||||
ls "$DP/modules" 2>/dev/null | sed 's/^/ ↓ /'
|
||||
read -p "dynr > " CMD < /dev/tty
|
||||
if [[ -n "$CMD" && "$CMD" != "exit" ]]; then
|
||||
[[ ! -f "$DP/modules/$CMD" ]] && { curl -s -o "$DP/modules/$CMD" "$REPO/modules/$CMD"; chmod +x "$DP/modules/$CMD"; }
|
||||
"$DP/modules/$CMD" < /dev/tty; read -p "Press Enter to return..." < /dev/tty
|
||||
fi ;;
|
||||
2) # PROXMOX COMMANDER
|
||||
[[ ! -f "$DP/modules/proxmox-commander" ]] && { echo -e "${GOLD}🔎 Fetching Commander...${NC}"; curl -s -o "$DP/modules/proxmox-commander" "$REPO/modules/proxmox-commander"; chmod +x "$DP/modules/proxmox-commander"; }
|
||||
"$DP/modules/proxmox-commander" < /dev/tty
|
||||
echo -e "\n${BLUE}Back at the Front Gate.${NC}"
|
||||
read -p "Press Enter to continue..." < /dev/tty ;;
|
||||
3) # SMART MULTI-REMOVE
|
||||
MODS=$(ls "$DP/modules" 2>/dev/null)
|
||||
if [[ -z "$MODS" ]]; then echo -e "${RED}No modules found.${NC}"; sleep 1; continue; fi
|
||||
if [[ "$OS" == "macOS" ]]; then
|
||||
PK=$(osascript -e "set theList to every paragraph of \"$MODS\"" -e 'choose from list theList with title "Module Purge" with prompt "Select modules to delete (Cmd+Click for multiple):" with multiple selections allowed')
|
||||
[[ "$PK" == "false" ]] && continue
|
||||
IFS=',' read -ra ADDR <<< "$PK"
|
||||
for m in "${ADDR[@]}"; do target=$(echo "$m" | xargs); rm -f "$DP/modules/$target"; echo -e "${GOLD} ❌ Removed: $target${NC}"; done
|
||||
else
|
||||
echo "$CLOUD_DATA" | sed 's/^/ ☁️ /'
|
||||
fi
|
||||
|
||||
echo -e "\n${BLUE}Enter command to execute (or 'exit'):${NC}"
|
||||
read -p "dynr > " CMD_INPUT < /dev/tty
|
||||
|
||||
if [[ "$CMD_INPUT" == "exit" || "$CMD_INPUT" == "quit" ]]; then
|
||||
echo -e "${GOLD}🐉 The Dynasty awaits your return. Farewell.${NC}"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [[ ! -z "$CMD_INPUT" ]]; then
|
||||
if [ ! -f "/opt/dynr/modules/$CMD_INPUT" ]; then
|
||||
echo -e "${GOLD}🔎 Module '$CMD_INPUT' is not local, but exists in the Cloud.${NC}"
|
||||
read -p "📥 Manifest this scroll from the heavens? (y/n): " CONFIRM < /dev/tty
|
||||
|
||||
if [[ "$CONFIRM" == "y" || "$CONFIRM" == "Y" ]]; then
|
||||
echo -e "${BLUE}☁️ Downloading...${NC}"
|
||||
HTTP_STATUS=$(curl -s -o "/tmp/$CMD_INPUT" -w "%{http_code}" "$REPO_RAW/modules/$CMD_INPUT")
|
||||
|
||||
if [ "$HTTP_STATUS" -eq 200 ]; then
|
||||
sudo mv "/tmp/$CMD_INPUT" "/opt/dynr/modules/$CMD_INPUT"
|
||||
sudo chmod +x "/opt/dynr/modules/$CMD_INPUT"
|
||||
echo -e "${BLUE}✅ Manifested!${NC}"
|
||||
else
|
||||
echo -e "${RED}❌ Failed to retrieve scroll.${NC}"
|
||||
rm -f "/tmp/$CMD_INPUT"; exit 1
|
||||
fi
|
||||
else
|
||||
echo -e "${GOLD}🐉 Operation cancelled.${NC}"; exit 0
|
||||
fi
|
||||
fi
|
||||
dynr "$CMD_INPUT" </dev/tty
|
||||
fi
|
||||
exit 0
|
||||
;;
|
||||
2)
|
||||
echo -e "${BLUE}📡 Fetching scrolls of change...${NC}"
|
||||
CHANGES=$(curl -sL "$REPO_RAW/dispatches.txt" | head -n 15)
|
||||
|
||||
if whiptail --title "Dynasty Update Manifest" --scrolltext --yesno "Reviewing latest changes:\n\n$CHANGES\n\nProceed with system manifest v$REMOTE_VER?" 20 70; then
|
||||
echo -e "${BLUE}Proceeding with Update...${NC}"
|
||||
sudo curl -sSL "$REPO_RAW/install.sh" -o /usr/local/bin/dynr
|
||||
sudo chmod +x /usr/local/bin/dynr
|
||||
echo -e "${GOLD}✅ System Manifest Updated to v$REMOTE_VER${NC}"
|
||||
else
|
||||
echo -e "${GOLD}🐉 Update deferred.${NC}"
|
||||
fi
|
||||
exit 0
|
||||
;;
|
||||
3)
|
||||
echo -e "${RED}Removing Dynasty files...${NC}"
|
||||
sudo rm -rf /opt/dynr /usr/local/bin/dynr
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo -e "${GOLD}🐉 The Dynasty awaits your return. Farewell.${NC}"
|
||||
exit 0
|
||||
;;
|
||||
WL=$(echo "$MODS" | awk '{print $1 " " $1 " off"}')
|
||||
REMS=$(whiptail --title "Module Purge" --checklist "Use Spacebar to select targets:" 20 60 10 $WL 3>&1 1>&2 2>&3)
|
||||
[[ -n "$REMS" ]] && for id in ${REMS//\"/}; do rm -f "$DP/modules/$id"; echo -e "${GOLD} ❌ Removed: $id${NC}"; done
|
||||
fi; sleep 1 ;;
|
||||
4) # SMART UPDATE & SYNC
|
||||
echo -e "${GOLD}🔄 Syncing Framework...${NC}"
|
||||
sudo curl -sSL "$REPO/install.sh" -o /usr/local/bin/dynr && sudo chmod +x /usr/local/bin/dynr
|
||||
if [ -d "$DP/modules" ]; then
|
||||
for mod in "$DP/modules"/*; do
|
||||
[ -e "$mod" ] || continue
|
||||
m_name=$(basename "$mod")
|
||||
echo -ne "${PURPLE} -> Refreshing $m_name... ${NC}"
|
||||
curl -s -o "$mod" "$REPO/modules/$m_name" && chmod +x "$mod" && echo -e "${GOLD}DONE${NC}"
|
||||
done
|
||||
fi; echo -e "${BLUE}✅ Sync Complete.${NC}"; sleep 1; exec /usr/local/bin/dynr ;;
|
||||
5) # UNINSTALL
|
||||
read -p "⚠️ Uninstall? (y/n): " UN < /dev/tty
|
||||
[[ "$UN" == "y" ]] && { sudo rm -f /usr/local/bin/dynr; rm -rf "$DP"; exit 0; } ;;
|
||||
6) # EXIT
|
||||
echo -e "${GOLD}\n ____ __ __ _ _ ____ \n | _ \ \ \ / /| \ | || _ \ \n | | | | \ V / | \| || |_) |\n | |_| | | | | |\ || _ < \n |____/ |_| |_| \_||_| \_\\\\${NC}"
|
||||
echo -e "${BLUE} 🐉 DEPARTING THE DYNASTY...${NC}\n"; exit 0 ;;
|
||||
*) echo "Invalid selection."; sleep 1 ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
echo -e "\n${BLUE}System Initialized. Version: $VERSION${NC}"
|
||||
done
|
||||
@@ -1,62 +1,89 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------
|
||||
# Dynasty Module: NetBird Strike (Single-Pass Manifest)
|
||||
# Dynasty Module: NetBird Strike v0.1.2
|
||||
# -----------------------------------------------------------------------
|
||||
BLUE='\033[38;5;45m'; GOLD='\033[38;5;178m'; RED='\033[38;5;196m'; NC='\033[0m'
|
||||
|
||||
# 1. Install Check
|
||||
if ! command -v netbird &> /dev/null; then
|
||||
echo -e "${BLUE}🛡️ Initializing NetBird Repository...${NC}"
|
||||
curl -sSL https://pkgs.netbird.io/debian/public.key | sudo gpg --dearmor --yes --output /usr/share/keyrings/netbird-archive-keyring.gpg
|
||||
echo 'deb [signed-by=/usr/share/keyrings/netbird-archive-keyring.gpg] https://pkgs.netbird.io/debian stable main' | sudo tee /etc/apt/sources.list.d/netbird.list
|
||||
sudo apt-get update && sudo apt-get install netbird -y
|
||||
fi
|
||||
LOG_DIR="$HOME/.dynr/logs/netbird-strike"
|
||||
mkdir -p "$LOG_DIR"
|
||||
TS=$(date +"%Y%m%d_%H%M%S")
|
||||
STRIKE_LOG="$LOG_DIR/strike_$TS.log"
|
||||
|
||||
# 2. Select Instance Type
|
||||
CHOICE=$(whiptail --title "NetBird Instance Selection" --menu "Choose your destination:" 15 60 2 \
|
||||
"1" "NetBird Managed Cloud (Default)" \
|
||||
"2" "Self-Hosted Instance" 3>&1 1>&2 2>&3)
|
||||
BLUE='\033[38;5;45m'; PURPLE='\033[38;5;127m'; GOLD='\033[38;5;178m'; RED='\033[38;5;196m'; NC='\033[0m'
|
||||
|
||||
if [ $? != 0 ]; then exit 0; fi
|
||||
log_event() { echo -e "$1" | tee -a "$STRIKE_LOG"; }
|
||||
|
||||
case $CHOICE in
|
||||
1)
|
||||
MGMT_URL=""
|
||||
;;
|
||||
2)
|
||||
if whiptail --title "Self-Hosted Choice" --yesno "Are you using the Dynasty Revolution Netbird instance?" 10 60; then
|
||||
MGMT_URL="https://netbird.dynastyrevolution.com"
|
||||
else
|
||||
MGMT_URL=$(whiptail --title "Custom Configuration" --inputbox "Enter your Management URL:" 10 60 3>&1 1>&2 2>&3)
|
||||
# --- 💀 Decimation Stance (Cleanup) ---
|
||||
run_decimation() {
|
||||
log_event "${RED}⚠️ INITIATING DECIMATION STANCE...${NC}"
|
||||
|
||||
# Locate the netbird directory (usually /root/netbird or $HOME/netbird)
|
||||
NB_PATH="/root/netbird"
|
||||
[ ! -d "$NB_PATH" ] && NB_PATH="$HOME/netbird"
|
||||
|
||||
if [ -d "$NB_PATH" ] && [ -f "$NB_PATH/docker-compose.yml" ]; then
|
||||
read -p "Run 'docker compose down' to stop and clean networks? (y/n): " DO_DOWN
|
||||
if [[ "$DO_DOWN" == "y" ]]; then
|
||||
log_event "ACTION: Bringing down Docker mesh..."
|
||||
cd "$NB_PATH" && sudo docker compose down 2>&1 | tee -a "$STRIKE_LOG"
|
||||
cd - > /dev/null
|
||||
fi
|
||||
|
||||
if [ -z "$MGMT_URL" ]; then echo -e "${RED}Error: URL cannot be empty.${NC}"; exit 1; fi
|
||||
ADMIN_URL="$MGMT_URL"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
log_event "NOTE: No docker-compose.yml found in $NB_PATH. Skipping 'down' command."
|
||||
fi
|
||||
|
||||
# 3. Get Setup Key
|
||||
SETUP_KEY=$(whiptail --title "Authentication" --inputbox "Enter your NetBird Setup Key:" 10 60 3>&1 1>&2 2>&3)
|
||||
read -p "DELETE all NetBird configuration and data files? (y/n): " PURGE_DATA
|
||||
if [[ "$PURGE_DATA" == "y" ]]; then
|
||||
echo -e "${RED}Final Warning: This will delete all keys and mesh data!${NC}"
|
||||
read -p "Type 'PURGE' to confirm: " FINAL_VAL
|
||||
if [[ "$FINAL_VAL" == "PURGE" ]]; then
|
||||
log_event "ACTION: Purging directories..."
|
||||
sudo rm -rf /root/netbird 2>> "$STRIKE_LOG"
|
||||
sudo rm -rf "$HOME/netbird" 2>> "$STRIKE_LOG"
|
||||
sudo rm -rf "$HOME/.netbird" 2>> "$STRIKE_LOG"
|
||||
log_event "STATUS: Configuration wiped."
|
||||
else
|
||||
log_event "Purge aborted."
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -z "$SETUP_KEY" ]; then
|
||||
echo -e "${GOLD}🐉 No key provided. Exiting.${NC}"; exit 0
|
||||
fi
|
||||
# --- 🏗️ Forge Stance (Install) ---
|
||||
run_forge() {
|
||||
[[ "$OSTYPE" == "darwin"* ]] && { echo -e "${RED}Forge requires Linux (Docker).${NC}"; return; }
|
||||
|
||||
# 4. The Single-Pass Strike
|
||||
echo -e "${BLUE}🐉 Manifesting Bridge...${NC}"
|
||||
log_event "${GOLD}Initiating Server Forge...${NC}"
|
||||
read -p "Confirm NetBird SERVER installation? (y/n): " CONFIRM
|
||||
[[ "$CONFIRM" != "y" ]] && return
|
||||
|
||||
if [ -z "$MGMT_URL" ]; then
|
||||
# Standard Cloud connection
|
||||
sudo netbird up --setup-key "$SETUP_KEY"
|
||||
else
|
||||
# Integrated Dynasty/Self-Hosted connection in one command
|
||||
sudo netbird up --management-url "$MGMT_URL" --admin-url "$ADMIN_URL" --setup-key "$SETUP_KEY"
|
||||
fi
|
||||
# Granular Dependency Check
|
||||
MISSING=()
|
||||
command -v curl &> /dev/null || MISSING+=("curl")
|
||||
command -v jq &> /dev/null || MISSING+=("jq")
|
||||
if ! command -v docker &> /dev/null; then
|
||||
MISSING+=("docker")
|
||||
else
|
||||
! docker compose version &> /dev/null && MISSING+=("docker-compose-v2")
|
||||
fi
|
||||
|
||||
# 5. Final Status Manifest
|
||||
if [ $? -eq 0 ]; then
|
||||
NB_STATUS=$(netbird status)
|
||||
whiptail --title "NetBird Connection Successful" --msgbox "The device is now manifested in the mesh.\n\n$NB_STATUS" 20 70
|
||||
else
|
||||
echo -e "${RED}❌ Strike failed. Verify your Setup Key and URL connectivity.${NC}"
|
||||
fi
|
||||
if [ ${#MISSING[@]} -gt 0 ]; then
|
||||
echo -e "${RED}⚠️ Missing Dependencies: ${MISSING[*]}${NC}"
|
||||
read -p "Allow Dynasty to install these now? (y/n): " PERM
|
||||
if [[ "$PERM" == "y" ]]; then
|
||||
sudo apt update -qq
|
||||
[[ " ${MISSING[*]} " == *" curl "* ]] && sudo apt install -y curl
|
||||
[[ " ${MISSING[*]} " == *" jq "* ]] && sudo apt install -y jq
|
||||
if [[ " ${MISSING[*]} " == *" docker "* || " ${MISSING[*]} " == *" docker-compose "* ]]; then
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
sudo apt install -y docker-compose-plugin
|
||||
fi
|
||||
else
|
||||
log_event "Rejected dependencies. Forge cancelled."; return
|
||||
fi
|
||||
fi
|
||||
|
||||
log_event "ACTION: Executing Overlord Script..."
|
||||
curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh | bash 2>&1 | tee -a "$STRIKE_LOG"
|
||||
}
|
||||
|
||||
# --- Main Interface ---
|
||||
# [Menu Logic with Client/Forge/Decimate options]
|
||||
125
modules/proxmox-commander
Normal file
125
modules/proxmox-commander
Normal file
@@ -0,0 +1,125 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------
|
||||
# Dynasty Module: Proxmox Commander (v2.0.1 - Ironclad Edition)
|
||||
# -----------------------------------------------------------------------
|
||||
BLUE='\033[38;5;45m'; PURPLE='\033[38;5;127m'; GOLD='\033[38;5;178m'; RED='\033[38;5;196m'; NC='\033[0m'
|
||||
HOST_FILE="$HOME/.dynr/.pve_hosts"; mkdir -p "$HOME/.dynr"
|
||||
IS_MAC=false; [[ "$OSTYPE" == "darwin"* ]] && IS_MAC=true
|
||||
|
||||
# --- 0. SMART DEPENDENCY BOOTSTRAPPER ---
|
||||
check_sshpass() {
|
||||
if ! command -v sshpass &> /dev/null && [ "$IS_MAC" = true ]; then
|
||||
clear
|
||||
echo -e "${RED}⚠️ Dependency Missing: 'sshpass' is required for password-based login.${NC}"
|
||||
echo -e "How would you like to proceed?"
|
||||
echo -e "1) ${GOLD}Switch to SSH Keys${NC} (Recommended - Bypass passwords)"
|
||||
echo -e "2) ${BLUE}Install Homebrew & sshpass${NC} (Standard Apple/Linux flow)"
|
||||
echo -e "3) ${PURPLE}Compile from Source${NC} (Requires Xcode)"
|
||||
echo -e "4) ${RED}Quit Entirely${NC} (Return to Dynasty Gate)"
|
||||
read -p "Selection [1-4]: " D_CHOICE < /dev/tty
|
||||
|
||||
case $D_CHOICE in
|
||||
1) echo -e "${GOLD}Initiating Key Exchange...${NC}"
|
||||
[[ ! -f "$HOME/.ssh/id_rsa.pub" ]] && ssh-keygen -t rsa -b 4096 -f "$HOME/.ssh/id_rsa" -N ""
|
||||
echo -e "Run this next: ${BLUE}ssh-copy-id root@YOUR_IP${NC}"
|
||||
read -p "Press Enter to return to menu..." ; return 1 ;;
|
||||
2) if ! command -v brew &> /dev/null; then
|
||||
echo -e "${BLUE}Homebrew not found. Installing...${NC}"
|
||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
fi
|
||||
echo -e "${BLUE}Installing sshpass...${NC}"; brew install sshpass ;;
|
||||
3) echo -e "${PURPLE}Starting Source Compilation...${NC}"
|
||||
if ! command -v cc &> /dev/null; then
|
||||
echo -e "${RED}Xcode Command Line Tools missing.${NC}"; xcode-select --install
|
||||
echo "Finish the Apple installer and relaunch."; exit 1
|
||||
fi
|
||||
curl -L https://sourceforge.net/projects/sshpass/files/latest/download -o sshpass.tar.gz
|
||||
tar -xvf sshpass.tar.gz && cd sshpass-*
|
||||
./configure && make && sudo make install
|
||||
cd .. && rm -rf sshpass* ;;
|
||||
*) echo -e "${RED}Aborting...${NC}"; sleep 1; exit 0 ;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
# --- 1. HOST SELECTION ---
|
||||
if ! command -v pct &> /dev/null; then
|
||||
if [ -f "$HOST_FILE" ]; then
|
||||
[ "$IS_MAC" = true ] && sed -i '' '/^$/d' "$HOST_FILE" || sed -i '/^$/d' "$HOST_FILE"
|
||||
fi
|
||||
|
||||
if [[ ! -s "$HOST_FILE" ]]; then
|
||||
echo -e "${RED}No Proxmox hosts found.${NC}"
|
||||
read -p "Add new host now? (y/n/q=quit): " ADD_NOW < /dev/tty
|
||||
[[ "$ADD_NOW" == "q" ]] && exit 0
|
||||
[[ "$ADD_NOW" =~ ^[Yy]$ ]] && HP="n" || exit 0
|
||||
else
|
||||
echo -e "${PURPLE}🐉 Your Proxmox VE Hosts:${NC}"
|
||||
i=1; while IFS='|' read -r ip usr am pe nick; do
|
||||
echo -e " $i) $usr@$ip ($nick)"; ((i++))
|
||||
done < "$HOST_FILE"
|
||||
read -p "Selection (ID#, n=new, m=manage, q=quit): " HP < /dev/tty
|
||||
fi
|
||||
|
||||
[[ "$HP" == "q" ]] && exit 0
|
||||
|
||||
if [[ "$HP" == "n" ]]; then
|
||||
read -p "IP: " IP; read -p "User (root): " USR; USR=${USR:-root}
|
||||
echo -e "1) Key 2) Pass 3) Back"
|
||||
read -p ": " AT
|
||||
[[ "$AT" == "3" ]] && exec "$0"
|
||||
if [[ "$AT" == "1" ]]; then
|
||||
[[ ! -f "$HOME/.ssh/id_rsa.pub" ]] && ssh-keygen -t rsa -b 4096 -f "$HOME/.ssh/id_rsa" -N ""
|
||||
ssh-copy-id "$USR@$IP" && { AM="KEY"; PE="NONE"; }
|
||||
else
|
||||
check_sshpass || exec "$0"
|
||||
read -rs -p "Pass: " P; echo ""; AM="PASS"; PE=$(echo -n "$P" | base64); fi
|
||||
read -p "Nickname: " HN; echo "$IP|$USR|$AM|$PE|$HN" >> "$HOST_FILE"; exec "$0"
|
||||
elif [[ "$HP" =~ ^[0-9]+$ ]]; then
|
||||
LINE=$(sed -n "${HP}p" "$HOST_FILE")
|
||||
IP=$(echo "$LINE" | cut -d'|' -f1); USR=$(echo "$LINE" | cut -d'|' -f2); AM=$(echo "$LINE" | cut -d'|' -f3); PE=$(echo "$LINE" | cut -d'|' -f4)
|
||||
if [[ "$AM" == "PASS" ]]; then
|
||||
check_sshpass || exec "$0"
|
||||
P_DEC=$(echo "$PE" | base64 --decode)
|
||||
REMOTE_BASE="sshpass -p '$P_DEC' ssh -o StrictHostKeyChecking=no -t $USR@$IP"
|
||||
else
|
||||
REMOTE_BASE="ssh -o StrictHostKeyChecking=no -t $USR@$IP"; fi
|
||||
else
|
||||
exec "$0"; fi
|
||||
else
|
||||
REMOTE_BASE=""; IP="LocalHost"; fi
|
||||
|
||||
# --- 2. FLEET OPS MENU ---
|
||||
while true; do
|
||||
clear; echo -e "${BLUE}🐉 Proxmox Commander | $IP${NC}"
|
||||
echo -e "1) ${GOLD}Create LXC(s)${NC}\n2) ${BLUE}Dashboard${NC}\n3) ${PURPLE}Console (Shell)${NC}\n4) Selective Update\n5) Switch Host\n6) Exit"
|
||||
read -p "Select: " OPT < /dev/tty
|
||||
case $OPT in
|
||||
1) # Creation logic
|
||||
read -p "🚢 Count (q=back): " CT; [[ "$CT" == "q" ]] && continue
|
||||
read -p "🔢 Start ID: " SID; read -p "📏 Disk (GB): " DSZ
|
||||
$REMOTE_BASE "pvesm status"; read -p "📥 Template Store: " TS; read -p "💾 Disk Store: " DS
|
||||
for (( i=0; i<CT; i++ )); do
|
||||
CID=$((SID + i)); read -p "🏷️ Name for $CID: " NM
|
||||
echo -e "💿 Distro: 1) Deb 12 2) Deb 13 3) Alpine 4) Arch"; read -p ": " DP
|
||||
case $DP in 1) T="debian-12-standard_12.2-1_amd64.tar.zst" ;; 2) T="debian-13-standard_13.0-1_amd64.tar.zst" ;; 3) T="alpine-3.19-default_20240207_amd64.tar.xz" ;; 4) T="archlinux-base_20230608-1_amd64.tar.zst" ;; esac
|
||||
$REMOTE_BASE "pct create $CID $TS:vztmpl/$T --hostname $NM --storage $DS --rootfs $DS:$DSZ --net0 name=eth0,bridge=vmbr0,ip=dhcp"
|
||||
$REMOTE_BASE "pct start $CID"; done; read -p "Done..." < /dev/tty ;;
|
||||
2) $REMOTE_BASE "pct list"; read -p "Enter..." < /dev/tty ;;
|
||||
3) echo -e "1) Host Shell 2) LXC Console 3) Back"
|
||||
read -p ": " CG < /dev/tty
|
||||
case $CG in
|
||||
1) eval "$REMOTE_BASE" ;;
|
||||
2) read -p "LXC ID: " LID < /dev/tty; eval "$REMOTE_BASE \"pct enter $LID\"" ;;
|
||||
*) continue ;;
|
||||
esac
|
||||
read -p "Returned. Press Enter..." < /dev/tty ;;
|
||||
4) echo -e "1) ${GOLD}Update Host ($IP)${NC}\n2) ${BLUE}Update ALL LXCs${NC}\n3) Back"
|
||||
read -p "Choice: " UO < /dev/tty
|
||||
if [[ "$UO" == "1" ]]; then $REMOTE_BASE "apt update && apt upgrade -y"
|
||||
elif [[ "$UO" == "2" ]]; then $REMOTE_BASE "for id in \$(pct list | awk 'NR>1 {print \$1}'); do echo \"Updating \$id...\"; pct exec \$id -- apt update && pct exec \$id -- apt upgrade -y; done"; fi
|
||||
read -p "Done..." < /dev/tty ;;
|
||||
5) exec "$0" ;;
|
||||
6) exit 0 ;;
|
||||
esac
|
||||
done
|
||||
@@ -1,44 +1,95 @@
|
||||
#!/bin/bash
|
||||
# DYNR Module: Rclone Wizard v2.3.6
|
||||
# DYNR Module: Rclone Wizard v2.3.7
|
||||
|
||||
run_rclone_wizard() {
|
||||
BLUE='\033[38;5;45m'; PURPLE='\033[38;5;127m'; GOLD='\033[38;5;178m'; RED='\033[38;5;196m'; NC='\033[0m'
|
||||
|
||||
# --- Dynamic Dependency Check ---
|
||||
MISSING=()
|
||||
command -v rclone &> /dev/null || MISSING+=("rclone")
|
||||
command -v fzf &> /dev/null || MISSING+=("fzf")
|
||||
LOG_DIR="$HOME/.dynr/logs/rclone-wizard"
|
||||
mkdir -p "$LOG_DIR"
|
||||
|
||||
if [ ${#MISSING[@]} -gt 0 ]; then
|
||||
echo -e "${RED}⚠️ Required tools missing: ${MISSING[*]}${NC}"
|
||||
read -p "Manifest these scrolls now? (y/n): " choice
|
||||
if [[ "$choice" == "y" ]]; then
|
||||
sudo apt update -qq && sudo apt install -y -qq "${MISSING[@]}"
|
||||
else
|
||||
echo -e "${RED}Wizard dismissed.${NC}"
|
||||
dynr; return
|
||||
# --- Log Viewer ---
|
||||
view_logs() {
|
||||
if [ ! "$(ls -A "$LOG_DIR" 2>/dev/null)" ]; then
|
||||
echo -e "${RED}No logs found in $LOG_DIR${NC}"; sleep 1; return
|
||||
fi
|
||||
fi
|
||||
local selected_log=$(ls -t "$LOG_DIR" | fzf --height 15 --reverse --header "Select Log (q to exit)")
|
||||
[[ -n "$selected_log" ]] && less -R "$LOG_DIR/$selected_log"
|
||||
}
|
||||
|
||||
# --- Navigation Engine ---
|
||||
navigate_path() {
|
||||
local type=$1; local base=$2; local current_dir="/"
|
||||
while true; do
|
||||
echo -e "${PURPLE}Navigation: ${GOLD}$type${NC} | ${BLUE}Path: ${GOLD}${base}${current_dir}${NC}" >&2
|
||||
if [[ "$type" == "LOCAL" ]]; then
|
||||
local options=$(find "$current_dir" -maxdepth 1 -type d -not -path "$current_dir" -exec basename {} \; 2>/dev/null)
|
||||
else
|
||||
local options=$(rclone lsd "${base}${current_dir}" 2>/dev/null | awk '{print substr($0, 32)}')
|
||||
fi
|
||||
local choice=$(printf "✅ SELECT THIS FOLDER\n..\nQUIT\n%s" "$options" | fzf --height 15 --reverse --header "Targeting Folder...")
|
||||
case "$choice" in
|
||||
"✅ SELECT THIS FOLDER") echo "${current_dir}"; return ;;
|
||||
"..") current_dir=$(dirname "$current_dir"); [[ "$current_dir" != "/" ]] && current_dir="${current_dir}/"; clear >&2 ;;
|
||||
"QUIT"|"") echo "CANCEL"; return ;;
|
||||
*) current_dir="${current_dir%/}/${choice}/"; current_dir=$(echo "$current_dir" | tr -s '/'); clear >&2 ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
clear
|
||||
echo -e "${PURPLE}=================================================${NC}"
|
||||
echo -e "${BLUE} 🐉 DYNASTY REVOLUTION: RCLONE WIZARD 🐉 ${NC}"
|
||||
echo -e "${BLUE} 🐉 DYNASTY REVOLUTION: RCLONE WIZARD 🐉 ${NC}"
|
||||
echo -e "${PURPLE}=================================================${NC}"
|
||||
|
||||
# Basic Menu Example
|
||||
echo -e "${GOLD}Select a path:${NC}"
|
||||
OPTIONS=("Configure New Remote" "List Existing Remotes" "Exit Wizard")
|
||||
|
||||
# Use fzf for the selection
|
||||
OPTIONS=("🚀 New Transfer (Copy or Move)" "📜 View Transfer Logs" "List Existing Remotes" "Configure New Remote" "Exit Wizard")
|
||||
CHOICE=$(printf "%s\n" "${OPTIONS[@]}" | fzf --height 40% --reverse --prompt="Select Stance > ")
|
||||
|
||||
case "$CHOICE" in
|
||||
"Configure New Remote") rclone config ;;
|
||||
"List Existing Remotes") rclone listremotes | sed 's/^/ ☁️ /' ;;
|
||||
*) echo "Returning...";;
|
||||
esac
|
||||
"🚀 New Transfer (Copy or Move)")
|
||||
REMOTES=$(rclone listremotes)
|
||||
# --- SOURCE ---
|
||||
S_BASE=$(printf "QUIT\nLOCAL_FILESYSTEM\n%s" "$REMOTES" | fzf --prompt="Select Source > ")
|
||||
[[ "$S_BASE" == "QUIT" || -z "$S_BASE" ]] && { run_rclone_wizard; return; }
|
||||
[[ "$S_BASE" != "LOCAL_FILESYSTEM" && "$S_BASE" != *":" ]] && S_BASE="${S_BASE}:"
|
||||
S_SUB=$(navigate_path "$([[ "$S_BASE" == "LOCAL_FILESYSTEM" ]] && echo "LOCAL" || echo "REMOTE")" "$S_BASE")
|
||||
[[ "$S_SUB" == "CANCEL" ]] && { run_rclone_wizard; return; }
|
||||
F_SRC="$([[ "$S_BASE" == "LOCAL_FILESYSTEM" ]] && echo "$S_SUB" || echo "${S_BASE}${S_SUB}")"
|
||||
|
||||
echo -e "${PURPLE}=================================================${NC}"
|
||||
read -p "Press Enter to return..." < /dev/tty
|
||||
dynr
|
||||
# --- DESTINATION ---
|
||||
D_BASE=$(printf "QUIT\nLOCAL_FILESYSTEM\n%s" "$REMOTES" | fzf --prompt="Select Destination > ")
|
||||
[[ "$D_BASE" == "QUIT" || -z "$D_BASE" ]] && { run_rclone_wizard; return; }
|
||||
[[ "$D_BASE" != "LOCAL_FILESYSTEM" && "$D_BASE" != *":" ]] && D_BASE="${D_BASE}:"
|
||||
D_SUB=$(navigate_path "$([[ "$D_BASE" == "LOCAL_FILESYSTEM" ]] && echo "LOCAL" || echo "REMOTE")" "$D_BASE")
|
||||
[[ "$D_SUB" == "CANCEL" ]] && { run_rclone_wizard; return; }
|
||||
F_DEST="$([[ "$D_BASE" == "LOCAL_FILESYSTEM" ]] && echo "$D_SUB" || echo "${D_BASE}${D_SUB}")"
|
||||
|
||||
# --- METHOD ---
|
||||
METHOD_CHOICE=$(printf "COPY (Safe - Keep Source)\nMOVE (Transfer & Delete Source)" | fzf --height 5 --reverse --prompt="Select Method > ")
|
||||
[[ -z "$METHOD_CHOICE" ]] && { run_rclone_wizard; return; }
|
||||
CMD=$([[ "$METHOD_CHOICE" == "COPY"* ]] && echo "copy" || echo "move")
|
||||
|
||||
clear
|
||||
echo -e "${RED}🛡️ DYNASTY DATA SAFETY LOCK${NC}"
|
||||
echo -e "-------------------------------------------------"
|
||||
echo -e "${BLUE}FROM: ${GOLD}\"$F_SRC\"${NC}"
|
||||
echo -e "${BLUE}TO: ${GOLD}\"$F_DEST\"${NC}"
|
||||
echo -e "${BLUE}ACTION: ${PURPLE}${CMD^^}${NC}"
|
||||
echo -e "-------------------------------------------------"
|
||||
[[ "$CMD" == "move" ]] && echo -e "${RED}⚠️ WARNING: Files will be deleted from source after transfer!${NC}"
|
||||
read -p "Type 'SAFE' to manifest: " VAL
|
||||
|
||||
if [[ "$VAL" == "SAFE" ]]; then
|
||||
TS=$(date +"%Y%m%d_%H%M%S"); LOG_FILE="$LOG_DIR/${CMD}_$TS.log"
|
||||
echo "Action: $CMD" > "$LOG_FILE"
|
||||
rclone "$CMD" -vP "$F_SRC" "$F_DEST" 2>&1 | tee -a "$LOG_FILE"
|
||||
read -p "Process Complete. Enter to return..."
|
||||
else
|
||||
echo -e "${RED}Aborted.${NC}"; sleep 1
|
||||
fi
|
||||
;;
|
||||
"📜 View Transfer Logs") view_logs ;;
|
||||
"List Existing Remotes") rclone listremotes | sed 's/^/ ☁️ /' ;;
|
||||
"Configure New Remote") rclone config ;;
|
||||
*) dynr; return ;;
|
||||
esac
|
||||
run_rclone_wizard
|
||||
}
|
||||
@@ -1,34 +1,58 @@
|
||||
#!/bin/bash
|
||||
# DYNR Module: System Info
|
||||
# -----------------------------------------------------------------------
|
||||
# Dynasty Module: Universal Pulse (v1.1.1 - Memory Fix)
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
run_system_info() {
|
||||
BLUE='\033[38;5;45m'; PURPLE='\033[38;5;127m'; GOLD='\033[38;5;178m'; NC='\033[0m'
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
OS="macOS"
|
||||
CPU_LOAD=$(sysctl -n vm.loadavg | awk '{print $2}')
|
||||
|
||||
clear
|
||||
echo -e "${PURPLE}=================================================${NC}"
|
||||
echo -e "${BLUE} 🐉 DYNASTY REVOLUTION: SYSTEM INFO 🐉 ${NC}"
|
||||
echo -e "${PURPLE}=================================================${NC}"
|
||||
# --- Advanced Mac Memory Math ---
|
||||
# Total Physical RAM in bytes
|
||||
MEM_TOTAL_BYTES=$(sysctl -n hw.memsize)
|
||||
MEM_TOTAL_GB=$((MEM_TOTAL_BYTES / 1024 / 1024 / 1024))
|
||||
|
||||
# Get Page Size (usually 4096 or 16384 on M1)
|
||||
PAGE_SIZE=$(vm_stat | grep "page size of" | awk '{print $8}')
|
||||
|
||||
# Get Free and Speculative pages (Both are essentially "Available")
|
||||
PAGES_FREE=$(vm_stat | grep "Pages free" | awk '{print $3}' | sed 's/\.//')
|
||||
PAGES_SPEC=$(vm_stat | grep "Pages speculative" | awk '{print $3}' | sed 's/\.//')
|
||||
|
||||
# Calculate Available GB
|
||||
MEM_FREE_BYTES=$(((PAGES_FREE + PAGES_SPEC) * PAGE_SIZE))
|
||||
MEM_FREE_GB=$((MEM_FREE_BYTES / 1024 / 1024 / 1024))
|
||||
|
||||
# Final Used Calculation
|
||||
MEM_USED_GB=$((MEM_TOTAL_GB - MEM_FREE_GB))
|
||||
|
||||
UPTIME=$(uptime | sed -E 's/.*up ([^,]+),.*/\1/' | xargs)
|
||||
DISK=$(df -h / | awk 'NR==2 {print $5}')
|
||||
else
|
||||
OS="Linux"
|
||||
CPU_LOAD=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')"%"
|
||||
MEM_TOTAL_GB=$(free -g | awk '/^Mem:/{print $2}')
|
||||
MEM_USED_GB=$(free -g | awk '/^Mem:/{print $3}')
|
||||
UPTIME=$(uptime -p | sed 's/up //')
|
||||
DISK=$(df -h / | awk 'NR==2 {print $5}')
|
||||
fi
|
||||
|
||||
OS_NAME=$(grep '^PRETTY_NAME=' /etc/os-release | cut -d '"' -f 2)
|
||||
KERNEL=$(uname -rs)
|
||||
ARCH=$(uname -m)
|
||||
HOSTNAME=$(hostname)
|
||||
CPU_MODEL=$(lscpu | grep "Model name" | awk -F: '{print $2}' | sed 's/^[ \t]*//')
|
||||
CPU_CORES=$(nproc)
|
||||
VIRT=$(systemd-detect-virt 2>/dev/null || echo "unknown")
|
||||
# --- Dashboard Construction ---
|
||||
DASHBOARD="🐉 DYNASTY SYSTEM PULSE ($OS)
|
||||
-------------------------------------
|
||||
🕒 UPTIME: $UPTIME
|
||||
🚀 CPU LOAD: $CPU_LOAD
|
||||
🧠 MEMORY: ${MEM_USED_GB}GB / ${MEM_TOTAL_GB}GB
|
||||
💾 DISK: $DISK Used
|
||||
-------------------------------------"
|
||||
|
||||
echo -e "${GOLD}HOSTNAME: ${NC}$HOSTNAME"
|
||||
echo -e "${GOLD}OPERATING SYS:${NC}$OS_NAME"
|
||||
echo -e "${GOLD}KERNEL: ${NC}$KERNEL"
|
||||
echo -e "${GOLD}ARCHITECTURE: ${NC}$ARCH"
|
||||
echo -e "${GOLD}VIRTUALIZATION:${NC}$VIRT"
|
||||
echo -e "${PURPLE}-------------------------------------------------${NC}"
|
||||
echo -e "${GOLD}CPU MODEL: ${NC}$CPU_MODEL"
|
||||
echo -e "${GOLD}CPU CORES: ${NC}$CPU_CORES"
|
||||
echo -e "${PURPLE}=================================================${NC}"
|
||||
|
||||
read -p "Press Enter to return to the Dynasty..." < /dev/tty
|
||||
|
||||
# --- The Return Logic ---
|
||||
dynr
|
||||
}
|
||||
# --- Display Logic ---
|
||||
if [[ "$OS" == "macOS" ]]; then
|
||||
osascript -e "display dialog \"$DASHBOARD\" with title \"Dynasty Diagnostics\" buttons {\"Close\"} default button \"Close\"" >/dev/null 2>&1
|
||||
else
|
||||
if command -v whiptail >/dev/null 2>&1; then
|
||||
whiptail --title "Dynasty Diagnostics" --msgbox "$DASHBOARD" 15 50
|
||||
else
|
||||
echo -e "$DASHBOARD"
|
||||
fi
|
||||
fi
|
||||
57
scripts/bootstrap.sh
Normal file
57
scripts/bootstrap.sh
Normal file
@@ -0,0 +1,57 @@
|
||||
#!/bin/bash
|
||||
# -----------------------------------------------------------------------
|
||||
# Dynasty Module: LXC Bootstrap (The Manifestor)
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
STACK=$1 # Passed from Proxmox Commander (portainer/arcane/dockhand/none)
|
||||
VERBOSE=$2 # Passed from Proxmox Commander (y/n)
|
||||
|
||||
# 1. STYLING & OUTPUT
|
||||
GOLD='\033[38;5;178m'; BLUE='\033[38;5;45m'; NC='\033[0m'
|
||||
|
||||
# Logic for Verbose vs Silent
|
||||
if [[ "$VERBOSE" == "y" ]]; then
|
||||
exec 3>&1 # Save stdout to fd 3
|
||||
else
|
||||
exec 3>/dev/null # Send all output to the void
|
||||
fi
|
||||
|
||||
echo -e "${BLUE}🐉 Dynasty Node Bootstrapping...${NC}"
|
||||
|
||||
# 2. SYSTEM REFRESH
|
||||
echo -e "${GOLD}🔎 Updating System Repositories...${NC}"
|
||||
apt-get update >&3 2>&3
|
||||
apt-get upgrade -y >&3 2>&3
|
||||
|
||||
# 3. DOCKER CORE INSTALLATION
|
||||
if [[ "$STACK" != "none" ]]; then
|
||||
echo -e "${GOLD}🐳 Installing Docker Engine & Compose...${NC}"
|
||||
curl -fsSL https://get.docker.com | sh >&3 2>&3
|
||||
systemctl enable --now docker >&3 2>&3
|
||||
fi
|
||||
|
||||
# 4. STACK MANIFESTATION
|
||||
case $STACK in
|
||||
"portainer")
|
||||
echo -e "${GOLD}🚢 Manifesting Portainer Business...${NC}"
|
||||
docker volume create portainer_data >&3 2>&3
|
||||
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart always \
|
||||
-v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data \
|
||||
portainer/portainer-ce:latest >&3 2>&3
|
||||
;;
|
||||
"arcane")
|
||||
echo -e "${GOLD}🔮 Manifesting Arcane Stack...${NC}"
|
||||
# Replace with your specific Arcane install command or git clone
|
||||
# docker run -d --name arcane ...
|
||||
;;
|
||||
"dockhand")
|
||||
echo -e "${GOLD}⚓ Manifesting Dockhand...${NC}"
|
||||
# Replace with your specific Dockhand install command
|
||||
;;
|
||||
esac
|
||||
|
||||
# 5. DYNASTY FRAMEWORK INJECTION
|
||||
echo -e "${GOLD}🐉 Installing Dynasty Framework v2.3.7-pre...${NC}"
|
||||
curl -sSL https://git.dynastyrevolution.com/DYNR/DynastyRevolution-Scripts/raw/branch/v2.3.7-pre/install.sh | bash >&3 2>&3
|
||||
|
||||
echo -e "${BLUE}✅ Manifestation Complete. Node is now part of the Dynasty.${NC}"
|
||||
Reference in New Issue
Block a user