From e6bdade1a47e3b3626e03719f59c2d3d81f999c3 Mon Sep 17 00:00:00 2001 From: Timmy Date: Tue, 7 Apr 2026 12:18:53 +0800 Subject: [PATCH] fix: use SSH for direct database queries instead of port-forward The user-notes command in cli-anything-codimd doesn't support PostgreSQL, so the script now queries the database directly via SSH kubectl exec. Also fixes SQL quote handling in db-query command. Co-Authored-By: Claude Opus 4.6 (1M context) --- apps/codimd/db-query-users.sh | 91 +++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 36 deletions(-) diff --git a/apps/codimd/db-query-users.sh b/apps/codimd/db-query-users.sh index 8275c1b..8003768 100755 --- a/apps/codimd/db-query-users.sh +++ b/apps/codimd/db-query-users.sh @@ -1,24 +1,21 @@ #!/bin/bash # CodiMD 資料庫查詢工具 -DB_TYPE="postgresql" -DB_HOST="localhost" +REMOTE_HOST="ubuntu@192.168.42.120" +DB_POD_NAME="codimd-db-0" +DB_NAMESPACE="default" DB_NAME="codimd" DB_USER="codimd" -DB_PASSWORD="8xG94tL0uKlGiBEd" -# 檢查 port-forward 是否運行 -if ! nc -z localhost 5432 2>/dev/null; then - echo "❌ Port-forward 未運行,請先執行: ./db-port-forward.sh" - exit 1 -fi +# 取得實際運行的 pod 名稱 +get_db_pod() { + ssh "$REMOTE_HOST" "sudo kubectl get pod -n $DB_NAMESPACE -l app=codimd-db -o jsonpath='{.items[0].metadata.name}'" +} -# 檢查 cli-anything-codimd 是否存在 -if ! command -v cli-anything-codimd &> /dev/null; then - echo "❌ cli-anything-codimd 未找到" - echo " 請先安裝: https://github.com/your-repo/cli-anything-codimd" - exit 1 -fi +# 檢查是否已透過 SSH 建立 port-forward +check_ssh_pf() { + pgrep -f "port-forward.*codimd-db" > /dev/null +} SCRIPT_NAME=$(basename "$0") @@ -31,45 +28,67 @@ if [ -z "$1" ]; then echo "指令:" echo " list-users 列出所有使用者" echo " user-notes 查看特定使用者的筆記" + echo " note-count 統計使用者筆記數量" + echo " db-query 執行自訂 SQL 查詢" echo "" echo "範例:" echo " $SCRIPT_NAME list-users" echo " $SCRIPT_NAME user-notes 33eabf61-c2ad-410e-99e0-19e11d86beec" + echo " $SCRIPT_NAME note-count 33eabf61-c2ad-410e-99e0-19e11d86beec" + echo " $SCRIPT_NAME db-query 'SELECT COUNT(*) FROM \"Notes\";'" exit 0 fi +DB_POD=$(get_db_pod) + case "$1" in list-users) - cli-anything-codimd admin list-users \ - --db-type "$DB_TYPE" \ - --db-host "$DB_HOST" \ - --db-name "$DB_NAME" \ - --db-user "$DB_USER" \ - --db-password "$DB_PASSWORD" + if check_ssh_pf; then + # 使用 port-forward 和 cli-anything-codimd + if command -v cli-anything-codimd &> /dev/null; then + cli-anything-codimd admin list-users \ + --db-type postgresql \ + --db-host localhost \ + --db-name "$DB_NAME" \ + --db-user "$DB_USER" \ + --db-password 8xG94tL0uKlGiBEd + else + echo "⚠️ cli-anything-codimd 未安裝" + fi + else + echo "⚠️ Port-forward 未運行,透過 SSH 直接查詢" + fi + # 總是顯示直接查詢結果 + ssh "$REMOTE_HOST" "sudo kubectl exec $DB_POD -- psql -U $DB_USER -d $DB_NAME -c 'SELECT id, email, profile, \"createdAt\" FROM \"Users\";'" ;; user-notes) if [ -z "$2" ]; then echo "用法: $0 user-notes " exit 1 fi - cli-anything-codimd admin user-notes "$2" \ - --db-type "$DB_TYPE" \ - --db-host "$DB_HOST" \ - --db-name "$DB_NAME" \ - --db-user "$DB_USER" \ - --db-password "$DB_PASSWORD" + echo "=== 使用者筆記列表 ===" + ssh "$REMOTE_HOST" "sudo kubectl exec $DB_POD -- psql -U $DB_USER -d $DB_NAME -c \"SELECT id, alias, title, \\\"lastchangeAt\\\", permission FROM \\\"Notes\\\" WHERE \\\"ownerId\\\" = '$2' ORDER BY \\\"lastchangeAt\\\" DESC;\"" + ;; + note-count) + if [ -z "$2" ]; then + echo "用法: $0 note-count " + exit 1 + fi + ssh "$REMOTE_HOST" "sudo kubectl exec $DB_POD -- psql -U $DB_USER -d $DB_NAME -t -c \"SELECT COUNT(*) FROM \\\"Notes\\\" WHERE \\\"ownerId\\\" = '$2';\"" + ;; + db-query) + shift + SQL="$*" + if [ -z "$SQL" ]; then + echo "用法: $0 db-query " + exit 1 + fi + ssh "$REMOTE_HOST" "sudo kubectl exec $DB_POD -- psql -U $DB_USER -d $DB_NAME -c '$SQL'" ;; *) - echo "=== CodiMD 資料庫查詢工具 ===" + echo "❌ 未知指令: $1" echo "" - echo "用法: $0 [args]" - echo "" - echo "指令:" - echo " list-users 列出所有使用者" - echo " user-notes 查看特定使用者的筆記" - echo "" - echo "範例:" - echo " $0 list-users" - echo " $0 user-notes 33eabf61-c2ad-410e-99e0-19e11d86beec" + echo "可用指令: list-users, user-notes, note-count, db-query" + exit 1 ;; esac