github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/cmd/serve/s3/s3.go (about) 1 package s3 2 3 import ( 4 "context" 5 _ "embed" 6 "strings" 7 8 "github.com/rclone/rclone/cmd" 9 "github.com/rclone/rclone/fs/config/flags" 10 "github.com/rclone/rclone/fs/hash" 11 httplib "github.com/rclone/rclone/lib/http" 12 "github.com/rclone/rclone/vfs" 13 "github.com/rclone/rclone/vfs/vfsflags" 14 "github.com/spf13/cobra" 15 ) 16 17 // DefaultOpt is the default values used for Options 18 var DefaultOpt = Options{ 19 pathBucketMode: true, 20 hashName: "MD5", 21 hashType: hash.MD5, 22 noCleanup: false, 23 HTTP: httplib.DefaultCfg(), 24 } 25 26 // Opt is options set by command line flags 27 var Opt = DefaultOpt 28 29 const flagPrefix = "" 30 31 func init() { 32 flagSet := Command.Flags() 33 httplib.AddHTTPFlagsPrefix(flagSet, flagPrefix, &Opt.HTTP) 34 vfsflags.AddFlags(flagSet) 35 flags.BoolVarP(flagSet, &Opt.pathBucketMode, "force-path-style", "", Opt.pathBucketMode, "If true use path style access if false use virtual hosted style (default true)", "") 36 flags.StringVarP(flagSet, &Opt.hashName, "etag-hash", "", Opt.hashName, "Which hash to use for the ETag, or auto or blank for off", "") 37 flags.StringArrayVarP(flagSet, &Opt.authPair, "auth-key", "", Opt.authPair, "Set key pair for v4 authorization: access_key_id,secret_access_key", "") 38 flags.BoolVarP(flagSet, &Opt.noCleanup, "no-cleanup", "", Opt.noCleanup, "Not to cleanup empty folder after object is deleted", "") 39 } 40 41 //go:embed serve_s3.md 42 var serveS3Help string 43 44 // help returns the help string cleaned up to simplify appending 45 func help() string { 46 return strings.TrimSpace(serveS3Help) + "\n\n" 47 } 48 49 // Command definition for cobra 50 var Command = &cobra.Command{ 51 Annotations: map[string]string{ 52 "versionIntroduced": "v1.65", 53 "groups": "Filter", 54 "status": "Experimental", 55 }, 56 Use: "s3 remote:path", 57 Short: `Serve remote:path over s3.`, 58 Long: help() + httplib.Help(flagPrefix) + vfs.Help(), 59 RunE: func(command *cobra.Command, args []string) error { 60 cmd.CheckArgs(1, 1, command, args) 61 f := cmd.NewFsSrc(args) 62 63 if Opt.hashName == "auto" { 64 Opt.hashType = f.Hashes().GetOne() 65 } else if Opt.hashName != "" { 66 err := Opt.hashType.Set(Opt.hashName) 67 if err != nil { 68 return err 69 } 70 } 71 cmd.Run(false, false, command, func() error { 72 s, err := newServer(context.Background(), f, &Opt) 73 if err != nil { 74 return err 75 } 76 router := s.Router() 77 s.Bind(router) 78 err = s.serve() 79 if err != nil { 80 return err 81 } 82 s.Wait() 83 return nil 84 }) 85 return nil 86 }, 87 }