#!/usr/bin/env bash # ============================================================================== # 🌌 Skynet Harness AI — Native Node Companion 1-Click Installer # Universal Installer for macOS (Apple Silicon & Intel) & Linux (x86_64, aarch64) # RASS Autonomous Idle Harvesting & Decentralized Mixtral Inference # ============================================================================== set -euo pipefail # Visual styling BOLD='\033[1m' CYAN='\033[0;36m' GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' SERVER_URL="${SKYNET_SERVER_URL:-https://skynet-harness.ai}" PAIRING_CODE="${SKYNET_PAIRING_CODE:-}" DEVICE_NAME="" UNINSTALL=false INSTALL_DIR="$HOME/.skynet" DAEMON_DIR="$INSTALL_DIR/daemon" VENV_DIR="$INSTALL_DIR/venv" LOGS_DIR="$INSTALL_DIR/logs" BIN_DIR="$INSTALL_DIR/bin" print_banner() { cat << "EOF" 🌌 ========================================================= 🌌 ____ _ _ _ _ _ / ___|| | _____ _ _ __ ___| |_ | \ | | ___ __| | ___ \___ \| |/ / _ \ | | '_ \ / _ \ __| | \| |/ _ \ / _` |/ _ \ ___) | < __/ |_| | | | __/ |_ | |\ | (_) | (_| | __/ |____/|_|\_\___|\__, |_| \___|\__| |_| \_|\___/ \__,_|\___| |___/ Skynet Native Node Companion Daemon — RASS Protocol Autonomous 20% Idle Compute Harvesting for Mixtral MoE Zero-Friction Host Protection (AC + Unmetered + Load <30%) 🌌 ========================================================= 🌌 EOF echo "" } parse_args() { while [[ $# -gt 0 ]]; do case "$1" in --pairing-code|-p) PAIRING_CODE="$2" shift 2 ;; --pairing-code=*) PAIRING_CODE="${1#*=}" shift ;; --device-name|-n) DEVICE_NAME="$2" shift 2 ;; --server|-s) SERVER_URL="$2" shift 2 ;; --uninstall) UNINSTALL=true shift ;; -h|--help) echo "Verwendung: $0 [--pairing-code <6-STELLIG>] [--device-name ] [--server ] [--uninstall]" exit 0 ;; *) echo -e "${RED}Unbekanntes Argument: $1${NC}" exit 1 ;; esac done } do_uninstall() { echo -e "${YELLOW}🛑 Deinstalliere Skynet Node Companion Daemon...${NC}" OS="$(uname -s)" if [[ "$OS" == "Darwin" ]]; then PLIST="$HOME/Library/LaunchAgents/ai.skynet.node.plist" if [[ -f "$PLIST" ]]; then echo "Stoppe LaunchAgent ai.skynet.node..." launchctl bootout "gui/$(id -u)" "$PLIST" 2>/dev/null || launchctl unload "$PLIST" 2>/dev/null || true rm -f "$PLIST" fi elif [[ "$OS" == "Linux" ]]; then if command -v systemctl &>/dev/null; then systemctl --user stop skynet-node.service 2>/dev/null || true systemctl --user disable skynet-node.service 2>/dev/null || true rm -f "$HOME/.config/systemd/user/skynet-node.service" systemctl --user daemon-reload 2>/dev/null || true fi fi echo -e "${GREEN}✅ Skynet Node Companion Daemon wurde erfolgreich entfernt.${NC}" echo "Hinweis: Konfiguration und Schlüssel in $INSTALL_DIR bleiben zur Sicherheit erhalten." exit 0 } detect_device_name() { if [[ -n "$DEVICE_NAME" ]]; then return fi OS="$(uname -s)" if [[ "$OS" == "Darwin" ]]; then MODEL="$(sysctl -n hw.model 2>/dev/null || echo 'Mac')" CHIP="$(sysctl -n machdep.cpu.brand_string 2>/dev/null || echo 'Apple Silicon')" DEVICE_NAME="$MODEL ($CHIP)" else HOSTNAME="$(hostname -s 2>/dev/null || echo 'linux-host')" DEVICE_NAME="Linux Node ($HOSTNAME)" fi } main() { print_banner parse_args "$@" if [[ "$UNINSTALL" == true ]]; then do_uninstall fi detect_device_name echo -e "${CYAN}🖥️ Erkannte Hardware: ${BOLD}$DEVICE_NAME${NC}" echo -e "${CYAN}🌐 Skynet Server: ${BOLD}$SERVER_URL${NC}" # Prompt for pairing code if not provided if [[ -z "$PAIRING_CODE" ]]; then echo "" echo -e "${YELLOW}🔑 Kein Pairing-Code übergeben.${NC}" echo -e "Bitte erstelle einen Pairing-Code unter ${BOLD}https://skynet-harness.ai/mining${NC} (+ Gerät koppeln)." read -r -p "Bitte 6-stelligen Pairing-Code eingeben: " PAIRING_CODE echo "" fi if [[ -z "$PAIRING_CODE" ]]; then echo -e "${RED}❌ Fehler: Kein Pairing-Code angegeben. Abbruch.${NC}" exit 1 fi # Check for python3 if ! command -v python3 &>/dev/null; then echo -e "${RED}❌ Python 3 wurde nicht gefunden. Bitte installiere Python 3.9+ und starte erneut.${NC}" exit 1 fi echo -e "${CYAN}📦 Erstelle Arbeitsverzeichnis unter $INSTALL_DIR...${NC}" mkdir -p "$DAEMON_DIR" "$LOGS_DIR" "$BIN_DIR" # Setup Python virtual environment if not already present if [[ ! -f "$VENV_DIR/bin/python3" ]]; then echo -e "${CYAN}🐍 Richte dediziertes Python Virtualenv ein...${NC}" python3 -m venv "$VENV_DIR" "$VENV_DIR/bin/pip" install --upgrade pip --quiet "$VENV_DIR/bin/pip" install cryptography psutil numpy --quiet echo -e "${GREEN}✅ Virtuelle Umgebung mit Abhängigkeiten erfolgreich erstellt.${NC}" fi # Determine script source directory SCRIPT_SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_SOURCE_DIR/../.." 2>/dev/null && pwd || echo "")" if [[ -d "$REPO_ROOT/daemon" && -f "$REPO_ROOT/daemon/skynet_node_companion.py" ]]; then cp "$REPO_ROOT/daemon/skynet_node_companion.py" "$DAEMON_DIR/" cp "$REPO_ROOT/daemon/telemetry_guard.py" "$DAEMON_DIR/" cp "$REPO_ROOT/daemon/compute_governor.py" "$DAEMON_DIR/" cp "$REPO_ROOT/daemon/device_auth.py" "$DAEMON_DIR/" cp "$REPO_ROOT/daemon/swarm_transport.py" "$DAEMON_DIR/" else # Download daemon files from server if running via curl pipe echo -e "${CYAN}⬇️ Lade aktuelle Daemon-Komponenten von $SERVER_URL herunter...${NC}" for comp in skynet_node_companion.py telemetry_guard.py compute_governor.py device_auth.py swarm_transport.py; do curl -fsSL "$SERVER_URL/api/daemon/$comp" -o "$DAEMON_DIR/$comp" 2>/dev/null || \ curl -fsSL "https://raw.githubusercontent.com/gamperlab/skynet-harness-ai/main/daemon/$comp" -o "$DAEMON_DIR/$comp" done fi echo -e "${CYAN}🔐 Führe Hardware-Benchmarking & kryptografische Kopplung durch...${NC}" "$VENV_DIR/bin/python3" "$DAEMON_DIR/skynet_node_companion.py" \ --pair "$PAIRING_CODE" \ --device-name "$DEVICE_NAME" \ --server "$SERVER_URL" echo -e "${CYAN}🚀 Richte Autostart-Hintergrunddienst ein...${NC}" OS="$(uname -s)" if [[ "$OS" == "Darwin" ]]; then PLIST_DIR="$HOME/Library/LaunchAgents" mkdir -p "$PLIST_DIR" PLIST_FILE="$PLIST_DIR/ai.skynet.node.plist" cat > "$PLIST_FILE" << EOF Label ai.skynet.node ProgramArguments $VENV_DIR/bin/python3 $DAEMON_DIR/skynet_node_companion.py --daemon --server $SERVER_URL RunAtLoad KeepAlive Nice 19 LowPriorityIO StandardOutPath $LOGS_DIR/companion.log StandardErrorPath $LOGS_DIR/companion.error.log EnvironmentVariables PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin OMP_NUM_THREADS 2 PYTHONUNBUFFERED 1 EOF # Reload launchd service launchctl bootout "gui/$(id -u)" "$PLIST_FILE" 2>/dev/null || launchctl unload "$PLIST_FILE" 2>/dev/null || true launchctl bootstrap "gui/$(id -u)" "$PLIST_FILE" 2>/dev/null || launchctl load "$PLIST_FILE" 2>/dev/null echo -e "${GREEN}✅ macOS LaunchAgent ai.skynet.node erfolgreich registriert & gestartet.${NC}" elif [[ "$OS" == "Linux" ]]; then SYSTEMD_DIR="$HOME/.config/systemd/user" mkdir -p "$SYSTEMD_DIR" SERVICE_FILE="$SYSTEMD_DIR/skynet-node.service" cat > "$SERVICE_FILE" << EOF [Unit] Description=Skynet Native Node Companion Daemon After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=$VENV_DIR/bin/python3 $DAEMON_DIR/skynet_node_companion.py --daemon --server $SERVER_URL Restart=always RestartSec=5 Nice=19 Environment=PYTHONUNBUFFERED=1 Environment=OMP_NUM_THREADS=2 StandardOutput=append:$LOGS_DIR/companion.log StandardError=append:$LOGS_DIR/companion.error.log [Install] WantedBy=default.target EOF if command -v systemctl &>/dev/null; then systemctl --user daemon-reload systemctl --user enable --now skynet-node.service echo -e "${GREEN}✅ Linux systemd Service skynet-node erfolgreich registriert & gestartet.${NC}" fi fi # Create convenient CLI wrapper CLI_WRAPPER="$BIN_DIR/skynet-node" cat > "$CLI_WRAPPER" << EOF #!/usr/bin/env bash case "\${1:-status}" in status) "$VENV_DIR/bin/python3" "$DAEMON_DIR/skynet_node_companion.py" --status ;; logs) tail -n 50 -f "$LOGS_DIR/companion.log" ;; stop) if [[ "\$(uname -s)" == "Darwin" ]]; then launchctl bootout "gui/\$(id -u)" "$HOME/Library/LaunchAgents/ai.skynet.node.plist" 2>/dev/null || launchctl unload "$HOME/Library/LaunchAgents/ai.skynet.node.plist" 2>/dev/null else systemctl --user stop skynet-node.service fi echo "Skynet Node Daemon gestoppt." ;; start) if [[ "\$(uname -s)" == "Darwin" ]]; then launchctl bootstrap "gui/\$(id -u)" "$HOME/Library/LaunchAgents/ai.skynet.node.plist" 2>/dev/null || launchctl load "$HOME/Library/LaunchAgents/ai.skynet.node.plist" 2>/dev/null else systemctl --user start skynet-node.service fi echo "Skynet Node Daemon gestartet." ;; *) echo "Verwendung: skynet-node {status|logs|start|stop}" ;; esac EOF chmod +x "$CLI_WRAPPER" echo "" echo -e "${GREEN}=================================================================${NC}" echo -e "${GREEN}🎉 Skynet Native Node Companion erfolgreich installiert & aktiv!${NC}" echo -e " • Status-Check: ${BOLD}$CLI_WRAPPER status${NC}" echo -e " • Live-Logs: ${BOLD}$CLI_WRAPPER logs${NC}" echo -e " • Dashboard: ${BOLD}https://skynet-harness.ai/mining${NC}" echo -e "${GREEN}=================================================================${NC}" } main "$@"