235 lines
8.2 KiB
C#
235 lines
8.2 KiB
C#
using System.Diagnostics;
|
|
using System.Net.NetworkInformation;
|
|
using System.Net.Sockets;
|
|
using System.Runtime.InteropServices;
|
|
using Makaretu.Dns;
|
|
using Microsoft.Win32;
|
|
|
|
namespace handler
|
|
{
|
|
public class MdsService
|
|
{
|
|
public static void Start()
|
|
{
|
|
var macAddress = (
|
|
from networkInterface in NetworkInterface.GetAllNetworkInterfaces()
|
|
where networkInterface.OperationalStatus == OperationalStatus.Up
|
|
select networkInterface.GetPhysicalAddress().ToString()).FirstOrDefault();
|
|
|
|
var addresses = MulticastService.GetIPAddresses()
|
|
.Where(ip => ip.AddressFamily == AddressFamily.InterNetwork).ToArray();
|
|
|
|
//TODO find macadress and send it
|
|
var serviceDiscovery = new ServiceDiscovery();
|
|
var service = new ServiceProfile("GoToBed-Server", "_gotobed._tcp", 13378);
|
|
service.AddProperty("mac", "macAddr");
|
|
service.AddProperty("protocol", "http");
|
|
service.AddProperty("ip", addresses[0].MapToIPv4().ToString());
|
|
serviceDiscovery.Advertise(service);
|
|
}
|
|
}
|
|
|
|
public class FirstRun
|
|
{
|
|
public static readonly string configPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "/go-to-bed-server-first-run";
|
|
|
|
public static void openGithubDocumentation(string uri)
|
|
{
|
|
Uri url = new Uri(uri);
|
|
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
Process.Start(new ProcessStartInfo(url.AbsoluteUri) { UseShellExecute = true });
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
|
{
|
|
Process.Start("xdg-open", url.AbsoluteUri);
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
|
{
|
|
Process.Start("open", url.AbsolutePath);
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("Unsupported OS!");
|
|
}
|
|
}
|
|
public static bool status(string documentationPath)
|
|
{
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"Software\GoToBed", true);
|
|
if (key == null)
|
|
{
|
|
key = Registry.CurrentUser.CreateSubKey(@"Software\GoToBed");
|
|
key.SetValue("FirstRun", true);
|
|
openGithubDocumentation(documentationPath);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
|
{
|
|
if (!File.Exists(configPath))
|
|
{
|
|
File.Create(configPath);
|
|
openGithubDocumentation(documentationPath);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
|
{
|
|
if (!File.Exists(configPath))
|
|
{
|
|
File.Create(configPath);
|
|
openGithubDocumentation(documentationPath);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("Unsupported OS!");
|
|
}
|
|
}
|
|
}
|
|
|
|
public class ShutdownCommand
|
|
{
|
|
[DllImport("user32.dll")]
|
|
private static extern bool ExitWindowsEx(uint uFlags, uint dwReason);
|
|
|
|
// TODO: will clean only few are needed. Checked out what things does from documentation.
|
|
private const uint EWX_LOGOFF = 0x00000000;
|
|
private const uint EWX_SHUTDOWN = 0x00000001;
|
|
private const uint EWX_REBOOT = 0x00000002;
|
|
private const uint EWX_FORCE = 0x00000004;
|
|
private const uint EWX_POWEROFF = 0x00000008;
|
|
private const uint EWX_FORCEIFHUNG = 0x00000010;
|
|
private const uint EWX_QUICKRESOLVE = 0x00000020;
|
|
private const uint EWX_RESTARTAPPS = 0x00000040;
|
|
private const uint EWX_HYBRID_SHUTDOWN = 0x00400000;
|
|
private const uint EWX_BOOTOPTIONS = 0x01000000;
|
|
|
|
private const uint SHTDN_REASON_MAJOR_OTHER = 0x00000000;
|
|
private const uint SHTDN_REASON_MINOR_OTHER = 0x00000000;
|
|
private const uint SHTDN_REASON_FLAG_PLANNED = 0x80000000;
|
|
|
|
public static void Shutdown()
|
|
{
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER | SHTDN_REASON_FLAG_PLANNED);
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
|
{
|
|
Process.Start("shutdown", "-h now");
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
|
{
|
|
Process.Start("shutdown", "-h now");
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("Unsupported OS!");
|
|
}
|
|
}
|
|
|
|
public static void Hibernate()
|
|
{
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
ExitWindowsEx(EWX_HYBRID_SHUTDOWN | EWX_FORCE, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER | SHTDN_REASON_FLAG_PLANNED);
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
|
{
|
|
Process.Start("systemctl", "suspend");
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
|
{
|
|
Process.Start("pmset", "sleepnow");
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("Unsupported OS!");
|
|
}
|
|
}
|
|
|
|
public static void Abort()
|
|
{
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
ExitWindowsEx(EWX_FORCEIFHUNG | EWX_FORCE, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER | SHTDN_REASON_FLAG_PLANNED);
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("Unsupported OS!");
|
|
}
|
|
}
|
|
|
|
public static void Reboot()
|
|
{
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
ExitWindowsEx(EWX_REBOOT | EWX_FORCE, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER | SHTDN_REASON_FLAG_PLANNED);
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
|
{
|
|
Process.Start("shutdown", "-r now");
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
|
{
|
|
Process.Start("shutdown", "-r now");
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("Unsupported OS!");
|
|
}
|
|
}
|
|
public static void Logout()
|
|
{
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
ExitWindowsEx(EWX_LOGOFF | EWX_FORCE, SHTDN_REASON_MAJOR_OTHER | SHTDN_REASON_MINOR_OTHER | SHTDN_REASON_FLAG_PLANNED);
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
|
{
|
|
Process.Start("shutdown", "-l now");
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
|
{
|
|
Process.Start("shutdown", "-l now");
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("Unsupported OS!");
|
|
}
|
|
}
|
|
|
|
public static void Lock()
|
|
{
|
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
|
|
{
|
|
Process.Start("rundll32.exe", "user32.dll,LockWorkStation");
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
|
|
{
|
|
Process.Start("gnome-screensaver-command", "-l");
|
|
}
|
|
else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
|
|
{
|
|
Process.Start("pmset", "displaysleepnow");
|
|
}
|
|
else
|
|
{
|
|
throw new Exception("Unsupported OS!");
|
|
}
|
|
}
|
|
}
|
|
} |