From 91339f861e0372682d8f479bbcb9f35d2e273a5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8C=BF=E4=BA=BA=E6=98=93?= Date: Tue, 1 Jul 2025 17:53:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=9C=8D=E5=8A=A1=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=BD=E4=BB=A4=E5=A4=84=E7=90=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 代码中新增了四个命令处理类:`ListServices`、`RestartService`、`StartService` 和 `StopService`,用于列出、重启、启动和停止子服务。每个类继承自 `BaseCommandHandler`,实现了 `Process` 方法以处理相应的命令逻辑,并通过 `ApiHttpClient` 与服务进行交互。新增的类还包含用户输入处理和错误处理逻辑,确保操作过程中的反馈。 --- StarAgent/CommandHandler/ListServices.cs | 82 +++++++++++++++++++ StarAgent/CommandHandler/RestartService.cs | 87 ++++++++++++++++++++ StarAgent/CommandHandler/StartService.cs | 93 ++++++++++++++++++++++ StarAgent/CommandHandler/StopService.cs | 89 +++++++++++++++++++++ 4 files changed, 351 insertions(+) create mode 100644 StarAgent/CommandHandler/ListServices.cs create mode 100644 StarAgent/CommandHandler/RestartService.cs create mode 100644 StarAgent/CommandHandler/StartService.cs create mode 100644 StarAgent/CommandHandler/StopService.cs diff --git a/StarAgent/CommandHandler/ListServices.cs b/StarAgent/CommandHandler/ListServices.cs new file mode 100644 index 00000000..def79b89 --- /dev/null +++ b/StarAgent/CommandHandler/ListServices.cs @@ -0,0 +1,82 @@ +using Stardust.Models; +using NewLife.Agent; +using NewLife.Agent.Command; +using NewLife.Log; +using NewLife.Remoting; + +namespace StarAgent.CommandHandler; + +public class ListServices : BaseCommandHandler +{ + public ListServices(ServiceBase service) : base(service) + { + Cmd = "-ListServices"; + Description = "查看子服务"; + ShortcutKey = '6'; + } + + public override void Process(String[] args) + { + var client = new ApiHttpClient("http://localhost:5500/"); + + try + { + // 调用GET请求。 + var response = client.Get("GetServices"); + + if (response == null || response.Services == null) + { + XTrace.WriteLine("没有找到任何子服务"); + return; + } + + XTrace.WriteLine("所有子服务列表:"); + XTrace.WriteLine("{0,-5} {1,-15} {2,-5} {3,-10} {4,-10} {5,-10}", "序号", "服务名称", "启用", "状态", "进程Id", "进程名称"); + + for (var i = 0; i < response.Services.Length; i++) + { + var svc = response.Services[i]; + + var es = response.RunningServices?.FirstOrDefault(e => e.Name == svc.Name); + + XTrace.WriteLine("{0,-7} {1,-20} {2,-5} {3,-10} {4,-10} {5,-10}", + i + 1, + svc.Name, + svc.Enable ? "是" : "否", + es != null ? "启动中" : "停止", + es?.ProcessId, + es?.ProcessName); + } + + //// 处理响应数据。 + //Console.WriteLine($"Response: {response?.ToJson()}"); + } + catch (Exception ex) + { + // 错误处理。 + Console.WriteLine($"Error: {ex.Message}"); + } + + //var service = (MyService)Service; + //var manager = service.Provider?.GetService(typeof(ServiceManager)) as ServiceManager; + + //if (manager == null || manager.Services == null || manager.Services.Length == 0) + //{ + // Console.WriteLine("没有找到任何子服务"); + // return; + //} + + //Console.WriteLine("所有子服务列表:"); + //Console.WriteLine("序号\t服务名称\t启用"); + + //for (int i = 0; i < manager.Services.Length; i++) + //{ + // var svc = manager.Services[i]; + + // Console.WriteLine("{0}\t{1}\t{2}", + // i + 1, + // svc.Name, + // svc.Enable ? "是" : "否"); + //} + } +} \ No newline at end of file diff --git a/StarAgent/CommandHandler/RestartService.cs b/StarAgent/CommandHandler/RestartService.cs new file mode 100644 index 00000000..4e275fcd --- /dev/null +++ b/StarAgent/CommandHandler/RestartService.cs @@ -0,0 +1,87 @@ +using NewLife.Agent; +using NewLife.Agent.Command; +using NewLife.Log; +using NewLife.Remoting; +using Stardust.Models; + +namespace StarAgent.CommandHandler; + +public class RestartService : BaseCommandHandler +{ + public RestartService(ServiceBase service) : base(service) + { + Cmd = "-RestartService"; + Description = "重启子服务"; + ShortcutKey = '9'; + } + + public override void Process(String[] args) + { + var client = new ApiHttpClient("http://localhost:5500/"); + + // 获取服务列表 + var services = client.Get("GetServices"); + if (services == null || services.Services == null || services.Services.Length == 0) + { + XTrace.WriteLine("没有找到任何子服务"); + return; + } + + // 显示服务列表 + XTrace.WriteLine("请选择要重启的服务:"); + for (var i = 0; i < services.Services.Length; i++) + { + var svc = services.Services[i]; + var es = services.RunningServices?.FirstOrDefault(e => e.Name == svc.Name); + var status = es != null ? "运行中" : "已停止"; + XTrace.WriteLine("{0}. {1} ({2})", i + 1, svc.Name, status); + } + + // 获取用户输入 + XTrace.WriteLine("请输入服务序号或名称:"); + var input = Console.ReadLine(); + if (String.IsNullOrEmpty(input)) + { + XTrace.WriteLine("操作已取消"); + return; + } + + // 解析用户输入 + String serviceName; + if (Int32.TryParse(input, out var index) && index > 0 && index <= services.Services.Length) + { + serviceName = services.Services[index - 1].Name; + } + else + { + serviceName = input; + } + + XTrace.WriteLine("准备重启服务:{0}", serviceName); + + try + { + // 调用API重启服务 + var response = client.Get("RestartService", new { serviceName }); + + if (response == null) + { + XTrace.WriteLine("重启服务失败:未收到响应"); + return; + } + + if (response.Success) + { + XTrace.WriteLine("服务 {0} 重启成功", serviceName); + } + else + { + XTrace.WriteLine("重启服务失败:{0}", response.Message); + } + } + catch (Exception ex) + { + XTrace.WriteLine("重启服务时发生错误:{0}", ex.Message); + } + } +} \ No newline at end of file diff --git a/StarAgent/CommandHandler/StartService.cs b/StarAgent/CommandHandler/StartService.cs new file mode 100644 index 00000000..5c0463f7 --- /dev/null +++ b/StarAgent/CommandHandler/StartService.cs @@ -0,0 +1,93 @@ +using NewLife.Agent; +using NewLife.Agent.Command; +using NewLife.Log; +using NewLife.Remoting; +using Stardust.Models; + +namespace StarAgent.CommandHandler; + +public class StartService : BaseCommandHandler +{ + public StartService(ServiceBase service) : base(service) + { + Cmd = "-StartService"; + Description = "启动子服务"; + ShortcutKey = '7'; + } + + public override void Process(String[] args) + { + var client = new ApiHttpClient("http://localhost:5500/"); + + // 获取服务列表 + var services = client.Get("GetServices"); + if (services == null || services.Services == null || services.Services.Length == 0) + { + XTrace.WriteLine("没有找到任何子服务"); + return; + } + + // 显示服务列表 + XTrace.WriteLine("请选择要启动的服务:"); + for (var i = 0; i < services.Services.Length; i++) + { + var svc = services.Services[i]; + XTrace.WriteLine("{0}. {1}", i + 1, svc.Name); + } + + // 获取用户输入 + XTrace.WriteLine("请输入服务序号或名称:"); + var input = Console.ReadLine(); + if (String.IsNullOrEmpty(input)) + { + XTrace.WriteLine("操作已取消"); + return; + } + + // 解析用户输入 + String serviceName; + if (Int32.TryParse(input, out var index) && index > 0 && index <= services.Services.Length) + { + serviceName = services.Services[index - 1].Name; + } + else + { + serviceName = input; + } + + XTrace.WriteLine("准备启动服务:{0}", serviceName); + + try + { + // 调用API启动服务 + var response = client.Get("StartService", new { serviceName }); + + if (response == null) + { + XTrace.WriteLine("启动服务失败:未收到响应"); + return; + } + + if (response.Success) + { + XTrace.WriteLine("服务 {0} 启动成功", serviceName); + } + else + { + XTrace.WriteLine("启动服务失败:{0}", response.Message); + } + } + catch (Exception ex) + { + XTrace.WriteLine("启动服务时发生错误:{0}", ex.Message); + } + } +} + +// 服务操作结果类,与API返回值对应 +public class ServiceOperationResult +{ + public Boolean Success { get; set; } + public String? Message { get; set; } + public String? ServiceName { get; set; } +} \ No newline at end of file diff --git a/StarAgent/CommandHandler/StopService.cs b/StarAgent/CommandHandler/StopService.cs new file mode 100644 index 00000000..05d22882 --- /dev/null +++ b/StarAgent/CommandHandler/StopService.cs @@ -0,0 +1,89 @@ +using NewLife.Agent; +using NewLife.Agent.Command; +using NewLife.Log; +using NewLife.Remoting; +using Stardust.Models; + +namespace StarAgent.CommandHandler; + +public class StopService : BaseCommandHandler +{ + public StopService(ServiceBase service) : base(service) + { + Cmd = "-StopService"; + Description = "停止子服务"; + ShortcutKey = '8'; + } + + public override void Process(String[] args) + { + var client = new ApiHttpClient("http://localhost:5500/"); + + // 获取服务列表 + var services = client.Get("GetServices"); + if (services == null || services.Services == null || services.Services.Length == 0) + { + XTrace.WriteLine("没有找到任何子服务"); + return; + } + + // 显示服务列表 + XTrace.WriteLine("请选择要停止的服务:"); + for (var i = 0; i < services.Services.Length; i++) + { + var svc = services.Services[i]; + var es = services.RunningServices?.FirstOrDefault(e => e.Name == svc.Name); + if (es != null) // 只显示正在运行的服务 + { + XTrace.WriteLine("{0}. {1} (PID: {2})", i + 1, svc.Name, es.ProcessId); + } + } + + // 获取用户输入 + XTrace.WriteLine("请输入服务序号或名称:"); + var input = Console.ReadLine(); + if (String.IsNullOrEmpty(input)) + { + XTrace.WriteLine("操作已取消"); + return; + } + + // 解析用户输入 + String serviceName; + if (Int32.TryParse(input, out var index) && index > 0 && index <= services.Services.Length) + { + serviceName = services.Services[index - 1].Name; + } + else + { + serviceName = input; + } + + XTrace.WriteLine("准备停止服务:{0}", serviceName); + + try + { + // 调用API停止服务 + var response = client.Get("StopService", new { serviceName }); + + if (response == null) + { + XTrace.WriteLine("停止服务失败:未收到响应"); + return; + } + + if (response.Success) + { + XTrace.WriteLine("服务 {0} 停止成功", serviceName); + } + else + { + XTrace.WriteLine("停止服务失败:{0}", response.Message); + } + } + catch (Exception ex) + { + XTrace.WriteLine("停止服务时发生错误:{0}", ex.Message); + } + } +} \ No newline at end of file