From 7a4c70ede9195ad5aae70593a294bc3a1746a919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Wed, 22 Oct 2025 23:26:05 +0800 Subject: [PATCH] daemon: Add clear logs --- daemon/started_service.go | 5 ++ daemon/started_service.pb.go | 85 ++++++++++++++------------- daemon/started_service.proto | 1 + daemon/started_service_grpc.pb.go | 39 ++++++++++++ experimental/libbox/command_client.go | 10 ++++ experimental/libbox/command_server.go | 2 +- 6 files changed, 100 insertions(+), 42 deletions(-) diff --git a/daemon/started_service.go b/daemon/started_service.go index 8b926b27c..acbbc5038 100644 --- a/daemon/started_service.go +++ b/daemon/started_service.go @@ -351,6 +351,11 @@ func (s *StartedService) GetDefaultLogLevel(ctx context.Context, empty *emptypb. return &DefaultLogLevel{Level: LogLevel(logLevel)}, nil } +func (s *StartedService) ClearLogs(ctx context.Context, empty *emptypb.Empty) (*emptypb.Empty, error) { + s.resetLogs() + return &emptypb.Empty{}, nil +} + func (s *StartedService) SubscribeStatus(request *SubscribeStatusRequest, server grpc.ServerStreamingServer[Status]) error { interval := time.Duration(request.Interval) if interval <= 0 { diff --git a/daemon/started_service.pb.go b/daemon/started_service.pb.go index 90cff9984..dcd94feb8 100644 --- a/daemon/started_service.pb.go +++ b/daemon/started_service.pb.go @@ -1746,13 +1746,14 @@ const file_daemon_started_service_proto_rawDesc = "" + "\x10ConnectionSortBy\x12\b\n" + "\x04DATE\x10\x00\x12\v\n" + "\aTRAFFIC\x10\x01\x12\x11\n" + - "\rTOTAL_TRAFFIC\x10\x022\xf8\v\n" + + "\rTOTAL_TRAFFIC\x10\x022\xb7\f\n" + "\x0eStartedService\x12=\n" + "\vStopService\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x12?\n" + "\rReloadService\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x12K\n" + "\x16SubscribeServiceStatus\x12\x16.google.protobuf.Empty\x1a\x15.daemon.ServiceStatus\"\x000\x01\x127\n" + "\fSubscribeLog\x12\x16.google.protobuf.Empty\x1a\v.daemon.Log\"\x000\x01\x12G\n" + - "\x12GetDefaultLogLevel\x12\x16.google.protobuf.Empty\x1a\x17.daemon.DefaultLogLevel\"\x00\x12E\n" + + "\x12GetDefaultLogLevel\x12\x16.google.protobuf.Empty\x1a\x17.daemon.DefaultLogLevel\"\x00\x12=\n" + + "\tClearLogs\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\"\x00\x12E\n" + "\x0fSubscribeStatus\x12\x1e.daemon.SubscribeStatusRequest\x1a\x0e.daemon.Status\"\x000\x01\x12=\n" + "\x0fSubscribeGroups\x12\x16.google.protobuf.Empty\x1a\x0e.daemon.Groups\"\x000\x01\x12G\n" + "\x12GetClashModeStatus\x12\x16.google.protobuf.Empty\x1a\x17.daemon.ClashModeStatus\"\x00\x12C\n" + @@ -1835,45 +1836,47 @@ var file_daemon_started_service_proto_depIdxs = []int32{ 27, // 12: daemon.StartedService.SubscribeServiceStatus:input_type -> google.protobuf.Empty 27, // 13: daemon.StartedService.SubscribeLog:input_type -> google.protobuf.Empty 27, // 14: daemon.StartedService.GetDefaultLogLevel:input_type -> google.protobuf.Empty - 6, // 15: daemon.StartedService.SubscribeStatus:input_type -> daemon.SubscribeStatusRequest - 27, // 16: daemon.StartedService.SubscribeGroups:input_type -> google.protobuf.Empty - 27, // 17: daemon.StartedService.GetClashModeStatus:input_type -> google.protobuf.Empty - 27, // 18: daemon.StartedService.SubscribeClashMode:input_type -> google.protobuf.Empty - 16, // 19: daemon.StartedService.SetClashMode:input_type -> daemon.ClashMode - 13, // 20: daemon.StartedService.URLTest:input_type -> daemon.URLTestRequest - 14, // 21: daemon.StartedService.SelectOutbound:input_type -> daemon.SelectOutboundRequest - 15, // 22: daemon.StartedService.SetGroupExpand:input_type -> daemon.SetGroupExpandRequest - 27, // 23: daemon.StartedService.GetSystemProxyStatus:input_type -> google.protobuf.Empty - 19, // 24: daemon.StartedService.SetSystemProxyEnabled:input_type -> daemon.SetSystemProxyEnabledRequest - 20, // 25: daemon.StartedService.SubscribeConnections:input_type -> daemon.SubscribeConnectionsRequest - 23, // 26: daemon.StartedService.CloseConnection:input_type -> daemon.CloseConnectionRequest - 27, // 27: daemon.StartedService.CloseAllConnections:input_type -> google.protobuf.Empty - 27, // 28: daemon.StartedService.GetDeprecatedWarnings:input_type -> google.protobuf.Empty - 27, // 29: daemon.StartedService.SubscribeHelperEvents:input_type -> google.protobuf.Empty - 28, // 30: daemon.StartedService.SendHelperResponse:input_type -> daemon.HelperResponse - 27, // 31: daemon.StartedService.StopService:output_type -> google.protobuf.Empty - 27, // 32: daemon.StartedService.ReloadService:output_type -> google.protobuf.Empty - 4, // 33: daemon.StartedService.SubscribeServiceStatus:output_type -> daemon.ServiceStatus - 7, // 34: daemon.StartedService.SubscribeLog:output_type -> daemon.Log - 8, // 35: daemon.StartedService.GetDefaultLogLevel:output_type -> daemon.DefaultLogLevel - 9, // 36: daemon.StartedService.SubscribeStatus:output_type -> daemon.Status - 10, // 37: daemon.StartedService.SubscribeGroups:output_type -> daemon.Groups - 17, // 38: daemon.StartedService.GetClashModeStatus:output_type -> daemon.ClashModeStatus - 16, // 39: daemon.StartedService.SubscribeClashMode:output_type -> daemon.ClashMode - 27, // 40: daemon.StartedService.SetClashMode:output_type -> google.protobuf.Empty - 27, // 41: daemon.StartedService.URLTest:output_type -> google.protobuf.Empty - 27, // 42: daemon.StartedService.SelectOutbound:output_type -> google.protobuf.Empty - 27, // 43: daemon.StartedService.SetGroupExpand:output_type -> google.protobuf.Empty - 18, // 44: daemon.StartedService.GetSystemProxyStatus:output_type -> daemon.SystemProxyStatus - 27, // 45: daemon.StartedService.SetSystemProxyEnabled:output_type -> google.protobuf.Empty - 21, // 46: daemon.StartedService.SubscribeConnections:output_type -> daemon.Connections - 27, // 47: daemon.StartedService.CloseConnection:output_type -> google.protobuf.Empty - 27, // 48: daemon.StartedService.CloseAllConnections:output_type -> google.protobuf.Empty - 24, // 49: daemon.StartedService.GetDeprecatedWarnings:output_type -> daemon.DeprecatedWarnings - 29, // 50: daemon.StartedService.SubscribeHelperEvents:output_type -> daemon.HelperRequest - 27, // 51: daemon.StartedService.SendHelperResponse:output_type -> google.protobuf.Empty - 31, // [31:52] is the sub-list for method output_type - 10, // [10:31] is the sub-list for method input_type + 27, // 15: daemon.StartedService.ClearLogs:input_type -> google.protobuf.Empty + 6, // 16: daemon.StartedService.SubscribeStatus:input_type -> daemon.SubscribeStatusRequest + 27, // 17: daemon.StartedService.SubscribeGroups:input_type -> google.protobuf.Empty + 27, // 18: daemon.StartedService.GetClashModeStatus:input_type -> google.protobuf.Empty + 27, // 19: daemon.StartedService.SubscribeClashMode:input_type -> google.protobuf.Empty + 16, // 20: daemon.StartedService.SetClashMode:input_type -> daemon.ClashMode + 13, // 21: daemon.StartedService.URLTest:input_type -> daemon.URLTestRequest + 14, // 22: daemon.StartedService.SelectOutbound:input_type -> daemon.SelectOutboundRequest + 15, // 23: daemon.StartedService.SetGroupExpand:input_type -> daemon.SetGroupExpandRequest + 27, // 24: daemon.StartedService.GetSystemProxyStatus:input_type -> google.protobuf.Empty + 19, // 25: daemon.StartedService.SetSystemProxyEnabled:input_type -> daemon.SetSystemProxyEnabledRequest + 20, // 26: daemon.StartedService.SubscribeConnections:input_type -> daemon.SubscribeConnectionsRequest + 23, // 27: daemon.StartedService.CloseConnection:input_type -> daemon.CloseConnectionRequest + 27, // 28: daemon.StartedService.CloseAllConnections:input_type -> google.protobuf.Empty + 27, // 29: daemon.StartedService.GetDeprecatedWarnings:input_type -> google.protobuf.Empty + 27, // 30: daemon.StartedService.SubscribeHelperEvents:input_type -> google.protobuf.Empty + 28, // 31: daemon.StartedService.SendHelperResponse:input_type -> daemon.HelperResponse + 27, // 32: daemon.StartedService.StopService:output_type -> google.protobuf.Empty + 27, // 33: daemon.StartedService.ReloadService:output_type -> google.protobuf.Empty + 4, // 34: daemon.StartedService.SubscribeServiceStatus:output_type -> daemon.ServiceStatus + 7, // 35: daemon.StartedService.SubscribeLog:output_type -> daemon.Log + 8, // 36: daemon.StartedService.GetDefaultLogLevel:output_type -> daemon.DefaultLogLevel + 27, // 37: daemon.StartedService.ClearLogs:output_type -> google.protobuf.Empty + 9, // 38: daemon.StartedService.SubscribeStatus:output_type -> daemon.Status + 10, // 39: daemon.StartedService.SubscribeGroups:output_type -> daemon.Groups + 17, // 40: daemon.StartedService.GetClashModeStatus:output_type -> daemon.ClashModeStatus + 16, // 41: daemon.StartedService.SubscribeClashMode:output_type -> daemon.ClashMode + 27, // 42: daemon.StartedService.SetClashMode:output_type -> google.protobuf.Empty + 27, // 43: daemon.StartedService.URLTest:output_type -> google.protobuf.Empty + 27, // 44: daemon.StartedService.SelectOutbound:output_type -> google.protobuf.Empty + 27, // 45: daemon.StartedService.SetGroupExpand:output_type -> google.protobuf.Empty + 18, // 46: daemon.StartedService.GetSystemProxyStatus:output_type -> daemon.SystemProxyStatus + 27, // 47: daemon.StartedService.SetSystemProxyEnabled:output_type -> google.protobuf.Empty + 21, // 48: daemon.StartedService.SubscribeConnections:output_type -> daemon.Connections + 27, // 49: daemon.StartedService.CloseConnection:output_type -> google.protobuf.Empty + 27, // 50: daemon.StartedService.CloseAllConnections:output_type -> google.protobuf.Empty + 24, // 51: daemon.StartedService.GetDeprecatedWarnings:output_type -> daemon.DeprecatedWarnings + 29, // 52: daemon.StartedService.SubscribeHelperEvents:output_type -> daemon.HelperRequest + 27, // 53: daemon.StartedService.SendHelperResponse:output_type -> google.protobuf.Empty + 32, // [32:54] is the sub-list for method output_type + 10, // [10:32] is the sub-list for method input_type 10, // [10:10] is the sub-list for extension type_name 10, // [10:10] is the sub-list for extension extendee 0, // [0:10] is the sub-list for field type_name diff --git a/daemon/started_service.proto b/daemon/started_service.proto index 17e9f6832..83b72ff85 100644 --- a/daemon/started_service.proto +++ b/daemon/started_service.proto @@ -13,6 +13,7 @@ service StartedService { rpc SubscribeServiceStatus(google.protobuf.Empty) returns(stream ServiceStatus) {} rpc SubscribeLog(google.protobuf.Empty) returns(stream Log) {} rpc GetDefaultLogLevel(google.protobuf.Empty) returns(DefaultLogLevel) {} + rpc ClearLogs(google.protobuf.Empty) returns(google.protobuf.Empty) {} rpc SubscribeStatus(SubscribeStatusRequest) returns(stream Status) {} rpc SubscribeGroups(google.protobuf.Empty) returns(stream Groups) {} diff --git a/daemon/started_service_grpc.pb.go b/daemon/started_service_grpc.pb.go index 4807b25c4..dec45dae6 100644 --- a/daemon/started_service_grpc.pb.go +++ b/daemon/started_service_grpc.pb.go @@ -20,6 +20,7 @@ const ( StartedService_SubscribeServiceStatus_FullMethodName = "/daemon.StartedService/SubscribeServiceStatus" StartedService_SubscribeLog_FullMethodName = "/daemon.StartedService/SubscribeLog" StartedService_GetDefaultLogLevel_FullMethodName = "/daemon.StartedService/GetDefaultLogLevel" + StartedService_ClearLogs_FullMethodName = "/daemon.StartedService/ClearLogs" StartedService_SubscribeStatus_FullMethodName = "/daemon.StartedService/SubscribeStatus" StartedService_SubscribeGroups_FullMethodName = "/daemon.StartedService/SubscribeGroups" StartedService_GetClashModeStatus_FullMethodName = "/daemon.StartedService/GetClashModeStatus" @@ -47,6 +48,7 @@ type StartedServiceClient interface { SubscribeServiceStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (grpc.ServerStreamingClient[ServiceStatus], error) SubscribeLog(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (grpc.ServerStreamingClient[Log], error) GetDefaultLogLevel(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*DefaultLogLevel, error) + ClearLogs(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) SubscribeStatus(ctx context.Context, in *SubscribeStatusRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[Status], error) SubscribeGroups(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (grpc.ServerStreamingClient[Groups], error) GetClashModeStatus(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ClashModeStatus, error) @@ -141,6 +143,16 @@ func (c *startedServiceClient) GetDefaultLogLevel(ctx context.Context, in *empty return out, nil } +func (c *startedServiceClient) ClearLogs(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, StartedService_ClearLogs_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *startedServiceClient) SubscribeStatus(ctx context.Context, in *SubscribeStatusRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[Status], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) stream, err := c.cc.NewStream(ctx, &StartedService_ServiceDesc.Streams[2], StartedService_SubscribeStatus_FullMethodName, cOpts...) @@ -355,6 +367,7 @@ type StartedServiceServer interface { SubscribeServiceStatus(*emptypb.Empty, grpc.ServerStreamingServer[ServiceStatus]) error SubscribeLog(*emptypb.Empty, grpc.ServerStreamingServer[Log]) error GetDefaultLogLevel(context.Context, *emptypb.Empty) (*DefaultLogLevel, error) + ClearLogs(context.Context, *emptypb.Empty) (*emptypb.Empty, error) SubscribeStatus(*SubscribeStatusRequest, grpc.ServerStreamingServer[Status]) error SubscribeGroups(*emptypb.Empty, grpc.ServerStreamingServer[Groups]) error GetClashModeStatus(context.Context, *emptypb.Empty) (*ClashModeStatus, error) @@ -401,6 +414,10 @@ func (UnimplementedStartedServiceServer) GetDefaultLogLevel(context.Context, *em return nil, status.Errorf(codes.Unimplemented, "method GetDefaultLogLevel not implemented") } +func (UnimplementedStartedServiceServer) ClearLogs(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method ClearLogs not implemented") +} + func (UnimplementedStartedServiceServer) SubscribeStatus(*SubscribeStatusRequest, grpc.ServerStreamingServer[Status]) error { return status.Errorf(codes.Unimplemented, "method SubscribeStatus not implemented") } @@ -561,6 +578,24 @@ func _StartedService_GetDefaultLogLevel_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _StartedService_ClearLogs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StartedServiceServer).ClearLogs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: StartedService_ClearLogs_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StartedServiceServer).ClearLogs(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _StartedService_SubscribeStatus_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(SubscribeStatusRequest) if err := stream.RecvMsg(m); err != nil { @@ -833,6 +868,10 @@ var StartedService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetDefaultLogLevel", Handler: _StartedService_GetDefaultLogLevel_Handler, }, + { + MethodName: "ClearLogs", + Handler: _StartedService_ClearLogs_Handler, + }, { MethodName: "GetClashModeStatus", Handler: _StartedService_GetClashModeStatus_Handler, diff --git a/experimental/libbox/command_client.go b/experimental/libbox/command_client.go index f5f6c6e24..9885af6e2 100644 --- a/experimental/libbox/command_client.go +++ b/experimental/libbox/command_client.go @@ -410,6 +410,16 @@ func (c *CommandClient) ServiceClose() error { return err } +func (c *CommandClient) ClearLogs() error { + client, err := c.getClientForCall() + if err != nil { + return err + } + + _, err = client.ClearLogs(context.Background(), &emptypb.Empty{}) + return err +} + func (c *CommandClient) GetSystemProxyStatus() (*SystemProxyStatus, error) { client, err := c.getClientForCall() if err != nil { diff --git a/experimental/libbox/command_server.go b/experimental/libbox/command_server.go index 5195c0b1a..b25f30658 100644 --- a/experimental/libbox/command_server.go +++ b/experimental/libbox/command_server.go @@ -192,7 +192,7 @@ func (s *CommandServer) NeedWIFIState() bool { if instance == nil || instance.Box() == nil { return false } - return instance.Box().Router().NeedWIFIState() + return instance.Box().Network().NeedWIFIState() } func (s *CommandServer) Pause() {