command.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. //go:build !confonly
  2. // +build !confonly
  3. package command
  4. //go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen
  5. import (
  6. "context"
  7. "github.com/golang/protobuf/proto"
  8. "google.golang.org/grpc"
  9. core "github.com/v2fly/v2ray-core/v5"
  10. "github.com/v2fly/v2ray-core/v5/app/observatory"
  11. "github.com/v2fly/v2ray-core/v5/common"
  12. "github.com/v2fly/v2ray-core/v5/features"
  13. "github.com/v2fly/v2ray-core/v5/features/extension"
  14. )
  15. type service struct {
  16. UnimplementedObservatoryServiceServer
  17. v *core.Instance
  18. observatory extension.Observatory
  19. }
  20. func (s *service) GetOutboundStatus(ctx context.Context, request *GetOutboundStatusRequest) (*GetOutboundStatusResponse, error) {
  21. var result proto.Message
  22. if request.Tag == "" {
  23. observeResult, err := s.observatory.GetObservation(ctx)
  24. if err != nil {
  25. return nil, newError("cannot get observation").Base(err)
  26. }
  27. result = observeResult
  28. } else {
  29. if _, ok := s.observatory.(features.TaggedFeatures); !ok {
  30. return nil, newError("observatory does not support tagged features")
  31. }
  32. fet, err := s.observatory.(features.TaggedFeatures).GetFeaturesByTag(request.Tag)
  33. if err != nil {
  34. return nil, newError("cannot get tagged observatory").Base(err)
  35. }
  36. observeResult, err := fet.(extension.Observatory).GetObservation(ctx)
  37. if err != nil {
  38. return nil, newError("cannot get observation").Base(err)
  39. }
  40. result = observeResult
  41. }
  42. retdata := result.(*observatory.ObservationResult)
  43. return &GetOutboundStatusResponse{
  44. Status: retdata,
  45. }, nil
  46. }
  47. func (s *service) Register(server *grpc.Server) {
  48. RegisterObservatoryServiceServer(server, s)
  49. }
  50. func init() {
  51. common.Must(common.RegisterConfig((*Config)(nil), func(ctx context.Context, cfg interface{}) (interface{}, error) {
  52. s := core.MustFromContext(ctx)
  53. sv := &service{v: s}
  54. err := s.RequireFeatures(func(Observatory extension.Observatory) {
  55. sv.observatory = Observatory
  56. })
  57. if err != nil {
  58. return nil, err
  59. }
  60. return sv, nil
  61. }))
  62. }