#18: export and import of config

This commit is contained in:
andreas 2022-03-02 10:53:47 +01:00
parent 82a9c5dcd6
commit 785ece971e
2 changed files with 61 additions and 37 deletions

View File

@ -62,6 +62,8 @@
<button id="resetForm">ReloadConfig</button>
<button id="forgetPass">ForgetPass</button>
<button id="changeConfig">Save&Restart</button>
<button id="exportConfig">Export</button>
<button id="importConfig">Import</button>
<button id="factoryReset">FactoryReset</button>
</div>
<div class="configFormRows">

View File

@ -204,39 +204,46 @@ function checkXDR(v,allValues){
}
}
}
function getAllConfigs(omitPass) {
let values = document.querySelectorAll('.configForm select , .configForm input');
let allValues = {};
for (let i = 0; i < values.length; i++) {
let v = values[i];
let name = v.getAttribute('name');
if (!name) continue;
if (name.indexOf("_") >= 0) continue;
let def = getConfigDefition(name);
if (def.type === 'password' && ( v.value == '' || omitPass)) {
continue;
}
let check = v.getAttribute('data-check');
if (check) {
if (typeof (self[check]) === 'function') {
let res = self[check](v.value, allValues, getConfigDefition(name));
if (res) {
let value = v.value;
if (v.type === 'password') value = "******";
alert("invalid config for " + v.getAttribute('name') + "(" + value + "):\n" + res);
return;
}
}
}
allValues[name] = v.value;
}
return allValues;
}
function changeConfig() {
ensurePass()
.then(function (pass) {
let newAdminPass;
let url = "/api/setConfig?_hash="+encodeURIComponent(pass)+"&";
let values = document.querySelectorAll('.configForm select , .configForm input');
let allValues = {};
for (let i = 0; i < values.length; i++) {
let v = values[i];
let name = v.getAttribute('name');
if (!name) continue;
if (name.indexOf("_") >= 0) continue;
let def = getConfigDefition(name);
if (def.type === 'password' && v.value == '') {
continue;
}
let check = v.getAttribute('data-check');
if (check) {
if (typeof (self[check]) === 'function') {
let res = self[check](v.value, allValues, getConfigDefition(name));
if (res) {
let value = v.value;
if (v.type === 'password') value = "******";
alert("invalid config for " + v.getAttribute('name') + "(" + value + "):\n" + res);
return;
}
}
}
let allValues=getAllConfigs();
if (!allValues) return;
for (let name in allValues){
if (name == 'adminPassword'){
newAdminPass=v.value;
newAdminPass=allValues[name];
}
allValues[name] = v.value;
url += name + "=" + encodeURIComponent(v.value) + "&";
url += name + "=" + encodeURIComponent(allValues[name]) + "&";
}
getJson(url)
.then(function (status) {
@ -254,7 +261,7 @@ function changeConfig() {
}
})
})
.catch(function (e) { alert("Invalid password"); })
.catch(function (e) { alert(e); })
}
function factoryReset() {
ensurePass()
@ -861,6 +868,19 @@ function formatDate(d){
else rt+=v;
return rt;
}
function downloadData(data,name){
let url="data:application/octet-stream,"+encodeURIComponent(JSON.stringify(data,undefined,2));
let target=document.getElementById('downloadXdr');
if (! target) return;
target.setAttribute('href',url);
target.setAttribute('download',name);
target.click();
}
function exportConfig(){
let data=getAllConfigs(true);
if (! data) return;
downloadData(data,"config"+formatDate()+".json");
}
function exportXdr(){
let data={};
forEl('.xdrvalue',function(el) {
@ -873,18 +893,14 @@ function exportXdr(){
}
data[name]=value;
})
let url="data:application/octet-stream,"+encodeURIComponent(JSON.stringify(data,undefined,2));
let target=document.getElementById('downloadXdr');
if (! target) return;
target.setAttribute('href',url);
target.setAttribute('download',"xdr"+formatDate()+".json");
target.click();
downloadData(data,"xdr"+formatDate()+".json");
}
function importXdr(){
forEl('.uploadXdr',function(ul){
function importJson(opt_keyPattern){
let clazz='importJson';
forEl('.'+clazz,function(ul){
ul.remove();
});
let ip=addEl('input','uploadXdr',document.body);
let ip=addEl('input',clazz,document.body);
ip.setAttribute('type','file');
ip.addEventListener('change',function(ev){
if (ip.files.length > 0){
@ -895,7 +911,7 @@ function importXdr(){
let idata=JSON.parse(reader.result);
let hasOverwrites=false;
for (let k in idata){
if (! k.match(/^XDR[0-9][0-9]*/)){
if (opt_keyPattern && ! k.match(opt_keyPattern)){
alert("file contains invalid key "+k);
return;
}
@ -926,6 +942,12 @@ function importXdr(){
});
ip.click();
}
function importXdr(){
importJson(new RegExp(/^XDR[0-9][0-9]*/));
}
function importConfig(){
importJson();
}
function toggleClass(el,id,classList){
let nc=classList[id];
let rt=false;