#!/usr/bin/env bash set -euo pipefail skill_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" project_dir="$(cd "${skill_dir}/../../.." && pwd)" local_log="${project_dir}/.local/logs/backend.log" online_ssh_host="${SHZ_ONLINE_SSH_HOST:-root@39.98.44.136}" online_ssh_port="${SHZ_ONLINE_SSH_PORT:-6022}" online_remote_log_dir="${SHZ_ONLINE_LOG_DIR:-/opt/service/project/shz-backend/logs}" test_ssh_host="${SHZ_TEST_SSH_HOST:-root@47.111.103.66}" test_ssh_port="${SHZ_TEST_SSH_PORT:-22}" test_remote_log_dir="${SHZ_TEST_LOG_DIR:-/data/code/shz-backend/logs}" usage() { cat <<'EOF' Usage: view.sh local [lines] [--follow] view.sh online|production [backend|error|info|user] [lines] [--follow] view.sh test [backend|error|info|user] [lines] [--follow] Examples: view.sh local 200 view.sh local 100 --follow view.sh online backend 200 view.sh test error 200 view.sh online error 500 --follow EOF } validate_lines() { local lines="$1" if [[ ! "${lines}" =~ ^[0-9]+$ ]] || (( lines < 1 || lines > 5000 )); then echo "Lines must be an integer between 1 and 5000: ${lines}" >&2 exit 2 fi } validate_follow() { local follow="${1:-}" if [[ -n "${follow}" && "${follow}" != "--follow" ]]; then echo "Unknown option: ${follow}" >&2 usage >&2 exit 2 fi } view_local() { local lines="${1:-200}" local follow="${2:-}" validate_lines "${lines}" validate_follow "${follow}" if [[ ! -f "${local_log}" ]]; then echo "Local log does not exist: ${local_log}" >&2 echo "Start the project first with: ./local.sh start" >&2 exit 1 fi if [[ "${follow}" == "--follow" ]]; then tail -n "${lines}" -F -- "${local_log}" else tail -n "${lines}" -- "${local_log}" fi } view_remote() { local target="$1" local kind="${2:-backend}" local lines="${3:-200}" local follow="${4:-}" local ssh_host ssh_port remote_log_dir remote_file case "${target}" in online|production) ssh_host="${online_ssh_host}" ssh_port="${online_ssh_port}" remote_log_dir="${online_remote_log_dir}" ;; test) ssh_host="${test_ssh_host}" ssh_port="${test_ssh_port}" remote_log_dir="${test_remote_log_dir}" ;; *) echo "Unknown remote environment: ${target}" >&2 usage >&2 exit 2 ;; esac case "${kind}" in backend) remote_file="${remote_log_dir}/backend.log" ;; error) remote_file="${remote_log_dir}/sys-error.log" ;; info) remote_file="${remote_log_dir}/sys-info.log" ;; user) remote_file="${remote_log_dir}/sys-user.log" ;; *) echo "Unknown log type: ${kind}" >&2 usage >&2 exit 2 ;; esac validate_lines "${lines}" validate_follow "${follow}" local -a ssh_args=(-o BatchMode=yes -o ConnectTimeout=10) if [[ -n "${ssh_port}" ]]; then ssh_args+=(-p "${ssh_port}") fi if [[ "${follow}" == "--follow" ]]; then ssh "${ssh_args[@]}" "${ssh_host}" \ tail -n "${lines}" -F -- "${remote_file}" else ssh "${ssh_args[@]}" "${ssh_host}" \ tail -n "${lines}" -- "${remote_file}" fi } target="${1:-}" case "${target}" in local) [[ $# -le 3 ]] || { usage >&2; exit 2; } view_local "${2:-200}" "${3:-}" ;; online|production|test) [[ $# -le 4 ]] || { usage >&2; exit 2; } view_remote "${target}" "${2:-backend}" "${3:-200}" "${4:-}" ;; help|-h|--help) usage ;; *) usage >&2 exit 2 ;; esac