iam.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package command
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/seaweedfs/seaweedfs/weed/util/version"
  6. "time"
  7. "github.com/gorilla/mux"
  8. "github.com/seaweedfs/seaweedfs/weed/glog"
  9. "github.com/seaweedfs/seaweedfs/weed/iamapi"
  10. "github.com/seaweedfs/seaweedfs/weed/pb"
  11. "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
  12. "github.com/seaweedfs/seaweedfs/weed/security"
  13. "github.com/seaweedfs/seaweedfs/weed/util"
  14. // Import credential stores to register them
  15. _ "github.com/seaweedfs/seaweedfs/weed/credential/filer_etc"
  16. _ "github.com/seaweedfs/seaweedfs/weed/credential/memory"
  17. _ "github.com/seaweedfs/seaweedfs/weed/credential/postgres"
  18. )
  19. var (
  20. iamStandaloneOptions IamOptions
  21. )
  22. type IamOptions struct {
  23. filer *string
  24. masters *string
  25. ip *string
  26. port *int
  27. }
  28. func init() {
  29. cmdIam.Run = runIam // break init cycle
  30. iamStandaloneOptions.filer = cmdIam.Flag.String("filer", "localhost:8888", "filer server address")
  31. iamStandaloneOptions.masters = cmdIam.Flag.String("master", "localhost:9333", "comma-separated master servers")
  32. iamStandaloneOptions.ip = cmdIam.Flag.String("ip", util.DetectedHostAddress(), "iam server http listen ip address")
  33. iamStandaloneOptions.port = cmdIam.Flag.Int("port", 8111, "iam server http listen port")
  34. }
  35. var cmdIam = &Command{
  36. UsageLine: "iam [-port=8111] [-filer=<ip:port>] [-master=<ip:port>,<ip:port>]",
  37. Short: "start a iam API compatible server",
  38. Long: "start a iam API compatible server.",
  39. }
  40. func runIam(cmd *Command, args []string) bool {
  41. return iamStandaloneOptions.startIamServer()
  42. }
  43. func (iamopt *IamOptions) startIamServer() bool {
  44. filerAddress := pb.ServerAddress(*iamopt.filer)
  45. util.LoadSecurityConfiguration()
  46. grpcDialOption := security.LoadClientTLS(util.GetViper(), "grpc.client")
  47. for {
  48. err := pb.WithGrpcFilerClient(false, 0, filerAddress, grpcDialOption, func(client filer_pb.SeaweedFilerClient) error {
  49. resp, err := client.GetFilerConfiguration(context.Background(), &filer_pb.GetFilerConfigurationRequest{})
  50. if err != nil {
  51. return fmt.Errorf("get filer %s configuration: %v", filerAddress, err)
  52. }
  53. glog.V(0).Infof("IAM read filer configuration: %s", resp)
  54. return nil
  55. })
  56. if err != nil {
  57. glog.V(0).Infof("wait to connect to filer %s grpc address %s", *iamopt.filer, filerAddress.ToGrpcAddress())
  58. time.Sleep(time.Second)
  59. } else {
  60. glog.V(0).Infof("connected to filer %s grpc address %s", *iamopt.filer, filerAddress.ToGrpcAddress())
  61. break
  62. }
  63. }
  64. masters := pb.ServerAddresses(*iamopt.masters).ToAddressMap()
  65. router := mux.NewRouter().SkipClean(true)
  66. _, iamApiServer_err := iamapi.NewIamApiServer(router, &iamapi.IamServerOption{
  67. Masters: masters,
  68. Filer: filerAddress,
  69. Port: *iamopt.port,
  70. GrpcDialOption: grpcDialOption,
  71. })
  72. glog.V(0).Info("NewIamApiServer created")
  73. if iamApiServer_err != nil {
  74. glog.Fatalf("IAM API Server startup error: %v", iamApiServer_err)
  75. }
  76. listenAddress := fmt.Sprintf(":%d", *iamopt.port)
  77. iamApiListener, iamApiLocalListener, err := util.NewIpAndLocalListeners(*iamopt.ip, *iamopt.port, time.Duration(10)*time.Second)
  78. if err != nil {
  79. glog.Fatalf("IAM API Server listener on %s error: %v", listenAddress, err)
  80. }
  81. glog.V(0).Infof("Start Seaweed IAM API Server %s at http port %d", version.Version(), *iamopt.port)
  82. if iamApiLocalListener != nil {
  83. go func() {
  84. if err = newHttpServer(router, nil).Serve(iamApiLocalListener); err != nil {
  85. glog.Errorf("IAM API Server Fail to serve: %v", err)
  86. }
  87. }()
  88. }
  89. if err = newHttpServer(router, nil).Serve(iamApiListener); err != nil {
  90. glog.Fatalf("IAM API Server Fail to serve: %v", err)
  91. }
  92. return true
  93. }