- Mise à jour VERSION vers 3.3.4 - Optimisations et révisions architecture API (deploy-api.sh, scripts de migration) - Ajout documentation Stripe Tap to Pay complète - Migration vers polices Inter Variable pour Flutter - Optimisations build Android et nettoyage fichiers temporaires - Amélioration système de déploiement avec gestion backups - Ajout scripts CRON et migrations base de données 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
273 lines
8.2 KiB
Bash
Executable File
273 lines
8.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
|
||
# =============================================================================
|
||
# BAO - Back-office Admin Operations
|
||
# Menu principal interactif pour gérer les données Geosector
|
||
# =============================================================================
|
||
|
||
set -euo pipefail
|
||
|
||
# Répertoire du script
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
BAO_ROOT="$(dirname "$SCRIPT_DIR")"
|
||
ENV_FILE="$BAO_ROOT/config/.env"
|
||
|
||
# Couleurs
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[0;33m'
|
||
BLUE='\033[0;34m'
|
||
MAGENTA='\033[0;35m'
|
||
CYAN='\033[0;36m'
|
||
BOLD='\033[1m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Fonctions d'affichage
|
||
log_info() {
|
||
echo -e "${BLUE}ℹ${NC} $*"
|
||
}
|
||
|
||
log_success() {
|
||
echo -e "${GREEN}✓${NC} $*"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}✗${NC} $*" >&2
|
||
}
|
||
|
||
log_warning() {
|
||
echo -e "${YELLOW}⚠${NC} $*"
|
||
}
|
||
|
||
# Affiche le titre principal
|
||
show_header() {
|
||
clear
|
||
echo -e "${CYAN}"
|
||
cat << "EOF"
|
||
╔════════════════════════════════════════════════════════════════╗
|
||
║ ║
|
||
║ ██████╗ █████╗ ██████╗ ║
|
||
║ ██╔══██╗██╔══██╗██╔═══██╗ ║
|
||
║ ██████╔╝███████║██║ ██║ ║
|
||
║ ██╔══██╗██╔══██║██║ ██║ ║
|
||
║ ██████╔╝██║ ██║╚██████╔╝ ║
|
||
║ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ║
|
||
║ ║
|
||
║ Back-office Admin Operations - Geosector ║
|
||
║ ║
|
||
╚════════════════════════════════════════════════════════════════╝
|
||
EOF
|
||
echo -e "${NC}\n"
|
||
}
|
||
|
||
# Charge une variable depuis .env
|
||
get_env_var() {
|
||
local key="$1"
|
||
grep "^${key}=" "$ENV_FILE" 2>/dev/null | cut -d'=' -f2- | tr -d ' "'
|
||
}
|
||
|
||
# Sélectionne l'environnement
|
||
select_environment() {
|
||
echo -e "${BOLD}Sélectionnez un environnement :${NC}\n"
|
||
|
||
local envs=()
|
||
local counter=1
|
||
|
||
for env in DEV REC PROD; do
|
||
local enabled=$(get_env_var "${env}_ENABLED")
|
||
if [[ "$enabled" == "true" ]]; then
|
||
local ssh_host=$(get_env_var "${env}_SSH_HOST")
|
||
echo -e " ${GREEN}${counter})${NC} ${BOLD}${env}${NC} (${ssh_host})"
|
||
envs+=("$env")
|
||
((counter++))
|
||
else
|
||
echo -e " ${YELLOW}-${NC} ${env} ${YELLOW}(désactivé)${NC}"
|
||
fi
|
||
done
|
||
|
||
echo -e " ${RED}q)${NC} Quitter\n"
|
||
|
||
while true; do
|
||
read -p "Votre choix: " choice
|
||
|
||
if [[ "$choice" == "q" || "$choice" == "Q" ]]; then
|
||
echo ""
|
||
log_info "Au revoir !"
|
||
exit 0
|
||
fi
|
||
|
||
if [[ "$choice" =~ ^[0-9]+$ ]] && [[ $choice -ge 1 ]] && [[ $choice -le ${#envs[@]} ]]; then
|
||
SELECTED_ENV="${envs[$((choice-1))]}"
|
||
return 0
|
||
fi
|
||
|
||
log_error "Choix invalide"
|
||
done
|
||
}
|
||
|
||
# Affiche le menu des actions
|
||
show_action_menu() {
|
||
echo -e "\n${BOLD}═══════════════════════════════════════════════════════════════${NC}"
|
||
echo -e "${BOLD}Environnement: ${GREEN}${SELECTED_ENV}${NC}"
|
||
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}\n"
|
||
|
||
echo -e "${BOLD}Actions disponibles :${NC}\n"
|
||
|
||
echo -e " ${CYAN}1)${NC} Lister les utilisateurs"
|
||
echo -e " ${CYAN}2)${NC} Décrypter un utilisateur spécifique"
|
||
echo -e " ${CYAN}3)${NC} Rechercher par email"
|
||
echo -e " ${CYAN}4)${NC} Lister les entités (amicales)"
|
||
echo -e " ${CYAN}5)${NC} Décrypter une entité spécifique"
|
||
echo -e " ${CYAN}6)${NC} État des tunnels SSH"
|
||
echo -e " ${CYAN}7)${NC} Fermer tous les tunnels"
|
||
echo -e " ${YELLOW}8)${NC} Changer d'environnement"
|
||
echo -e " ${RED}q)${NC} Quitter\n"
|
||
}
|
||
|
||
# Execute une action
|
||
execute_action() {
|
||
local action="$1"
|
||
|
||
case "$action" in
|
||
1)
|
||
echo ""
|
||
read -p "Filtrer par entité ? (ID ou vide): " entite_filter
|
||
read -p "Filtrer par rôle ? (ID ou vide): " role_filter
|
||
read -p "Limite de résultats ? (défaut: 50): " limit_input
|
||
|
||
local cmd="$SCRIPT_DIR/list-users $SELECTED_ENV"
|
||
[[ -n "$entite_filter" ]] && cmd="$cmd --entite=$entite_filter"
|
||
[[ -n "$role_filter" ]] && cmd="$cmd --role=$role_filter"
|
||
[[ -n "$limit_input" ]] && cmd="$cmd --limit=$limit_input"
|
||
|
||
echo ""
|
||
$cmd
|
||
;;
|
||
|
||
2)
|
||
echo ""
|
||
read -p "ID de l'utilisateur: " user_id
|
||
|
||
if [[ -z "$user_id" || ! "$user_id" =~ ^[0-9]+$ ]]; then
|
||
log_error "ID invalide"
|
||
return 1
|
||
fi
|
||
|
||
echo ""
|
||
"$SCRIPT_DIR/decrypt-user" "$SELECTED_ENV" "$user_id"
|
||
;;
|
||
|
||
3)
|
||
echo ""
|
||
read -p "Email à rechercher: " email
|
||
|
||
if [[ -z "$email" ]]; then
|
||
log_error "Email vide"
|
||
return 1
|
||
fi
|
||
|
||
echo ""
|
||
"$SCRIPT_DIR/search-email" "$SELECTED_ENV" "$email"
|
||
;;
|
||
|
||
4)
|
||
echo ""
|
||
read -p "Uniquement les entités avec Stripe ? (o/N): " stripe_filter
|
||
read -p "Limite de résultats ? (défaut: 50): " limit_input
|
||
|
||
local cmd="$SCRIPT_DIR/list-entites $SELECTED_ENV"
|
||
[[ "$stripe_filter" == "o" || "$stripe_filter" == "O" ]] && cmd="$cmd --stripe"
|
||
[[ -n "$limit_input" ]] && cmd="$cmd --limit=$limit_input"
|
||
|
||
echo ""
|
||
$cmd
|
||
;;
|
||
|
||
5)
|
||
echo ""
|
||
read -p "ID de l'entité: " entite_id
|
||
|
||
if [[ -z "$entite_id" || ! "$entite_id" =~ ^[0-9]+$ ]]; then
|
||
log_error "ID invalide"
|
||
return 1
|
||
fi
|
||
|
||
echo ""
|
||
"$SCRIPT_DIR/decrypt-entite" "$SELECTED_ENV" "$entite_id"
|
||
;;
|
||
|
||
6)
|
||
echo ""
|
||
"$SCRIPT_DIR/_ssh-tunnel.sh" status
|
||
;;
|
||
|
||
7)
|
||
echo ""
|
||
"$SCRIPT_DIR/_ssh-tunnel.sh" close-all
|
||
;;
|
||
|
||
8)
|
||
return 2 # Signal pour changer d'environnement
|
||
;;
|
||
|
||
q|Q)
|
||
echo ""
|
||
log_info "Fermeture des tunnels..."
|
||
"$SCRIPT_DIR/_ssh-tunnel.sh" close-all
|
||
echo ""
|
||
log_success "Au revoir !"
|
||
exit 0
|
||
;;
|
||
|
||
*)
|
||
log_error "Action invalide"
|
||
return 1
|
||
;;
|
||
esac
|
||
|
||
return 0
|
||
}
|
||
|
||
# Boucle principale
|
||
main() {
|
||
if [[ ! -f "$ENV_FILE" ]]; then
|
||
log_error "Fichier .env introuvable: $ENV_FILE"
|
||
log_info "Copiez config/.env.example vers config/.env"
|
||
exit 1
|
||
fi
|
||
|
||
# Vérifier que PHP est installé
|
||
if ! command -v php >/dev/null 2>&1; then
|
||
log_error "PHP n'est pas installé"
|
||
exit 1
|
||
fi
|
||
|
||
while true; do
|
||
show_header
|
||
select_environment
|
||
|
||
while true; do
|
||
show_header
|
||
show_action_menu
|
||
|
||
read -p "Votre choix: " action
|
||
|
||
execute_action "$action"
|
||
local exit_code=$?
|
||
|
||
if [[ $exit_code -eq 2 ]]; then
|
||
# Changer d'environnement
|
||
break
|
||
fi
|
||
|
||
echo ""
|
||
read -p "Appuyez sur Entrée pour continuer..."
|
||
done
|
||
done
|
||
}
|
||
|
||
# Gestion de Ctrl+C
|
||
trap 'echo ""; log_info "Fermeture des tunnels..."; $SCRIPT_DIR/_ssh-tunnel.sh close-all 2>/dev/null; echo ""; exit 0' INT
|
||
|
||
main "$@"
|