From cd21034b415454cbfa5f81b85fa0fef2b600bc96 Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Fri, 11 Jul 2014 14:38:10 +0000 Subject: [PATCH] Lang nichts mehr passiert, refactoring ist geil --- NetMonitor.sln | 40 ++- NetMonitorClient/NetMonitorClient.csproj | 1 - NetMonitorClient/ServiceControl.cs | 141 ----------- NetMonitorConsole/CMDArgs.cs | 43 ---- NetMonitorConsole/Factory.cs | 34 +++ NetMonitorConsole/NetMonitorConsole.csproj | 59 ++++- .../NetMonitorConsole.csproj.user | 6 + NetMonitorConsole/Program.cs | 68 ++++-- NetMonitorConsole/Properties/AssemblyInfo.cs | 12 +- .../Properties/Resources.Designer.cs | 73 ++++++ NetMonitorConsole/Properties/Resources.resx | 124 ++++++++++ NetMonitorConsole/icon.ico | Bin 0 -> 5430 bytes NetMonitorConsole/icon.png | Bin 0 -> 1855 bytes NetMonitorConsole/network.ini | 6 + NetMonitorServer/ActionClass.cs | 29 +++ NetMonitorServer/Actions/SetNetworks.cs | 151 ++++++++++++ NetMonitorServer/Actions/SetOpenVPNService.cs | 15 ++ NetMonitorServer/Actions/SetService.cs | 115 +++++++++ NetMonitorServer/Factory.cs | 25 ++ ...e1.Designer.cs => MainService.Designer.cs} | 7 +- NetMonitorServer/MainService.cs | 84 +++++++ .../{Service1.resx => MainService.resx} | 6 - NetMonitorServer/NetMonitorServer.csproj | 61 +++-- NetMonitorServer/Program.cs | 90 +++---- NetMonitorServer/Properties/AssemblyInfo.cs | 12 +- NetMonitorServer/Service1.cs | 65 ----- NetMonitorServer/SetNetworks.cs | 102 -------- NetMonitorServer/SetService.cs | 95 -------- NetMonitorServer/config.ini | 4 + NetMonitorServer/icon.ico | Bin 0 -> 5430 bytes NetMonitorServer/icon.png | Bin 0 -> 1030 bytes NetMonitorTray/Controller/Tray.cs | 84 +++++++ NetMonitorTray/Models/Tray.cs | 49 ++++ NetMonitorTray/NetMonitorTray.csproj | 96 ++++++++ NetMonitorTray/Program.cs | 18 ++ NetMonitorTray/Properties/AssemblyInfo.cs | 36 +++ .../Properties/Resources.Designer.cs | 123 ++++++++++ NetMonitorTray/Properties/Resources.resx | 139 +++++++++++ NetMonitorTray/Resources/Icons/door_open.png | Bin 0 -> 508 bytes .../Resources/Icons/server_connect.png | Bin 0 -> 755 bytes .../Resources/Icons/server_delete.png | Bin 0 -> 668 bytes NetMonitorTray/Resources/connected.ico | Bin 0 -> 3638 bytes NetMonitorTray/Resources/nothing.ico | Bin 0 -> 3638 bytes NetMonitorTray/Resources/working.ico | Bin 0 -> 5430 bytes NetMonitorTray/Views/Tray.cs | 110 +++++++++ NetMonitorTray/icon.ico | Bin 0 -> 5430 bytes NetMonitorTray/icon.png | Bin 0 -> 795 bytes .../ServiceControlArgumentException.cs | 17 ++ .../Execptions/ServiceControlException.cs | 17 ++ .../ServiceControlNetworkException.cs | 17 ++ NetMonitorUtils/NetMonitorUtils.csproj | 64 +++++ NetMonitorUtils/NetworkSetter.cs | 182 ++++++++++++++ NetMonitorUtils/Properties/AssemblyInfo.cs | 36 +++ NetMonitorUtils/ServiceControl.cs | 227 ++++++++++++++++++ NetOpenVPNGUI/Resources/icon_con.ico | Bin 0 -> 5430 bytes bin/Debug/NetMonitorConsole.exe | Bin 0 -> 20992 bytes bin/Debug/NetMonitorServer.exe | Bin 0 -> 19456 bytes bin/Debug/NetMonitorTray.exe | Bin 0 -> 34304 bytes bin/Debug/NetMonitorUtils.dll | Bin 0 -> 14336 bytes bin/Debug/Utils.dll | Bin 0 -> 14336 bytes bin/Debug/config.ini | 4 + bin/Debug/network.ini | 6 + 62 files changed, 2132 insertions(+), 561 deletions(-) delete mode 100644 NetMonitorClient/ServiceControl.cs delete mode 100644 NetMonitorConsole/CMDArgs.cs create mode 100644 NetMonitorConsole/Factory.cs create mode 100644 NetMonitorConsole/NetMonitorConsole.csproj.user create mode 100644 NetMonitorConsole/Properties/Resources.Designer.cs create mode 100644 NetMonitorConsole/Properties/Resources.resx create mode 100644 NetMonitorConsole/icon.ico create mode 100644 NetMonitorConsole/icon.png create mode 100644 NetMonitorConsole/network.ini create mode 100644 NetMonitorServer/ActionClass.cs create mode 100644 NetMonitorServer/Actions/SetNetworks.cs create mode 100644 NetMonitorServer/Actions/SetOpenVPNService.cs create mode 100644 NetMonitorServer/Actions/SetService.cs create mode 100644 NetMonitorServer/Factory.cs rename NetMonitorServer/{Service1.Designer.cs => MainService.Designer.cs} (77%) create mode 100644 NetMonitorServer/MainService.cs rename NetMonitorServer/{Service1.resx => MainService.resx} (91%) delete mode 100644 NetMonitorServer/Service1.cs delete mode 100644 NetMonitorServer/SetNetworks.cs delete mode 100644 NetMonitorServer/SetService.cs create mode 100644 NetMonitorServer/config.ini create mode 100644 NetMonitorServer/icon.ico create mode 100644 NetMonitorServer/icon.png create mode 100644 NetMonitorTray/Controller/Tray.cs create mode 100644 NetMonitorTray/Models/Tray.cs create mode 100644 NetMonitorTray/NetMonitorTray.csproj create mode 100644 NetMonitorTray/Program.cs create mode 100644 NetMonitorTray/Properties/AssemblyInfo.cs create mode 100644 NetMonitorTray/Properties/Resources.Designer.cs create mode 100644 NetMonitorTray/Properties/Resources.resx create mode 100644 NetMonitorTray/Resources/Icons/door_open.png create mode 100644 NetMonitorTray/Resources/Icons/server_connect.png create mode 100644 NetMonitorTray/Resources/Icons/server_delete.png create mode 100644 NetMonitorTray/Resources/connected.ico create mode 100644 NetMonitorTray/Resources/nothing.ico create mode 100644 NetMonitorTray/Resources/working.ico create mode 100644 NetMonitorTray/Views/Tray.cs create mode 100644 NetMonitorTray/icon.ico create mode 100644 NetMonitorTray/icon.png create mode 100644 NetMonitorUtils/Execptions/ServiceControlArgumentException.cs create mode 100644 NetMonitorUtils/Execptions/ServiceControlException.cs create mode 100644 NetMonitorUtils/Execptions/ServiceControlNetworkException.cs create mode 100644 NetMonitorUtils/NetMonitorUtils.csproj create mode 100644 NetMonitorUtils/NetworkSetter.cs create mode 100644 NetMonitorUtils/Properties/AssemblyInfo.cs create mode 100644 NetMonitorUtils/ServiceControl.cs create mode 100644 NetOpenVPNGUI/Resources/icon_con.ico create mode 100644 bin/Debug/NetMonitorConsole.exe create mode 100644 bin/Debug/NetMonitorServer.exe create mode 100644 bin/Debug/NetMonitorTray.exe create mode 100644 bin/Debug/NetMonitorUtils.dll create mode 100644 bin/Debug/Utils.dll create mode 100644 bin/Debug/config.ini create mode 100644 bin/Debug/network.ini diff --git a/NetMonitor.sln b/NetMonitor.sln index 6a9fdaf..bd3d5f6 100644 --- a/NetMonitor.sln +++ b/NetMonitor.sln @@ -1,6 +1,6 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetMonitorClient", "NetMonitorClient\NetMonitorClient.csproj", "{718693A0-06A3-4765-801D-33842861AA61}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetMonitorServer", "NetMonitorServer\NetMonitorServer.csproj", "{7813196F-D729-44A2-81C7-82BB83E207F5}" @@ -9,6 +9,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetMonitorConsole", "NetMon EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetOpenVPNGUI", "NetOpenVPNGUI\NetOpenVPNGUI.csproj", "{23485575-888C-4990-A4C8-6C74563F6A85}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "..\Utils\Utils\Utils.csproj", "{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetMonitorUtils", "NetMonitorUtils\NetMonitorUtils.csproj", "{45EE003D-5572-48FE-B90E-6BFE18D9EEC8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetMonitorTray", "NetMonitorTray\NetMonitorTray.csproj", "{0B85C838-3295-4FDA-9B07-4F5B3681BE2F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -59,6 +65,36 @@ Global {23485575-888C-4990-A4C8-6C74563F6A85}.Release|Mixed Platforms.Build.0 = Release|x86 {23485575-888C-4990-A4C8-6C74563F6A85}.Release|x86.ActiveCfg = Release|x86 {23485575-888C-4990-A4C8-6C74563F6A85}.Release|x86.Build.0 = Release|x86 + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|x86.ActiveCfg = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.Build.0 = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|x86.ActiveCfg = Release|Any CPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8}.Debug|x86.ActiveCfg = Debug|Any CPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8}.Release|Any CPU.Build.0 = Release|Any CPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8}.Release|x86.ActiveCfg = Release|Any CPU + {0B85C838-3295-4FDA-9B07-4F5B3681BE2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0B85C838-3295-4FDA-9B07-4F5B3681BE2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B85C838-3295-4FDA-9B07-4F5B3681BE2F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {0B85C838-3295-4FDA-9B07-4F5B3681BE2F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {0B85C838-3295-4FDA-9B07-4F5B3681BE2F}.Debug|x86.ActiveCfg = Debug|Any CPU + {0B85C838-3295-4FDA-9B07-4F5B3681BE2F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0B85C838-3295-4FDA-9B07-4F5B3681BE2F}.Release|Any CPU.Build.0 = Release|Any CPU + {0B85C838-3295-4FDA-9B07-4F5B3681BE2F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {0B85C838-3295-4FDA-9B07-4F5B3681BE2F}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {0B85C838-3295-4FDA-9B07-4F5B3681BE2F}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/NetMonitorClient/NetMonitorClient.csproj b/NetMonitorClient/NetMonitorClient.csproj index 6d40a03..b2e4ae1 100644 --- a/NetMonitorClient/NetMonitorClient.csproj +++ b/NetMonitorClient/NetMonitorClient.csproj @@ -115,7 +115,6 @@ Settings.settings True - diff --git a/NetMonitorClient/ServiceControl.cs b/NetMonitorClient/ServiceControl.cs deleted file mode 100644 index ba02207..0000000 --- a/NetMonitorClient/ServiceControl.cs +++ /dev/null @@ -1,141 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.ServiceProcess; -using System.Net.Sockets; -using System.Net; - -namespace NetMonitorClient -{ - public class ServiceControl - { - private UdpClient net_send; - private IPEndPoint net_send_port; - private UdpClient net_gets; - private IPEndPoint net_gets_port; - public ServiceControl(string name) - { - ServiceController sc = new ServiceController(); - sc.ServiceName = name; - //if (sc.Status != ServiceControllerStatus.Running) - //{ - // sc.Start(); - //} - this.net_send = new UdpClient(); - this.net_send_port = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 34523); - this.net_gets = new UdpClient(34524); - this.net_gets_port = new IPEndPoint(IPAddress.Loopback, 0); - } - - internal bool setNetworkAuto(string adapter) - { - if (adapter == null) - { - System.Windows.Forms.MessageBox.Show("Adapter ist not Set!"); - return false; - } - byte[] data = Encoding.UTF8.GetBytes("NET AUTO "+adapter); - this.net_send.Send(data, data.Length, this.net_send_port); - return Boolean.Parse(Encoding.UTF8.GetString(net_gets.Receive(ref net_gets_port))); - } - - internal bool setNetworkIp(string ip, string subnet, string gateway, string adapter) - { - if (ip == null) - { - System.Windows.Forms.MessageBox.Show("IP address not Set!"); - return false; - } - if (subnet == null) - { - System.Windows.Forms.MessageBox.Show("Subnet address not Set!"); - return false; - } - if (gateway == null) - { - System.Windows.Forms.MessageBox.Show("Gateway address not Set!"); - return false; - } - if (adapter == null) - { - System.Windows.Forms.MessageBox.Show("Adapter ist not Set!"); - return false; - } - byte[] data = Encoding.UTF8.GetBytes("NET IP " + ip + " " + subnet + " " + gateway + " " + adapter); - this.net_send.Send(data, data.Length, this.net_send_port); - return Boolean.Parse(Encoding.UTF8.GetString(net_gets.Receive(ref net_gets_port))); - } - - internal bool setNetworkDNS(string dns, string adapter) - { - if (dns == null) - { - System.Windows.Forms.MessageBox.Show("DNS address not Set!"); - return false; - } - if (adapter == null) - { - System.Windows.Forms.MessageBox.Show("Adapter ist not Set!"); - return false; - } - byte[] data = Encoding.UTF8.GetBytes("NET DNS " + dns + " " + adapter); - this.net_send.Send(data, data.Length, this.net_send_port); - return Boolean.Parse(Encoding.UTF8.GetString(net_gets.Receive(ref net_gets_port))); - } - - internal bool setNetworkWINS(string wins, string adapter) - { - if (wins == null) - { - System.Windows.Forms.MessageBox.Show("WINS address not Set!"); - return false; - } - if (adapter == null) - { - System.Windows.Forms.MessageBox.Show("Adapter ist not Set!"); - return false; - } - byte[] data = Encoding.UTF8.GetBytes("NET WINS " + wins + " " + adapter); - this.net_send.Send(data, data.Length, this.net_send_port); - return Boolean.Parse(Encoding.UTF8.GetString(net_gets.Receive(ref net_gets_port))); - } - - internal bool setNetworkIpAuto(string adapter) - { - if (adapter == null) - { - System.Windows.Forms.MessageBox.Show("Adapter ist not Set!"); - return false; - } - byte[] data = Encoding.UTF8.GetBytes("NET IP AUTO "+adapter); - this.net_send.Send(data, data.Length, this.net_send_port); - return Boolean.Parse(Encoding.UTF8.GetString(net_gets.Receive(ref net_gets_port))); - } - - - internal bool setNetworkDnsAuto(string adapter) - { - if (adapter == null) - { - System.Windows.Forms.MessageBox.Show("Adapter ist not Set!"); - return false; - } - byte[] data = Encoding.UTF8.GetBytes("NET DNS AUTO " + adapter); - this.net_send.Send(data, data.Length, this.net_send_port); - return Boolean.Parse(Encoding.UTF8.GetString(net_gets.Receive(ref net_gets_port))); - } - - internal bool setNetworkWinsAuto(string adapter) - { - if (adapter == null) - { - System.Windows.Forms.MessageBox.Show("Adapter ist not Set!"); - return false; - } - byte[] data = Encoding.UTF8.GetBytes("NET WINS AUTO " + adapter); - this.net_send.Send(data, data.Length, this.net_send_port); - return Boolean.Parse(Encoding.UTF8.GetString(net_gets.Receive(ref net_gets_port))); - } - } -} diff --git a/NetMonitorConsole/CMDArgs.cs b/NetMonitorConsole/CMDArgs.cs deleted file mode 100644 index 8446df5..0000000 --- a/NetMonitorConsole/CMDArgs.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace NetMonitorConsole -{ - class CMDArgs - { - private string[] args; - public enum Worker - { - Network, - Nothing - } - private Worker work; - public CMDArgs(string[] arg) - { - this.args = arg; - work = Worker.Nothing; - setWorker(); - } - - private void setWorker() - { - if (args.Length >= 1 && args[0].ToLower() == "-n") - work = Worker.Network; - } - - - internal Worker getWorker() - { - return work; - } - - internal string getNetworkName() - { - if (work == Worker.Network) - return args[1]; - return null; - } - } -} diff --git a/NetMonitorConsole/Factory.cs b/NetMonitorConsole/Factory.cs new file mode 100644 index 0000000..878bd59 --- /dev/null +++ b/NetMonitorConsole/Factory.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using BlubbFish.Utils; +using NetMonitorUtils; + +namespace NetMonitorConsole +{ + class Factory + { + private static CmdArgs instanceArguments; + private static FileLogger instanceLogger; + public static CmdArgs getArguments(string[] args) + { + if (instanceArguments == null) + { + instanceArguments = CmdArgs.getInstance(String.Join(" ", args, 0, args.Length)); + Dictionary argp = new Dictionary(); + argp.Add("-n", CmdArgs.ArgLength.Touple); + instanceArguments.setArguments(argp); + } + return instanceArguments; + } + public static FileLogger getLogger() + { + if (instanceLogger == null) + { + instanceLogger = FileLogger.getInstance("logs/console.log", true); + } + return instanceLogger; + } + } +} diff --git a/NetMonitorConsole/NetMonitorConsole.csproj b/NetMonitorConsole/NetMonitorConsole.csproj index 2a1a732..22a6105 100644 --- a/NetMonitorConsole/NetMonitorConsole.csproj +++ b/NetMonitorConsole/NetMonitorConsole.csproj @@ -6,36 +6,48 @@ 8.0.30703 2.0 {148AA47C-FA4D-4807-9EB0-5AEAC36C1524} - Exe + WinExe Properties NetMonitorConsole NetMonitorConsole - v4.0 - Client + v4.5 + + 512 - x86 + AnyCPU true full false - E:\Programme\NetMonitor\ + ..\bin\Debug\ DEBUG;TRACE prompt 4 + false - x86 + AnyCPU pdbonly true - bin\Release\ - TRACE + ..\bin\Release\ + + prompt 4 + false + + + icon.ico + + + + + @@ -43,15 +55,38 @@ - + + + True + True + Resources.resx + - - {718693A0-06A3-4765-801D-33842861AA61} - NetMonitorClient + + {fac8ce64-bf13-4ece-8097-aeb5dd060098} + Utils + + {45ee003d-5572-48fe-b90e-6bfe18d9eec8} + NetMonitorUtils + + + + + PreserveNewest + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/NetMonitorConsole/icon.ico b/NetMonitorConsole/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..179d0a42d662376b55e9e9192d3617541d8f7b04 GIT binary patch literal 5430 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 literal 0 HcmV?d00001 diff --git a/NetMonitorConsole/network.ini b/NetMonitorConsole/network.ini new file mode 100644 index 0000000..fc415b3 --- /dev/null +++ b/NetMonitorConsole/network.ini @@ -0,0 +1,6 @@ +[network1] +Name=Home +Ip=auto +Dns=auto +Wins=auto +Adapter=LAN-Verbindung \ No newline at end of file diff --git a/NetMonitorServer/ActionClass.cs b/NetMonitorServer/ActionClass.cs new file mode 100644 index 0000000..cd5c93c --- /dev/null +++ b/NetMonitorServer/ActionClass.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Net.Sockets; +using System.Net; + +namespace NetMonitorServer +{ + abstract class ActionClass + { + protected UdpClient outputNetworkStream; + protected IPEndPoint outputNetworkPort; + internal void SetAnswerStream(UdpClient udpClient, IPEndPoint iPEndPoint) + { + this.outputNetworkStream = udpClient; + this.outputNetworkPort = iPEndPoint; + } + + abstract internal bool Run(Queue arguments); + + protected void sendMessage(string message) + { + Console.WriteLine(message); + byte[] answ = Encoding.UTF8.GetBytes(message); + outputNetworkStream.Send(answ, answ.Length, outputNetworkPort); + } + } +} diff --git a/NetMonitorServer/Actions/SetNetworks.cs b/NetMonitorServer/Actions/SetNetworks.cs new file mode 100644 index 0000000..fdbf398 --- /dev/null +++ b/NetMonitorServer/Actions/SetNetworks.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; + +namespace NetMonitorServer +{ + class SetNetworks : ActionClass + { + private bool setNetworkWins(Queue data) + { + if (data.Count != 2) + { + this.sendMessage("To less arguments for SetNetworks.setNetworkWins class"); + return false; + } + string ip = data.Dequeue(); + string name = data.Dequeue(); + string netsh = "interface ipv4 set winsservers name=\"" + name + (ip == "auto" ? "\" source=dhcp" : "\" static " + ip); + try + { + this.runProgramNetsh(netsh); + } + catch (Exception e) + { + this.sendMessage(e.Message); + return false; + } + this.sendMessage("true"); + return true; + } + + private bool setNetworkDns(Queue data) + { + if (data.Count != 2) + { + this.sendMessage("To less arguments for SetNetworks.setNetworkDns class"); + return false; + } + string ip = data.Dequeue(); + string name = data.Dequeue(); + string netsh = "interface ipv4 set dnsservers name=\"" + name + (ip == "auto" ? "\" source=dhcp" : "\" static " + ip + "primary"); + try + { + this.runProgramNetsh(netsh); + } + catch (Exception e) + { + this.sendMessage(e.Message); + return false; + } + this.sendMessage("true"); + return true; + } + + private bool setNetworkIp(Queue data) + { + if (data.Count != 2 && data.Count != 4) + { + this.sendMessage("To less arguments for SetNetworks.setNetworkIp class"); + return false; + } + string ip = data.Dequeue(); + string netsh = ""; + if (ip == "auto") + { + string name = data.Dequeue(); + netsh = "interface ipv4 set address name=\"" + name + "\" source=dhcp"; + } + else + { + string subnet = data.Dequeue(); + string gw = data.Dequeue(); + string name = data.Dequeue(); + netsh = "interface ipv4 set address \"" + name + "\" static " + ip + " " + subnet + " " + gw; + } + try + { + this.runProgramNetsh(netsh); + } + catch (Exception e) + { + this.sendMessage(e.Message); + return false; + } + this.sendMessage("true"); + return true; + } + + private bool setNetworkAuto(Queue data) + { + if (data.Count != 1) + { + this.sendMessage("To less arguments for SetNetworks.setNetworkDns class"); + return false; + } + string name = data.Dequeue(); + try + { + this.runProgramNetsh("interface ipv4 set address name=\"" + name + "\" source=dhcp"); + this.runProgramNetsh("interface ipv4 set dnsservers name=\"" + name + "\" source=dhcp"); + this.runProgramNetsh("interface ipv4 set winsservers name=\"" + name + "\" source=dhcp"); + } + catch (Exception e) + { + this.sendMessage(e.Message); + return false; + } + this.sendMessage("true"); + return true; + } + + private bool runProgramNetsh(string args) + { + Process p = new Process(); + p.StartInfo.Arguments = args; + p.StartInfo.FileName = "netsh"; + p.StartInfo.CreateNoWindow = true; + p.StartInfo.RedirectStandardOutput = true; + p.StartInfo.UseShellExecute = false; + p.Start(); + string output = p.StandardOutput.ReadToEnd(); + p.WaitForExit(); + Console.WriteLine(output.Trim()); + if (p.ExitCode == 0) + { + return true; + } + throw new Exception(output.Trim()); + } + internal override bool Run(Queue arguments) + { + if (arguments.Count < 2) + { + this.sendMessage("To less arguments for SetNetwork class"); + return false; + } + switch (arguments.Dequeue().ToLower()) + { + case "auto": return this.setNetworkAuto(arguments); + case "ip": return this.setNetworkIp(arguments); + case "dns": return this.setNetworkDns(arguments); + case "wins": return this.setNetworkWins(arguments); + default: this.sendMessage("Wrong arguments for service on SetNetwork class"); return false; + } + } + } +} diff --git a/NetMonitorServer/Actions/SetOpenVPNService.cs b/NetMonitorServer/Actions/SetOpenVPNService.cs new file mode 100644 index 0000000..9123730 --- /dev/null +++ b/NetMonitorServer/Actions/SetOpenVPNService.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace NetMonitorServer +{ + class SetOpenVPNService : ActionClass + { + internal override bool Run(Queue arguments) + { + throw new NotImplementedException(); + } + } +} diff --git a/NetMonitorServer/Actions/SetService.cs b/NetMonitorServer/Actions/SetService.cs new file mode 100644 index 0000000..d381b93 --- /dev/null +++ b/NetMonitorServer/Actions/SetService.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; +using System.ServiceProcess; + +namespace NetMonitorServer +{ + class SetService : ActionClass + { + ServiceController serviceController; + + private bool setServiceStart(Queue data) + { + if (data.Count != 1) + { + this.sendMessage("To less arguments for SetService.setServiceStart class"); + return false; + } + this.serviceController.ServiceName = data.Dequeue(); + try + { + this.serviceController.Start(); + this.serviceController.WaitForStatus(ServiceControllerStatus.Running, new TimeSpan(0, 0, 30)); + } + catch (Exception e) + { + this.sendMessage(e.Message); + return false; + } + if (this.serviceController.Status == ServiceControllerStatus.Running) + { + this.sendMessage("true"); + } + else + { + this.sendMessage("The service isn't started"); + return false; + } + return true; + } + + private bool setServiceStop(Queue data) + { + if (data.Count != 1) + { + this.sendMessage("To less arguments for SetService.setServiceStop class"); + return false; + } + this.serviceController.ServiceName = data.Dequeue(); + try + { + this.serviceController.Stop(); + this.serviceController.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 30)); + } + catch (Exception e) + { + this.sendMessage(e.Message); + return false; + } + if (this.serviceController.Status == ServiceControllerStatus.Stopped) + { + this.sendMessage("true"); + } + else + { + this.sendMessage("The service isn't stopped"); + return false; + } + return true; + } + + private bool getServiceStatus(Queue data) + { + if (data.Count != 1) + { + this.sendMessage("To less arguments for SetService.setServiceStatus class"); + return false; + } + try + { + this.serviceController.ServiceName = data.Dequeue(); + if (this.serviceController.Status == ServiceControllerStatus.Running) + this.sendMessage("running"); + else + this.sendMessage("stopped"); + } + catch (Exception e) + { + this.sendMessage(e.Message); + return false; + } + return true; + } + internal override bool Run(Queue arguments) + { + if (arguments.Count != 2) + { + this.sendMessage("To less arguments for SetService class"); + return false; + } + this.serviceController = new ServiceController(); + switch (arguments.Dequeue().ToLower()) + { + case "start": return this.setServiceStart(arguments); + case "stop": return this.setServiceStop(arguments); + case "status": return this.getServiceStatus(arguments); + default: this.sendMessage("Wrong arguments for service on SetService class"); return false; + } + } + } +} diff --git a/NetMonitorServer/Factory.cs b/NetMonitorServer/Factory.cs new file mode 100644 index 0000000..88654c7 --- /dev/null +++ b/NetMonitorServer/Factory.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using BlubbFish.Utils; + +namespace NetMonitorServer +{ + class Factory + { + internal static ActionClass getAction(string className) + { + if (className.Substring(0, 3).ToLower() == "net") + return new SetNetworks(); + if (className.Substring(0, 7).ToLower() == "service") + return new SetService(); + if (className.Substring(0, 7).ToLower() == "openvpn") + return new SetOpenVPNService(); + return null; + } + internal static InIReader getSettings() { + return InIReader.getInstance("config.ini"); + } + } +} diff --git a/NetMonitorServer/Service1.Designer.cs b/NetMonitorServer/MainService.Designer.cs similarity index 77% rename from NetMonitorServer/Service1.Designer.cs rename to NetMonitorServer/MainService.Designer.cs index 1e794f9..a10e8df 100644 --- a/NetMonitorServer/Service1.Designer.cs +++ b/NetMonitorServer/MainService.Designer.cs @@ -1,6 +1,6 @@ namespace NetMonitorServer { - partial class Service1 + partial class MainService { /// /// Required designer variable. @@ -28,10 +28,8 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - this.timer1 = new System.Windows.Forms.Timer(this.components); // - // Service1 + // MainService // this.ServiceName = "NetMonitorServer"; @@ -39,6 +37,5 @@ #endregion - private System.Windows.Forms.Timer timer1; } } diff --git a/NetMonitorServer/MainService.cs b/NetMonitorServer/MainService.cs new file mode 100644 index 0000000..3f8cdcc --- /dev/null +++ b/NetMonitorServer/MainService.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Linq; +using System.ServiceProcess; +using System.Text; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using BlubbFish.Utils; + +namespace NetMonitorServer +{ + public partial class MainService : ServiceBase + { + private Thread serverThread = new Thread(new ThreadStart(overwatch)); + private static UdpClient receiveStream; + public MainService() + { + InitializeComponent(); + this.serverThread.IsBackground = true; + } + + private static void overwatch() + { + IPEndPoint networkStreamAddress = new IPEndPoint(IPAddress.Loopback, 0); + while (true) + { + if (Thread.CurrentThread.ThreadState == System.Threading.ThreadState.AbortRequested) + { + receiveStream.Close(); + break; + } + byte[] data = receiveStream.Receive(ref networkStreamAddress); + Thread queryThread = new Thread(new ParameterizedThreadStart(ServerCommandProcessor)); + queryThread.Start(data); + } + } + + private static void ServerCommandProcessor(object threadParam) + { + string data = Encoding.UTF8.GetString((byte[])threadParam); + Console.WriteLine(data); + Queue arguments = new Queue(data.Split(' ')); + if (arguments.Count < 2) + { + Console.WriteLine("Zu wenig Argumente"); + return; + } + ActionClass a = Factory.getAction(arguments.Dequeue()); + if (a == null) + { + Console.WriteLine("Falsche Angabe der ActionClass"); + return; + } + a.SetAnswerStream(new UdpClient(), new IPEndPoint(IPAddress.Loopback, Int32.Parse(arguments.Dequeue()))); + a.Run(arguments); + } + + protected override void OnStart(string[] args) + { + this.initServerThread(); + this.serverThread.Start(); + } + + private void initServerThread() + { + receiveStream = new UdpClient(Int32.Parse(Factory.getSettings().getValue("ports", "server"))); + } + + protected override void OnStop() + { + this.serverThread.Abort(); + try { receiveStream.Close(); } catch { }; + } + + public void StartServiceConsole(string[] args) + { + this.OnStart(args); + } + } +} diff --git a/NetMonitorServer/Service1.resx b/NetMonitorServer/MainService.resx similarity index 91% rename from NetMonitorServer/Service1.resx rename to NetMonitorServer/MainService.resx index 72995a7..34987b2 100644 --- a/NetMonitorServer/Service1.resx +++ b/NetMonitorServer/MainService.resx @@ -117,12 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 143, 71 - - - 230, 71 - False diff --git a/NetMonitorServer/NetMonitorServer.csproj b/NetMonitorServer/NetMonitorServer.csproj index efe4c71..d76ab9c 100644 --- a/NetMonitorServer/NetMonitorServer.csproj +++ b/NetMonitorServer/NetMonitorServer.csproj @@ -6,32 +6,42 @@ 8.0.30703 2.0 {7813196F-D729-44A2-81C7-82BB83E207F5} - WinExe + Exe Properties NetMonitorServer NetMonitorServer - v4.0 - Client + v4.5 + + 512 - x86 + AnyCPU true full false - E:\Programme\NetMonitor\ + ..\bin\Debug\ DEBUG;TRACE prompt 4 + false - x86 - pdbonly + AnyCPU + none true - E:\Programme\NetMonitor\ - TRACE + ..\bin\Release\ + + prompt 4 + false + + + icon.ico + + + @@ -46,24 +56,43 @@ - - + + + + + Component - - Service1.cs + + MainService.cs Component - + - - Service1.cs + + MainService.cs + + + + + PreserveNewest + + + + + + + + {fac8ce64-bf13-4ece-8097-aeb5dd060098} + Utils + + + \ No newline at end of file diff --git a/NetMonitorTray/Program.cs b/NetMonitorTray/Program.cs new file mode 100644 index 0000000..18875e0 --- /dev/null +++ b/NetMonitorTray/Program.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + + +namespace NetMonitorTray +{ + class Program + { + static void Main(string[] args) + { + Controller.Tray t = new Controller.Tray(); + t.view(); + } + } +} diff --git a/NetMonitorTray/Properties/AssemblyInfo.cs b/NetMonitorTray/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d7489dc --- /dev/null +++ b/NetMonitorTray/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("NetMonitorTray")] +[assembly: AssemblyDescription("NetMonitor TrayLauncher")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("BlubbFish")] +[assembly: AssemblyProduct("NetMonitorTray")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("9069ec73-a0b6-4414-b9f0-e3794324b8bd")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/NetMonitorTray/Properties/Resources.Designer.cs b/NetMonitorTray/Properties/Resources.Designer.cs new file mode 100644 index 0000000..4cfbdce --- /dev/null +++ b/NetMonitorTray/Properties/Resources.Designer.cs @@ -0,0 +1,123 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.18444 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace NetMonitorTray.Properties { + using System; + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NetMonitorTray.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + internal static System.Drawing.Icon IconConnected { + get { + object obj = ResourceManager.GetObject("IconConnected", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + internal static System.Drawing.Icon IconNothing { + get { + object obj = ResourceManager.GetObject("IconNothing", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + internal static System.Drawing.Icon IconWorking { + get { + object obj = ResourceManager.GetObject("IconWorking", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap MenuImagesQuit { + get { + object obj = ResourceManager.GetObject("MenuImagesQuit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap MenuImagesServerConnect { + get { + object obj = ResourceManager.GetObject("MenuImagesServerConnect", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap MenuImagesServerDisconnect { + get { + object obj = ResourceManager.GetObject("MenuImagesServerDisconnect", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/NetMonitorTray/Properties/Resources.resx b/NetMonitorTray/Properties/Resources.resx new file mode 100644 index 0000000..f441025 --- /dev/null +++ b/NetMonitorTray/Properties/Resources.resx @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\connected.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\nothing.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\working.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Icons\door_open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Icons\server_connect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Icons\server_delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/NetMonitorTray/Resources/Icons/door_open.png b/NetMonitorTray/Resources/Icons/door_open.png new file mode 100644 index 0000000000000000000000000000000000000000..64bab57ddd0e95ad9a73a3828ec29b5d0b4dd675 GIT binary patch literal 508 zcmVjv0zFqT|_}Gg5c7fH`2AZ7W59X^b!J!cjQKk5f=?+6Od?2ip|XV za}o2aVlr?zXY)SuzK59<5o~(S-oAM4Zm-OARNqAS>D|jO?sih$KIXi4#zC#p8KB*6 zhr2T^Gn@5ikAoUcb$HCpdndR#asC03%nV>=v|23yQc6ob;v>x`Pk}_f8e)=(a71(& zuqvL;W`>(lMgvR>P$S&_bg(E|oK*{Mf@#6E0Euv?l<^#(s{aI-7D5%5GI0madt{~$%;b@oK6JNMtzMm)wYT0AgCL27sE1k% zB#Vk*Q+6?;e9+Vt!L4!K*`1ktXYNe*UVlWT^w7ZN+<|kx?>px^H{km|{^wKwm9Vg| zaNl*^8;;|sJc37gD5WAk3LK@NP$bk5Y$CIXlI%=4cd(q9B*cVPIfT zN-yMdJTl47IAHqHm0t=ttI8)@h=c;2s@8%}%bVy(RAhosz?g^LzLS!DUxmLngP`ow zrfn8+J7Zx$33yPOy6}EAf^^3q=H^}@`{F5>9HNI({R$?_cfm&~2_!((r0s!M>3g`lJ{4?wIwATQp;6yHt2^& zKYuq+Eb5L^v&R{AmzYgUE~OhIXUe@VXP)2T#eMsaNyJ@y*%#F`%&V0x=ZR~P^R7jY l<)&}aKbCWipX^bu^(V1WxGAiK0S5p8002ovPDHLkV1nEbSAPHi literal 0 HcmV?d00001 diff --git a/NetMonitorTray/Resources/Icons/server_delete.png b/NetMonitorTray/Resources/Icons/server_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..61e740fe18dc615016c3493811f305df96d678a7 GIT binary patch literal 668 zcmV;N0%QG&P)ZQIL=Mmwl(g-y|iYtDg0bIogV2(V47x-17<>@P+Hf!VQ~;Bh1ADY_Vk1>Kc5@s ze}58`N~Nm;9En7Z`Tc&Zu9YFOQ_4UY-hbj=vgo8wo7>bZ?mX^6EGP}5o4qgAd zf>y7X3>E~5{sEcYRlyGFL6@t*C6FW{GilXc39MrFM;3HnTt|X7nCvx95Y4`y#>dJg ztfe`ee?5c6OCFj}YU|v_+9e2S?u!(X>8@nT&ql-J&^L3?zb)dzt-H{Tgi?Q*KmN9` zaDU;lXQ!<|OhHxER^9tl$hWZk7^g1YfN$j)lt&}z{_q67@vzDiHtH&PUMLjK8is*D zAOPQypQzOua-5=e?fX~wjvBzVJA2(9k3ywNui{G2X0t&dv@F4i0c~a)OJC3*6k?uzvk|xVyW<)6)}PUS8O|c{6-`eBkHjhpk(;g2`lJ z+qP}k65xk`fB*yr24csK9S9B%#?GBP5fT!D(9lqXg@qv^A_9?-k%)?lLUeRAqS&E` ziHX6kUAqt)8w(bTg}AslBqSt&m9z^9DX~aMibG;zBG_y;k~oRra5zX#PKL<^0*nq} zFfItgym28M>zBf%NfEaDG+DW3eOuV@V&VjTd(V4+kh?tZWoDg-}39$p~5Hsik z*7t6R9dbd!&;}$9dLr?b7m|iHfj#U2_77g*+}(`iA2%a4e>e7)CSl)xHd2Rukueg8 zjQiV>Ga8KCd!fj^AA-EmaO97Lp>Qk`MGvDHe5eo+%CE&<72j&0SgQJgA zus3xt($dn9o}P}3j0|LDW+6K}8#y^S$ji$^K|uj>D$-C`Scu}{Vw9GaqO7b8hYue{ zMMVXU9zBZO6Z=qnHWQ_1a&e$OA7xFssI08S$&)8hRaJ%R>T1;1)}pSi4)yi*Xl`ys zOG^t{TU*i5(Sgp+PE=kjLCvMFaprb8Dxd7d@uz7xK9PpYIIGU#l@db z&T4i4hZ zojVvF9>xH#3-|8b!`Rpu#>dAoF)@LusVU6N%z(?~f?omf8yd>SW(<38XJ=EH&wrGK zsgHQnxZzSCEs{V=~F|6B!wo{g7dOO%#C@)vB3XM-lOitN<WEoXHL2YWYGjGynUM9seTj(%-Z zZ+X2}uUx)(-p|C?^H(y!o9gbK=JB{Q*Dn37&ehP=_#+)#>o5QG^NX3OZ`+#Po!!oT zERzv86mzpFc8D{!uDK7a4{hZjwj=mw(;KSIi%L zPT~Jolu4W86hYGYbbP`nqN1V{rz~E)m|_$fjYe^bq@*OpDl#%M6sstxN<&#=`5c?5 zs;bU$iH?pA)~;O(eSQ58JYr--@yN#<@`dvXn6Oqr&vg~_{-_R%a805xDipV$=1N@afe;z<@qN`YjPUV2#K_{)j6G zMO42dqHj4Py*L>~?I}pT>xa~T`6G427nx*#&ir>E${xj2eKspA3%R+uRBz4C&!_rp z_Q5n1m*=CXs0bw`B`9w!#qo}VR1a-vXh36QBbu6;(B9sT>YgL0y?q3gkN4r&L>f*# z%R%k)0yIt?p!#3)P!-wtPT|t4GgOZo7#P6N&=A$LMn^|MUV-23_Z;x=!2ii9n!4r& ziu1~gA;UmHO6bGkMbh+@>a+#a!g5Jf6-OsmPfs-(T>@Ax{|5(WXP5OGe4?Nv1u(Vc zG~Cv0@bU56NCh;q+v4Hl=N}VG0z5g4fz89pA!+X zMSJdRI2?9F5_`@iA2_>{=DYvnnV$oKctaxyF3AQXB*3JSdEpx&I?qU*UyV~!2%?MJ J&p*SrUjUKu^?d*U literal 0 HcmV?d00001 diff --git a/NetMonitorTray/Resources/nothing.ico b/NetMonitorTray/Resources/nothing.ico new file mode 100644 index 0000000000000000000000000000000000000000..b8392009e5e2b19aa814ad51992fcbd882e8352f GIT binary patch literal 3638 zcmeH~cUV+c8pbam;3zsk=qMr}Z9(ctlOi1~Akv8lBT}VElO~{`f&`Feqlg+2gVGFS z*+4*6v4V=k?6R_Af>Bn97(geMdH2i}(5UR4``&ZU+_`h+yuYC+K8l}G zRHR5hm#UphQK}S0iHg3>Lj@_SkJQvjjZC4eNbu&-ZMu7#%)Ww;j}QF({FpOm4g>`S zAtWS(xpU`Y{`~n65fQ<{g$p4nDhhFNaY#r=KuSsql9IBJk&%I%oE#P{S_B0J1rmx- zR8)kLk`h!@RG_M=3UzgLXliOgLqiK%T3T4Xd^vP=b)l!H2Ll5G7#gy$V#Nv=8ymyK z!~~|MrZ6`*hlPa&EG;b|FSQO@8cxvFUJFYLTj=XLf~D^c)g|Frt`-4ZjaXP&S;5-c z8n(8!u(!8|qoX67ot?2}%^Iv*w+ z0}v1p05+SApr9ZG2L~f0Bm|+Mp$H2LLwI;Nwr<^u$jC@UMMWVxIvU|&DTs-Q!M1JN z5E~ndxVSjP$HyZvF_F}g$v7Etu^C88N5{kbebYW3sS4As0JR3lJM!hP32T z>_{oYddCy^jIRrl0$pT{Zpa9ALymC)i$yMCspuuBNL+xbFHAIUz*6@* ziGHjyxB)w(UO1Uug`-&?oL1g|vw0uvjRvrKw`z;dx1l!{-HhbPfkk?%V`wSs6@JB?k zhY=e*g80z;NDLoAa^wS~L_b7Y%mbvyJ;Kh!hsaEPggt4a$W4EYojWs;m6e6;>}>4W zvj;gjdy$))i+%g{AwNGKg@uLKomGkb`}d=`xEQ6Sr8scl0FE3vg38KDR8>`B_pTGj z+uMMGyfY{&s7GO5Gpehraq{Fz)YR0Vwzd{^b#*v<_AKh_>(SEEg4Whnw6(RNqoV_z zot-#TavsNzcH?-(ZRG8If`Y7HP>?-_lH6Z#u;3}m^2Tv6e;kMRKSO!(uc#nVRW^a@ zgA+J*XcET{PvT_7Bx)+BP?GgT~V@(EQbJXgT{5 ztqm{H*8B>8JNF9hEw9nh`WoN;^$pH{`v!k+e}kT$9$dS24ZXd+=H$xq*usgb#@ zy|aa>iu{64-ME~AiM5NnlZBzO{Jc+mviS@pQ(G4+RWTt3LqOmY69ffBmMV!b81v>y zEM$;l^xd;zh%y*rVoVVxQ%p`nCnR*2I+H>4=?QbhWu=)CQqqdry8c0%**i<}3YJST zc{)9TA-hCLQbKFfmd&y3ST;MkWcR+Djq)-?<(<2Lyt1COq@*UBh(wOd%1_VE4p31g zcgQa&M09hOimbHMUx*$X8yBCNSCEx(mw(A~z`OmXp2^Wd}{8GH5~sytd*RekLEDzh2g%*NWu)vv*Q+y0`m!xbk^ zo~o&>?Yj~Aa$09uIhfbgdpFgGS5+VXvi9b!{@dUG@Q=Zm)ziAEow=)9UE77Ws6L|I z8NB=N;rl;5e0ZHZty}oiH8yl#x_W8r;Lz}oBR@YH{m+xfV^6R9&b+^!-5H2)fX$ zGRrCar0{Y3h*5-vg=tP%uwVhrC`=}k<`gk8F`88*B_(NAk&;k`!eZ4~Hc?hqp5+p4 zZEfi2=s;gzf0{=O!D78-k`Gx#d5Hrw)tsQQ%mr#o;-I4*0Sn_em>Fi!{9$8bGs_>Y zuCBA(;o;#ybBCXw-z;+k1_sisv1QAa-*HAnL`(%&5roE z!!3mP4iP^droA|t{Sz|Ni?KVS9hnJ_Xs^x5$w6LT9__CM1qIU{dkBRE6(}kyLP<#p z4wg2d;!p?eqm7M?XliOgb8|D=+uKoHeg((MZ=O0`m3$8Gk;5nLY5%i{C#yJ{qg*5;J_SYG`I4D=P5r z;`tJyOP4X{(1pcfN-B2ttKHm`nPMWqV%g7ZogJLlxq3uGK^)kqC9Sq*t&6*dmlM4p z%i7P$!^<}&etRk}X9b0Xv56lO*QIk<2c?8ZZjDNQn*ph$MTA&u&E8FFD)}#vJe!h1 uYD&`k>Hit?Xo8|%6R_YAHW=o6cNSB^u9c=2Bt)8=*n literal 0 HcmV?d00001 diff --git a/NetMonitorTray/Resources/working.ico b/NetMonitorTray/Resources/working.ico new file mode 100644 index 0000000000000000000000000000000000000000..d6cbcd238e6926961e47f293f67e61d794a456fc GIT binary patch literal 5430 zcmeHL4^Wj=7XLs2*I5OPSYupeP)Qtf5Yt3J9wRDiXybs6F}W!I16Bu=L^Bp%!D!e3 z3d%N$!f3i|E`P!ibBP|gCMp7gEJZ?!Mn#5_graNx_Wq81%zM^SYq~SdbZ5@H-*?|V z=XcJz=bn4+r)gH2wdUfYsoq7)bI>$5P177y&-aM_npUlz$EqE0JTGSi-(JQ;z3ftWXM9u_WKi16@m#Kpy7<;s;pK|w)qb#>Ksd)Rs)BqRjH z2n`Lz^5x61YSk*NUcDNN7cZ9orcIlM@#DwC$;nCALGOQ#E+WHS$qfhyKyYv{mMmF< zn3x!`Jt`_n@Mq1M1uriz!FOQu3lwi7=rEDY19Psi}# z!!cmM0GY#i{rmS9Qh?_8eEwgW1+T5Gt;lqAbi|Y?Q$!a&6OTljNiHrfc>IYcWQ;rt z@P6t`2jO#ecJ7r++epKP4FmDmlQ_mTaS!|ho{anxrlxO)SJ7d3pF9Jnx$|TW_4)yP zj@{p2V`GC6BSv7{xN&fEa}$2rGJ5oAd1vf<28X~sW*uD9w!`_Y0@%D$2JP5;c;<8! zg6rxrtGW(>=jt&sB1-tErvmzKr0XEI5_i(1N#a-TA!2)|z4l~g7KRrT3zk)Bx!~zN zu^r1#2)1u!HD;VW2mdoQa7%nu;&ANPu@=}?R#wodM=$Cia~Zn^gF$R1KIy5Txq?R= z9aHZ))=%l@QF<#uFZSLG3tXey*{5*Sp)x?^O#ZlFL)Q1$X?~1Bo6ltWz!$`t%*jP=ggTS z`-=N}!h{K;1Lsnwf%$L4w(K~5V>*G~mVW?;;}v-P#A&#ms=}P}A0nio5%WK4#&ZoH zcu59SG(XQCmdsxX|wj<^0HKcuY9j~`{ zVB58?k#X$?c6M~)jjzAKrX4%6X3d&D@p+!`?4qA(cWi7dsKeg9dy$`?FMagRouEzT zcp2Ak2u8NT$+^*m+;47Tf7dM>?CM7Ttvfs_lynE+c5P### z@qOZ}Q0P6oH*el7x*R)p43(9YXlQ6aeSN*iAQo|mq01*m;nj9z*PfTYy}e!RrOln4 zox;m8VpxWp#T$r6-*XKZ2fKFdLUVJo#18pi+p+~)3JUT1p}!+(&mM`Zb%}|1@uipW ziqVLqq$JUsG4mr>7Qp%o`55~=Q@Ivg`|9dybai!!J=Bl;nDKD%;6dc(<{~RAOXf0f zFoqd74}#sJgWwR8Yfqxz=|@saON*>USy>ql95{d-J9bFCL`FtRj$=JU9dvshut!2d z0vH3dv8t*Ht*x!H4vYipcI3zr@y)hv+YlWcEwvZ(1^4OCu-#nUUYlw6$&)9Ah|M*j zU+8z{2j+}Lixx>8`jD`7J;e9=I%i~LNIbH}WUO(Ia$jz_tJ596e(6oN#>NA2-*=a_8 z>NQaj`}@d_tRkXZiJ`a-EfL*HG!%q+<97=6xkA2B^nRxppa%Yb&7h!+X2kcO+6=R2 z&z3yIJjk3hS=DZ;zBMTU#vc)49QxQ}lDC=1$vbi4M5+1B?o5{}jdt48{F2m^W?+;H;PmEIXosCJ*6c5Q-k-NHc`Kr5zUv(|K z*2T)*f%h}sTUqn_`1qKZul@Y|q`rRo&k1n)=P9_TJA-Fc9YR$t8~X7lQpbj6@5O=z z3v|83e)26{x>U|wp7)Vy>3IIaMTDz5^hH$@zWT*gRdcc)ypCkk`{bwIy^Ux4h7B8} zzA7pzLRxk<(p1fu)o}wkon82=s;Lg$x{V@LPyMaw6TI-kVhet*Giyoa|Hj5f6cxRV z-F4@&`_yUtrSx5778YTD@nN3NrYl#j7}u{~Z|ntE58mG1#(n$t$yuWQ$K}hHQCeDx zoSYmas#=EUx390Sh0W&te0FztH&s+rpsA?|wY9Y(-#flXxh->JJ?+5-fsxgv5(IanA)_v!vX?N{3t)ri&m0Ou@Fg2!` QlbUBtRC5$hry}zH2V18*mjD0& literal 0 HcmV?d00001 diff --git a/NetMonitorTray/Views/Tray.cs b/NetMonitorTray/Views/Tray.cs new file mode 100644 index 0000000..96e5a3e --- /dev/null +++ b/NetMonitorTray/Views/Tray.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Drawing; +using NetMonitorTray.Properties; +using BlubbFish.Utils; + +namespace NetMonitorTray.View +{ + public class Tray : OwnView + { + private NotifyIcon trayi; + private Dictionary> menuOpenVpnService; + private Dictionary> menuNetwork; + + public Tray() + { + this.initIcon(); + Model.Tray.Instance.setObserver(this); + } + + public override void update() + { + this.menuOpenVpnService = Model.Tray.Instance.getMenuOpenVpnService(); + this.menuNetwork = Model.Tray.Instance.getMenuNetwork(); + this.trayi.ContextMenuStrip = this.genMenu(); + } + + private void initIcon() + { + this.trayi = new NotifyIcon(); + this.trayi.Visible = true; + this.trayi.Icon = new Icon(Resources.IconNothing, 40, 40); + this.trayi.Text = "NetMonitorTray"; + this.trayi.DoubleClick += Controller.Tray.Click_Tray; + this.trayi.BalloonTipClicked += Controller.Tray.Click_Ballon; + } + + private ContextMenuStrip genMenu() + { + ContextMenuStrip menu = new ContextMenuStrip(); + ToolStripMenuItem m1 = new ToolStripMenuItem("Öffnen"); + m1.Image = Resources.MenuImagesQuit; + m1.Click += Controller.Tray.Click_Open; + m1.Name = "Open"; + menu.Items.Add(m1); + menu.Items.Add(new ToolStripSeparator()); + menu.Items.AddRange(this.genMenuIt(this.menuNetwork, Controller.Tray.Click_Network)); + menu.Items.Add(new ToolStripSeparator()); + menu.Items.AddRange(this.genMenuIt(this.menuOpenVpnService, Controller.Tray.Click_Service)); + menu.Items.Add(new ToolStripSeparator()); + ToolStripMenuItem m2 = new ToolStripMenuItem("Beenden"); + m2.Image = Resources.MenuImagesQuit; + m2.Click += Controller.Tray.Click_Quit; + m2.Name = "Quit"; + menu.Items.Add(m2); + return menu; + } + + private ToolStripMenuItem[] genMenuIt(Dictionary> dictionary, EventHandler ev) + { + List l = new List(); + foreach (String key in dictionary.Keys) + { + ToolStripMenuItem m = new ToolStripMenuItem(dictionary[key].Item1); + if (dictionary[key].Item2 != null) + { + m.Image = dictionary[key].Item2; + } + m.Click += ev; + m.Name = key; + m.Enabled = dictionary[key].Item3; + if (dictionary[key].Item4) + { + m.Font = new System.Drawing.Font(m.Font, m.Font.Style | FontStyle.Bold); + } + l.Add(m); + } + return l.ToArray(); + } + + private void showBallonTooltip(string text, ToolTipIcon toolTipIcon, string title = "NetMonitor Tray") + { + this.trayi.BalloonTipIcon = toolTipIcon; + this.trayi.BalloonTipText = text; + this.trayi.BalloonTipTitle = title; + this.trayi.ShowBalloonTip(100); + } + + internal void Dispose() + { + this.trayi.Visible = false; + Application.ExitThread(); + } + + internal void setService(bool run) + { + this.showBallonTooltip((run ? "Service erfolgreich gestartet." : "Service erfolgreich beendet"), ToolTipIcon.Info); + Model.Tray.Instance.setService(run); + } + + internal void showError(string text) + { + this.showBallonTooltip(text, ToolTipIcon.Error); + } + } +} diff --git a/NetMonitorTray/icon.ico b/NetMonitorTray/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e8dfc7c3e769e5dfcfe7c08fd7b173d14ea1c9cf GIT binary patch literal 5430 zcmcgwQD_`h6n!xT8?ZF^ThOI~G$67{A+?BIsYd)zSG0v~TY zd+#~-zL)tJr5e;7DiTpLN7RXCrS4ZsHOtKPj%7-n7kiEDiHnK}xbF;iy0r-X3-PQM zLX*xK^?WizRy_o^bTw|FpP(H4dJfUt=_)&(|xOzTkM^V3m*8cwM+V$LY z&jV=f8p4wUXR&SU8lKG-@Y1C@Z2EH+Yu`JM?jxs)-eoR_(s>uU&f1UX&RDL^JD}}V z@wc$=(hOdiC}8L091^(#HeD>>u{}SR5W;qaAt zbdKg>$+@&0{-cOP*DtdoHwS0#2ie+3*YC!coZH=xZpK#o3XbJ(!1_Ip&a+ps`S@jY zA3I%^Uu)1kET@6Gv=8-^!TI+*!sm74j%f<;io_QM1MatKXXvW%b$OTcmJBhYuOoW-+RJ~ml|X2S0a&c>eKny zyI3sd;d!eMhbCsQ%bvo)Py4-i(V!%UmCNOzK`q)g=Wi}dV>CPIXk~utH{+wxsKXbJ z$DJOT?+???WHL?;e|#hnLClUJnuPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qQF!XYv0007tNklw zqCyyxs8vRbA_xU3jCRqYAQuI}G!#rp610kRV+caD5C?1}&18X$R8T}U{$$KT3?v3? zo{Edp{hsf8eDC_+c;B6O9*1|o``vTCbKgtVLpGa5BlK+SKnBHP(TW6mD;v8INeuVC zK>PqCYy>>qDgY0cH;PLh-f#eEWWq3=va}DN%2;GwvH_wVF__7^L<3MQO?gc{ovh=t z;+#21#73%=ciwu$K%J~hG=MboLq(8vQsec^K_WI%rM!FaQ9U`xhVDQe)Q|z>jd(5J zHkAJEPzgOi7?T)I9-dziGC&x(Zwnr76hLRa-ZmEA;Nz=4%#QV9W-RCL^YG9Bw8@85 z=?>G^1l=f%qYrzqQo4!Fza=bA^q@NbwtfKGAaEmW&1cAn_M_N+Vjq?Zm$6wLLG^1E zE7KYL9PP&B$Rpo}y%o2Hn^FeAo^U?9aS$7SUSfSIgZ1S>R6l3nRI>O!*ctE&1TcXf zfNJ?!d420b3;r$i!})a`Yn47Yi&x;xcHzVQlm1zvAHV}|M3O`@fPV8s`9`dH`uw8XrLZ-eL8rpQAQ^5l*=i@A}&?dHVkmw9j(o1+P%vq>k<}`5Ev*C4VKz{u8^mTUN&AXBgATKSDjQnUo7ajvg9S-a*_sU}kRU0<9xlMbB&Z>k Z`VSd`o6?z5*608L002ovPDHLkV1g|KTgLzZ literal 0 HcmV?d00001 diff --git a/NetMonitorUtils/Execptions/ServiceControlArgumentException.cs b/NetMonitorUtils/Execptions/ServiceControlArgumentException.cs new file mode 100644 index 0000000..98ba086 --- /dev/null +++ b/NetMonitorUtils/Execptions/ServiceControlArgumentException.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NetMonitorUtils.Execptions +{ + [Serializable()] + class ServiceControlArgumentException : System.Exception + { + public ServiceControlArgumentException() : base() { } + public ServiceControlArgumentException(string message) : base(message) { } + public ServiceControlArgumentException(string message, System.Exception inner) : base(message, inner) { } + protected ServiceControlArgumentException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { } + } +} diff --git a/NetMonitorUtils/Execptions/ServiceControlException.cs b/NetMonitorUtils/Execptions/ServiceControlException.cs new file mode 100644 index 0000000..fb85881 --- /dev/null +++ b/NetMonitorUtils/Execptions/ServiceControlException.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NetMonitorUtils.Execptions +{ + [Serializable()] + class ServiceControlException : System.Exception + { + public ServiceControlException() : base() { } + public ServiceControlException(string message) : base(message) { } + public ServiceControlException(string message, System.Exception inner) : base(message, inner) { } + protected ServiceControlException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { } + } +} diff --git a/NetMonitorUtils/Execptions/ServiceControlNetworkException.cs b/NetMonitorUtils/Execptions/ServiceControlNetworkException.cs new file mode 100644 index 0000000..dbcc12b --- /dev/null +++ b/NetMonitorUtils/Execptions/ServiceControlNetworkException.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NetMonitorUtils.Execptions +{ + [Serializable()] + class ServiceControlNetworkException : System.Exception + { + public ServiceControlNetworkException() : base() { } + public ServiceControlNetworkException(string message) : base(message) { } + public ServiceControlNetworkException(string message, System.Exception inner) : base(message, inner) { } + protected ServiceControlNetworkException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { } + } +} diff --git a/NetMonitorUtils/NetMonitorUtils.csproj b/NetMonitorUtils/NetMonitorUtils.csproj new file mode 100644 index 0000000..ec2bade --- /dev/null +++ b/NetMonitorUtils/NetMonitorUtils.csproj @@ -0,0 +1,64 @@ + + + + + Debug + AnyCPU + {45EE003D-5572-48FE-B90E-6BFE18D9EEC8} + Library + Properties + NetMonitorUtils + NetMonitorUtils + v4.5 + 512 + + + true + full + false + ..\bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + {fac8ce64-bf13-4ece-8097-aeb5dd060098} + Utils + + + + + \ No newline at end of file diff --git a/NetMonitorUtils/NetworkSetter.cs b/NetMonitorUtils/NetworkSetter.cs new file mode 100644 index 0000000..8cbe756 --- /dev/null +++ b/NetMonitorUtils/NetworkSetter.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using BlubbFish.Utils; + +namespace NetMonitorUtils +{ + public class NetworkSetter : OwnObject + { + private ServiceControl serviceController; + private InIReader networkini; + + private enum netsetterType + { + Auto, + IpAuto, + Ip, + DnsAuto, + Dns, + WinsAuto, + Wins + } + public NetworkSetter(string networkfile, string configfile) + { + this.addLog("NetworkSetter", "networkfile: " + networkfile + "; configfile: " + configfile + ";", LogLevel.Debug); + this.serviceController = ServiceControl.getInstance(configfile); + this.networkini = InIReader.getInstance(networkfile); + } + public bool setNetwork(string networkName) + { + this.addLog("setNetwork", "Setze Netzwerkeinstellungen: " + networkName, LogLevel.Info); + this.addLog("setNetwork", "networkName: " + networkName + ";", LogLevel.Debug); + String name = networkini.getValue(networkName, "Name"); + String ip = networkini.getValue(networkName, "Ip"); + String subnet = networkini.getValue(networkName, "Subnet"); + String gateway = networkini.getValue(networkName, "Gateway"); + String dns = networkini.getValue(networkName, "Dns"); + String wins = networkini.getValue(networkName, "Wins"); + String adapter = networkini.getValue(networkName, "Adapter"); + this.addLog("setNetwork", "name: " + name, LogLevel.Debug); + this.addLog("setNetwork", "ip: " + ip, LogLevel.Debug); + this.addLog("setNetwork", "subnet: " + subnet, LogLevel.Debug); + this.addLog("setNetwork", "gateway: " + gateway, LogLevel.Debug); + this.addLog("setNetwork", "dns: " + dns, LogLevel.Debug); + this.addLog("setNetwork", "wins: " + wins, LogLevel.Debug); + this.addLog("setNetwork", "adapter: " + adapter, LogLevel.Debug); + bool ret = false; + if (ip.ToLower() == "auto" && dns.ToLower() == "auto" && wins.ToLower() == "auto") + { + ret = setNetworkAuto(adapter, name); + this.addLog("setNetwork.setNetworkAuto", "return " + ret, LogLevel.Debug); + } + else + { + if (ip.ToLower() == "auto") + { + ret = setNetworkIpAuto(adapter, name); + this.addLog("setNetwork.setNetworkIpAuto", "return " + ret, LogLevel.Debug); + } + else + { + ret = setNetworkIp(ip, subnet, gateway, adapter, name); + this.addLog("setNetwork.setNetworkIp", "return " + ret, LogLevel.Debug); + } + if (dns.ToLower() == "auto") + { + ret = setNetworkDnsAuto(adapter, name); + this.addLog("setNetwork.setNetworkDnsAuto", "return " + ret, LogLevel.Debug); + } + else + { + ret = setNetworkDns(dns, adapter, name); + this.addLog("setNetwork.setNetworkDns", "return " + ret, LogLevel.Debug); + } + if (wins.ToLower() == "auto") + { + ret = setNetworkWinsAuto(adapter, name); + this.addLog("setNetwork.setNetworkWinsAuto", "return " + ret, LogLevel.Debug); + } + else + { + ret = setNetworkWins(wins, adapter, name); + this.addLog("setNetwork.setNetworkWins", "return " + ret, LogLevel.Debug); + } + } + this.addLog("setNetwork", "return " + ret, LogLevel.Debug); + return ret; + } + public bool setNetworkAuto(string adapter, string name) + { + this.addLog("setNetworkAuto", "Setze Netzwerkeinstellungen von " + adapter + " auf Automatisch", LogLevel.Info); + this.addLog("setNetworkAuto", "datapter: " + adapter + "; name: " + name + ";", LogLevel.Debug); + return setNetwork(netsetterType.Auto, null, null, null, adapter, name, null, null); + } + public bool setNetworkIpAuto(string adapter, string name) + { + this.addLog("setNetworkIpAuto", "Setze Netzwerkeinstellungen von " + adapter + " auf IP Automatisch", LogLevel.Info); + this.addLog("setNetworkIpAuto", "adapter: " + adapter + "; name: " + name + ";", LogLevel.Debug); + return setNetwork(netsetterType.IpAuto, null, null, null, adapter, name, null, null); + } + public bool setNetworkIp(string ip, string subnet, string gateway, string adapter, string name) + { + this.addLog("setNetworkIp", "Setze Netzwerkeinstellungen von " + adapter + " auf IP " + ip + "/" + subnet + " GW " + gateway, LogLevel.Info); + this.addLog("setNetworkIp", "ip: " + ip + "; subnet: " + subnet + "; gateway: " + gateway + "; adapter: " + adapter + "; name: " + name + ";", LogLevel.Debug); + return setNetwork(netsetterType.Ip, ip, subnet, gateway, adapter, name, null, null); + } + public bool setNetworkDnsAuto(string adapter, string name) + { + this.addLog("setNetworkDnsAuto", "Setze Netzwerkeinstellungen von " + adapter + " auf Dns Automatisch", LogLevel.Info); + this.addLog("setNetworkDnsAuto", "adapter: " + adapter + "; name: " + name + ";", LogLevel.Debug); + return setNetwork(netsetterType.DnsAuto, null, null, null, adapter, name, null, null); + } + public bool setNetworkDns(string dns, string adapter, string name) + { + this.addLog("setNetworkDns", "Setze Netzwerkeinstellungen von " + adapter + " auf Dns " + dns, LogLevel.Info); + this.addLog("setNetworkDns", "dns: " + dns + "; adapter: " + adapter + "; name: " + name + ";", LogLevel.Debug); + return setNetwork(netsetterType.Dns, null, null, null, adapter, name, dns, null); + } + public bool setNetworkWinsAuto(string adapter, string name) + { + this.addLog("setNetworkWinsAuto", "Setze Netzwerkeinstellungen von " + adapter + " auf Wins Automatisch", LogLevel.Info); + this.addLog("setNetworkWinsAuto", "adapter: " + adapter + "; name: " + name + ";", LogLevel.Debug); + return setNetwork(netsetterType.WinsAuto, null, null, null, adapter, name, null, null); + } + public bool setNetworkWins(string wins, string adapter, string name) + { + this.addLog("setNetworkWins", "Setze Netzwerkeinstellungen von " + adapter + " auf Wins " + wins, LogLevel.Info); + this.addLog("setNetworkWins", "wins: " + wins + "; adapter: " + adapter + "; name: " + name + ";", LogLevel.Debug); + return setNetwork(netsetterType.Wins, null, null, null, adapter, name, null, wins); + } + private bool setNetwork(netsetterType option, string ip, string subnet, string gateway, string adapter, string name, string dns, string wins) + { + this.addLog("setNetwork", "option: " + option + "; ip: " + ip + "; subnet: " + subnet + "; gateway: " + gateway + "; adapter: " + adapter + "; name: " + name + "; dns: " + dns + "; wins: " + wins + ";", LogLevel.Debug); + bool status = false; + try + { + if (option == netsetterType.Ip) + { + this.addLog("ServiceController.NetworkSetIp", "ip: "+ip+"; subnet: "+subnet+"; gateway: "+gateway+"; adapter: "+adapter+";", LogLevel.Debug); + status = this.serviceController.NetworkSetIp(ip, subnet, gateway, adapter); + } + if (option == netsetterType.Auto) + { + this.addLog("ServiceController.NetworkSetAuto", "adapter: "+adapter+";", LogLevel.Debug); + status = this.serviceController.NetworkSetAuto(adapter); + } + if (option == netsetterType.IpAuto) + { + this.addLog("ServiceController.NetworkSetIpAuto", "adapter: "+adapter+";", LogLevel.Debug); + status = this.serviceController.NetworkSetIpAuto(adapter); + } + if (option == netsetterType.DnsAuto) + { + this.addLog("ServiceController.NetworkSetDnsAuto", "adapter: "+adapter+";", LogLevel.Debug); + status = this.serviceController.NetworkSetDnsAuto(adapter); + } + if (option == netsetterType.WinsAuto) + { + this.addLog("ServiceController.NetworkSetWinsAuto", "adapter: "+adapter+";", LogLevel.Debug); + status = this.serviceController.NetworkSetWinsAuto(adapter); + } + if (option == netsetterType.Dns) + { + this.addLog("ServiceController.NetworkSetDNS", "dns: "+dns+"; adapter: "+adapter+";", LogLevel.Debug); + status = this.serviceController.NetworkSetDNS(dns, adapter); + } + if (option == netsetterType.Wins) + { + this.addLog("ServiceController.NetworkSetWINS", "wins: "+wins+"; adapter: "+adapter+";", LogLevel.Debug); + status = this.serviceController.NetworkSetWINS(wins, adapter); + } + } + catch (Exception e) + { + this.addLog("setNetwork", "Fehler beim Ausführen des Befehls: " + e.Message, LogLevel.Error); + throw e; + } + return status; + } + } +} diff --git a/NetMonitorUtils/Properties/AssemblyInfo.cs b/NetMonitorUtils/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..67cf7dd --- /dev/null +++ b/NetMonitorUtils/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("NetMonitorUtils")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("NetMonitorUtils")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("2c86a911-78de-4ced-a0fe-d63cd945c0ae")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/NetMonitorUtils/ServiceControl.cs b/NetMonitorUtils/ServiceControl.cs new file mode 100644 index 0000000..f2586f4 --- /dev/null +++ b/NetMonitorUtils/ServiceControl.cs @@ -0,0 +1,227 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.ServiceProcess; +using System.Net.Sockets; +using System.Net; +using BlubbFish.Utils; +using NetMonitorUtils.Execptions; + +namespace NetMonitorUtils +{ + public class ServiceControl + { + private ServiceController sc = new ServiceController(); + private static ServiceControl instance; + private InIReader config; + private ServiceControl(string configfile) + { + this.sc.ServiceName = "NetMonitorServer"; + this.config = InIReader.getInstance(configfile); + } + + public static ServiceControl getInstance(string configfile) + { + if (instance == null) + { + instance = new ServiceControl(configfile); + } + return instance; + } + + private bool ServiceSetStatus(ServiceControllerStatus status) + { + if (this.sc.Status == status) + { + return true; + } + this.sc.Start(); + try + { + this.sc.WaitForStatus(status, new TimeSpan(0, 0, 30)); + } + catch (System.ServiceProcess.TimeoutException) + { + return false; + } + return true; + } + + public bool ServiceStart() + { + return this.ServiceSetStatus(ServiceControllerStatus.Running); + } + + public bool ServicePause() + { + return this.ServiceSetStatus(ServiceControllerStatus.Paused); + } + + public bool ServiceStop() + { + return this.ServiceSetStatus(ServiceControllerStatus.Stopped); + } + + public bool NetworkSetAuto(string adapter) + { + if (adapter == null) + { + throw new ServiceControlArgumentException("Adapter ist not Set!"); + } + return this.sendMessage("NET","AUTO "+adapter); + } + + private bool sendMessage(string method, string message) + { + IPEndPoint netRecieverPoint = new IPEndPoint(IPAddress.Loopback, 0); + int startPort = Int32.Parse(this.config.getValue("ports", "client_from")); + int rangePort = Int32.Parse(this.config.getValue("ports", "client_to")); + UdpClient netReciver = null; + int selectedPort = 0; + for (int i = startPort; i < rangePort; i++) + { + try + { + netReciver = new UdpClient(i); + } + catch (System.Net.Sockets.SocketException) { } + if (netReciver != null) + { + selectedPort = i; + break; + } + } + if (netReciver == null) + { + throw new ServiceControlException("No Free Port for Comunication"); + } + byte[] data = Encoding.UTF8.GetBytes(method + " " + selectedPort + " " + message); + + UdpClient netSender = new UdpClient(); + IPEndPoint netSenderPoint = new IPEndPoint(IPAddress.Loopback, Int32.Parse(this.config.getValue("ports", "server"))); + netSender.Send(data, data.Length, netSenderPoint); + netReciver.Client.ReceiveTimeout = 60000; + byte[] recivedData; + try + { + recivedData = netReciver.Receive(ref netRecieverPoint); + } + catch (Exception e) + { + throw new ServiceControlNetworkException(e.Message); + } + string recieveText = Encoding.UTF8.GetString(recivedData); + if (recieveText.ToLower() == "true") + { + return true; + } + else + { + throw new ServiceControlException(recieveText); + } + } + + public bool NetworkSetIp(string ip, string subnet, string gateway, string adapter) + { + if (ip == null) + { + throw new ServiceControlArgumentException("IP address not Set!"); + } + if (subnet == null) + { + throw new ServiceControlArgumentException("Subnet address not Set!"); + } + if (gateway == null) + { + throw new ServiceControlArgumentException("Gateway address not Set!"); + } + if (adapter == null) + { + throw new ServiceControlArgumentException("Adapter ist not Set!"); + } + return this.sendMessage("NET", "IP " + ip + " " + subnet + " " + gateway + " " + adapter); + } + + public bool NetworkSetDNS(string dns, string adapter) + { + if (dns == null) + { + throw new ServiceControlArgumentException("DNS address not Set!"); + } + if (adapter == null) + { + throw new ServiceControlArgumentException("Adapter ist not Set!"); + } + return this.sendMessage("NET", "DNS " + dns + " " + adapter); + } + + public bool NetworkSetWINS(string wins, string adapter) + { + if (wins == null) + { + throw new ServiceControlArgumentException("WINS address not Set!"); + } + if (adapter == null) + { + throw new ServiceControlArgumentException("Adapter ist not Set!"); + } + return this.sendMessage("NET", "WINS " + wins + " " + adapter); + } + + public bool NetworkSetIpAuto(string adapter) + { + if (adapter == null) + { + throw new ServiceControlArgumentException("Adapter ist not Set!"); + } + return this.sendMessage("NET", "IP AUTO "+adapter); + } + + + public bool NetworkSetDnsAuto(string adapter) + { + if (adapter == null) + { + throw new ServiceControlArgumentException("Adapter ist not Set!"); + } + return this.sendMessage("NET", "DNS AUTO " + adapter); + } + + public bool NetworkSetWinsAuto(string adapter) + { + if (adapter == null) + { + throw new ServiceControlArgumentException("Adapter ist not Set!"); + } + return this.sendMessage("NET", "WINS AUTO " + adapter); + } + + public bool ServiceStart(string name) + { + if (name == null) + { + throw new ServiceControlArgumentException("Service name ist not set!"); + } + return this.sendMessage("SERVICE", "START " + name); + } + + public bool ServiceStop(string name) + { + if (name == null) + { + throw new ServiceControlArgumentException("Service name ist not set!"); + } + return this.sendMessage("SERVICE", "STOP " + name); + } + + public bool ServiceStatus(string name) + { + if (name == null) + { + throw new ServiceControlArgumentException("Service name ist not set!"); + } + return this.sendMessage("SERVICE", "STATUS " + name); + } + } +} diff --git a/NetOpenVPNGUI/Resources/icon_con.ico b/NetOpenVPNGUI/Resources/icon_con.ico new file mode 100644 index 0000000000000000000000000000000000000000..d6cbcd238e6926961e47f293f67e61d794a456fc GIT binary patch literal 5430 zcmeHL4^Wj=7XLs2*I5OPSYupeP)Qtf5Yt3J9wRDiXybs6F}W!I16Bu=L^Bp%!D!e3 z3d%N$!f3i|E`P!ibBP|gCMp7gEJZ?!Mn#5_graNx_Wq81%zM^SYq~SdbZ5@H-*?|V z=XcJz=bn4+r)gH2wdUfYsoq7)bI>$5P177y&-aM_npUlz$EqE0JTGSi-(JQ;z3ftWXM9u_WKi16@m#Kpy7<;s;pK|w)qb#>Ksd)Rs)BqRjH z2n`Lz^5x61YSk*NUcDNN7cZ9orcIlM@#DwC$;nCALGOQ#E+WHS$qfhyKyYv{mMmF< zn3x!`Jt`_n@Mq1M1uriz!FOQu3lwi7=rEDY19Psi}# z!!cmM0GY#i{rmS9Qh?_8eEwgW1+T5Gt;lqAbi|Y?Q$!a&6OTljNiHrfc>IYcWQ;rt z@P6t`2jO#ecJ7r++epKP4FmDmlQ_mTaS!|ho{anxrlxO)SJ7d3pF9Jnx$|TW_4)yP zj@{p2V`GC6BSv7{xN&fEa}$2rGJ5oAd1vf<28X~sW*uD9w!`_Y0@%D$2JP5;c;<8! zg6rxrtGW(>=jt&sB1-tErvmzKr0XEI5_i(1N#a-TA!2)|z4l~g7KRrT3zk)Bx!~zN zu^r1#2)1u!HD;VW2mdoQa7%nu;&ANPu@=}?R#wodM=$Cia~Zn^gF$R1KIy5Txq?R= z9aHZ))=%l@QF<#uFZSLG3tXey*{5*Sp)x?^O#ZlFL)Q1$X?~1Bo6ltWz!$`t%*jP=ggTS z`-=N}!h{K;1Lsnwf%$L4w(K~5V>*G~mVW?;;}v-P#A&#ms=}P}A0nio5%WK4#&ZoH zcu59SG(XQCmdsxX|wj<^0HKcuY9j~`{ zVB58?k#X$?c6M~)jjzAKrX4%6X3d&D@p+!`?4qA(cWi7dsKeg9dy$`?FMagRouEzT zcp2Ak2u8NT$+^*m+;47Tf7dM>?CM7Ttvfs_lynE+c5P### z@qOZ}Q0P6oH*el7x*R)p43(9YXlQ6aeSN*iAQo|mq01*m;nj9z*PfTYy}e!RrOln4 zox;m8VpxWp#T$r6-*XKZ2fKFdLUVJo#18pi+p+~)3JUT1p}!+(&mM`Zb%}|1@uipW ziqVLqq$JUsG4mr>7Qp%o`55~=Q@Ivg`|9dybai!!J=Bl;nDKD%;6dc(<{~RAOXf0f zFoqd74}#sJgWwR8Yfqxz=|@saON*>USy>ql95{d-J9bFCL`FtRj$=JU9dvshut!2d z0vH3dv8t*Ht*x!H4vYipcI3zr@y)hv+YlWcEwvZ(1^4OCu-#nUUYlw6$&)9Ah|M*j zU+8z{2j+}Lixx>8`jD`7J;e9=I%i~LNIbH}WUO(Ia$jz_tJ596e(6oN#>NA2-*=a_8 z>NQaj`}@d_tRkXZiJ`a-EfL*HG!%q+<97=6xkA2B^nRxppa%Yb&7h!+X2kcO+6=R2 z&z3yIJjk3hS=DZ;zBMTU#vc)49QxQ}lDC=1$vbi4M5+1B?o5{}jdt48{F2m^W?+;H;PmEIXosCJ*6c5Q-k-NHc`Kr5zUv(|K z*2T)*f%h}sTUqn_`1qKZul@Y|q`rRo&k1n)=P9_TJA-Fc9YR$t8~X7lQpbj6@5O=z z3v|83e)26{x>U|wp7)Vy>3IIaMTDz5^hH$@zWT*gRdcc)ypCkk`{bwIy^Ux4h7B8} zzA7pzLRxk<(p1fu)o}wkon82=s;Lg$x{V@LPyMaw6TI-kVhet*Giyoa|Hj5f6cxRV z-F4@&`_yUtrSx5778YTD@nN3NrYl#j7}u{~Z|ntE58mG1#(n$t$yuWQ$K}hHQCeDx zoSYmas#=EUx390Sh0W&te0FztH&s+rpsA?|wY9Y(-#flXxh->JJ?+5-fsxgv5(IanA)_v!vX?N{3t)ri&m0Ou@Fg2!` QlbUBtRC5$hry}zH2V18*mjD0& literal 0 HcmV?d00001 diff --git a/bin/Debug/NetMonitorConsole.exe b/bin/Debug/NetMonitorConsole.exe new file mode 100644 index 0000000000000000000000000000000000000000..f5653ffe0f0b06ba009221a478cbf49aa77735e8 GIT binary patch literal 20992 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 literal 0 HcmV?d00001 diff --git a/bin/Debug/NetMonitorServer.exe b/bin/Debug/NetMonitorServer.exe new file mode 100644 index 0000000000000000000000000000000000000000..a5a97949283a382823bb4a0c26d7dbffc23d416a GIT binary patch literal 19456 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 Hg$Mo@JNzG> literal 0 HcmV?d00001 diff --git a/bin/Debug/NetMonitorTray.exe b/bin/Debug/NetMonitorTray.exe new file mode 100644 index 0000000000000000000000000000000000000000..baed8bb9ea77354d920796699bc0a783d83d2922 GIT binary patch literal 34304 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 ZLJJ{4ed2eVR`**&G*SQ8{eP%|{{sldtD67- literal 0 HcmV?d00001 diff --git a/bin/Debug/NetMonitorUtils.dll b/bin/Debug/NetMonitorUtils.dll new file mode 100644 index 0000000000000000000000000000000000000000..9256284812a4e243ec668d53a6b746e95d8cab1b GIT binary patch literal 14336 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 literal 0 HcmV?d00001 diff --git a/bin/Debug/Utils.dll b/bin/Debug/Utils.dll new file mode 100644 index 0000000000000000000000000000000000000000..c0c35830141eba11d858361527cb40b8fc9899f4 GIT binary patch literal 14336 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 literal 0 HcmV?d00001 diff --git a/bin/Debug/config.ini b/bin/Debug/config.ini new file mode 100644 index 0000000..598f128 --- /dev/null +++ b/bin/Debug/config.ini @@ -0,0 +1,4 @@ +[ports] +server=54323 +client_from=54330 +client_to=54340 diff --git a/bin/Debug/network.ini b/bin/Debug/network.ini new file mode 100644 index 0000000..fc415b3 --- /dev/null +++ b/bin/Debug/network.ini @@ -0,0 +1,6 @@ +[network1] +Name=Home +Ip=auto +Dns=auto +Wins=auto +Adapter=LAN-Verbindung \ No newline at end of file