#!/bin/sh
# Chạy một lần lúc cài. KHÔNG kích hoạt gì cả.
#
# Kích hoạt nay là việc của trang RocketZero trong DSM (target/ui/index.cgi),
# kiểu QuickConnect: cài xong không hỏi gì, khách mở app ra nhập mã và chọn ID.
#
# Việc còn lại của tệp này: khôi phục dữ liệu kích hoạt sau khi khách lỡ gỡ gói,
# đăng ký kho gói để máy nhận được bản cập nhật, dọn tàn dư của các bản cũ, và
# ghi phiên bản đang chạy vào cấu hình.
VAR="/var/packages/rocketzero/var"
TARGET="/var/packages/rocketzero/target"
API="${TL_API:-https://link.nashub.vn}"
# Chỉ còn để DỌN tệp mồi mà bản cũ có thể đã để lại — trong đó có mã kích hoạt
# nằm ở /tmp, ai trên máy cũng đọc được.
SEED="/tmp/rocketzero.conf"

mkdir -p "$VAR"
LOG="$VAR/install.log"
echo "--- postinst $(date) ---" >>"$LOG"

# Dấu "đang nâng cấp" do preupgrade đặt đã hết việc: postuninst chạy trước
# postinst nên đã đọc xong. Dọn ngay để một lần nâng cấp hỏng giữa chừng không
# để lại dấu cũ khiến lần GỠ thật sau đó bỏ qua phần trả hệ thống về nguyên
# trạng.
rm -f /tmp/rocketzero-upgrading 2>/dev/null

# Nơi cất bản sao dữ liệu kích hoạt và dấu hoàn tác — phải nằm NGOÀI cây thư mục
# của gói, vì DSM tháo sạch /var/packages/rocketzero khi gỡ, và tháo TRƯỚC khi
# postuninst chạy. Quy tắc chọn chỗ nằm ở target/paths.sh, dùng chung với
# fix_proxy_session.sh và (bằng một bản sao có chủ ý) postuninst.
#
# Nạp có kiểm tra: thiếu paths.sh thì chỉ mất bản sao và khả năng hoàn tác, chứ
# không được làm hỏng lần cài.
if [ -r "$TARGET/paths.sh" ]; then
    . "$TARGET/paths.sh"

    # Bản sao để khôi phục: tìm ở MỌI chỗ từng dùng, không chỉ chỗ hiện hành —
    # máy cài lại có thể có bản sao do một bản gói khác cất ở chỗ khác.
    BACKUP="$(tl_backup_find)"
    echo "bản sao để khôi phục: ${BACKUP:-không có}" >>"$LOG"

    # Ghi ngay vào log chỗ cất được chọn, và ghi cả lý do những chỗ bị loại
    # (stderr của tl_state_dir). Chính vì bản trước im lặng ở đúng chỗ này mà
    # chuyện "gói không ghi được vào gốc volume" chỉ lộ ra khi gỡ thật.
    STATE="$(tl_state_dir 2>>"$LOG")"
    if [ -n "$STATE" ]; then
        echo "chỗ cất bản sao/dấu: $STATE (ghi thử OK)" >>"$LOG"
    else
        echo "CẢNH BÁO: không có chỗ nào ghi được — lúc gỡ sẽ không có bản sao" >>"$LOG"
    fi

    # Chuyển dấu hoàn tác từ var sang chỗ cất chung, lúc cả hai còn sống. Máy nâng
    # cấp từ 1.4.x mà không làm bước này thì dấu của nó nằm lại trong var, và mất
    # ngay khi khách chọn xoá dữ liệu gói lúc gỡ.
    tl_marks_migrate 2>>"$LOG"
else
    BACKUP=""
    echo "CẢNH BÁO: không thấy paths.sh, không có bản sao lẫn dấu hoàn tác" >>"$LOG"
fi

# Phiên bản gói đang được cài, để báo lên máy chủ.
#
# Nạp có kiểm tra chứ không nạp thẳng: một file thiếu trong payload mà làm hỏng
# cả lần cài thì cái giá quá đắt so với việc mất một dòng thông tin. VER rỗng
# đồng nghĩa "không biết", và mọi chỗ dùng bên dưới đều chịu được điều đó.
VER=""
if [ -r "$TARGET/version.sh" ]; then
    . "$TARGET/version.sh"
    VER=$(tl_pkg_ver)
else
    # Thiếu version.sh thì mọi hàm cấu hình dưới kia thành "command not found".
    # Khai stub để lần cài vẫn chạy trọn, chỉ mất mấy việc dọn dẹp phụ.
    tl_cfg_set_ver()      { return 1; }
    tl_cfg_ensure_retry() { return 1; }
    tl_cfg_drop_proxy()   { return 1; }
fi
echo "ver=${VER:-không xác định}" >>"$LOG"

# Tạo file rỗng rồi khoá quyền TRƯỚC khi ghi bí mật vào.
#
# Bản cũ chỉ chmod 600 ở cuối script, nên suốt thời gian postinst còn chạy thì
# token tunnel nằm trong một file 644 — mọi tài khoản trên NAS đọc được.
mkfile600() { : >"$1" && chmod 600 "$1"; }

# Cơ chế tự đăng ký kho cập nhật (add_repo.sh) ĐÃ BỎ HẲN.
#
# Đã kiểm trên DSM 7.2 sạch: gói khai "run-as": "package" nên postinst chạy bằng
# user "rocketzero", không có quyền ghi file root-owned /usr/syno/etc/packages/
# feeds (thư mục là root:root 0755). add_repo.sh fail ở MỌI lần cài — không phải
# lỗi parser mà là giới hạn quyền. Đổi sang "run-as": "root" thì DSM từ chối cài
# (lỗi 319). Không có đường vá dưới mô hình quyền này, nên bỏ để khỏi ghi log
# "repo: thêm không được" gây hiểu nhầm là có tự cập nhật.
#
# Muốn máy tự cập nhật: khách tự thêm nguồn https://pkg.nashub.vn trong Package
# Center (Package Center chạy bằng root nên ghi feeds được). Cài tay .spk thì
# KHÔNG có tự cập nhật.

# Bật lại chỉnh sửa hệ thống mà gói cần. Script tự biết khi nào không có việc gì
# để làm, nên gọi lại nhiều lần vô hại.
#
# Trước đây ở đây còn enable_webdav.sh. Đã bỏ hẳn cùng tính năng WebDAV: gói khai
# "run-as": "package" nên không có quyền root để bật cổng WebDAV HTTPS, mà đổi
# sang run-as root thì DSM từ chối cài (lỗi 319). Một tính năng gói không tự bật
# được thì thà bỏ, hơn là để nó im lặng không chạy trên máy khách. Từ khi app máy
# tính gắn ổ bằng SMB thì WebDAV cũng còn ít giá trị.
apply_system_tweaks() {
    "$TARGET/fix_proxy_session.sh" "$LOG"
}

# Dọn tàn dư WebDAV trên máy đã cài bản cũ.
#
# Cấu hình tunnel được GIỮ NGUYÊN khi nâng cấp, nên nếu không chủ động cắt thì
# khối proxy "dav" vẫn nằm đó: frpc vẫn đăng ký, máy chủ vẫn thấy, cổng vẫn được
# chào ra Internet — tính năng "đã bỏ" vẫn sống trên mọi máy đã bán.
#
# Đây là đường dọn cho máy cũ, bỏ được sau vài bản nữa (khi không còn máy nào
# chạy 1.4.x). Máy mới cài không có gì để dọn nên hàm này im lặng không làm gì.
drop_webdav_leftovers() {
    for _c in "$VAR/rocketcore.toml" "$VAR/frpc.toml"; do
        [ -s "$_c" ] || continue
        if tl_cfg_drop_proxy "$_c" dav; then
            echo "đã gỡ khối proxy dav khỏi $_c (WebDAV đã bỏ)" >>"$LOG"
        fi
    done
    rm -f "$VAR/dav.txt" "$VAR/dav_url.txt" 2>/dev/null
}

# Nhận lại dữ liệu kích hoạt từ lần gỡ trước.
#
# Khách lỡ tay bấm Gỡ cài đặt rồi cài lại thì không còn mã giấy phép trong tay
# (mã nằm trong hộp máy, đa số bị vứt). Có bản sao thì lần cài lại im lặng chạy
# tiếp như chưa có gì xảy ra.
if [ ! -s "$VAR/rocketcore.toml" ] && [ ! -s "$VAR/frpc.toml" ] && [ -f "$BACKUP" ]; then
    if tar -C "$VAR" -xzf "$BACKUP" 2>>"$LOG"; then
        chmod 600 "$VAR/rocketcore.toml" "$VAR/frpc.toml" "$VAR/p2p.key" 2>/dev/null
        echo "--- postinst $(date): khôi phục kích hoạt từ $BACKUP ---" >>"$LOG"
    fi
fi

# Nâng cấp thì máy đã kích hoạt rồi: giữ nguyên cấu hình và thoát.
#
# DSM chạy cả postinst lẫn postupgrade khi nâng cấp, mà lúc đó không có giá trị
# nào từ wizard. Nếu cứ đòi kích hoạt lại thì khách bấm Update là hỏng máy, vì
# mã giấy phép nằm trong hộp chứ không nằm trong đầu họ.
for cfg in "$VAR/rocketcore.toml" "$VAR/frpc.toml"; do
    if [ -s "$cfg" ] && grep -q '^metadatas.token' "$cfg" 2>/dev/null; then
        echo "đã kích hoạt sẵn, bỏ qua bước kích hoạt" >>"$LOG"
        # Nhưng phiên bản thì phải ghi lại: mỗi lần nâng cấp đều đi qua đúng
        # nhánh này. Không cập nhật ở đây thì máy chủ mãi thấy con số của lần
        # cài đầu tiên, và bảng "máy nào chạy bản nào" thành vô dụng.
        tl_cfg_ensure_retry "$cfg" || true
        if [ -n "$VER" ] && tl_cfg_set_ver "$cfg" "$VER"; then
            echo "ver: đã ghi $VER vào cấu hình" >>"$LOG"
        fi
        # Vẫn phải chạy: sau một lần gỡ, skip_ip_checking đã bị trả về trạng thái
        # cũ, cấu hình cũ khôi phục về nhưng hệ thống thì chưa.
        apply_system_tweaks
        # Đây là nhánh mà MỌI lần nâng cấp đi qua, nên cũng là chỗ duy nhất dọn
        # được tàn dư WebDAV trên máy đã bán.
        drop_webdav_leftovers
        exit 0
    fi
done

# Cài xong là XONG — không hỏi gì, không kích hoạt.
#
# Kích hoạt nay là việc của trang RocketZero (target/ui/index.cgi), kiểu
# QuickConnect: khách mở app trong DSM rồi nhập mã và chọn ID ở đó. Wizard của
# DSM không làm được việc đó tử tế — nó là JSON tĩnh, không hiện được địa chỉ đổi
# theo từng chữ, báo lỗi thì DSM chỉ hiện "failed to run postinst script", và
# không mở lại được để đổi ID.
#
# Gói vẫn "đang chạy" khi chưa kích hoạt nhờ vòng trông coi trong
# start-stop-status — cần vậy thì DSM mới hiện app cho khách vào kích hoạt.
chmod 600 "$VAR/rocketcore.toml"
chmod 644 "$VAR/url.txt" "$VAR/linkid.txt" 2>/dev/null
rm -f "$SEED" 2>/dev/null
echo "cài xong ver=${VER:-?}" >>"$LOG"
exit 0
