mirror of
https://github.com/Stone-Red-Code/RemSox.git
synced 2026-09-04 00:56:19 +02:00
Add remote desktop start/stop commands and process with server support
This commit is contained in:
@@ -28,7 +28,9 @@ public class Kernel : Sys.Kernel
|
|||||||
new StartGuiCommand(),
|
new StartGuiCommand(),
|
||||||
new StopGuiCommand(),
|
new StopGuiCommand(),
|
||||||
new ViewProcessLogs(),
|
new ViewProcessLogs(),
|
||||||
new YesNtCommand()
|
new YesNtCommand(),
|
||||||
|
new StartRemoteDesktopCommand(),
|
||||||
|
new StopRemoteDesktopCommand()
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Sys.Graphics.Canvas canvas = Sys.Graphics.FullScreenCanvas.GetFullScreenCanvas();
|
Sys.Graphics.Canvas canvas = Sys.Graphics.FullScreenCanvas.GetFullScreenCanvas();
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
using RemSox.Networking;
|
||||||
|
using RemSox.Processing;
|
||||||
|
using RemSox.UI.GUI.Rendering;
|
||||||
|
using RemSox.UI.GUI.Windows;
|
||||||
|
|
||||||
|
namespace RemSox.Processes;
|
||||||
|
|
||||||
|
internal sealed class RemoteDesktopProcess() : Process("Remote Desktop Server")
|
||||||
|
{
|
||||||
|
private TcpRpcServer? server;
|
||||||
|
private NetworkRenderSource? networkSource;
|
||||||
|
private CancellationTokenSource? cts;
|
||||||
|
|
||||||
|
public int Port { get; private set; }
|
||||||
|
|
||||||
|
internal override void Start(string[] args)
|
||||||
|
{
|
||||||
|
if (args.Length == 0 || !int.TryParse(args[0], out int port) || port <= 0 || port > 65535)
|
||||||
|
{
|
||||||
|
Logger.Log("Invalid port. Usage: rdp-start <port> (1-65535)", Logging.LogSeverity.Error);
|
||||||
|
RequestStop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Port = port;
|
||||||
|
cts = new CancellationTokenSource();
|
||||||
|
server = new TcpRpcServer();
|
||||||
|
networkSource = new NetworkRenderSource(server);
|
||||||
|
|
||||||
|
server.ListenTo<string>("SyncRequest", async _ =>
|
||||||
|
{
|
||||||
|
WindowManager.InvalidateAll();
|
||||||
|
});
|
||||||
|
|
||||||
|
_ = Task.Run(() => server.StartAsync(port, cts.Token));
|
||||||
|
|
||||||
|
WindowManager.AddRenderSource(networkSource);
|
||||||
|
|
||||||
|
Logger.Log($"Remote desktop server started on port {port}.", Logging.LogSeverity.Info);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal override void Tick()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
internal override void Stop()
|
||||||
|
{
|
||||||
|
cts?.Cancel();
|
||||||
|
server?.Stop();
|
||||||
|
|
||||||
|
if (networkSource is not null)
|
||||||
|
{
|
||||||
|
WindowManager.RemoveRenderSource(networkSource);
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.Log("Remote desktop server stopped.", Logging.LogSeverity.Info);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,7 +15,8 @@ public static class ProcessManifest
|
|||||||
private static readonly Dictionary<Type, ProcessManifestFlags> map = new()
|
private static readonly Dictionary<Type, ProcessManifestFlags> map = new()
|
||||||
{
|
{
|
||||||
{ typeof(DesktopProcess), ProcessManifestFlags.Singleton | ProcessManifestFlags.System },
|
{ typeof(DesktopProcess), ProcessManifestFlags.Singleton | ProcessManifestFlags.System },
|
||||||
{ typeof(CliProcess), ProcessManifestFlags.Singleton | ProcessManifestFlags.System }
|
{ typeof(CliProcess), ProcessManifestFlags.Singleton | ProcessManifestFlags.System },
|
||||||
|
{ typeof(RemoteDesktopProcess), ProcessManifestFlags.Singleton }
|
||||||
};
|
};
|
||||||
|
|
||||||
public static bool HasFlag<T>(ProcessManifestFlags flag) where T : Process
|
public static bool HasFlag<T>(ProcessManifestFlags flag) where T : Process
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
using RemSox.Processes;
|
||||||
|
using RemSox.Processing;
|
||||||
|
|
||||||
|
namespace RemSox.UI.CLI.Commands;
|
||||||
|
|
||||||
|
public class StartRemoteDesktopCommand : ICommand
|
||||||
|
{
|
||||||
|
public string Name => "rdp-start";
|
||||||
|
public string Description => "Starts the remote desktop server on the specified port (rdp-start <port>)";
|
||||||
|
|
||||||
|
public Task ExecuteAsync(string? arguments, Action<string> printLine)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(arguments) || !int.TryParse(arguments.Trim(), out int port) || port <= 0 || port > 65535)
|
||||||
|
{
|
||||||
|
printLine("Usage: rdp-start <port> (1-65535)");
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ProcessManager.IsProcessRunning<RemoteDesktopProcess>())
|
||||||
|
{
|
||||||
|
printLine("Remote desktop server is already running.");
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
_ = ProcessManager.SpawnProcess<RemoteDesktopProcess>([port.ToString()]);
|
||||||
|
printLine($"Remote desktop server started on port {port}.");
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
using RemSox.Processes;
|
||||||
|
using RemSox.Processing;
|
||||||
|
|
||||||
|
namespace RemSox.UI.CLI.Commands;
|
||||||
|
|
||||||
|
public class StopRemoteDesktopCommand : ICommand
|
||||||
|
{
|
||||||
|
public string Name => "rdp-stop";
|
||||||
|
public string Description => "Stops the remote desktop server";
|
||||||
|
|
||||||
|
public async Task ExecuteAsync(string? arguments, Action<string> printLine)
|
||||||
|
{
|
||||||
|
if (!ProcessManager.IsProcessRunning<RemoteDesktopProcess>())
|
||||||
|
{
|
||||||
|
printLine("Remote desktop server is not running.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (RemoteDesktopProcess process in ProcessManager.GetProcessesOfType<RemoteDesktopProcess>())
|
||||||
|
{
|
||||||
|
await ProcessManager.StopProcessAndWaitAsync(process.Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
printLine("Remote desktop server stopped.");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user