diff --git a/html/config.js b/html/config.js
index 0cb4bf1..dd8512b 100644
--- a/html/config.js
+++ b/html/config.js
@@ -1,35 +1,84 @@
var configInterval = Number();
var configuration = [];
const conf_cmds = [
- /ip\s+(\d{1,3}\.){3}\d{1,3}/, /gw\s+(\d{1,3}\.){3}\d{1,3}/, /netmask\s+(\d{1,3}\.){3}\d{1,3}/,
- /eee(\s+\d)?\s+(on|off)/, /mirror(\s+(\d|10))(\s+(\d|10)(t|r)?)+/, /vlan\s+(\d{1,4})(\s+(\d|10)(t|u)?)+/
+ /^ip\s+(\d{1,3}\.){3}\d{1,3}$/,
+ /^ip\s+dhcp$/,
+ /^gw\s+(\d{1,3}\.){3}\d{1,3}$/,
+ /^netmask\s+(\d{1,3}\.){3}\d{1,3}$/,
+ /^syslog\s+(on|off)$/,
+ /^syslog\s+ip\s+(\d{1,3}\.){3}\d{1,3}$/,
+ /^passwd\s+\S+$/,
+ /^vlan\s+\d{1,4}\s+d$/,
+ /^vlan\s+\d{1,4}\s+mgmt$/,
+ /^vlan\s+\d{1,4}(\s+[a-zA-Z]\w*)?(\s+\d{1,2}[tu]?)+$/,
+ /^pvid\s+\d{1,2}\s+\d{1,4}$/,
+ /^ingress(\s+\d{1,2}[tua])+$/,
+ /^ingress\s+[tua]$/,
+ /^port\s+\d{1,2}\s+name\s+\S+$/,
+ /^eee(\s+\d{1,2})?\s+(on|off)$/,
+ /^mirror(\s+\d{1,2})(\s+\d{1,2}[tr]?)+$/,
+ /^lag\s+\d(\s+\d{1,2})+$/,
+ /^laghash\s+\d(\s+\w+)+$/,
+ /^isolate\s+\d{1,2}(\s+(off|\d{1,2}))+$/,
+ /^stp\s+(on|off)$/,
+ /^igmp\s+(on|off)$/,
+ /^mtu\s+\d{1,2}\s+\d+$/,
+ /^bw\s+(in|out)\s+\d{1,2}\s+\S+$/,
];
const conf_overwrite = [
- /ip/, /gw/, /netmask/, /eee\s+\w+/, /eee(\s+\w)/, /mirror/, /vlan\s+(\d{1,4})/
+ /^ip\b/,
+ /^gw\b/,
+ /^netmask\b/,
+ /^syslog\s+ip\b/,
+ /^syslog\b/,
+ /^passwd\b/,
+ /^vlan\s+\d{1,4}\s+mgmt$/,
+ /^vlan\s+\d{1,4}(?!\s+mgmt\b)/,
+ /^pvid\s+\d{1,2}\b/,
+ /^ingress\b/,
+ /^port\s+\d{1,2}\s+name\b/,
+ /^eee\s+\d{1,2}\b/,
+ /^eee\b/,
+ /^mirror\b/,
+ /^lag\s+\d+\b/,
+ /^laghash\b/,
+ /^isolate\s+\d{1,2}\b/,
+ /^stp\b/,
+ /^igmp\b/,
+ /^mtu\s+\d{1,2}\b/,
+ /^bw\s+(in|out)\s+\d{1,2}\b/,
];
function parseConf(s){
var a = s.split(/\r\n|\n/);
- for (var l = 0; l < a.length; l++) {
- if (!a[l].length || a[l] == "\n" || a[l] == "\r\n")
- continue;
- console.log(l + ' --> ' + a[l]);
- var ignore = true;
- for (const x of conf_cmds)
- if (x.test(a[l])) ignore = false;
- if (ignore) continue;
- for (const x of conf_overwrite) {
- if (x.test(a[l])) {
- console.log("Match ", x, " to ", a[l]);
- m = a[l].match(x);
- console.log("Starts with ", m[0]);
- configuration = configuration.filter(item => !(item.startsWith(m[0])));
- }
- }
- configuration.push(a[l]);
+ for (var l = 0; l < a.length; l++) {
+ var line = a[l].trim().replace(/\s+/g, ' ');
+ if (!line.length) continue;
+ const deleteMatch = line.match(/^vlan\s+(\d{1,4})\s+d$/);
+ if (deleteMatch) {
+ const prefix = "vlan " + deleteMatch[1] + " ";
+ configuration = configuration.filter(c =>
+ c !== "vlan " + deleteMatch[1] && !c.startsWith(prefix));
+ continue;
}
- console.log("Configuration now:");
- for (const x of configuration) { console.log(x); }
+ console.log(l + ' --> ' + line);
+ var ignore = true;
+ for (const x of conf_cmds)
+ if (x.test(line)) { ignore = false; break; }
+ if (ignore) continue;
+ for (const x of conf_overwrite) {
+ if (x.test(line)) {
+ let m = line.match(x);
+ let matchStr = m[0];
+ configuration = configuration.filter(item =>
+ !(item === matchStr || item.startsWith(matchStr + " ")));
+ break;
+ }
+ }
+ configuration.push(line);
+ }
+ console.log("Configuration now:");
+ for (const x of configuration) { console.log(x); }
}
async function fetchConfig() {
diff --git a/html/system.js b/html/system.js
index 322e057..a90a173 100644
--- a/html/system.js
+++ b/html/system.js
@@ -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() {