diff --git a/NOCQ.sln b/NOCQ.sln index 38a986d..5207153 100644 --- a/NOCQ.sln +++ b/NOCQ.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 +# Visual Studio 2012 VisualStudioVersion = 12.0.30501.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NOCQ", "src\NOCQ\NOCQ.csproj", "{83651B7D-B58F-46B8-BFE2-BCC0A6C92C7A}" @@ -14,6 +14,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{37EF76 .nuget\packages.config = .nuget\packages.config EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NOCQ.EmailPlugin", "src\NOCQ.EmailPlugin\NOCQ.EmailPlugin.csproj", "{8A49052A-7BD4-4F12-898C-AF398DA5BD07}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -24,21 +26,27 @@ Global {83651B7D-B58F-46B8-BFE2-BCC0A6C92C7A}.Debug|Any CPU.Build.0 = Debug|Any CPU {83651B7D-B58F-46B8-BFE2-BCC0A6C92C7A}.Release|Any CPU.ActiveCfg = Release|Any CPU {83651B7D-B58F-46B8-BFE2-BCC0A6C92C7A}.Release|Any CPU.Build.0 = Release|Any CPU - {DF8CD7EA-76FC-4B57-B24A-52C6373A8EDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DF8CD7EA-76FC-4B57-B24A-52C6373A8EDF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DF8CD7EA-76FC-4B57-B24A-52C6373A8EDF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DF8CD7EA-76FC-4B57-B24A-52C6373A8EDF}.Release|Any CPU.Build.0 = Release|Any CPU + {8A49052A-7BD4-4F12-898C-AF398DA5BD07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A49052A-7BD4-4F12-898C-AF398DA5BD07}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A49052A-7BD4-4F12-898C-AF398DA5BD07}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A49052A-7BD4-4F12-898C-AF398DA5BD07}.Release|Any CPU.Build.0 = Release|Any CPU {D9435B3A-C005-49C2-9C0D-B87330B006D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D9435B3A-C005-49C2-9C0D-B87330B006D7}.Debug|Any CPU.Build.0 = Debug|Any CPU {D9435B3A-C005-49C2-9C0D-B87330B006D7}.Release|Any CPU.ActiveCfg = Release|Any CPU {D9435B3A-C005-49C2-9C0D-B87330B006D7}.Release|Any CPU.Build.0 = Release|Any CPU + {DF8CD7EA-76FC-4B57-B24A-52C6373A8EDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF8CD7EA-76FC-4B57-B24A-52C6373A8EDF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF8CD7EA-76FC-4B57-B24A-52C6373A8EDF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF8CD7EA-76FC-4B57-B24A-52C6373A8EDF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE + GlobalSection(NestedProjects) = preSolution EndGlobalSection GlobalSection(MonoDevelopProperties) = preSolution StartupItem = src\NOCQ.Application\NOCQ.Application.csproj EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection GlobalSection(NDepend) = preSolution Project = ".\NOCQ.ndproj" EndGlobalSection diff --git a/src/NOCQ.Application/NOCQ.Application.csproj b/src/NOCQ.Application/NOCQ.Application.csproj index ee2f7fe..9467231 100644 --- a/src/NOCQ.Application/NOCQ.Application.csproj +++ b/src/NOCQ.Application/NOCQ.Application.csproj @@ -3,8 +3,6 @@ Debug AnyCPU - 10.0.0 - 2.0 {DF8CD7EA-76FC-4B57-B24A-52C6373A8EDF} Exe NOCQ.Application diff --git a/src/NOCQ.Application/Program.cs b/src/NOCQ.Application/Program.cs index b9cd8bd..ff8e335 100644 --- a/src/NOCQ.Application/Program.cs +++ b/src/NOCQ.Application/Program.cs @@ -1,43 +1,42 @@ using System; -using System.Dynamic; -using NOCQ.Settings; -using NOCQ.Plugins.Email; using System.Collections; using System.Collections.Generic; +using System.Dynamic; +using System.IO; using System.Linq; using System.Threading.Tasks; using NOCQ.Extensability; -using System.IO; +using NOCQ.Settings; namespace NOCQ.Application { class MainClass { public static void Main (string[] args) { - var s = RedisDatabase.GetNextAlert(SettingsParser.Parse(File.ReadAllText(Path.Combine(".","settings.json"))).Redis); + //var s = RedisDatabase.GetNextAlert(SettingsParser.Parse(Path.Combine("settings.json").ToString()).Redis); // process s var importPlugs = CatalogRepository.GetImportPlugins(); importPlugs.ToList().ForEach(x => { - Task.Factory.StartNew(x.Value.Run, TaskCreationOptions.LongRunning); + //Task.Factory.StartNew(x.Value.Run, TaskCreationOptions.LongRunning); Console.WriteLine(x.Value.Name); }); //RedisDatabase.SaveAlert(, "127.0.0.1", RedisQueues.Output, 6379, 3000); // Parse the settings file - var json = System.IO.File.ReadAllText ("settings.json"); + var json = File.ReadAllText ("settings.json"); var settings = SettingsParser.Parse (json); // Load the settings for the email plugin - var email = settings.InputPlugins.Single (x => x.Name == "Email"); - var emailSettings = email.Settings; + //var email = settings.InputPlugins.Single (x => x.Name == "Email"); + //var emailSettings = email.Settings; //.Create and start an email plugin instance - var emailPlugin = new ImapInput(emailSettings); - emailPlugin.Execute(null,null); + //var emailPlugin = new ImapInput(emailSettings); + //emailPlugin.Execute(null,null); Console.ReadKey (); /* diff --git a/src/NOCQ/Plugins/Email/EmailSettings.cs b/src/NOCQ.EmailPlugin/Email/EmailSettings.cs similarity index 100% rename from src/NOCQ/Plugins/Email/EmailSettings.cs rename to src/NOCQ.EmailPlugin/Email/EmailSettings.cs diff --git a/src/NOCQ.EmailPlugin/Email/ImapInput.cs b/src/NOCQ.EmailPlugin/Email/ImapInput.cs new file mode 100644 index 0000000..6e3546d --- /dev/null +++ b/src/NOCQ.EmailPlugin/Email/ImapInput.cs @@ -0,0 +1,162 @@ +//using System; +//using System.Timers; +//using AE.Net.Mail; +//using System.Collections.Generic; +//using System.Linq; +//using System.Text.RegularExpressions; +//using System.ComponentModel.Composition; +//using Newtonsoft.Json.Linq; +// +// +//namespace NOCQ.Plugins.Email +//{ +// +// [IDataImportAttr("Email")] +// public class ImapInput: IDataImportHook +// { +// public IEnumerable ImportAlerts (DateTime lastRun) +// { +// throw new NotImplementedException (); +// } +// +// public string Name +// { +// get +// { +// {return "IMAP";} +// } +// } +// +// string loginName { get; set; } +// string password { get; set; } +// string server { get; set; } +// string folderPath { get; set; } +// Timer timer { get; set; } +// int port { get; set; } +// bool ssl { get; set; } +// DateTime lastRun { get; set; } +// IEnumerable parseRules{ get; set; } +// +// +// public ImapInput (dynamic settings) +// { +// // Load settings from the dynamic object +// // TODO get it to be a EmailSettings now +// if (settings["Username"] == null +// || settings["Password"] == null +// || settings["Host"] == null +// || settings["Folder"] == null) +// throw new ArgumentException ("You are missing a required setting."); +// +// if (settings["ParseRules"] != null) { +// var rules = new List (); +// foreach (JObject rule in settings["ParseRules"]) { +// +// //var r = rule.Children().Value(); +// +// var r = new ParseRule () { +// Name = rule["Name"].ToString(), +// From = rule["From"].ToString(), +// Enabled = rule["Enabled"].ToString().Equals("true") ? true:false, +// Source = rule["Source"].ToString(), +// System = rule["System"].ToString(), +// Service = rule["Service"].ToString(), +// Severity = rule["Severity"].ToString(), +// Data = rule["Data"].ToString() +// }; +// +// if (r.Enabled) +// rules.Add (r); +// } +// +// //var rules = settings ["ParseRules"] as List; +// +// parseRules = (IEnumerable)rules.Where (x => x.Enabled).ToList (); +// } +// +// loginName = settings["Username"]; +// password = settings["Password"]; +// server = settings["Host"]; +// folderPath = settings["Folder"]; +// port = settings["Port"]; +// var period = (string) settings ["Frequency"]; +// +// // Set up the timer +// timer = new Timer (Double.Parse(period)); +// timer.Elapsed += Execute; +// } +// +// private List getAlerts() +// { +// var alerts = new List (); +// +// using(var imap = new ImapClient(server, loginName, password, ImapClient.AuthMethods.Login, 993, true)) { +// // Find all undeleted messages from today +// // TODO We probably want to check either all and delete or since last run +// var msgs = imap.SearchMessages( +// SearchCondition.Undeleted().And( +// SearchCondition.SentSince(new DateTime(2014, 5, 7)) +// )); +// +// foreach (var msg in msgs) +// { +// var realMsg = msg.Value; +// +// // Figure out if any enabled parse rules apply +// var rule = parseRules.Where (x => x.From.Equals (realMsg.From.Address, StringComparison.CurrentCultureIgnoreCase)); +// if (rule.Any ()) +// { +// var thisRule = rule.First (); +// +// // Email + ParseRule = Alert +// var source = thisRule.Source; +// var sysRegex = new Regex(thisRule.System); +// var servRegex = new Regex(thisRule.Service); +// +// var sysMatch = sysRegex.Match(realMsg.Body); +// var servMatch = servRegex.Match(realMsg.Body); +// +// if (sysMatch.Success && servMatch.Success) { +// Console.WriteLine ("Source: " + source); +// Console.WriteLine("System: " + sysMatch.Value); +// Console.WriteLine ("Service: " + servMatch.Value); +// +// alerts.Add (new Alert () { +// Source = source, +// System = sysMatch.Value, +// Service = servMatch.Value +// }); +// } +// } +// } +// } +// +// return alerts; +// } +// +// // Gather alerts from recent emails and throw them at redis +// public void Execute(object sender, ElapsedEventArgs args) +// { +// var alerts = getAlerts (); +// +// foreach (var alert in alerts) { +// //RedisDatabase.SaveAlert (alert); +// } +// } +// +// // Start the timer +// public void Run() +// { +// Console.WriteLine ("Start"); +// timer.Enabled = true; +// timer.Start (); +// } +// +// // Stop the timer +// public void Stop() +// { +// Console.WriteLine ("Stop"); +// timer.Stop (); +// } +// } +//} \ No newline at end of file diff --git a/src/NOCQ/Plugins/Email/ParseRule.cs b/src/NOCQ.EmailPlugin/Email/ParseRule.cs similarity index 100% rename from src/NOCQ/Plugins/Email/ParseRule.cs rename to src/NOCQ.EmailPlugin/Email/ParseRule.cs diff --git a/src/NOCQ.EmailPlugin/MyClass.cs b/src/NOCQ.EmailPlugin/MyClass.cs new file mode 100644 index 0000000..edf8267 --- /dev/null +++ b/src/NOCQ.EmailPlugin/MyClass.cs @@ -0,0 +1,12 @@ +using System; + +namespace NOCQ.EmailPlugin +{ + public class MyClass + { + public MyClass () + { + } + } +} + diff --git a/src/NOCQ.EmailPlugin/NOCQ.EmailPlugin.csproj b/src/NOCQ.EmailPlugin/NOCQ.EmailPlugin.csproj new file mode 100644 index 0000000..eafd5b0 --- /dev/null +++ b/src/NOCQ.EmailPlugin/NOCQ.EmailPlugin.csproj @@ -0,0 +1,49 @@ + + + + Debug + AnyCPU + {8A49052A-7BD4-4F12-898C-AF398DA5BD07} + Library + NOCQ.EmailPlugin + NOCQ.EmailPlugin + v4.5 + + + true + full + false + bin\Debug + DEBUG; + prompt + 4 + false + + + full + true + bin\Release + prompt + 4 + false + + + + + + + + + + ..\..\NOCQ\Plugins\Email\EmailSettings.cs + + + + + + + {83651B7D-B58F-46B8-BFE2-BCC0A6C92C7A} + NOCQ + + + \ No newline at end of file diff --git a/src/NOCQ.EmailPlugin/Properties/AssemblyInfo.cs b/src/NOCQ.EmailPlugin/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ebfaab2 --- /dev/null +++ b/src/NOCQ.EmailPlugin/Properties/AssemblyInfo.cs @@ -0,0 +1,27 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// Information about this assembly is defined by the following attributes. +// Change them to the values specific to your project. + +[assembly: AssemblyTitle ("NOCQ.EmailPlugin")] +[assembly: AssemblyDescription ("")] +[assembly: AssemblyConfiguration ("")] +[assembly: AssemblyCompany ("")] +[assembly: AssemblyProduct ("")] +[assembly: AssemblyCopyright ("tparnell")] +[assembly: AssemblyTrademark ("")] +[assembly: AssemblyCulture ("")] + +// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". +// The form "{Major}.{Minor}.*" will automatically update the build and revision, +// and "{Major}.{Minor}.{Build}.*" will update just the revision. + +[assembly: AssemblyVersion ("1.0.*")] + +// The following attributes are used to specify the signing key for the assembly, +// if desired. See the Mono documentation for more information about signing. + +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile("")] + diff --git a/src/NOCQ.UnitTest/NOCQ.UnitTest.csproj b/src/NOCQ.UnitTest/NOCQ.UnitTest.csproj index 219da77..1116f13 100644 --- a/src/NOCQ.UnitTest/NOCQ.UnitTest.csproj +++ b/src/NOCQ.UnitTest/NOCQ.UnitTest.csproj @@ -1,5 +1,5 @@  - + Debug diff --git a/src/NOCQ/DB/RedisDatabase.cs b/src/NOCQ/DB/RedisDatabase.cs index 76c1395..1ac303d 100644 --- a/src/NOCQ/DB/RedisDatabase.cs +++ b/src/NOCQ/DB/RedisDatabase.cs @@ -10,36 +10,39 @@ namespace NOCQ { public sealed class RedisDatabase { - private string host { get; set; } - private string q { get; set; } - private string port {get;set;} - private int timeout { get; set;} - public RedisDatabase(){} - - public static void SaveAlert(Alert alert, RedisSettings setting) + public RedisSettings Settings { get; private set;} + public RedisDatabase(RedisSettings settings) { - using (var redis = new RedisClient(setting.Hostname, - setting.Port, - setting.Timeout + if (settings == null) + throw new ArgumentNullException ("settings"); + + Settings = settings; + } + + public void SaveAlert(Alert alert) + { + using (var redis = new RedisClient(Settings.Hostname, + Settings.Port, + Settings.Timeout )) { - redis.LPush(setting.InputQueue, JsonConvert.SerializeObject(alert)); + redis.LPush(Settings.InputQueue, JsonConvert.SerializeObject(alert)); } } - public static Alert GetNextAlert(RedisSettings setting) + public Alert GetNextAlert() { - using (var redis = new RedisClient(setting.Hostname, - setting.Port, - setting.Timeout + using (var redis = new RedisClient(Settings.Hostname, + Settings.Port, + Settings.Timeout )) { - var ts = redis.RPop(setting.OutputQueue); + var ts = redis.RPop(Settings.OutputQueue); return JsonConvert.DeserializeObject(ts); diff --git a/src/NOCQ/Imports/DataImports.cs b/src/NOCQ/Imports/DataImports.cs index 818243d..97d6599 100644 --- a/src/NOCQ/Imports/DataImports.cs +++ b/src/NOCQ/Imports/DataImports.cs @@ -7,7 +7,7 @@ namespace NOCQ public class DataImports { [ImportMany(AllowRecomposition = true)] - IEnumerable> DataHooks {get; set;} + IEnumerable> DataHooks {get; set;} } } diff --git a/src/NOCQ/Imports/IDataImportHook.cs b/src/NOCQ/Imports/IDataImportHook.cs index 5d3982a..d7ab087 100644 --- a/src/NOCQ/Imports/IDataImportHook.cs +++ b/src/NOCQ/Imports/IDataImportHook.cs @@ -1,14 +1,15 @@ +using System.Collections.Generic; using System.ComponentModel.Composition; - namespace NOCQ { - + [InheritedExport] public interface IDataImportHook { string Name { get; } - void Run(); - void Stop(); + string Description { get; } + string Version {get;} + IEnumerable ImportAlerts (System.DateTime lastRun); } } diff --git a/src/NOCQ/Imports/IDataImportMetadata.cs b/src/NOCQ/Imports/IDataImportMetadata.cs deleted file mode 100644 index a00462f..0000000 --- a/src/NOCQ/Imports/IDataImportMetadata.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.ComponentModel.Composition; - -namespace NOCQ -{ - interface IDataImportMetadata - { - string Name {get;set;} - } - [MetadataAttribute] - public class IDataImportAttr : ExportAttribute, IDataImportMetadata - { - public string Name {get;set;} - - public IDataImportAttr(string name) - :base(typeof(IDataImportHook)) - { - Name = name; - } - } -} - diff --git a/src/NOCQ/Model/Alert.cs b/src/NOCQ/Model/Alert.cs index 226666c..a721ad4 100644 --- a/src/NOCQ/Model/Alert.cs +++ b/src/NOCQ/Model/Alert.cs @@ -11,6 +11,7 @@ namespace NOCQ public string Data {get;set;} public string Runbook {get; set;} public string Severity {get;set;} + public Guid Id {get;set;} } } diff --git a/src/NOCQ/NOCQ.csproj b/src/NOCQ/NOCQ.csproj index 9c003ed..a7d1fdc 100644 --- a/src/NOCQ/NOCQ.csproj +++ b/src/NOCQ/NOCQ.csproj @@ -62,13 +62,8 @@ - - - - EmailSettings.cs - RedisDatabase.cs @@ -76,10 +71,8 @@ - - @@ -90,7 +83,6 @@ - diff --git a/src/NOCQ/Plugins/Email/ImapInput.cs b/src/NOCQ/Plugins/Email/ImapInput.cs deleted file mode 100644 index 2e69c57..0000000 --- a/src/NOCQ/Plugins/Email/ImapInput.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; -using System.Timers; -using AE.Net.Mail; -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using System.ComponentModel.Composition; -using Newtonsoft.Json.Linq; - - -namespace NOCQ.Plugins.Email -{ - - [IDataImportAttr("Email")] - public class ImapInput: IDataImportHook - { - public string Name - { - get - { - {return "IMAP";} - } - } - - string loginName { get; set; } - string password { get; set; } - string server { get; set; } - string folderPath { get; set; } - Timer timer { get; set; } - int port { get; set; } - bool ssl { get; set; } - DateTime lastRun { get; set; } - IEnumerable parseRules{ get; set; } - - - public ImapInput (dynamic settings) - { - // Load settings from the dynamic object - // TODO get it to be a EmailSettings now - if (settings["Username"] == null - || settings["Password"] == null - || settings["Host"] == null - || settings["Folder"] == null) - throw new ArgumentException ("You are missing a required setting."); - - if (settings["ParseRules"] != null) { - var rules = new List (); - foreach (JObject rule in settings["ParseRules"]) { - - //var r = rule.Children().Value(); - - var r = new ParseRule () { - Name = rule["Name"].ToString(), - From = rule["From"].ToString(), - Enabled = rule["Enabled"].ToString().Equals("true") ? true:false, - Source = rule["Source"].ToString(), - System = rule["System"].ToString(), - Service = rule["Service"].ToString(), - Severity = rule["Severity"].ToString(), - Data = rule["Data"].ToString() - }; - - if (r.Enabled) - rules.Add (r); - } - - //var rules = settings ["ParseRules"] as List; - - parseRules = (IEnumerable)rules.Where (x => x.Enabled).ToList (); - } - - loginName = settings["Username"]; - password = settings["Password"]; - server = settings["Host"]; - folderPath = settings["Folder"]; - port = settings["Port"]; - var period = (string) settings ["Frequency"]; - - // Set up the timer - timer = new Timer (Double.Parse(period)); - timer.Elapsed += Execute; - } - - private List getAlerts() - { - var alerts = new List (); - - using(var imap = new ImapClient(server, loginName, password, ImapClient.AuthMethods.Login, 993, true)) { - // Find all undeleted messages from today - // TODO We probably want to check either all and delete or since last run - var msgs = imap.SearchMessages( - SearchCondition.Undeleted().And( - SearchCondition.SentSince(new DateTime(2014, 5, 7)) - )); - - foreach (var msg in msgs) - { - var realMsg = msg.Value; - - // Figure out if any enabled parse rules apply - var rule = parseRules.Where (x => x.From.Equals (realMsg.From.Address, StringComparison.CurrentCultureIgnoreCase)); - if (rule.Any ()) - { - var thisRule = rule.First (); - - // Email + ParseRule = Alert - var source = thisRule.Source; - var sysRegex = new Regex(thisRule.System); - var servRegex = new Regex(thisRule.Service); - - var sysMatch = sysRegex.Match(realMsg.Body); - var servMatch = servRegex.Match(realMsg.Body); - - if (sysMatch.Success && servMatch.Success) { - Console.WriteLine ("Source: " + source); - Console.WriteLine("System: " + sysMatch.Value); - Console.WriteLine ("Service: " + servMatch.Value); - - alerts.Add (new Alert () { - Source = source, - System = sysMatch.Value, - Service = servMatch.Value - }); - } - } - } - } - - return alerts; - } - - // Gather alerts from recent emails and throw them at redis - public void Execute(object sender, ElapsedEventArgs args) - { - var alerts = getAlerts (); - - foreach (var alert in alerts) { - //RedisDatabase.SaveAlert (alert); - } - } - - // Start the timer - public void Run() - { - Console.WriteLine ("Start"); - timer.Enabled = true; - timer.Start (); - } - - // Stop the timer - public void Stop() - { - Console.WriteLine ("Stop"); - timer.Stop (); - } - } -} \ No newline at end of file diff --git a/src/NOCQ/Settings/SettingsFIle.cs b/src/NOCQ/Settings/SettingsFIle.cs index bd5297c..e421187 100644 --- a/src/NOCQ/Settings/SettingsFIle.cs +++ b/src/NOCQ/Settings/SettingsFIle.cs @@ -7,7 +7,6 @@ namespace NOCQ.Settings public class SettingsFile { public RedisSettings Redis { get; set; } - public IEnumerable InputPlugins {get; set; } } } diff --git a/src/NOCQ/Settings/SettingsParser.cs b/src/NOCQ/Settings/SettingsParser.cs index 4951761..86160b6 100644 --- a/src/NOCQ/Settings/SettingsParser.cs +++ b/src/NOCQ/Settings/SettingsParser.cs @@ -1,11 +1,12 @@ using System; - +using System.IO; namespace NOCQ.Settings { - public class SettingsParser + public static class SettingsParser { - public static SettingsFile Parse(string json){ - return Newtonsoft.Json.JsonConvert.DeserializeObject(json); + public static SettingsFile Parse(string filePath = "settings.json"){ + + return Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(filePath)); } } }