UMTS at Teleco 3 周之前
父节点
当前提交
a57dbcda73
共有 1 个文件被更改,包括 144 次插入64 次删除
  1. 144 64
      beepzone-helper.sh

+ 144 - 64
beepzone-helper.sh

@@ -78,6 +78,9 @@ if command -v git >/dev/null 2>&1; then
   HAS_GIT=true
 fi
 
+# Selected DB target for user/role and imports
+DB_TARGET=""
+
 TMP_FILE="$(mktemp)"
 CHOICE_FILE="$(mktemp)"
 trap 'rm -f "$TMP_FILE" "$CHOICE_FILE"' EXIT
@@ -124,6 +127,60 @@ DEPLOYMENT_TYPE="$DEPLOYMENT_TYPE"
 EOF
 }
 
+choose_db_target() {
+  local prompt native_available
+  prompt="${1:-Select where to run the DB operation}"
+  native_available=false
+  if $IS_DEBIAN_NATIVE && [[ -n "$MYSQL_CLIENT" ]]; then
+    native_available=true
+  fi
+
+  if $HAS_PODMAN && $native_available; then
+    $DIALOG --menu "$prompt" 14 70 2 \
+      podman "Podman container: $BEEPZONE_DB_CONTAINER_NAME" \
+      native "Native MariaDB/MySQL (using $MYSQL_CLIENT)" 2>"$CHOICE_FILE" || return 1
+    cat "$CHOICE_FILE"
+    return 0
+  elif $HAS_PODMAN; then
+    echo "podman"
+    return 0
+  elif $native_available; then
+    echo "native"
+    return 0
+  else
+    "$DIALOG" --msgbox "No database target available.\n\nNative is only supported on Debian 12/13 with a MariaDB/MySQL client.\nInstall podman or meet the native requirements." 12 74
+    return 1
+  fi
+}
+
+db_query() {
+  local sql="$1"; local target="${2:-$DB_TARGET}"
+  if [[ -z "$target" ]]; then
+    echo "DB target not set" >&2; return 1
+  fi
+  if [[ "$target" == "podman" ]]; then
+    podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
+      mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME" \
+      -e "$sql" -s -N
+  else
+    "$MYSQL_CLIENT" -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME" \
+      -e "$sql" -s -N
+  fi
+}
+
+db_exec_sql() {
+  local sql="$1"; local target="${2:-$DB_TARGET}"
+  if [[ -z "$target" ]]; then
+    echo "DB target not set" >&2; return 1
+  fi
+  if [[ "$target" == "podman" ]]; then
+    echo "$sql" | podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
+      mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME"
+  else
+    echo "$sql" | "$MYSQL_CLIENT" -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME"
+  fi
+}
+
 show_capabilities_screen() {
   local cf
   cf="$(mktemp)"
@@ -360,6 +417,9 @@ configure_and_run_native_db() {
 }
 
 import_schema_and_seed() {
+  local target
+  target=$(choose_db_target "Where should the import be applied?") || return
+
   local import_type schema_file full_dump_file
   schema_file="$WORK_DIR/backend/database/schema/beepzone-schema-dump.sql"
   full_dump_file="$WORK_DIR/backend/database/dev/beepzone-full-dump.sql"
@@ -382,19 +442,34 @@ import_schema_and_seed() {
 
     $DIALOG --yesno "import full database dump from:\n$full_dump_file\n\nThis will DROP and recreate the database.\n\nYou Sure?" 12 70 || return
 
-    {
-      echo "DROP DATABASE IF EXISTS \`$DB_NAME\`;"
-      echo "CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;"
-      echo "USE \`$DB_NAME\`;"
-      echo "SET FOREIGN_KEY_CHECKS=0;"
-      cat "$full_dump_file"
-      echo "SET FOREIGN_KEY_CHECKS=1;"
-    } | podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
-      mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" >>"$LOG_FILE" 2>&1 || {
-        error_log=$(tail -30 "$LOG_FILE")
-        $DIALOG --title "Fuck" --msgbox "full dump import failed.\n\nError:\n${error_log}" 22 76
-        return
-    }
+    if [[ "$target" == "podman" ]]; then
+      {
+        echo "DROP DATABASE IF EXISTS \`$DB_NAME\`;"
+        echo "CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;"
+        echo "USE \`$DB_NAME\`;"
+        echo "SET FOREIGN_KEY_CHECKS=0;"
+        cat "$full_dump_file"
+        echo "SET FOREIGN_KEY_CHECKS=1;"
+      } | podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
+        mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" >>"$LOG_FILE" 2>&1 || {
+          error_log=$(tail -30 "$LOG_FILE")
+          $DIALOG --title "Fuck" --msgbox "full dump import failed.\n\nError:\n${error_log}" 22 76
+          return
+      }
+    else
+      {
+        echo "DROP DATABASE IF EXISTS \`$DB_NAME\`;"
+        echo "CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;"
+        echo "USE \`$DB_NAME\`;"
+        echo "SET FOREIGN_KEY_CHECKS=0;"
+        cat "$full_dump_file"
+        echo "SET FOREIGN_KEY_CHECKS=1;"
+      } | "$MYSQL_CLIENT" -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" >>"$LOG_FILE" 2>&1 || {
+          error_log=$(tail -30 "$LOG_FILE")
+          $DIALOG --title "Fuck" --msgbox "full dump import failed.\n\nError:\n${error_log}" 22 76
+          return
+      }
+    fi
 
     DEPLOYMENT_TYPE="dev"
     save_env
@@ -409,19 +484,34 @@ import_schema_and_seed() {
 
     $DIALOG --yesno "import clean schema from:\n$schema_file\n\nThis will DROP and recreate the database.\n\nProceed?" 12 70 || return
 
-    {
-      echo "DROP DATABASE IF EXISTS \`$DB_NAME\`;"
-      echo "CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;"
-      echo "USE \`$DB_NAME\`;"
-      echo "SET FOREIGN_KEY_CHECKS=0;"
-      cat "$schema_file"
-      echo "SET FOREIGN_KEY_CHECKS=1;"
-    } | podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
-      mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" >>"$LOG_FILE" 2>&1 || {
-        error_log=$(tail -30 "$LOG_FILE")
-        $DIALOG --title "Error" --msgbox "schema import failed.\n\nError:\n${error_log}" 22 76
-        return
-    }
+    if [[ "$target" == "podman" ]]; then
+      {
+        echo "DROP DATABASE IF EXISTS \`$DB_NAME\`;"
+        echo "CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;"
+        echo "USE \`$DB_NAME\`;"
+        echo "SET FOREIGN_KEY_CHECKS=0;"
+        cat "$schema_file"
+        echo "SET FOREIGN_KEY_CHECKS=1;"
+      } | podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
+        mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" >>"$LOG_FILE" 2>&1 || {
+          error_log=$(tail -30 "$LOG_FILE")
+          $DIALOG --title "Error" --msgbox "schema import failed.\n\nError:\n${error_log}" 22 76
+          return
+      }
+    else
+      {
+        echo "DROP DATABASE IF EXISTS \`$DB_NAME\`;"
+        echo "CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;"
+        echo "USE \`$DB_NAME\`;"
+        echo "SET FOREIGN_KEY_CHECKS=0;"
+        cat "$schema_file"
+        echo "SET FOREIGN_KEY_CHECKS=1;"
+      } | "$MYSQL_CLIENT" -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" >>"$LOG_FILE" 2>&1 || {
+          error_log=$(tail -30 "$LOG_FILE")
+          $DIALOG --title "Error" --msgbox "schema import failed.\n\nError:\n${error_log}" 22 76
+          return
+      }
+    fi
 
     DEPLOYMENT_TYPE="clean"
     save_env
@@ -430,6 +520,8 @@ import_schema_and_seed() {
 }
 
 manage_users_and_roles() {
+  DB_TARGET=$(choose_db_target "Apply user/role management to which database?") || return
+
   while true; do
     $DIALOG --clear \
       --title "Manage Users & Roles" \
@@ -481,11 +573,10 @@ create_role() {
 
   local sql="INSERT INTO roles (name, power) VALUES ('$name', $power);"
 
-  echo "$sql" | podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
-    mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME" >>"$LOG_FILE" 2>&1 || {
-      error_log=$(tail -20 "$LOG_FILE")
-      $DIALOG --title "Error" --msgbox "Failed to create role.\n\nError:\n${error_log}" 20 76
-      return 1
+  db_exec_sql "$sql" "$DB_TARGET" >>"$LOG_FILE" 2>&1 || {
+    error_log=$(tail -20 "$LOG_FILE")
+    $DIALOG --title "Error" --msgbox "Failed to create role.\n\nError:\n${error_log}" 20 76
+    return 1
   }
 
   $DIALOG --msgbox "Role '$name' created successfully!" 8 50
@@ -494,11 +585,9 @@ create_role() {
 delete_role() {
   # Fetch roles from the database
   local roles_list
-  roles_list=$(podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
-    mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME" \
-    -e "SELECT id, name, power FROM roles ORDER BY power DESC;" -s -N 2>>"$LOG_FILE") || {
-      $DIALOG --msgbox "Failed to fetch roles from database." 10 60
-      return
+  roles_list=$(db_query "SELECT id, name, power FROM roles ORDER BY power DESC;" "$DB_TARGET" 2>>"$LOG_FILE") || {
+    $DIALOG --msgbox "Failed to fetch roles from database." 10 60
+    return
   }
 
   # Build role selection menu
@@ -523,9 +612,7 @@ delete_role() {
 
   # Check if any users are using this role
   local user_count
-  user_count=$(podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
-    mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME" \
-    -e "SELECT COUNT(*) FROM users WHERE role_id = $selected_role_id;" -s -N 2>>"$LOG_FILE")
+  user_count=$(db_query "SELECT COUNT(*) FROM users WHERE role_id = $selected_role_id;" "$DB_TARGET" 2>>"$LOG_FILE")
   
   if [[ "$user_count" -gt 0 ]]; then
     $DIALOG --msgbox "Cannot delete role '$selected_role_name'.\n$user_count user(s) are currently assigned this role." 10 60
@@ -538,11 +625,10 @@ delete_role() {
   # Delete role
   local sql="DELETE FROM roles WHERE id = $selected_role_id;"
   
-  echo "$sql" | podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
-    mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME" >>"$LOG_FILE" 2>&1 || {
-      error_log=$(tail -20 "$LOG_FILE")
-      $DIALOG --title "Error" --msgbox "Failed to delete role.\n\nError:\n${error_log}" 20 76
-      return
+  db_exec_sql "$sql" "$DB_TARGET" >>"$LOG_FILE" 2>&1 || {
+    error_log=$(tail -20 "$LOG_FILE")
+    $DIALOG --title "Error" --msgbox "Failed to delete role.\n\nError:\n${error_log}" 20 76
+    return
   }
 
   $DIALOG --msgbox "Role '$selected_role_name' deleted successfully!" 8 60
@@ -551,11 +637,9 @@ delete_role() {
 create_user() {
   # Get available roles
   local roles_list
-  roles_list=$(podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
-    mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME" \
-    -e "SELECT id, name, power FROM roles ORDER BY power DESC;" -s -N 2>>"$LOG_FILE") || {
-      $DIALOG --msgbox "Failed to fetch roles from database.\nEnsure schema is imported and roles exist." 10 60
-      return
+  roles_list=$(db_query "SELECT id, name, power FROM roles ORDER BY power DESC;" "$DB_TARGET" 2>>"$LOG_FILE") || {
+    $DIALOG --msgbox "Failed to fetch roles from database.\nEnsure schema is imported and roles exist." 10 60
+    return
   }
 
   # Build role selection menu
@@ -621,11 +705,10 @@ create_user() {
   [[ -n "$phone" ]] && sql+="'$phone'" || sql+="NULL"
   sql+=", 1);"
 
-  echo "$sql" | podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
-    mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME" >>"$LOG_FILE" 2>&1 || {
-      error_log=$(tail -20 "$LOG_FILE")
-      $DIALOG --title "Error" --msgbox "Failed to create user.\n\nError:\n${error_log}" 20 76
-      return
+  db_exec_sql "$sql" "$DB_TARGET" >>"$LOG_FILE" 2>&1 || {
+    error_log=$(tail -20 "$LOG_FILE")
+    $DIALOG --title "Error" --msgbox "Failed to create user.\n\nError:\n${error_log}" 20 76
+    return
   }
 
   $DIALOG --msgbox "User '$username' created successfully!" 8 60
@@ -634,11 +717,9 @@ create_user() {
 delete_user() {
   # Fetch users from the database
   local users_list
-  users_list=$(podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
-    mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME" \
-    -e "SELECT id, username, name FROM users ORDER BY id;" -s -N 2>>"$LOG_FILE") || {
-      $DIALOG --msgbox "Failed to fetch users from database." 10 60
-      return
+  users_list=$(db_query "SELECT id, username, name FROM users ORDER BY id;" "$DB_TARGET" 2>>"$LOG_FILE") || {
+    $DIALOG --msgbox "Failed to fetch users from database." 10 60
+    return
   }
 
   # Build user selection menu
@@ -667,11 +748,10 @@ delete_user() {
   # Delete user
   local sql="DELETE FROM users WHERE id = $selected_user_id;"
   
-  echo "$sql" | podman exec -i "$BEEPZONE_DB_CONTAINER_NAME" \
-    mariadb -h"$DB_HOST" -P"$DB_PORT" -uroot -p"$DB_ROOT_PASSWORD" "$DB_NAME" >>"$LOG_FILE" 2>&1 || {
-      error_log=$(tail -20 "$LOG_FILE")
-      $DIALOG --title "Error" --msgbox "Failed to delete user.\n\nError:\n${error_log}" 20 76
-      return
+  db_exec_sql "$sql" "$DB_TARGET" >>"$LOG_FILE" 2>&1 || {
+    error_log=$(tail -20 "$LOG_FILE")
+    $DIALOG --title "Error" --msgbox "Failed to delete user.\n\nError:\n${error_log}" 20 76
+    return
   }
 
   $DIALOG --msgbox "User '$selected_username' deleted successfully!" 8 60