#!/bin/bash

set -e

PROXY_IP="45.140.19.39"
SOCKS_PORT="1080"
HTTP_PORT="3128"

if [ "$(id -u)" -ne 0 ]; then
    echo "Запустите скрипт от root:"
    echo "sudo bash $0"
    exit 1
fi

echo "========================================"
echo " Установка 3proxy на Ubuntu 24.04"
echo "========================================"
echo

# Проверяем, добавлен ли IP на сервер
if ! ip addr show | grep -qw "$PROXY_IP"; then
    echo "ОШИБКА: IP $PROXY_IP не найден на сетевых интерфейсах сервера."
    echo
    echo "Проверьте командой:"
    echo "ip addr"
    exit 1
fi

read -rp "Введите логин прокси [proxyuser]: " PROXY_USER
PROXY_USER="${PROXY_USER:-proxyuser}"

# Разрешаем безопасные символы в логине
if [[ ! "$PROXY_USER" =~ ^[a-zA-Z0-9_-]+$ ]]; then
    echo "Ошибка: логин может содержать только английские буквы, цифры, _ и -"
    exit 1
fi

read -rsp "Введите пароль прокси или нажмите Enter для генерации: " PROXY_PASSWORD
echo

if [ -z "$PROXY_PASSWORD" ]; then
    PROXY_PASSWORD="$(openssl rand -hex 12)"
fi

# Из-за синтаксиса конфига запрещаем пробелы и двоеточие
if [[ "$PROXY_PASSWORD" == *" "* ]] || [[ "$PROXY_PASSWORD" == *":"* ]]; then
    echo "Ошибка: пароль не должен содержать пробелы или двоеточие (:)"
    exit 1
fi

echo
echo "[1/7] Устанавливаем необходимые пакеты..."

export DEBIAN_FRONTEND=noninteractive

apt-get update
apt-get install -y \
    git \
    make \
    gcc \
    libc6-dev \
    ca-certificates \
    curl \
    openssl

echo "[2/7] Скачиваем исходный код 3proxy..."

rm -rf /usr/local/src/3proxy
git clone --depth 1 https://github.com/3proxy/3proxy.git /usr/local/src/3proxy

echo "[3/7] Компилируем 3proxy..."

cd /usr/local/src/3proxy
make -f Makefile.Linux

install -m 755 bin/3proxy /usr/local/bin/3proxy

echo "[4/7] Создаём каталоги..."

mkdir -p /etc/3proxy
mkdir -p /var/log/3proxy
mkdir -p /var/run/3proxy

touch /var/log/3proxy/3proxy.log
chmod 750 /etc/3proxy
chmod 750 /var/log/3proxy

echo "[5/7] Создаём конфигурацию..."

cat > /etc/3proxy/3proxy.cfg <<EOF
daemon
pidfile /var/run/3proxy/3proxy.pid

nscache 65536
timeouts 1 5 30 60 180 1800 15 60

log /var/log/3proxy/3proxy.log D
logformat "L%Y-%m-%d %H:%M:%S %N.%p %E %U %C:%c %R:%r %O %I %h %T"
rotate 14

users ${PROXY_USER}:CL:${PROXY_PASSWORD}
auth strong

allow ${PROXY_USER}

socks -p${SOCKS_PORT} -i${PROXY_IP} -e${PROXY_IP}
proxy -p${HTTP_PORT} -i${PROXY_IP} -e${PROXY_IP}

flush
EOF

chmod 600 /etc/3proxy/3proxy.cfg

echo "[6/7] Создаём службу systemd..."

cat > /etc/systemd/system/3proxy.service <<'EOF'
[Unit]
Description=3proxy Proxy Server
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/3proxy/3proxy.pid
ExecStart=/usr/local/bin/3proxy /etc/3proxy/3proxy.cfg
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable 3proxy
systemctl restart 3proxy

echo "[7/7] Настраиваем firewall..."

# Открываем порты только если UFW установлен и активен
if command -v ufw >/dev/null 2>&1; then
    if ufw status | grep -q "Status: active"; then
        ufw allow "${SOCKS_PORT}/tcp" comment "3proxy SOCKS5"
        ufw allow "${HTTP_PORT}/tcp" comment "3proxy HTTP"
        echo "Порты добавлены в UFW."
    else
        echo "UFW установлен, но выключен. Дополнительные правила не требуются."
    fi
else
    echo "UFW не установлен. Дополнительные правила не создавались."
fi

sleep 2

echo
echo "========================================"
echo " Проверка"
echo "========================================"

systemctl --no-pager --full status 3proxy || true

echo
echo "Открытые порты:"
ss -lntp | grep -E ":(${SOCKS_PORT}|${HTTP_PORT})" || true

echo
echo "========================================"
echo " 3proxy успешно установлен"
echo "========================================"
echo
echo "SOCKS5:"
echo "${PROXY_IP}:${SOCKS_PORT}"
echo
echo "HTTP:"
echo "${PROXY_IP}:${HTTP_PORT}"
echo
echo "Логин:  ${PROXY_USER}"
echo "Пароль: ${PROXY_PASSWORD}"
echo
echo "Формат SOCKS5:"
echo "socks5://${PROXY_USER}:${PROXY_PASSWORD}@${PROXY_IP}:${SOCKS_PORT}"
echo
echo "Формат HTTP:"
echo "http://${PROXY_USER}:${PROXY_PASSWORD}@${PROXY_IP}:${HTTP_PORT}"
echo
echo "Данные сохранены в /root/3proxy-access.txt"

cat > /root/3proxy-access.txt <<EOF
SOCKS5
IP: ${PROXY_IP}
Port: ${SOCKS_PORT}
Login: ${PROXY_USER}
Password: ${PROXY_PASSWORD}
URL: socks5://${PROXY_USER}:${PROXY_PASSWORD}@${PROXY_IP}:${SOCKS_PORT}

HTTP
IP: ${PROXY_IP}
Port: ${HTTP_PORT}
Login: ${PROXY_USER}
Password: ${PROXY_PASSWORD}
URL: http://${PROXY_USER}:${PROXY_PASSWORD}@${PROXY_IP}:${HTTP_PORT}
EOF

chmod 600 /root/3proxy-access.txt