diff --git a/Lora-Map/Model/Admin/Adminmodel.cs b/Lora-Map/Model/Admin/Adminmodel.cs index d81963d..6eb9231 100644 --- a/Lora-Map/Model/Admin/Adminmodel.cs +++ b/Lora-Map/Model/Admin/Adminmodel.cs @@ -5,6 +5,7 @@ using System.Net; using System.Text; using BlubbFish.Utils; using BlubbFish.Utils.IoT.Bots; +using LitJson; namespace Fraunhofer.Fit.IoT.LoraMap.Model.Admin { class AdminModel { @@ -12,6 +13,16 @@ namespace Fraunhofer.Fit.IoT.LoraMap.Model.Admin { public event AdminEvent NamesUpdate; private readonly Dictionary session = new Dictionary(); + private readonly Dictionary settings; + + public AdminModel(Dictionary 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) { if(cont.Request.Url.PathAndQuery == "/admin/login") { return this.Login(cont); @@ -34,6 +45,13 @@ namespace Fraunhofer.Fit.IoT.LoraMap.Model.Admin { String rawData = reader.ReadToEnd(); cont.Request.InputStream.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); Console.WriteLine("200 - Get names.json " + cont.Request.Url.PathAndQuery); this.NamesUpdate?.Invoke(this, new EventArgs()); @@ -58,8 +76,7 @@ namespace Fraunhofer.Fit.IoT.LoraMap.Model.Admin { private Boolean Login(HttpListenerContext cont) { Dictionary POST = Webserver.GetPostParams(cont.Request); - if(POST.ContainsKey("user") && POST["user"] == "admin" && - POST.ContainsKey("pass") && POST["pass"] == "password") { + if(POST.ContainsKey("user") && POST["user"] == this.settings["admin_user"] && POST.ContainsKey("pass") && POST["pass"] == this.settings["admin_pass"]) { Int64 sessionid = 0; while(true) { sessionid = AdminSession.GetRandomSessionid(); diff --git a/Lora-Map/Properties/AssemblyInfo.cs b/Lora-Map/Properties/AssemblyInfo.cs index 5edc28b..e4a70a7 100644 --- a/Lora-Map/Properties/AssemblyInfo.cs +++ b/Lora-Map/Properties/AssemblyInfo.cs @@ -10,7 +10,7 @@ using System.Runtime.InteropServices; [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Fraunhofer FIT")] [assembly: AssemblyProduct("Lora-Map")] -[assembly: AssemblyCopyright("Copyright © 2018 - 14.04.2019")] +[assembly: AssemblyCopyright("Copyright © 2018 - 15.04.2019")] [assembly: AssemblyTrademark("Fraunhofer FIT, BlubbFish")] [assembly: AssemblyCulture("")] [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, // übernehmen, indem Sie "*" eingeben: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.1.7")] -[assembly: AssemblyFileVersion("1.1.7")] +[assembly: AssemblyVersion("1.2.0")] +[assembly: AssemblyFileVersion("1.2.0")] /* * 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.6 #5 Create admin area * 1.1.7 #8 Editor for Names +* 1.2.0 #4 Possible to Ex and Import Setting */ diff --git a/Lora-Map/Server.cs b/Lora-Map/Server.cs index 5d22ecb..118d323 100644 --- a/Lora-Map/Server.cs +++ b/Lora-Map/Server.cs @@ -18,10 +18,12 @@ namespace Fraunhofer.Fit.IoT.LoraMap { private readonly SortedDictionary alarms = new SortedDictionary(); private JsonData marker; private readonly Dictionary markertable = new Dictionary(); - private readonly AdminModel admin = new AdminModel(); + private readonly AdminModel admin; public Server(ADataBackend backend, Dictionary settings, InIReader requests) : base(backend, settings, requests) { + this.logger.SetPath(settings["loggingpath"]); this.CheckJsonFiles(); + this.admin = new AdminModel(settings); this.marker = JsonMapper.ToObject(File.ReadAllText("json/names.json")); this.admin.NamesUpdate += this.AdminModelUpdateNames; this.StartListen(); @@ -32,6 +34,7 @@ namespace Fraunhofer.Fit.IoT.LoraMap { foreach(KeyValuePair item in this.positions) { item.Value.UpdateMarker(this.marker, item.Key); } + Console.WriteLine("Namen und Icons aktualisiert!"); } private void CheckJsonFiles() { diff --git a/Lora-Map/config-example/settings.conf.example b/Lora-Map/config-example/settings.conf.example index 39be6d5..bc000f3 100644 --- a/Lora-Map/config-example/settings.conf.example +++ b/Lora-Map/config-example/settings.conf.example @@ -3,4 +3,7 @@ type=mqtt server=127.0.0.1 [webserver] -prefix=http://+:8080/ \ No newline at end of file +prefix=http://+:8080/ +admin_user=admin +admin_pass=password +loggingpath=/var/log/loramap.log \ No newline at end of file diff --git a/Lora-Map/names.json b/Lora-Map/names.json deleted file mode 100644 index 8fec858..0000000 --- a/Lora-Map/names.json +++ /dev/null @@ -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" - } -} \ No newline at end of file diff --git a/Lora-Map/resources/admin/css/global.css b/Lora-Map/resources/admin/css/global.css index 98ca1dc..2c0a105 100644 --- a/Lora-Map/resources/admin/css/global.css +++ b/Lora-Map/resources/admin/css/global.css @@ -104,4 +104,13 @@ } #iconeditor .innerbox .save { clear: both; +} + +#content #eximport .title { + margin-bottom: 20px; + font-weight: bold; +} +#content #eximport .names textarea { + height: 120px; + width: 90%; } \ No newline at end of file diff --git a/Lora-Map/resources/admin/js/menu.js b/Lora-Map/resources/admin/js/menu.js index 828e98f..e994a92 100644 --- a/Lora-Map/resources/admin/js/menu.js +++ b/Lora-Map/resources/admin/js/menu.js @@ -1,12 +1,12 @@ function menu_names() { - var parsenames = new XMLHttpRequest(); - parsenames.onreadystatechange = function() { - if(parsenames.readyState === 4 && parsenames.status === 200) { - NamesEditor.ParseJson(parsenames.responseText); + var ajaxnames = new XMLHttpRequest(); + ajaxnames.onreadystatechange = function() { + if(ajaxnames.readyState === 4 && ajaxnames.status === 200) { + NamesEditor.ParseJson(ajaxnames.responseText); } }; - parsenames.open("GET", "http://{%REQUEST_URL_HOST%}/admin/get_json_names", true); - parsenames.send(); + ajaxnames.open("GET", "http://{%REQUEST_URL_HOST%}/admin/get_json_names", true); + ajaxnames.send(); } function menu_overlay() { @@ -14,7 +14,14 @@ function menu_overlay() { } 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 = { @@ -112,8 +119,12 @@ var NamesEditor = { } var savenames = new XMLHttpRequest(); savenames.onreadystatechange = function () { - if (savenames.readyState === 4 && savenames.status === 200) { - alert("Änderungen gespeichert!"); + 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); @@ -244,4 +255,26 @@ var NamesEditor = { } }; -var ExImport = {}; \ No newline at end of file +var ExImport = { + ParseJson: function (jsonstring) { + html = "
Ex- und Import der Einstellungen
"; + html += "
names.json (Namen und Icons)
"; + html += "
"; + 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); + } +}; \ No newline at end of file