#!/usr/bin/env sh
set -eu

REPO="fatedier/frp"
INSTALL_BIN="/usr/local/bin/frpc"
UNIT="/etc/systemd/system/frpc.service"
CONFIG_DIR="/etc/frp"
CONFIG_FILE="${CONFIG_DIR}/frpc.toml"
LOGFILE="$HOME/frpc_version"
TMPDIR="$(mktemp -d)"
trap 'rm -rf "$TMPDIR"' EXIT
OWNER_UID="${SUDO_UID:-$(id -u)}"
OWNER_GID="${SUDO_GID:-$(id -g)}"

SUDO=""
if [ "$(id -u)" -ne 0 ]; then
    SUDO="sudo"
fi

ensure_default_config() {
    auth_token=""
    web_password=""

    ${SUDO} install -d -m 0755 -o "${OWNER_UID}" -g "${OWNER_GID}" "${CONFIG_DIR}"
    if [ ! -f "${CONFIG_FILE}" ]; then
        auth_token="$(openssl rand -base64 36 | tr -d '\n')"
        web_password="$(openssl rand -base64 18 | tr -d '\n')"
        ${SUDO} tee "${CONFIG_FILE}" >/dev/null <<'EOF'
serverAddr = "127.0.0.1"
serverPort = 6666

loginFailExit = false

[log]
to = "console"
level = "warn"

[auth]
method = "token"
token = "__AUTH_TOKEN__"

[webServer]
addr = "127.0.0.1"
port = 6655
user = "influx"
password = "__WEB_PASSWORD__"

[[proxies]]
name = "example-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 30080
EOF
        ${SUDO} sed -i \
            -e "s|__AUTH_TOKEN__|${auth_token}|" \
            -e "s|__WEB_PASSWORD__|${web_password}|" \
            "${CONFIG_FILE}"
        ${SUDO} chmod 0644 "${CONFIG_FILE}"
        ${SUDO} chown "${OWNER_UID}:${OWNER_GID}" "${CONFIG_FILE}"
        echo "default frpc config installed to ${CONFIG_FILE}"
    fi
}

# 1. get latest version
latest_tag="$(curl -fsSL https://api.github.com/repos/${REPO}/releases/latest | sed -n 's/.*"tag_name":[ ]*"\([^"]*\)".*/\1/p')"
latest_version="${latest_tag#v}"

# check installed version
installed_version=""
if command -v frpc >/dev/null 2>&1; then
    installed_version="$(frpc -v 2>/dev/null || true)"
fi

if [ "$installed_version" = "$latest_version" ]; then
    ensure_default_config
    echo "frpc already latest (${installed_version})"
    exit 0
fi

echo "installing/upgrading frpc ${installed_version:-none} -> ${latest_version}"

# 2. download
tarball="frp_${latest_version}_linux_amd64.tar.gz"
url="https://github.com/${REPO}/releases/download/${latest_tag}/${tarball}"

curl -fL -o "${TMPDIR}/${tarball}" "${url}"

# 3. extract
tar -xzf "${TMPDIR}/${tarball}" -C "${TMPDIR}"

# 4. install binary
${SUDO} install -m 0755 "${TMPDIR}/frp_${latest_version}_linux_amd64/frpc" "${INSTALL_BIN}"

# 5. install default config when missing
ensure_default_config

# 6/7 systemd
if [ ! -f "${UNIT}" ]; then
cat <<EOF | ${SUDO} tee "${UNIT}" >/dev/null
[Unit]
Description=FRP Client
After=network.target

[Service]
Type=simple
ExecStart=${INSTALL_BIN} -c ${CONFIG_FILE}
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF

    ${SUDO} systemctl daemon-reload
    echo "systemd unit created (not enabled, not started)"
else
    ${SUDO} systemctl daemon-reload
    echo "systemd unit already exists (not enabled by this script)"
fi

# version log
echo "$(date '+%Y-%m-%d %H:%M:%S') ${installed_version:-none} -> ${latest_version}" >> "${LOGFILE}"

echo "done: ${latest_version}"