From 622e49a36fe619f685f8c804a9350d658412ad47 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Thu, 13 Sep 2018 22:03:19 +0000 Subject: [PATCH] Add more Logging On Module load catch Exceptions and not load the plugin --- Bot.cs | 30 +++++++++++++++++++----------- Moduls/Mqtt.cs | 2 ++ bin/Release/Bot-Utils.dll | Bin 21504 -> 23040 bytes 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Bot.cs b/Bot.cs index 0fd1cc7..3cb19cd 100644 --- a/Bot.cs +++ b/Bot.cs @@ -20,10 +20,10 @@ namespace BlubbFish.Utils.IoT.Bots { new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGTERM), new Mono.Unix.UnixSignal(Mono.Unix.Native.Signum.SIGINT) }; - Console.WriteLine("Signalhandler Mono attached."); + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.WaitForShutdown: Signalhandler Mono attached."); while (true) { Int32 i = Mono.Unix.UnixSignal.WaitAny(signals, -1); - Console.WriteLine("Signalhandler Mono INT recieved " + i + "."); + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.WaitForShutdown: Signalhandler Mono INT recieved " + i + "."); this.RunningProcess = false; break; } @@ -31,7 +31,7 @@ namespace BlubbFish.Utils.IoT.Bots { this.sig_thread.Start(); } else { Console.CancelKeyPress += new ConsoleCancelEventHandler(this.SetupShutdown); - Console.WriteLine("Signalhandler Windows attached."); + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.WaitForShutdown: Signalhandler Windows attached."); } while (this.RunningProcess) { Thread.Sleep(100); @@ -40,14 +40,14 @@ namespace BlubbFish.Utils.IoT.Bots { private void SetupShutdown(Object sender, ConsoleCancelEventArgs e) { e.Cancel = true; - Console.WriteLine("Signalhandler Windows INT recieved."); + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.SetupShutdown: Signalhandler Windows INT recieved."); this.RunningProcess = false; } protected void ModulDispose() { foreach (KeyValuePair> item in this.moduls) { item.Value.Dispose(); - Console.WriteLine("Modul entladen: " + item.Key); + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.ModulDispose: Modul entladen: " + item.Key); } if (this.sig_thread != null && this.sig_thread.IsAlive) { this.sig_thread.Abort(); @@ -60,12 +60,18 @@ namespace BlubbFish.Utils.IoT.Bots { if (item.Namespace == @namespace) { Type t = item; String name = t.Name; - if (InIReader.ConfigExist(name.ToLower())) { - this.moduls.Add(name, (AModul)t.GetConstructor(new Type[] { typeof(T), typeof(InIReader) }).Invoke(new Object[] { library, InIReader.GetInstance(name.ToLower()) })); - Console.WriteLine("Load Modul " + name); - } else if (t.HasInterface(typeof(IForceLoad))) { - this.moduls.Add(name, (AModul)t.GetConstructor(new Type[] { typeof(T), typeof(InIReader) }).Invoke(new Object[] { library, null })); - Console.WriteLine("Load Modul Forced " + name); + try { + if (InIReader.ConfigExist(name.ToLower())) { + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.ModulLoader: Load Modul " + name); + this.moduls.Add(name, (AModul)t.GetConstructor(new Type[] { typeof(T), typeof(InIReader) }).Invoke(new Object[] { library, InIReader.GetInstance(name.ToLower()) })); + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.ModulLoader: Loaded Modul " + name); + } else if (t.HasInterface(typeof(IForceLoad))) { + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.ModulLoader: Load Modul Forced " + name); + this.moduls.Add(name, (AModul)t.GetConstructor(new Type[] { typeof(T), typeof(InIReader) }).Invoke(new Object[] { library, null })); + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.ModulLoader: Loaded Modul Forced " + name); + } + } catch(Exception e) { + Helper.WriteError(e.InnerException.Message); } } } @@ -74,6 +80,7 @@ namespace BlubbFish.Utils.IoT.Bots { protected void ModulInterconnect() { foreach (KeyValuePair> item in this.moduls) { item.Value.Interconnect(this.moduls); + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.ModulInterconnect: Interconnect Module " + item.Key); } } @@ -81,6 +88,7 @@ namespace BlubbFish.Utils.IoT.Bots { foreach (KeyValuePair> item in this.moduls) { item.Value.EventLibSetter(); item.Value.Update += this.ModulUpdate; + Console.WriteLine("BlubbFish.Utils.IoT.Bots.Bot.ModulEvents: Attach Event " + item.Key); } } diff --git a/Moduls/Mqtt.cs b/Moduls/Mqtt.cs index 920f70f..7641f1c 100644 --- a/Moduls/Mqtt.cs +++ b/Moduls/Mqtt.cs @@ -18,6 +18,8 @@ namespace BlubbFish.Utils.IoT.Bots.Moduls { if (this.config.ContainsKey("settings")) { this.connectionWatcher = new Thread(this.ConnectionWatcherRunner); this.connectionWatcher.Start(); + } else { + throw new ArgumentException("Setting section [settings] is missing!"); } } #endregion diff --git a/bin/Release/Bot-Utils.dll b/bin/Release/Bot-Utils.dll index caf4664148f6f54e96a9806fd6edc7287497adbe..eb7fd4b26c2f231e199082037bda5e6bd8d5442f 100644 GIT binary patch literal 23040 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 V{`-8g>UX)Txv>A|^Z#80{sZ%G(p3Ne delta 9933 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 JQXBjG{s)aDMf(5%