#18: export and import of config
This commit is contained in:
parent
82a9c5dcd6
commit
785ece971e
|
@ -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">
|
||||
|
|
96
web/index.js
96
web/index.js
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue