command.go 2.0 KB

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