Showing 5 changed files with 41 additions and 34 deletions
+2 -2
.doc/host-manager.md
@@ -70,7 +70,7 @@ http://hosts.madagascar.xdev.ro/
70 70
 Secretul TOTP nu este în repo. Pentru bootstrap, citește URI-ul root-only de pe jumper:
71 71
 
72 72
 ```bash
73
-ssh is-vpn-gw 'cat /etc/xdev/host-manager.totp-uri'
73
+ssh jumper.madagascar.xdev.ro 'cat /etc/xdev/host-manager.totp-uri'
74 74
 ```
75 75
 
76 76
 ## OTP
@@ -84,7 +84,7 @@ Secretul nu se comite în repo. Dacă avem nevoie de integrare cu un manager de
84 84
 1. Hosturile se editează în aplicație sau direct în `config/hosts.yaml`.
85 85
 2. Operatorii autentificați pot descărca `/download/hosts.yaml`, `/download/local-hosts.tsv` sau `/download/monitoring.json`.
86 86
 3. Pentru DNS local, butonul `Write local-hosts.tsv` regenerează `config/local-hosts.tsv`.
87
-4. Sincronizarea efectivă către is-vpn-gw și as01 rămâne:
87
+4. Sincronizarea efectivă către jumper și as01 rămâne:
88 88
 
89 89
 ```bash
90 90
 ./scripts/sync_local_hosts.sh --apply --verify
+13 -11
.doc/local-hosts.md
@@ -1,6 +1,8 @@
1 1
 # Adăugare hosturi locale — madagascar network
2 2
 
3
-Rețeaua madagascar folosește un **DNS intern dual**: is-vpn-gw (192.168.2.100) ca resolver principal și as01 (192.168.2.2) ca fallback. Un hostname nou trebuie adăugat în **ambele locuri**.
3
+Rețeaua madagascar folosește un **DNS intern dual**: jumper (192.168.2.100) ca resolver principal și as01 (192.168.2.2) ca fallback. Un hostname nou trebuie adăugat în **ambele locuri**.
4
+
5
+Numele vechi `is-vpn-gw` este deprecated. Folosește `jumper` sau `jumper.madagascar.xdev.ro` în scripturi și documentație.
4 6
 
5 7
 Regula importantă: local nu se folosește wildcard pentru `*.madagascar.xdev.ro`. Doar hostname-urile cunoscute din `config/local-hosts.tsv` se rezolvă local; orice nume necunoscut, inclusiv typo-uri precum `nohost.madagascar.xdev.ro`, trebuie să întoarcă `NXDOMAIN`.
6 8
 
@@ -8,15 +10,15 @@ Domeniul vechi `.vad.is.xdev.ro` este deprecated. Nu se adaugă intrări noi pen
8 10
 
9 11
 ## De ce dual?
10 12
 
11
-is-vpn-gw este sus pe "lista de sacrificiu" la power outage — poate fi oprit deliberat. Fără intrările de pe as01, clienții nu pot rezolva hostname-urile interne când jumper e oprit.
13
+Jumper este sus pe "lista de sacrificiu" la power outage — poate fi oprit deliberat. Fără intrările de pe as01, clienții nu pot rezolva hostname-urile interne când jumper e oprit.
12 14
 
13 15
 ## Unde se adaugă
14 16
 
15 17
 | Loc | Fișier | Rol |
16 18
 |-----|--------|-----|
17
-| is-vpn-gw `/etc/hosts` | resolver principal, precedență maximă față de dnscrypt-proxy | Funcționează și când dnscrypt-proxy e down |
18
-| is-vpn-gw `/etc/dnscrypt-proxy/cloaking-rules.txt` | servit clienților LAN prin dnscrypt-proxy | Clienții care cer DNS la 192.168.2.100 primesc IP-ul intern |
19
-| as01 `/ip dns static` (MikroTik) | fallback când is-vpn-gw e oprit | as01 servește direct din cache static propriu |
19
+| jumper `/etc/hosts` | resolver principal, precedență maximă față de dnscrypt-proxy | Funcționează și când dnscrypt-proxy e down |
20
+| jumper `/etc/dnscrypt-proxy/cloaking-rules.txt` | servit clienților LAN prin dnscrypt-proxy | Clienții care cer DNS la 192.168.2.100 primesc IP-ul intern |
21
+| as01 `/ip dns static` (MikroTik) | fallback când jumper e oprit | as01 servește direct din cache static propriu |
20 22
 
21 23
 Zona publică poate avea nume Madagascar care ajung la IP-ul public `89.32.222.226`. Pentru LAN, fiecare nume real care există și local trebuie să aibă override exact în ambele resolvere, altfel va cădea în DNS public și va ajunge greșit la `.226`.
22 24
 
@@ -36,7 +38,7 @@ Când inventarele se contrazic, ordinea de încredere este:
36 38
 
37 39
 1. DHCP lease/reservation pe router (`admin@192.168.2.1`) — autoritatea pentru alocarea IP-urilor pe LAN. Configurațiile statice locale nu au voie să mute un IP peste DHCP; cel mult semnalează o rezervare lipsă sau o intrare veche.
38 40
 2. `cluster/cluster-context/madagascar.json` — autoritatea pentru roluri, topologie și IP-uri de serviciu. Pentru nodurile Proxmox, DNS-ul de serviciu poate folosi interfața `thunderbridge` (`192.168.10.x`) chiar dacă management/WAN este `192.168.2.x`.
39
-3. `config/local-hosts.tsv` — manifestul DNS local publicat pe is-vpn-gw și as01. Acesta trebuie să fie derivat sau validat din DHCP plus topologia clusterului, nu folosit ca sursă primară de alocare IP.
41
+3. `config/local-hosts.tsv` — manifestul DNS local publicat pe jumper și as01. Acesta trebuie să fie derivat sau validat din DHCP plus topologia clusterului, nu folosit ca sursă primară de alocare IP.
40 42
 4. `hosts-local.yaml` — inventar SSH: aliasuri, utilizatori, entrypoint-uri și căi de acces. IP-urile de aici sunt utile pentru audit, dar pot fi stale dacă DHCP spune altceva.
41 43
 5. mDNS (`*.local`) — sursă observată de descoperire și validare. Confirmă prezența unui host sau propune aliasuri, dar nu creează automat intrări `madagascar.xdev.ro`.
42 44
 6. DNS public — folosit doar pentru acces extern. Local, numele interne trebuie shadow-uite exact sau lăsate nerezolvate; wildcard-ul public nu este autoritate pentru LAN.
@@ -49,7 +51,7 @@ Reguli de împăcare:
49 51
 - Prefixele istorice `is-`, `vad-` și `b-` se elimină la normalizarea numelor. `.vad.is.xdev.ro` rămâne deprecated și nu se reactivează prin aliasuri.
50 52
 - Dacă o sursă observată există doar în mDNS sau doar în lease-uri dinamice, se raportează ca propunere, nu se sincronizează automat în DNS.
51 53
 
52
-Pe `is-vpn-gw`, LAN-ul trebuie servit direct de `dnscrypt-proxy` pe `192.168.2.100:53`. `systemd-resolved` rămâne doar stub local și trebuie să aibă `ReadEtcHosts=no` plus upstream unic `DNS=127.0.0.1:5300`. Altfel fie publică intrările din `/etc/hosts` către clienții LAN, fie ocolește cloaking-rules și întreabă DNS public direct. Scriptul de sync verifică și aplică aceste setări.
54
+Pe jumper, LAN-ul trebuie servit direct de `dnscrypt-proxy` pe `192.168.2.100:53`. `systemd-resolved` rămâne doar stub local și trebuie să aibă `ReadEtcHosts=no` plus upstream unic `DNS=127.0.0.1:5300`. Altfel fie publică intrările din `/etc/hosts` către clienții LAN, fie ocolește cloaking-rules și întreabă DNS public direct. Scriptul de sync verifică și aplică aceste setări.
53 55
 
54 56
 `dnscrypt-proxy` folosește blocklist; `google.com` și `www.google.com` sunt allowlist-uite explicit ca să nu fie întoarse ca `0.0.0.0`.
55 57
 
@@ -76,7 +78,7 @@ Aplică și verifică:
76 78
 ./scripts/sync_local_hosts.sh --apply --verify
77 79
 
78 80
 # 3. Verificare manuală, dacă e nevoie
79
-dig @192.168.2.100 host.madagascar.xdev.ro +short   # via is-vpn-gw
81
+dig @192.168.2.100 host.madagascar.xdev.ro +short   # via jumper
80 82
 dig @192.168.2.2   host.madagascar.xdev.ro +short   # via as01
81 83
 
82 84
 # 4. Verificare negativă: numele inexistente nu trebuie să se rezolve
@@ -88,10 +90,10 @@ Comenzile negative de mai sus trebuie să întoarcă output gol, iar cu `+commen
88 90
 
89 91
 ## Hosturi speciale — excepții
90 92
 
91
-| Hostname | /etc/hosts pe is-vpn-gw | cloaking-rules | Motiv |
93
+| Hostname | /etc/hosts pe jumper | cloaking-rules | Motiv |
92 94
 |----------|------------------------|----------------|-------|
93
-| `mazeri.madagascar.xdev.ro` | 192.168.2.102 | 192.168.2.102 | Mașina Debian la .102, separată de is-vpn-gw chiar dacă Exim folosește acest hostname |
94
-| `jumper.madagascar.xdev.ro` | 127.0.0.1 | 192.168.2.100 | is-vpn-gw se referă la sine prin loopback (necesar pentru Exim local delivery); clienții LAN primesc IP-ul real |
95
+| `mazeri.madagascar.xdev.ro` | 192.168.2.102 | 192.168.2.102 | Mașina Debian la .102, separată de jumper chiar dacă Exim folosește acest hostname |
96
+| `jumper.madagascar.xdev.ro` | 127.0.0.1 | 192.168.2.100 | Jumper se referă la sine prin loopback (necesar pentru Exim local delivery); clienții LAN primesc IP-ul real |
95 97
 
96 98
 ## Hosturi existente
97 99
 
+1 -1
README.md
@@ -7,7 +7,7 @@ This project lives on jumper and is the local source for:
7 7
 - `config/hosts.yaml` - git-versioned host registry
8 8
 - `config/local-hosts.tsv` - DNS manifest exported for local resolvers
9 9
 - `scripts/host_manager.pl` - Perl-only web app
10
-- `scripts/sync_local_hosts.sh` - local DNS sync to is-vpn-gw and as01
10
+- `scripts/sync_local_hosts.sh` - local DNS sync to jumper and as01
11 11
 - `scripts/ca_manager.sh` - local OpenSSL CA helper for host certificates
12 12
 
13 13
 The public `xdev.ro` zone is maintained in the separate DNS public-zone repository.
+1 -1
config/hosts.yaml
@@ -159,4 +159,4 @@ hosts:
159 159
       - "local-hosts.tsv"
160 160
       - "hosts-local.yaml"
161 161
     monitoring: "enabled"
162
-    notes: "Loopback only for local delivery on is-vpn-gw; LAN DNS gets 192.168.2.100."
162
+    notes: "Loopback only for local delivery on jumper; LAN DNS gets 192.168.2.100."
+24 -19
scripts/sync_local_hosts.sh
@@ -1,6 +1,6 @@
1 1
 #!/usr/bin/env bash
2 2
 #
3
-# sync_local_hosts.sh - Sync local madagascar DNS records to is-vpn-gw and as01.
3
+# sync_local_hosts.sh - Sync local madagascar DNS records to jumper and as01.
4 4
 #
5 5
 
6 6
 set -euo pipefail
@@ -8,7 +8,7 @@ set -euo pipefail
8 8
 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9 9
 PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
10 10
 CONFIG_FILE="$PROJECT_DIR/config/local-hosts.tsv"
11
-IS_VPN_GW="is-vpn-gw"
11
+JUMPER_HOST="jumper.madagascar.xdev.ro"
12 12
 AS01="admin@192.168.2.2"
13 13
 APPLY=false
14 14
 VERIFY=false
@@ -17,7 +17,7 @@ NEGATIVE_NAME="nohost.madagascar.xdev.ro"
17 17
 
18 18
 usage() {
19 19
     cat << EOF
20
-Usage: $0 [--apply] [--verify] [--target all|is-vpn-gw|as01] [-c file]
20
+Usage: $0 [--apply] [--verify] [--target all|jumper|as01] [-c file]
21 21
 
22 22
 Default mode is dry-run. Use --apply to change remote resolvers.
23 23
 
@@ -49,10 +49,15 @@ while [[ $# -gt 0 ]]; do
49 49
 done
50 50
 
51 51
 case "$TARGET" in
52
-    all|is-vpn-gw|as01) ;;
52
+    all|jumper|is-vpn-gw|as01) ;;
53 53
     *) die "Invalid target: $TARGET" ;;
54 54
 esac
55 55
 
56
+if [[ "$TARGET" == "is-vpn-gw" ]]; then
57
+    log "Target is-vpn-gw is deprecated; use jumper"
58
+    TARGET="jumper"
59
+fi
60
+
56 61
 [[ -f "$CONFIG_FILE" ]] || die "Missing config file: $CONFIG_FILE"
57 62
 
58 63
 WORK_DIR="$(mktemp -d)"
@@ -70,7 +75,7 @@ quote_ros() {
70 75
     printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
71 76
 }
72 77
 
73
-is_local_is_vpn_gw() {
78
+is_local_jumper() {
74 79
     local host_name
75 80
     host_name="$(hostname -f 2>/dev/null || hostname 2>/dev/null || true)"
76 81
     [[ "$host_name" == "jumper.madagascar.xdev.ro" ]] && return 0
@@ -78,12 +83,12 @@ is_local_is_vpn_gw() {
78 83
     return 1
79 84
 }
80 85
 
81
-run_is_vpn_gw_payload() {
86
+run_jumper_payload() {
82 87
     local remote_dir="$1"
83
-    if is_local_is_vpn_gw; then
88
+    if is_local_jumper; then
84 89
         REMOTE_DIR="$remote_dir" bash -s
85 90
     else
86
-        ssh "$IS_VPN_GW" "REMOTE_DIR='$remote_dir' bash -s"
91
+        ssh "$JUMPER_HOST" "REMOTE_DIR='$remote_dir' bash -s"
87 92
     fi
88 93
 }
89 94
 
@@ -116,25 +121,25 @@ sort -u "$NAMES_FILE" -o "$NAMES_FILE"
116 121
 printf '/ip dns cache flush\n' >> "$MIKROTIK_RSC"
117 122
 printf ':put "xdev local dns sync complete"\n' >> "$MIKROTIK_RSC"
118 123
 
119
-sync_is_vpn_gw() {
124
+sync_jumper() {
120 125
     if ! $APPLY; then
121
-        log "Dry-run for $IS_VPN_GW: generated /etc/hosts block"
126
+        log "Dry-run for $JUMPER_HOST: generated /etc/hosts block"
122 127
         sed -n '1,80p' "$HOSTS_ROWS"
123
-        log "Dry-run for $IS_VPN_GW: generated cloaking-rules block"
128
+        log "Dry-run for $JUMPER_HOST: generated cloaking-rules block"
124 129
         sed -n '1,120p' "$CLOAK_ROWS"
125 130
         return
126 131
     fi
127 132
 
128
-    log "Syncing $IS_VPN_GW"
133
+    log "Syncing $JUMPER_HOST"
129 134
     remote_dir="/tmp/xdev-local-dns.$$"
130
-    if is_local_is_vpn_gw; then
135
+    if is_local_jumper; then
131 136
         mkdir -p "$remote_dir"
132 137
         cp "$HOSTS_ROWS" "$CLOAK_ROWS" "$NAMES_FILE" "$remote_dir/"
133 138
     else
134
-        ssh "$IS_VPN_GW" "mkdir -p '$remote_dir'"
135
-        scp "$HOSTS_ROWS" "$CLOAK_ROWS" "$NAMES_FILE" "$IS_VPN_GW:$remote_dir/" >/dev/null
139
+        ssh "$JUMPER_HOST" "mkdir -p '$remote_dir'"
140
+        scp "$HOSTS_ROWS" "$CLOAK_ROWS" "$NAMES_FILE" "$JUMPER_HOST:$remote_dir/" >/dev/null
136 141
     fi
137
-    run_is_vpn_gw_payload "$remote_dir" <<'REMOTE'
142
+    run_jumper_payload "$remote_dir" <<'REMOTE'
138 143
 set -euo pipefail
139 144
 stamp="$(date +%Y%m%d_%H%M%S)"
140 145
 cp /etc/hosts "/etc/hosts.bak.$stamp"
@@ -284,10 +289,10 @@ verify_resolver() {
284 289
 if $APPLY || ! $VERIFY; then
285 290
     case "$TARGET" in
286 291
         all)
287
-            sync_is_vpn_gw
292
+            sync_jumper
288 293
             sync_as01
289 294
             ;;
290
-        is-vpn-gw) sync_is_vpn_gw ;;
295
+        jumper) sync_jumper ;;
291 296
         as01) sync_as01 ;;
292 297
     esac
293 298
 fi
@@ -298,7 +303,7 @@ if $VERIFY; then
298 303
             verify_resolver 192.168.2.100
299 304
             verify_resolver 192.168.2.2
300 305
             ;;
301
-        is-vpn-gw) verify_resolver 192.168.2.100 ;;
306
+        jumper) verify_resolver 192.168.2.100 ;;
302 307
         as01) verify_resolver 192.168.2.2 ;;
303 308
     esac
304 309
 fi