Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 69 additions & 0 deletions cmdbuild/01_extract_war.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#!/usr/bin/env bash
# Extrait un WAR CMDBuild dans un répertoire de travail pour modification de l'IHM.
# Usage : ./01_extract_war.sh <fichier.war> [dossier_cible]
#
# Le WAR est une archive ZIP standard. On extrait tout, puis on identifie
# les artefacts UI (HTML/JS/CSS/resources) séparément des JARs/classes Java
# afin de ne recompiler que ce qui est nécessaire.

set -euo pipefail

WAR_FILE="${1:-}"
TARGET_DIR="${2:-./cmdbuild-exploded}"

if [[ -z "$WAR_FILE" ]]; then
echo "Usage: $0 <fichier.war> [dossier_cible]"
echo ""
echo "Exemple :"
echo " $0 cmdbuild-3.4.war ./cmdbuild-exploded"
exit 1
fi

if [[ ! -f "$WAR_FILE" ]]; then
echo "ERREUR : Le fichier WAR '$WAR_FILE' n'existe pas."
exit 1
fi

WAR_ABS=$(realpath "$WAR_FILE")
WAR_NAME=$(basename "$WAR_FILE" .war)

echo "=== Extraction du WAR CMDBuild ==="
echo "Source : $WAR_ABS"
echo "Cible : $TARGET_DIR"
echo ""

# Créer le répertoire cible
mkdir -p "$TARGET_DIR"

# Extraire le WAR (= ZIP)
unzip -q -o "$WAR_ABS" -d "$TARGET_DIR"

echo "[OK] WAR extrait dans : $TARGET_DIR"
echo ""

# Inventaire des ressources UI (tout ce qui n'est pas Java)
UI_MANIFEST="$TARGET_DIR/../ui-files.txt"
echo "=== Inventaire des fichiers UI ==="
find "$TARGET_DIR" \
-not -path "*/WEB-INF/lib/*" \
-not -path "*/WEB-INF/classes/*" \
-not -name "*.jar" \
-not -name "*.class" \
-type f \
| sort > "$UI_MANIFEST"

UI_COUNT=$(wc -l < "$UI_MANIFEST")
echo "[OK] $UI_COUNT fichiers UI répertoriés dans : $UI_MANIFEST"
echo ""

# Résumé de la structure
echo "=== Structure du répertoire extrait ==="
if command -v tree &>/dev/null; then
tree -L 3 --dirsfirst "$TARGET_DIR" 2>/dev/null | head -60
else
find "$TARGET_DIR" -maxdepth 3 -type d | sort | sed "s|$TARGET_DIR||" | sed 's|^/||'
fi

echo ""
echo "Prochaine étape : modifiez les fichiers UI dans '$TARGET_DIR'"
echo "Puis lancez : ./02_repackage_war.sh $TARGET_DIR $WAR_NAME-modified.war"
54 changes: 54 additions & 0 deletions cmdbuild/02_repackage_war.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#!/usr/bin/env bash
# Repackage un répertoire WAR extrait en un nouveau fichier WAR.
# Usage : ./02_repackage_war.sh <dossier_exploded> <nouveau.war>
#
# Seuls les fichiers UI modifiés sont re-zippés avec les JARs/classes
# d'origine — aucune recompilation Maven nécessaire.

set -euo pipefail

EXPLODED_DIR="${1:-}"
OUTPUT_WAR="${2:-}"

if [[ -z "$EXPLODED_DIR" || -z "$OUTPUT_WAR" ]]; then
echo "Usage: $0 <dossier_exploded> <nouveau.war>"
echo ""
echo "Exemple :"
echo " $0 ./cmdbuild-exploded ./cmdbuild-modified.war"
exit 1
fi

if [[ ! -d "$EXPLODED_DIR" ]]; then
echo "ERREUR : Le répertoire '$EXPLODED_DIR' n'existe pas."
exit 1
fi

OUTPUT_ABS=$(realpath -m "$OUTPUT_WAR")
EXPLODED_ABS=$(realpath "$EXPLODED_DIR")

echo "=== Repackaging WAR CMDBuild ==="
echo "Source : $EXPLODED_ABS"
echo "Sortie : $OUTPUT_ABS"
echo ""

# Supprimer le WAR de sortie s'il existe déjà
[[ -f "$OUTPUT_ABS" ]] && rm -f "$OUTPUT_ABS"

# Repackager depuis le répertoire exploded
# jar/zip doit être lancé depuis le répertoire lui-même pour avoir
# les chemins relatifs corrects dans l'archive.
(
cd "$EXPLODED_ABS"
zip -q -r "$OUTPUT_ABS" .
)

SIZE=$(du -sh "$OUTPUT_ABS" | cut -f1)
echo "[OK] WAR généré : $OUTPUT_ABS ($SIZE)"
echo ""
echo "=== Vérification du contenu ==="
unzip -l "$OUTPUT_ABS" | tail -5

echo ""
echo "Déployez ce WAR dans Tomcat (webapps/) ou utilisez le mode"
echo "exploded avec le script 03_deploy_exploded.sh pour recharger"
echo "à chaud sans redémarrer Tomcat."
94 changes: 94 additions & 0 deletions cmdbuild/03_deploy_exploded.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#!/usr/bin/env bash
# Déploie le répertoire WAR extrait directement dans Tomcat en mode "exploded"
# (sans repackager le WAR). Tomcat recharge les ressources statiques à chaud.
#
# Usage : ./03_deploy_exploded.sh <dossier_exploded> [tomcat_webapps] [context_name]
#
# Exemple :
# ./03_deploy_exploded.sh ./cmdbuild-exploded /opt/tomcat/webapps cmdbuild
#
# En mode exploded, Tomcat sert directement les fichiers depuis le dossier —
# toute modification de JS/CSS/HTML est visible sans redémarrage.

set -euo pipefail

EXPLODED_DIR="${1:-}"
TOMCAT_WEBAPPS="${2:-/opt/tomcat/webapps}"
CONTEXT_NAME="${3:-cmdbuild}"

if [[ -z "$EXPLODED_DIR" ]]; then
echo "Usage: $0 <dossier_exploded> [tomcat_webapps] [context_name]"
echo ""
echo "Exemples :"
echo " $0 ./cmdbuild-exploded /opt/tomcat/webapps cmdbuild"
echo " $0 ./cmdbuild-exploded /var/lib/tomcat9/webapps cmdbuild"
exit 1
fi

if [[ ! -d "$EXPLODED_DIR" ]]; then
echo "ERREUR : Le répertoire '$EXPLODED_DIR' n'existe pas."
echo "Lancez d'abord : ./01_extract_war.sh <fichier.war> $EXPLODED_DIR"
exit 1
fi

if [[ ! -d "$TOMCAT_WEBAPPS" ]]; then
echo "ERREUR : Le répertoire webapps Tomcat '$TOMCAT_WEBAPPS' n'existe pas."
echo "Vérifiez le chemin d'installation de Tomcat."
exit 1
fi

DEPLOY_TARGET="$TOMCAT_WEBAPPS/$CONTEXT_NAME"
EXPLODED_ABS=$(realpath "$EXPLODED_DIR")

echo "=== Déploiement exploded CMDBuild ==="
echo "Source : $EXPLODED_ABS"
echo "Destination : $DEPLOY_TARGET"
echo "Contexte : /$CONTEXT_NAME"
echo ""

# Supprimer l'ancien WAR éventuellement présent (Tomcat préfère le dossier)
WAR_IN_WEBAPPS="$TOMCAT_WEBAPPS/$CONTEXT_NAME.war"
if [[ -f "$WAR_IN_WEBAPPS" ]]; then
echo "[INFO] Suppression du WAR existant : $WAR_IN_WEBAPPS"
rm -f "$WAR_IN_WEBAPPS"
fi

# Copier (ou créer un lien symbolique) le répertoire exploded
if [[ -L "$DEPLOY_TARGET" ]]; then
echo "[INFO] Le lien symbolique existe déjà, mise à jour..."
ln -sfn "$EXPLODED_ABS" "$DEPLOY_TARGET"
elif [[ -d "$DEPLOY_TARGET" ]]; then
echo "[INFO] Répertoire existant détecté — synchronisation avec rsync..."
rsync -a --delete "$EXPLODED_ABS/" "$DEPLOY_TARGET/"
else
echo "[INFO] Création du lien symbolique..."
ln -s "$EXPLODED_ABS" "$DEPLOY_TARGET"
fi

echo "[OK] Déploiement terminé."
echo ""

# Optionnel : recharger le contexte Tomcat via manager si disponible
TOMCAT_MANAGER="${TOMCAT_MANAGER_URL:-}"
if [[ -n "$TOMCAT_MANAGER" ]]; then
echo "=== Rechargement du contexte Tomcat ==="
TOMCAT_USER="${TOMCAT_MANAGER_USER:-admin}"
TOMCAT_PASS="${TOMCAT_MANAGER_PASS:-admin}"
curl -s -u "$TOMCAT_USER:$TOMCAT_PASS" \
"$TOMCAT_MANAGER/text/reload?path=/$CONTEXT_NAME" \
&& echo "[OK] Contexte rechargé." \
|| echo "[WARN] Rechargement automatique échoué — redémarrez Tomcat manuellement."
else
echo "=== Information ==="
echo "Pour recharger le contexte sans redémarrer Tomcat, définissez :"
echo " TOMCAT_MANAGER_URL=http://localhost:8080/manager"
echo " TOMCAT_MANAGER_USER=admin"
echo " TOMCAT_MANAGER_PASS=votre_mot_de_passe"
echo ""
echo "Ou rechargez manuellement :"
echo " curl -u admin:pass http://localhost:8080/manager/text/reload?path=/$CONTEXT_NAME"
fi

echo ""
echo "L'application est accessible à : http://localhost:8080/$CONTEXT_NAME"
echo "Les modifications UI sont prises en compte immédiatement (mode exploded)."
116 changes: 116 additions & 0 deletions cmdbuild/04_watch_ui.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
#!/usr/bin/env bash
# Surveille les modifications de fichiers UI dans le répertoire source
# et les synchronise automatiquement vers le répertoire exploded (ou Tomcat).
#
# Usage : ./04_watch_ui.sh <dossier_source_ui> <dossier_cible>
#
# Prérequis : inotify-tools (Linux) ou fswatch (macOS)
# Linux : sudo apt-get install inotify-tools
# macOS : brew install fswatch
#
# Exemples :
# ./04_watch_ui.sh ./src/ui ./cmdbuild-exploded
# ./04_watch_ui.sh ./cmdbuild-exploded /opt/tomcat/webapps/cmdbuild

set -euo pipefail

SOURCE_DIR="${1:-}"
TARGET_DIR="${2:-}"

if [[ -z "$SOURCE_DIR" || -z "$TARGET_DIR" ]]; then
echo "Usage: $0 <dossier_source_ui> <dossier_cible>"
echo ""
echo "Exemples :"
echo " $0 ./src/ui ./cmdbuild-exploded"
echo " $0 ./cmdbuild-exploded /opt/tomcat/webapps/cmdbuild"
exit 1
fi

if [[ ! -d "$SOURCE_DIR" ]]; then
echo "ERREUR : Le répertoire source '$SOURCE_DIR' n'existe pas."
exit 1
fi

if [[ ! -d "$TARGET_DIR" ]]; then
echo "ERREUR : Le répertoire cible '$TARGET_DIR' n'existe pas."
exit 1
fi

SOURCE_ABS=$(realpath "$SOURCE_DIR")
TARGET_ABS=$(realpath "$TARGET_DIR")

# Extensions UI à surveiller
UI_EXTENSIONS="html|js|css|less|scss|json|xml|png|jpg|gif|svg|ico|woff|woff2|ttf|eot"

echo "=== Surveillance des modifications UI ==="
echo "Source : $SOURCE_ABS"
echo "Cible : $TARGET_ABS"
echo "Types : $UI_EXTENSIONS"
echo ""
echo "Appuyez sur Ctrl+C pour arrêter."
echo ""

sync_file() {
local file="$1"
local rel_path="${file#$SOURCE_ABS/}"
local dest="$TARGET_ABS/$rel_path"
mkdir -p "$(dirname "$dest")"
cp -f "$file" "$dest"
echo "[$(date '+%H:%M:%S')] Synchronisé : $rel_path"
}

# Détecter l'outil de surveillance disponible
if command -v inotifywait &>/dev/null; then
# Linux : inotify-tools
echo "[INFO] Utilisation de inotifywait (Linux)"
inotifywait -m -r -e close_write,moved_to,create "$SOURCE_ABS" \
--format '%w%f' \
| while IFS= read -r changed_file; do
# Filtrer par extension
ext="${changed_file##*.}"
if echo "$ext" | grep -qiE "^($UI_EXTENSIONS)$"; then
sync_file "$changed_file"
fi
done

elif command -v fswatch &>/dev/null; then
# macOS ou Linux avec fswatch
echo "[INFO] Utilisation de fswatch"
fswatch -r "$SOURCE_ABS" | while IFS= read -r changed_file; do
if [[ -f "$changed_file" ]]; then
ext="${changed_file##*.}"
if echo "$ext" | grep -qiE "^($UI_EXTENSIONS)$"; then
sync_file "$changed_file"
fi
fi
done

else
# Fallback : polling toutes les 2 secondes
echo "[WARN] inotifywait et fswatch non trouvés — mode polling (2s)"
echo " Installez inotify-tools pour une surveillance temps réel :"
echo " sudo apt-get install inotify-tools"
echo ""

declare -A file_mtimes

# Initialiser les mtimes
while IFS= read -r -d '' f; do
file_mtimes["$f"]=$(stat -c '%Y' "$f" 2>/dev/null || echo 0)
done < <(find "$SOURCE_ABS" -type f -print0)

while true; do
while IFS= read -r -d '' f; do
mtime=$(stat -c '%Y' "$f" 2>/dev/null || echo 0)
prev="${file_mtimes[$f]:-0}"
if [[ "$mtime" != "$prev" ]]; then
file_mtimes["$f"]="$mtime"
ext="${f##*.}"
if echo "$ext" | grep -qiE "^($UI_EXTENSIONS)$"; then
sync_file "$f"
fi
fi
done < <(find "$SOURCE_ABS" -type f -print0)
sleep 2
done
fi
Loading