mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Fix config persistence: missing commands, delete handling, multipart
Multiple related bugs in the Save-to-Flash path:
1. Multipart upload was missing the required filename argument,
causing the backend parser to fail. Added 'config.txt' to the
form.append call. This was likely the primary reason Save-to-Flash
was unreliable.
2. Web UI was not pausing its polling interval during flash write,
causing CPU contention and intermittent crashes. Added isSaving
lock and clearInterval before sendConfig.
3. conf_cmds whitelist was incomplete. Added: syslog, passwd, pvid,
ingress, port name, lag, laghash, isolate, stp, igmp, mtu, bw,
vlan N mgmt, vlan N d.
4. VLAN regex blocked named VLANs. New pattern allows optional name
(starts with letter, matching CLI parser semantics).
5. vlan N d (delete) was not persisted. parseConf now removes the
matching vlan N ... entry from configuration[] when seeing a
delete command, without storing the delete itself. Result: the
saved config describes the end state.
6. configuration[] was not cleared between flashSave invocations,
leading to stale entries from prior interactions.
7. conf_overwrite boundary fix: 'pvid 1' no longer matches 'pvid 10'
etc. Added trailing space in startsWith check.
8. All conf_cmds patterns now anchored with ^...$ for full-line
match. parseConf normalizes whitespace before testing.
9. Port range widened to \d{1,2} so ports 11+ are accepted.
Structural fixes (1, 2, 6, 7, 8) ported from mcaptur's closed PR #219;
remaining fixes (3, 4, 5, 9) and overall regex strategy are new.
This commit is contained in:
+20
-15
@@ -1,4 +1,5 @@
|
||||
var systemInterval = Number();
|
||||
var isSaving = false;
|
||||
const ips = ["ip", "netmask", "gw"];
|
||||
|
||||
function checkIp(ip) {
|
||||
@@ -43,35 +44,39 @@ async function cmdSub() {
|
||||
|
||||
|
||||
async function sendConfig(c) {
|
||||
const form = new FormData();
|
||||
if (isSaving) return;
|
||||
isSaving = true;
|
||||
clearInterval(systemInterval);
|
||||
const form = new FormData();
|
||||
form.append("MAX_FILE_SIZE", "4096");
|
||||
form.append("configuration", new Blob([c], {type: "application/octet-stream"}));
|
||||
form.append("configuration", new Blob([c], {type: "application/octet-stream"}), "config.txt");
|
||||
try {
|
||||
const response = await fetch('/config', {
|
||||
method: 'POST',
|
||||
body: form
|
||||
});
|
||||
console.log('Completed!', response);
|
||||
try {
|
||||
await fetch('/cmd_log_clear', { method: 'GET' });
|
||||
} catch(e) {}
|
||||
} catch(err) {
|
||||
console.error(`Error: ${err}`);
|
||||
} finally {
|
||||
isSaving = false;
|
||||
systemInterval = setInterval(fetchIP, 1000);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async function flashSave() {
|
||||
fetchConfig().then((s) => {
|
||||
parseConf(s);
|
||||
fetchCmdLog().then((s) => {
|
||||
parseConf(s);
|
||||
var body = "";
|
||||
for (const x of configuration) { body = body + x + "\n"; }
|
||||
console.log("CONFIGURATION to save: ", body);
|
||||
sendConfig(body);
|
||||
});
|
||||
});
|
||||
setTimeout(() => {
|
||||
fetchIP();
|
||||
}, 500);
|
||||
configuration = [];
|
||||
const savedConfig = await fetchConfig();
|
||||
const cmdLog = await fetchCmdLog();
|
||||
if (savedConfig) parseConf(savedConfig);
|
||||
if (cmdLog) parseConf(cmdLog);
|
||||
const body = configuration.join('\n') + '\n';
|
||||
console.log("CONFIGURATION to save: ", body);
|
||||
await sendConfig(body);
|
||||
}
|
||||
|
||||
async function flashStartupSave() {
|
||||
|
||||
Reference in New Issue
Block a user