#!/usr/bin/env bash
#
# install_3proxy.sh
#
# Автоматическая установка и настройка 3proxy на Ubuntu/Debian
#

set -euo pipefail

# Проверка запуска от root
if [[ $EUID -ne 0 ]]; then
  echo "Ошибка: скрипт должен быть запущен от имени root."
  exit 1
fi

# Переменные
THIRD_PROXY_VERSION="0.9.3"
DOWNLOAD_URL="https://github.com/z3APA3A/3proxy/archive/${THIRD_PROXY_VERSION}.tar.gz"
BUILD_DIR="/usr/local/src/3proxy-${THIRD_PROXY_VERSION}"
INSTALL_USER="proxy3"
INSTALL_GROUP="proxy3"
CONFIG_DIR="/etc/3proxy"
LOG_DIR="/var/log/3proxy"
BINARY_PATH="/usr/bin/3proxy"
SERVICE_FILE="/etc/systemd/system/3proxy.service"

echo "=== Обновляем APT и устанавливаем зависимости..."
apt-get update -qq
apt-get install -y build-essential wget

echo "=== Переходим в /usr/local/src..."
cd /usr/local/src

# Удаляем старую папку, если она существует
if [[ -d "${BUILD_DIR}" ]]; then
  echo "Папка ${BUILD_DIR} уже есть, удаляем её..."
  rm -rf "${BUILD_DIR}"
fi

echo "=== Скачиваем 3proxy v${THIRD_PROXY_VERSION}..."
wget -q "${DOWNLOAD_URL}" -O "3proxy-${THIRD_PROXY_VERSION}.tar.gz"
echo "=== Распаковываем архив..."
tar xzf "3proxy-${THIRD_PROXY_VERSION}.tar.gz"

# Папка уже распакована как /usr/local/src/3proxy-0.9.3
# Переход в исходники
cd "${BUILD_DIR}"

echo "=== Компилируем 3proxy..."
make -f Makefile.Linux

echo "=== Устанавливаем бинарь в ${BINARY_PATH}..."
cp "${BUILD_DIR}/bin/3proxy" "${BINARY_PATH}"
chmod 755 "${BINARY_PATH}"

# Создаём системного пользователя proxy3, если его нет
if ! id -u "${INSTALL_USER}" &>/dev/null; then
  echo "=== Создаём пользователя ${INSTALL_USER}..."
  adduser --system --no-create-home --disabled-login --group "${INSTALL_USER}"
else
  echo "Пользователь ${INSTALL_USER} уже существует, пропускаем."
fi

# Получаем UID и GID
USER_UID=$(id -u "${INSTALL_USER}")
USER_GID=$(id -g "${INSTALL_GROUP}")

echo "=== Создаём конфигурационную папку ${CONFIG_DIR}..."
mkdir -p "${CONFIG_DIR}"
chown root:root "${CONFIG_DIR}"
chmod 755 "${CONFIG_DIR}"

# Формируем файл /etc/3proxy/3proxy.cfg
echo "=== Записываем конфиг в ${CONFIG_DIR}/3proxy.cfg..."
cat > "${CONFIG_DIR}/3proxy.cfg" <<EOF
# Конфигурация 3proxy
setgid ${USER_GID}
setuid ${USER_UID}

# DNS-сервер (как в /etc/resolv.conf)
nserver 127.0.0.53
nscache 65536
timeouts 1 5 30 60 180 1800 15 60

# Пользователи и пароли
users ${CONFIG_DIR}/.proxyauth

# Демон
daemon

# Логи
log ${LOG_DIR}/3proxy.log D
logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T"

# Авторизация
auth cache strong

# HTTP(S)-прокси (анонимный, порт 59128)
proxy -n -p59128 -a
EOF

# Создаём файл авторизации
echo "=== Записываем файл ${CONFIG_DIR}/.proxyauth..."
cat > "${CONFIG_DIR}/.proxyauth" <<EOF
## Формат: user:CL:password
landeros:CL:ProfitLan03
EOF

echo "=== Устанавливаем права на конфиги и файл авторизации..."
chown -R "${INSTALL_USER}:${INSTALL_GROUP}" "${CONFIG_DIR}"
chmod 444 "${CONFIG_DIR}/3proxy.cfg"
chmod 400 "${CONFIG_DIR}/.proxyauth"

echo "=== Создаём директорию логов ${LOG_DIR}..."
mkdir -p "${LOG_DIR}"
chown "${INSTALL_USER}:${INSTALL_GROUP}" "${LOG_DIR}"
chmod 755 "${LOG_DIR}"

# Пишем systemd-сервис
echo "=== Создаём файл ${SERVICE_FILE}..."
cat > "${SERVICE_FILE}" <<EOF
[Unit]
Description=3proxy Proxy Server
After=network.target

[Service]
Type=simple
User=${INSTALL_USER}
Group=${INSTALL_GROUP}
ExecStart=${BINARY_PATH} ${CONFIG_DIR}/3proxy.cfg
ExecStop=/bin/kill \$(/usr/bin/pgrep -u ${INSTALL_USER})
RemainAfterExit=yes
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

echo "=== Перезагружаем systemd, включаем и запускаем 3proxy..."
systemctl daemon-reload
systemctl enable 3proxy
systemctl restart 3proxy

echo "=== Готово! Статус сервиса:"
systemctl status 3proxy --no-pager
