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) <noreply@anthropic.com>
This commit is contained in:
@@ -1,24 +1,21 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# CodiMD 資料庫查詢工具
|
# CodiMD 資料庫查詢工具
|
||||||
|
|
||||||
DB_TYPE="postgresql"
|
REMOTE_HOST="ubuntu@192.168.42.120"
|
||||||
DB_HOST="localhost"
|
DB_POD_NAME="codimd-db-0"
|
||||||
|
DB_NAMESPACE="default"
|
||||||
DB_NAME="codimd"
|
DB_NAME="codimd"
|
||||||
DB_USER="codimd"
|
DB_USER="codimd"
|
||||||
DB_PASSWORD="8xG94tL0uKlGiBEd"
|
|
||||||
|
|
||||||
# 檢查 port-forward 是否運行
|
# 取得實際運行的 pod 名稱
|
||||||
if ! nc -z localhost 5432 2>/dev/null; then
|
get_db_pod() {
|
||||||
echo "❌ Port-forward 未運行,請先執行: ./db-port-forward.sh"
|
ssh "$REMOTE_HOST" "sudo kubectl get pod -n $DB_NAMESPACE -l app=codimd-db -o jsonpath='{.items[0].metadata.name}'"
|
||||||
exit 1
|
}
|
||||||
fi
|
|
||||||
|
|
||||||
# 檢查 cli-anything-codimd 是否存在
|
# 檢查是否已透過 SSH 建立 port-forward
|
||||||
if ! command -v cli-anything-codimd &> /dev/null; then
|
check_ssh_pf() {
|
||||||
echo "❌ cli-anything-codimd 未找到"
|
pgrep -f "port-forward.*codimd-db" > /dev/null
|
||||||
echo " 請先安裝: https://github.com/your-repo/cli-anything-codimd"
|
}
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
SCRIPT_NAME=$(basename "$0")
|
SCRIPT_NAME=$(basename "$0")
|
||||||
|
|
||||||
@@ -31,45 +28,67 @@ if [ -z "$1" ]; then
|
|||||||
echo "指令:"
|
echo "指令:"
|
||||||
echo " list-users 列出所有使用者"
|
echo " list-users 列出所有使用者"
|
||||||
echo " user-notes <user-id> 查看特定使用者的筆記"
|
echo " user-notes <user-id> 查看特定使用者的筆記"
|
||||||
|
echo " note-count <user-id> 統計使用者筆記數量"
|
||||||
|
echo " db-query <sql> 執行自訂 SQL 查詢"
|
||||||
echo ""
|
echo ""
|
||||||
echo "範例:"
|
echo "範例:"
|
||||||
echo " $SCRIPT_NAME list-users"
|
echo " $SCRIPT_NAME list-users"
|
||||||
echo " $SCRIPT_NAME user-notes 33eabf61-c2ad-410e-99e0-19e11d86beec"
|
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
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
DB_POD=$(get_db_pod)
|
||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
list-users)
|
list-users)
|
||||||
cli-anything-codimd admin list-users \
|
if check_ssh_pf; then
|
||||||
--db-type "$DB_TYPE" \
|
# 使用 port-forward 和 cli-anything-codimd
|
||||||
--db-host "$DB_HOST" \
|
if command -v cli-anything-codimd &> /dev/null; then
|
||||||
--db-name "$DB_NAME" \
|
cli-anything-codimd admin list-users \
|
||||||
--db-user "$DB_USER" \
|
--db-type postgresql \
|
||||||
--db-password "$DB_PASSWORD"
|
--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)
|
user-notes)
|
||||||
if [ -z "$2" ]; then
|
if [ -z "$2" ]; then
|
||||||
echo "用法: $0 user-notes <user-id>"
|
echo "用法: $0 user-notes <user-id>"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
cli-anything-codimd admin user-notes "$2" \
|
echo "=== 使用者筆記列表 ==="
|
||||||
--db-type "$DB_TYPE" \
|
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;\""
|
||||||
--db-host "$DB_HOST" \
|
;;
|
||||||
--db-name "$DB_NAME" \
|
note-count)
|
||||||
--db-user "$DB_USER" \
|
if [ -z "$2" ]; then
|
||||||
--db-password "$DB_PASSWORD"
|
echo "用法: $0 note-count <user-id>"
|
||||||
|
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 <sql>"
|
||||||
|
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 ""
|
||||||
echo "用法: $0 <command> [args]"
|
echo "可用指令: list-users, user-notes, note-count, db-query"
|
||||||
echo ""
|
exit 1
|
||||||
echo "指令:"
|
|
||||||
echo " list-users 列出所有使用者"
|
|
||||||
echo " user-notes <user-id> 查看特定使用者的筆記"
|
|
||||||
echo ""
|
|
||||||
echo "範例:"
|
|
||||||
echo " $0 list-users"
|
|
||||||
echo " $0 user-notes 33eabf61-c2ad-410e-99e0-19e11d86beec"
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
Reference in New Issue
Block a user