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  }