-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsetup-hosts.sh
More file actions
executable file
·196 lines (174 loc) · 5.86 KB
/
Copy pathsetup-hosts.sh
File metadata and controls
executable file
·196 lines (174 loc) · 5.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
#!/usr/bin/env bash
# ═══════════════════════════════════════════════════════════════
# setup-hosts.sh — Ajoute les domaines *.local dans /etc/hosts
# Usage : sudo bash setup-hosts.sh
# ═══════════════════════════════════════════════════════════════
set -e
# Génération du fichier .env s'il n'existe pas
if [ ! -f ".env" ] && [ -f ".env.example" ]; then
echo "🆕 Création du fichier .env à partir de .env.example..."
if [ -n "$SUDO_USER" ]; then
sudo -u "$SUDO_USER" cp .env.example .env
else
cp .env.example .env
fi
echo "⚠️ N'oublie pas de vérifier et modifier les mots de passe dans .env si nécessaire !"
echo ""
fi
MARKER="# ── devstack local domains ──"
# Génération du fichier openapi dummy s'il n'existe pas
if [ ! -f "openapi/openapi.json" ]; then
echo "🆕 Création d'un fichier openapi.json dummy..."
mkdir -p openapi
cat << 'EOF' > openapi/openapi.json
{
"openapi": "3.0.0",
"info": {
"title": "Dummy API",
"version": "1.0.0"
},
"paths": {
"/ping": {
"get": {
"summary": "Ping endpoint",
"responses": {
"200": {
"description": "OK",
"content": {
"application/json": {
"schema": {
"type": "string",
"example": "pong"
}
}
}
}
}
}
}
}
}
EOF
# Ajuster les permissions si exécuté avec sudo
if [ -n "$SUDO_USER" ]; then
chown -R "$SUDO_USER" openapi
fi
fi
if [ -f ".env" ]; then
# Sourcing .env pour que Python lise COMPOSE_PROFILES et DOMAIN_SUFFIX
set -a
source .env
set +a
fi
echo "🔍 Analyse du docker-compose.yml pour extraire les domaines dynamiquement..."
if command -v python3 &> /dev/null; then
DOMAINS_STR=$(docker compose config --format json 2>/dev/null | python3 -c '
import sys, json, os, re
try:
data = json.load(sys.stdin)
except Exception:
sys.exit(0)
active_profiles_str = os.getenv("COMPOSE_PROFILES", "")
active_profiles = [p.strip() for p in active_profiles_str.split(",") if p.strip()]
active_domains = set()
all_domains = set()
for s_name, service in data.get("services", {}).items():
s_profiles = service.get("profiles", [])
is_active = not active_profiles or not s_profiles or any(p in active_profiles for p in s_profiles)
for k, v in service.get("labels", {}).items():
if k.startswith("traefik.http.routers.") and k.endswith(".rule"):
match = re.search(r"Host\(`([^`]+)`\)", v)
if match:
domain = match.group(1)
all_domains.add(domain)
if is_active:
active_domains.add(domain)
ignored_domains = all_domains - active_domains
for d in sorted(list(active_domains)):
print(f"ACTIVE:{d}")
for d in sorted(list(ignored_domains)):
print(f"IGNORED:{d}")
')
else
echo "⚠️ ATTENTION : Python 3 n'\''est pas installé sur votre système."
echo "👉 L'\''absence de Python empêche le script de filtrer intelligemment les domaines selon vos profils actifs."
echo "👉 Tous les domaines seront ajoutés par défaut à votre fichier hosts."
echo "💡 Conseil : Installez Python 3 et relancez ce script pour garder votre fichier hosts propre et léger !"
echo ""
DOMAINS_RAW=$(grep -oE "Host\(\`[^\`]+\`\)" docker-compose.yml | cut -d"\`" -f2 | sort -u)
DOMAINS_STR=$(for d in $DOMAINS_RAW; do echo "ACTIVE:$d"; done)
fi
if [ -z "$DOMAINS_STR" ]; then
echo "❌ Erreur: Impossible de lire les domaines depuis docker-compose. Assurez-vous que docker-compose fonctionne."
exit 1
fi
ACTIVE_DOMAINS=()
IGNORED_DOMAINS=()
while IFS= read -r line; do
if [[ "$line" == ACTIVE:* ]]; then
ACTIVE_DOMAINS+=("${line#ACTIVE:}")
elif [[ "$line" == IGNORED:* ]]; then
IGNORED_DOMAINS+=("${line#IGNORED:}")
fi
done <<< "$DOMAINS_STR"
if [ "$EUID" -ne 0 ]; then
echo "❌ Lance ce script avec sudo : sudo bash setup-hosts.sh"
exit 1
fi
OLD_DOMAINS=()
if grep -q "$MARKER" /etc/hosts; then
# Extraire les anciens domaines avant de les supprimer
OLD_DOMAINS_STR=$(sed -n "/^${MARKER}$/,/^${MARKER} END$/p" /etc/hosts | grep -E "^127\.0\.0\.1" | awk '{print $2}')
while IFS= read -r line; do
if [ -n "$line" ]; then
OLD_DOMAINS+=("$line")
fi
done <<< "$OLD_DOMAINS_STR"
echo "🔄 Nettoyage des anciennes entrées devstack…"
# macOS et Linux compatibles, suppression par bloc exact
if [ "$(uname)" = "Darwin" ]; then
sed -i '' "/^${MARKER}$/,/^${MARKER} END$/d" /etc/hosts
else
sed -i "/^${MARKER}$/,/^${MARKER} END$/d" /etc/hosts
fi
fi
REMOVED_DOMAINS=()
for old in "${OLD_DOMAINS[@]}"; do
found=0
for active in "${ACTIVE_DOMAINS[@]}"; do
if [ "$old" = "$active" ]; then
found=1
break
fi
done
if [ $found -eq 0 ]; then
REMOVED_DOMAINS+=("$old")
fi
done
# Ajoute les nouvelles entrées
echo "" >> /etc/hosts
echo "$MARKER" >> /etc/hosts
for domain in "${ACTIVE_DOMAINS[@]}"; do
echo "127.0.0.1 $domain" >> /etc/hosts
done
echo "$MARKER END" >> /etc/hosts
echo "✅ Domaines actifs configurés dans /etc/hosts :"
for domain in "${ACTIVE_DOMAINS[@]}"; do
echo " 🟢 http://$domain"
done
if [ ${#IGNORED_DOMAINS[@]} -gt 0 ]; then
echo ""
echo "⏸️ Domaines inactifs (ignorés car profils non activés) :"
for domain in "${IGNORED_DOMAINS[@]}"; do
echo " ⚪ http://$domain"
done
fi
if [ ${#REMOVED_DOMAINS[@]} -gt 0 ]; then
echo ""
echo "🗑️ Domaines supprimés de /etc/hosts (n'étaient plus actifs) :"
for domain in "${REMOVED_DOMAINS[@]}"; do
echo " 🔴 http://$domain"
done
fi
echo ""
echo "🚀 Lance maintenant : docker compose up -d"