Ik heb met behulp van ChatGPT weten te vinden dat er dus wel een UserStartupScript is, zie hieronder. (Schaamteloos hem gevraagd de forumpost op te zetten zodat het hopelijk duidelijk genoeg is). Op een 2 tal NR7302's heb ik ook last van het terugvallen naar de verkeerde APN door de DT FW die mogelijk niet klopt. Onderstaande script is getest, natuurlijk wel op eigen risico gebruiken, maar ik vermoed dat er meer zijn die hier wat aan hebben :)
Wel root nodig, maar hoe je dat wachtwoord krijgt is al eerder beschreven
Edit:
Ik heb overigens wel:
Enable Customized Settings
op Individual staan.
Zyxel NR7302 – APN automatisch herstellen na firmware-update/FOTA
Bij de Deutsche Telekom-versie van de
Zyxel NR7302 kan een firmware-update de handmatig ingestelde APN overschrijven. In mijn geval moet de APN fwainternet zijn, maar na een FOTA-update werd deze weer teruggezet naar:
Een normale reboot is geen probleem: een handmatig ingestelde APN blijft daarbij gewoon behouden. Het probleem treedt specifiek op bij een firmware-update, doordat de firmware tijdens de upgrade een rom_convert uitvoert waarin expliciet staat:
Gelukkig blijkt de firmware zelf een verborgen mogelijkheid voor een eigen startup-script te hebben:
code:
1
| /data/user_startup_parameters.sh |
In het datamodel zit hiervoor:
code:
1
| Device.X_ZYXEL_FEATRUE_FLAG.UserStartupScript |
Als deze op 1 staat, wordt het script tijdens het booten uitgevoerd.
Vereisten
Hiervoor is
shelltoegang als root op de NR7302 nodig. Voor zover ik heb kunnen testen is de normale admin-account uit de webinterface hiervoor niet voldoende.
Getest op:
code:
1
2
3
| Product: NR7302
Firmware: 1.00(ACHA.6)F2
Build Date: 2026/06/08 |
Ook getest met een echte FOTA van:
naar:
Daarbij bleven zowel /data/user_startup_parameters.sh als de UserStartupScript=1 instelling behouden.
Startup-script installeren
Onderstaand script controleert na iedere boot:
- APN moet fwainternet zijn;
- Manual APN moet ingeschakeld zijn;
- username/password moeten leeg zijn;
- Preferred Access Technology moet Auto zijn;
- daarna wordt gecontroleerd of internet weer bereikbaar is via 8.8.8.8 of 1.1.1.1.
Het script logt alles naar /data/apn_startup.log.
Als fwainternet niet jouw APN is, pas dan uiteraard APN="fwainternet" aan.
Bash:
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
| cat > /data/user_startup_parameters.sh <<'EOF'
#!/bin/sh
LOG="/data/apn_startup.log"
APN="fwainternet"
MAX_WAIT=90
echo "" >> "$LOG"
echo "===== $(date) startup APN check =====" >> "$LOG"
# Wacht totdat het Zyxel datamodel beschikbaar is
WAITED=0
CURRENT_APN=""
while [ "$WAITED" -lt "$MAX_WAIT" ]; do
CURRENT_APN="$(ztr69cli get Device.Cellular.AccessPoint.1.APN 2>/dev/null | sed -n 's/.*: "\(.*\)"/\1/p')"
if [ -n "$CURRENT_APN" ]; then
break
fi
sleep 5
WAITED=$((WAITED + 5))
done
if [ -z "$CURRENT_APN" ]; then
echo "ERROR: ztr69/datamodel not ready after ${MAX_WAIT}s" >> "$LOG"
echo "===== FAILED =====" >> "$LOG"
exit 1
fi
echo "Datamodel ready after ${WAITED}s" >> "$LOG"
CURRENT_MANUAL="$(ztr69cli get Device.Cellular.AccessPoint.1.X_ZYXEL_ManualAPN 2>/dev/null | sed -n 's/.*: //p')"
CURRENT_USER="$(ztr69cli get Device.Cellular.AccessPoint.1.Username 2>/dev/null | sed -n 's/.*: "\(.*\)"/\1/p')"
CURRENT_TECH="$(ztr69cli get Device.Cellular.Interface.1.PreferredAccessTechnology 2>/dev/null | sed -n 's/.*: "\(.*\)"/\1/p')"
echo "Before: APN=$CURRENT_APN Manual=$CURRENT_MANUAL User=$CURRENT_USER Tech=$CURRENT_TECH" >> "$LOG"
CHANGED=0
if [ "$CURRENT_APN" != "$APN" ]; then
echo "APN incorrect ($CURRENT_APN), restoring $APN" >> "$LOG"
ztr69cli set Device.Cellular.AccessPoint.1.APN="$APN" >> "$LOG" 2>&1
CHANGED=1
fi
if [ "$CURRENT_MANUAL" != "1" ]; then
echo "ManualAPN incorrect ($CURRENT_MANUAL), setting 1" >> "$LOG"
ztr69cli set Device.Cellular.AccessPoint.1.X_ZYXEL_ManualAPN=1 >> "$LOG" 2>&1
CHANGED=1
fi
if [ -n "$CURRENT_USER" ]; then
echo "Username present ($CURRENT_USER), clearing credentials" >> "$LOG"
ztr69cli set Device.Cellular.AccessPoint.1.Username="" >> "$LOG" 2>&1
ztr69cli set Device.Cellular.AccessPoint.1.Password="" >> "$LOG" 2>&1
CHANGED=1
fi
if [ "$CURRENT_TECH" != "Auto" ]; then
echo "Access technology incorrect ($CURRENT_TECH), setting Auto" >> "$LOG"
ztr69cli set Device.Cellular.Interface.1.PreferredAccessTechnology="Auto" >> "$LOG" 2>&1
CHANGED=1
fi
sleep 5
# Instellingen opnieuw uitlezen ter controle
FINAL_APN="$(ztr69cli get Device.Cellular.AccessPoint.1.APN 2>/dev/null | sed -n 's/.*: "\(.*\)"/\1/p')"
FINAL_MANUAL="$(ztr69cli get Device.Cellular.AccessPoint.1.X_ZYXEL_ManualAPN 2>/dev/null | sed -n 's/.*: //p')"
FINAL_USER="$(ztr69cli get Device.Cellular.AccessPoint.1.Username 2>/dev/null | sed -n 's/.*: "\(.*\)"/\1/p')"
FINAL_TECH="$(ztr69cli get Device.Cellular.Interface.1.PreferredAccessTechnology 2>/dev/null | sed -n 's/.*: "\(.*\)"/\1/p')"
echo "After: APN=$FINAL_APN Manual=$FINAL_MANUAL User=$FINAL_USER Tech=$FINAL_TECH Changed=$CHANGED" >> "$LOG"
# Eenmalige retry als APN/ManualAPN nog niet correct zijn
if [ "$FINAL_APN" != "$APN" ] || [ "$FINAL_MANUAL" != "1" ]; then
echo "WARNING: APN verification failed - retrying" >> "$LOG"
ztr69cli set Device.Cellular.AccessPoint.1.X_ZYXEL_ManualAPN=1 >> "$LOG" 2>&1
ztr69cli set Device.Cellular.AccessPoint.1.APN="$APN" >> "$LOG" 2>&1
sleep 10
FINAL_APN="$(ztr69cli get Device.Cellular.AccessPoint.1.APN 2>/dev/null | sed -n 's/.*: "\(.*\)"/\1/p')"
FINAL_MANUAL="$(ztr69cli get Device.Cellular.AccessPoint.1.X_ZYXEL_ManualAPN 2>/dev/null | sed -n 's/.*: //p')"
echo "Retry result: APN=$FINAL_APN Manual=$FINAL_MANUAL" >> "$LOG"
fi
# Wacht maximaal 120 seconden op internet
echo "Waiting for internet connectivity..." >> "$LOG"
WAITED=0
INTERNET=0
while [ "$WAITED" -lt 120 ]; do
if ping -c 1 -W 3 8.8.8.8 >/dev/null 2>&1; then
echo "Internet: 8.8.8.8 OK after ${WAITED}s" >> "$LOG"
INTERNET=1
break
fi
if ping -c 1 -W 3 1.1.1.1 >/dev/null 2>&1; then
echo "Internet: 1.1.1.1 OK after ${WAITED}s" >> "$LOG"
INTERNET=1
break
fi
sleep 5
WAITED=$((WAITED + 5))
done
if [ "$INTERNET" = "0" ]; then
echo "WARNING: No internet connectivity after ${WAITED}s" >> "$LOG"
fi
FINAL_APN="$(ztr69cli get Device.Cellular.AccessPoint.1.APN 2>/dev/null | sed -n 's/.*: "\(.*\)"/\1/p')"
if [ "$FINAL_APN" = "$APN" ]; then
echo "RESULT: APN OK ($FINAL_APN)" >> "$LOG"
else
echo "RESULT: APN FAILED ($FINAL_APN)" >> "$LOG"
fi
echo "===== $(date) done =====" >> "$LOG"
exit 0
EOF
chmod 755 /data/user_startup_parameters.sh
ztr69cli set Device.X_ZYXEL_FEATRUE_FLAG.UserStartupScript=1
sync |
Daarna controleren of de startupfunctie daadwerkelijk aan staat:
Bash:
1
| ztr69cli get Device.X_ZYXEL_FEATRUE_FLAG.UserStartupScript |
Dit moet opleveren:
code:
1
| Device.X_ZYXEL_FEATRUE_FLAG.UserStartupScript: 1 |
Je kunt het script eerst zonder reboot handmatig testen:
Bash:
1
2
| /data/user_startup_parameters.sh
cat /data/apn_startup.log |
Als alles al goed staat, krijg je bijvoorbeeld:
code:
1
2
3
4
5
6
| Datamodel ready after 0s
Before: APN=fwainternet Manual=1 User= Tech=Auto
After: APN=fwainternet Manual=1 User= Tech=Auto Changed=0
Waiting for internet connectivity...
Internet: 8.8.8.8 OK after 0s
RESULT: APN OK (fwainternet) |
Getest met een echte FOTA
Om te controleren of dit niet alleen een normale reboot overleeft, heb ik daarna opnieuw de FOTA uitgevoerd.
Na de firmware-update bleek de NR7302 de APN inderdaad weer veranderd te hebben naar backup.telekom. Het startup-script werd echter automatisch uitgevoerd en gaf:
code:
1
2
3
4
5
6
| ===== Fri Aug 21 08:30:35 CEST 2026 startup APN check =====
Before: APN=backup.telekom Manual=1 User= Tech=Auto
APN incorrect (backup.telekom), restoring fwainternet
Set success.
After: APN=fwainternet Manual=1 Tech=Auto Changed=1
===== done ===== |
Na het opstarten stond de router dus weer automatisch op:
code:
1
2
3
4
| APN: fwainternet
ManualAPN: 1
Username: ""
PreferredAccessTechnology: Auto |
Zowel het script in /data als:
code:
1
| Device.X_ZYXEL_FEATRUE_FLAG.UserStartupScript=1 |
bleef bij de geteste FOTA behouden.
Let op: dit is getest op de Deutsche Telekom NR7302-firmware. Root-toegang en het wijzigen van verborgen datamodelparameters is uiteraard op eigen risico. Ik zou dit ook niet blind toepassen op een NR7302 met een andere provider/OEM-firmware zonder eerst te controleren of UserStartupScript daar aanwezig is.