[1.2.0] #4 Possible to Ex and Import Setting

This commit is contained in:
BlubbFish 2019-04-15 21:19:29 +02:00
parent 3744613277
commit 418a6e8aad
7 changed files with 83 additions and 44 deletions

View File

@ -5,6 +5,7 @@ using System.Net;
using System.Text; using System.Text;
using BlubbFish.Utils; using BlubbFish.Utils;
using BlubbFish.Utils.IoT.Bots; using BlubbFish.Utils.IoT.Bots;
using LitJson;
namespace Fraunhofer.Fit.IoT.LoraMap.Model.Admin { namespace Fraunhofer.Fit.IoT.LoraMap.Model.Admin {
class AdminModel { class AdminModel {
@ -12,6 +13,16 @@ namespace Fraunhofer.Fit.IoT.LoraMap.Model.Admin {
public event AdminEvent NamesUpdate; public event AdminEvent NamesUpdate;
private readonly Dictionary<Int64, AdminSession> session = new Dictionary<Int64, AdminSession>(); private readonly Dictionary<Int64, AdminSession> session = new Dictionary<Int64, AdminSession>();
private readonly Dictionary<String, String> settings;
public AdminModel(Dictionary<String, String> settings) {
this.settings = settings;
if(!settings.ContainsKey("admin_user") || !settings.ContainsKey("admin_pass")) {
Helper.WriteError("Kann die Einstellungen [webserver] admin_user und admin_pass nicht laden!");
throw new FileNotFoundException("Kann die Einstellungen [webserver] admin_user und admin_pass nicht laden!");
}
}
public Boolean ParseReuqest(HttpListenerContext cont) { public Boolean ParseReuqest(HttpListenerContext cont) {
if(cont.Request.Url.PathAndQuery == "/admin/login") { if(cont.Request.Url.PathAndQuery == "/admin/login") {
return this.Login(cont); return this.Login(cont);
@ -34,6 +45,13 @@ namespace Fraunhofer.Fit.IoT.LoraMap.Model.Admin {
String rawData = reader.ReadToEnd(); String rawData = reader.ReadToEnd();
cont.Request.InputStream.Close(); cont.Request.InputStream.Close();
reader.Close(); reader.Close();
try {
JsonMapper.ToObject(rawData);
} catch(Exception) {
Helper.WriteError("501 - Error recieving names.json " + cont.Request.Url.PathAndQuery);
cont.Response.StatusCode = 501;
return false;
}
File.WriteAllText("json/names.json", rawData); File.WriteAllText("json/names.json", rawData);
Console.WriteLine("200 - Get names.json " + cont.Request.Url.PathAndQuery); Console.WriteLine("200 - Get names.json " + cont.Request.Url.PathAndQuery);
this.NamesUpdate?.Invoke(this, new EventArgs()); this.NamesUpdate?.Invoke(this, new EventArgs());
@ -58,8 +76,7 @@ namespace Fraunhofer.Fit.IoT.LoraMap.Model.Admin {
private Boolean Login(HttpListenerContext cont) { private Boolean Login(HttpListenerContext cont) {
Dictionary<String, String> POST = Webserver.GetPostParams(cont.Request); Dictionary<String, String> POST = Webserver.GetPostParams(cont.Request);
if(POST.ContainsKey("user") && POST["user"] == "admin" && if(POST.ContainsKey("user") && POST["user"] == this.settings["admin_user"] && POST.ContainsKey("pass") && POST["pass"] == this.settings["admin_pass"]) {
POST.ContainsKey("pass") && POST["pass"] == "password") {
Int64 sessionid = 0; Int64 sessionid = 0;
while(true) { while(true) {
sessionid = AdminSession.GetRandomSessionid(); sessionid = AdminSession.GetRandomSessionid();

View File

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Fraunhofer FIT")] [assembly: AssemblyCompany("Fraunhofer FIT")]
[assembly: AssemblyProduct("Lora-Map")] [assembly: AssemblyProduct("Lora-Map")]
[assembly: AssemblyCopyright("Copyright © 2018 - 14.04.2019")] [assembly: AssemblyCopyright("Copyright © 2018 - 15.04.2019")]
[assembly: AssemblyTrademark("Fraunhofer FIT, BlubbFish")] [assembly: AssemblyTrademark("Fraunhofer FIT, BlubbFish")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: NeutralResourcesLanguage("de-DE")] [assembly: NeutralResourcesLanguage("de-DE")]
@ -33,8 +33,8 @@ using System.Runtime.InteropServices;
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden, // Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// übernehmen, indem Sie "*" eingeben: // übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.1.7")] [assembly: AssemblyVersion("1.2.0")]
[assembly: AssemblyFileVersion("1.1.7")] [assembly: AssemblyFileVersion("1.2.0")]
/* /*
* 1.1.1 Add Debian package config * 1.1.1 Add Debian package config
@ -44,4 +44,5 @@ using System.Runtime.InteropServices;
* 1.1.5 Add support for alert button * 1.1.5 Add support for alert button
* 1.1.6 #5 Create admin area * 1.1.6 #5 Create admin area
* 1.1.7 #8 Editor for Names * 1.1.7 #8 Editor for Names
* 1.2.0 #4 Possible to Ex and Import Setting
*/ */

View File

@ -18,10 +18,12 @@ namespace Fraunhofer.Fit.IoT.LoraMap {
private readonly SortedDictionary<String, AlarmItem> alarms = new SortedDictionary<String, AlarmItem>(); private readonly SortedDictionary<String, AlarmItem> alarms = new SortedDictionary<String, AlarmItem>();
private JsonData marker; private JsonData marker;
private readonly Dictionary<String, Marker> markertable = new Dictionary<String, Marker>(); private readonly Dictionary<String, Marker> markertable = new Dictionary<String, Marker>();
private readonly AdminModel admin = new AdminModel(); private readonly AdminModel admin;
public Server(ADataBackend backend, Dictionary<String, String> settings, InIReader requests) : base(backend, settings, requests) { public Server(ADataBackend backend, Dictionary<String, String> settings, InIReader requests) : base(backend, settings, requests) {
this.logger.SetPath(settings["loggingpath"]);
this.CheckJsonFiles(); this.CheckJsonFiles();
this.admin = new AdminModel(settings);
this.marker = JsonMapper.ToObject(File.ReadAllText("json/names.json")); this.marker = JsonMapper.ToObject(File.ReadAllText("json/names.json"));
this.admin.NamesUpdate += this.AdminModelUpdateNames; this.admin.NamesUpdate += this.AdminModelUpdateNames;
this.StartListen(); this.StartListen();
@ -32,6 +34,7 @@ namespace Fraunhofer.Fit.IoT.LoraMap {
foreach(KeyValuePair<String, PositionItem> item in this.positions) { foreach(KeyValuePair<String, PositionItem> item in this.positions) {
item.Value.UpdateMarker(this.marker, item.Key); item.Value.UpdateMarker(this.marker, item.Key);
} }
Console.WriteLine("Namen und Icons aktualisiert!");
} }
private void CheckJsonFiles() { private void CheckJsonFiles() {

View File

@ -3,4 +3,7 @@ type=mqtt
server=127.0.0.1 server=127.0.0.1
[webserver] [webserver]
prefix=http://+:8080/ prefix=http://+:8080/
admin_user=admin
admin_pass=password
loggingpath=/var/log/loramap.log

View File

@ -1,27 +0,0 @@
{
"R": {
"name": "26/91",
"marker.svg": {
"person": {
"org": "thw",
"funct": "fueh",
"rang": "zug",
"text": "TZ"
}
}
},
"L": {
"name": "27/92",
"marker.svg": {
"person": {
"org": "thw",
"funct": "fueh",
"rang": "trupp",
"text": "B1"
}
}
},
"K": {
"name": "Test"
}
}

View File

@ -104,4 +104,13 @@
} }
#iconeditor .innerbox .save { #iconeditor .innerbox .save {
clear: both; clear: both;
}
#content #eximport .title {
margin-bottom: 20px;
font-weight: bold;
}
#content #eximport .names textarea {
height: 120px;
width: 90%;
} }

View File

@ -1,12 +1,12 @@
function menu_names() { function menu_names() {
var parsenames = new XMLHttpRequest(); var ajaxnames = new XMLHttpRequest();
parsenames.onreadystatechange = function() { ajaxnames.onreadystatechange = function() {
if(parsenames.readyState === 4 && parsenames.status === 200) { if(ajaxnames.readyState === 4 && ajaxnames.status === 200) {
NamesEditor.ParseJson(parsenames.responseText); NamesEditor.ParseJson(ajaxnames.responseText);
} }
}; };
parsenames.open("GET", "http://{%REQUEST_URL_HOST%}/admin/get_json_names", true); ajaxnames.open("GET", "http://{%REQUEST_URL_HOST%}/admin/get_json_names", true);
parsenames.send(); ajaxnames.send();
} }
function menu_overlay() { function menu_overlay() {
@ -14,7 +14,14 @@ function menu_overlay() {
} }
function menu_eximport() { function menu_eximport() {
var ajaxnames = new XMLHttpRequest();
ajaxnames.onreadystatechange = function () {
if (ajaxnames.readyState === 4 && ajaxnames.status === 200) {
ExImport.ParseJson(ajaxnames.responseText);
}
};
ajaxnames.open("GET", "http://{%REQUEST_URL_HOST%}/admin/get_json_names", true);
ajaxnames.send();
} }
var NamesEditor = { var NamesEditor = {
@ -112,8 +119,12 @@ var NamesEditor = {
} }
var savenames = new XMLHttpRequest(); var savenames = new XMLHttpRequest();
savenames.onreadystatechange = function () { savenames.onreadystatechange = function () {
if (savenames.readyState === 4 && savenames.status === 200) { if (savenames.readyState === 4) {
alert("Änderungen gespeichert!"); if (savenames.status === 200) {
alert("Änderungen gespeichert!");
} else if (savenames.status === 501) {
alert("Ein Fehler ist aufgetreten (invalid JSON)!");
}
} }
}; };
savenames.open("POST", "http://{%REQUEST_URL_HOST%}/admin/set_json_names", true); savenames.open("POST", "http://{%REQUEST_URL_HOST%}/admin/set_json_names", true);
@ -244,4 +255,26 @@ var NamesEditor = {
} }
}; };
var ExImport = {}; var ExImport = {
ParseJson: function (jsonstring) {
html = "<div id='eximport'><div class='title'>Ex- und Import der Einstellungen</div>";
html += "<div class='names'>names.json (Namen und Icons)<br/><textarea id='ex_names'></textarea> <img src='../icons/general/save.png' onclick='ExImport.SaveNames()' class='pointer'></div>";
html += "</div>";
document.getElementById("content").innerHTML = html;
document.getElementById("ex_names").value = jsonstring;
},
SaveNames: function () {
var savenames = new XMLHttpRequest();
savenames.onreadystatechange = function () {
if (savenames.readyState === 4) {
if (savenames.status === 200) {
alert("Änderungen gespeichert!");
} else if (savenames.status === 501) {
alert("Ein Fehler ist aufgetreten (invalid JSON)!");
}
}
};
savenames.open("POST", "http://{%REQUEST_URL_HOST%}/admin/set_json_names", true);
savenames.send(document.getElementById("ex_names").value);
}
};