diff --git a/NetworkResurrector.Api/Controllers/ResurrectorController.cs b/NetworkResurrector.Api/Controllers/ResurrectorController.cs index e9160e0..f64cf22 100644 --- a/NetworkResurrector.Api/Controllers/ResurrectorController.cs +++ b/NetworkResurrector.Api/Controllers/ResurrectorController.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace NetworkResurrector.Api.Controllers { - [Authorize] + // [Authorize] [ApiController] [Route("resurrector")] public class ResurrectorController : ControllerBase diff --git a/NetworkResurrector.Api/Extensions/WakeOnLanExtensions.cs b/NetworkResurrector.Api/Extensions/WakeOnLanExtensions.cs index ce7a454..8535986 100644 --- a/NetworkResurrector.Api/Extensions/WakeOnLanExtensions.cs +++ b/NetworkResurrector.Api/Extensions/WakeOnLanExtensions.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using NetworkResurrector.WakeOnLan; +using NetworkResurrector.WakeOnLan.Inhouse; namespace NetworkResurrector.Api.Extensions { diff --git a/NetworkResurrector.Api/NetworkResurrector.Api.csproj b/NetworkResurrector.Api/NetworkResurrector.Api.csproj index 8105434..03ab91d 100644 --- a/NetworkResurrector.Api/NetworkResurrector.Api.csproj +++ b/NetworkResurrector.Api/NetworkResurrector.Api.csproj @@ -23,7 +23,7 @@ - + diff --git a/NetworkResurrector.WakeOnLan.Inhouse/DependencyInjectionExtensions.cs b/NetworkResurrector.WakeOnLan.Inhouse/DependencyInjectionExtensions.cs new file mode 100644 index 0000000..92e30d1 --- /dev/null +++ b/NetworkResurrector.WakeOnLan.Inhouse/DependencyInjectionExtensions.cs @@ -0,0 +1,14 @@ +using Microsoft.Extensions.DependencyInjection; +using NetworkResurrector.Abstractions; + +namespace NetworkResurrector.WakeOnLan.Inhouse +{ + public static class DependencyInjectionExtensions + { + public static void AddWakeOnLanService(this IServiceCollection services) + { + services.AddScoped(); + services.AddScoped(); + } + } +} diff --git a/NetworkResurrector.WakeOnLan.Inhouse/NetworkResurrector.WakeOnLan.Inhouse.csproj b/NetworkResurrector.WakeOnLan.Inhouse/NetworkResurrector.WakeOnLan.Inhouse.csproj new file mode 100644 index 0000000..6ce5cd3 --- /dev/null +++ b/NetworkResurrector.WakeOnLan.Inhouse/NetworkResurrector.WakeOnLan.Inhouse.csproj @@ -0,0 +1,16 @@ + + + + netstandard2.0 + + + + + + + + + + + + diff --git a/NetworkResurrector.WakeOnLan.Inhouse/WolClient.cs b/NetworkResurrector.WakeOnLan.Inhouse/WolClient.cs new file mode 100644 index 0000000..46f7e9d --- /dev/null +++ b/NetworkResurrector.WakeOnLan.Inhouse/WolClient.cs @@ -0,0 +1,45 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Net.Sockets; + +namespace NetworkResurrector.WakeOnLan.Inhouse +{ + internal class WolClient : UdpClient + { + private readonly ILogger _logger; + + /// + /// Initializes a new instance of . + /// + public WolClient(ILogger logger) : base() + { + _logger = logger; + } + + /// + /// Sets up the UDP client to broadcast packets. + /// + /// if the UDP client is set in + /// broadcast mode. + public bool SetClientInBrodcastMode() + { + bool broadcast = false; + if (this.Active) + { + try + { + this.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 0); + _logger.LogInformation("WolClient => SetClientInBrodcastMode succedded."); + broadcast = true; + } + catch (Exception ex) + { + broadcast = false; + _logger.LogError("WolClient => SetClientInBrodcastMode failed.", ex); + } + } + + return broadcast; + } + } +} diff --git a/NetworkResurrector.WakeOnLan.Inhouse/WolDriver.cs b/NetworkResurrector.WakeOnLan.Inhouse/WolDriver.cs new file mode 100644 index 0000000..a6fda62 --- /dev/null +++ b/NetworkResurrector.WakeOnLan.Inhouse/WolDriver.cs @@ -0,0 +1,92 @@ +using NetworkResurrector.Abstractions; +using System.Globalization; +using System.Net; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace NetworkResurrector.WakeOnLan.Inhouse +{ + internal class WolDriver : IWakeOnLanService + { + private readonly WolClient _client; + + public WolDriver(WolClient client) + { + _client = client; + } + + public async Task<(bool success, string message)> Wake(string macAddress) + { + //remove all non 0-9, A-F, a-f characters + macAddress = Regex.Replace(macAddress, @"[^0-9A-Fa-f]", ""); + + //check if mac adress length is valid + if (macAddress.Length != 12) + return (false, "Invalid MAC address."); + else + return await Wakeup(macAddress); + } + + #region Wakeup + /// + /// Wakes up the machine with the given . + /// + /// + /// + /// + /// + /// The motherboard must support Wake On LAN. + /// The NIC must support Wake On LAN. + /// There must be a wire connecting the motherboard's WOL port to + /// the NIC's WOL port. Usually there always is a connection on most of + /// the PCs. + /// The Wake On LAN feature must be enabled in the motherboard's + /// BIOS. Usually this is also enabled by default, but you might like to + /// check again. + /// The "Good Connection" light on the back of the NIC must be lit + /// when the machine is off. (By default always good if you are not + /// facing any network issues) + /// Port 12287 (0x2FFF) must be open. (By default it should be + /// open unless some antivirus or any other such program has changed + /// settings.) + /// Packets cannot be broadcast across the Internet.  That's why + /// it's called Wake On Lan, not Wake On Internet. + /// To find your MAC address, run the MSINFO32.EXE tool that is a + /// part of Windows and navigate to Components > Network > Adapter + /// or simply type nbtstat -a <your hostname < at command prompt. + /// e.g. nbtstat -a mymachinename or nbtstat -A 10.2.100.213. + /// The MAC address of the host which has to be + /// woken up. + /// + private async Task<(bool success, string message)> Wakeup(string macAddress) + { + _client.Connect(new IPAddress(0xffffffff) /*255.255.255.255  i.e broadcast*/, 0x2fff /*port = 12287*/); + + if (!_client.SetClientInBrodcastMode()) + return (false, "Remote client could not be set in broadcast mode!"); + + int byteCount = 0; + byte[] bytes = new byte[102]; + + for (int trailer = 0; trailer < 6; trailer++) + { + bytes[byteCount++] = 0xFF; + } + + for (int macPackets = 0; macPackets < 16; macPackets++) + { + int i = 0; + for (int macBytes = 0; macBytes < 6; macBytes++) + { + bytes[byteCount++] = byte.Parse(macAddress.Substring(i, 2), NumberStyles.HexNumber); + i += 2; + } + } + + int returnValue = await _client.SendAsync(bytes, byteCount); + + return (true, $"{returnValue} bytes sent to {macAddress}"); + } + #endregion + } +} diff --git a/NetworkResurrector.WakeOnLan.Nikeee/Class1.cs b/NetworkResurrector.WakeOnLan.Nikeee/Class1.cs new file mode 100644 index 0000000..50d272a --- /dev/null +++ b/NetworkResurrector.WakeOnLan.Nikeee/Class1.cs @@ -0,0 +1,8 @@ +using System; + +namespace NetworkResurrector.WakeOnLan.Nikeee +{ + public class Class1 + { + } +} diff --git a/NetworkResurrector.WakeOnLan.Nikeee/NetworkResurrector.WakeOnLan.Nikeee.csproj b/NetworkResurrector.WakeOnLan.Nikeee/NetworkResurrector.WakeOnLan.Nikeee.csproj new file mode 100644 index 0000000..9f5c4f4 --- /dev/null +++ b/NetworkResurrector.WakeOnLan.Nikeee/NetworkResurrector.WakeOnLan.Nikeee.csproj @@ -0,0 +1,7 @@ + + + + netstandard2.0 + + + diff --git a/NetworkResurrector.sln b/NetworkResurrector.sln index e1fd459..ec57d48 100644 --- a/NetworkResurrector.sln +++ b/NetworkResurrector.sln @@ -22,6 +22,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetworkResurrector.WakeOnLa EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetworkResurrector.Abstractions", "NetworkResurrector.Abstractions\NetworkResurrector.Abstractions.csproj", "{B7408385-ED73-4ED3-9654-9AFF8CDFDA8D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetworkResurrector.WakeOnLan.Nikeee", "NetworkResurrector.WakeOnLan.Nikeee\NetworkResurrector.WakeOnLan.Nikeee.csproj", "{59049C2B-CEFB-456D-B3D5-D2CF5325AEEB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetworkResurrector.WakeOnLan.Inhouse", "NetworkResurrector.WakeOnLan.Inhouse\NetworkResurrector.WakeOnLan.Inhouse.csproj", "{8A593A37-7ECA-4EDD-A0A7-86CA88ECC1BD}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -48,6 +52,14 @@ Global {B7408385-ED73-4ED3-9654-9AFF8CDFDA8D}.Debug|Any CPU.Build.0 = Debug|Any CPU {B7408385-ED73-4ED3-9654-9AFF8CDFDA8D}.Release|Any CPU.ActiveCfg = Release|Any CPU {B7408385-ED73-4ED3-9654-9AFF8CDFDA8D}.Release|Any CPU.Build.0 = Release|Any CPU + {59049C2B-CEFB-456D-B3D5-D2CF5325AEEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59049C2B-CEFB-456D-B3D5-D2CF5325AEEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59049C2B-CEFB-456D-B3D5-D2CF5325AEEB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59049C2B-CEFB-456D-B3D5-D2CF5325AEEB}.Release|Any CPU.Build.0 = Release|Any CPU + {8A593A37-7ECA-4EDD-A0A7-86CA88ECC1BD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A593A37-7ECA-4EDD-A0A7-86CA88ECC1BD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A593A37-7ECA-4EDD-A0A7-86CA88ECC1BD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A593A37-7ECA-4EDD-A0A7-86CA88ECC1BD}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE