command.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package command
  2. //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen
  3. import (
  4. "context"
  5. grpc "google.golang.org/grpc"
  6. core "github.com/v2fly/v2ray-core/v5"
  7. "github.com/v2fly/v2ray-core/v5/app/log"
  8. "github.com/v2fly/v2ray-core/v5/common"
  9. cmlog "github.com/v2fly/v2ray-core/v5/common/log"
  10. )
  11. // LoggerServer is the implemention of LoggerService
  12. type LoggerServer struct {
  13. V *core.Instance
  14. }
  15. // RestartLogger implements LoggerService.
  16. func (s *LoggerServer) RestartLogger(ctx context.Context, request *RestartLoggerRequest) (*RestartLoggerResponse, error) {
  17. logger := s.V.GetFeature((*log.Instance)(nil))
  18. if logger == nil {
  19. return nil, newError("unable to get logger instance")
  20. }
  21. if err := logger.Close(); err != nil {
  22. return nil, newError("failed to close logger").Base(err)
  23. }
  24. if err := logger.Start(); err != nil {
  25. return nil, newError("failed to start logger").Base(err)
  26. }
  27. return &RestartLoggerResponse{}, nil
  28. }
  29. // FollowLog implements LoggerService.
  30. func (s *LoggerServer) FollowLog(_ *FollowLogRequest, stream LoggerService_FollowLogServer) error {
  31. logger := s.V.GetFeature((*log.Instance)(nil))
  32. if logger == nil {
  33. return newError("unable to get logger instance")
  34. }
  35. follower, ok := logger.(cmlog.Follower)
  36. if !ok {
  37. return newError("logger not support following")
  38. }
  39. ctx, cancel := context.WithCancel(stream.Context())
  40. f := func(msg cmlog.Message) {
  41. err := stream.Send(&FollowLogResponse{
  42. Message: msg.String(),
  43. })
  44. if err != nil {
  45. cancel()
  46. }
  47. }
  48. follower.AddFollower(f)
  49. defer follower.RemoveFollower(f)
  50. <-ctx.Done()
  51. return nil
  52. }
  53. func (s *LoggerServer) mustEmbedUnimplementedLoggerServiceServer() {}
  54. type service struct {
  55. v *core.Instance
  56. }
  57. func (s *service) Register(server *grpc.Server) {
  58. RegisterLoggerServiceServer(server, &LoggerServer{
  59. V: s.v,
  60. })
  61. }
  62. func init() {
  63. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) {
  64. s := core.MustFromContext(ctx)
  65. return &service{v: s}, nil
  66. }))
  67. }