2021-04-03 10:40:58 +00:00
|
|
|
package mounter
|
2019-03-07 19:27:02 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
2021-04-05 13:07:16 +00:00
|
|
|
"path"
|
2021-04-03 10:40:58 +00:00
|
|
|
|
|
|
|
"github.com/ctrox/csi-s3/pkg/s3"
|
2019-03-07 19:27:02 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// Implements Mounter
|
|
|
|
type rcloneMounter struct {
|
2021-04-05 13:07:16 +00:00
|
|
|
meta *s3.FSMeta
|
2019-03-07 19:27:02 +00:00
|
|
|
url string
|
|
|
|
region string
|
|
|
|
accessKeyID string
|
|
|
|
secretAccessKey string
|
|
|
|
}
|
|
|
|
|
|
|
|
const (
|
|
|
|
rcloneCmd = "rclone"
|
|
|
|
)
|
|
|
|
|
2021-04-05 13:07:16 +00:00
|
|
|
func newRcloneMounter(meta *s3.FSMeta, cfg *s3.Config) (Mounter, error) {
|
2019-03-07 19:27:02 +00:00
|
|
|
return &rcloneMounter{
|
2021-04-05 13:07:16 +00:00
|
|
|
meta: meta,
|
2019-03-07 19:27:02 +00:00
|
|
|
url: cfg.Endpoint,
|
|
|
|
region: cfg.Region,
|
|
|
|
accessKeyID: cfg.AccessKeyID,
|
|
|
|
secretAccessKey: cfg.SecretAccessKey,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rclone *rcloneMounter) Stage(stageTarget string) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rclone *rcloneMounter) Unstage(stageTarget string) error {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (rclone *rcloneMounter) Mount(source string, target string) error {
|
|
|
|
args := []string{
|
|
|
|
"mount",
|
2021-04-05 13:07:16 +00:00
|
|
|
fmt.Sprintf(":s3:%s", path.Join(rclone.meta.BucketName, rclone.meta.Prefix, rclone.meta.FSPath)),
|
2019-03-07 19:27:02 +00:00
|
|
|
fmt.Sprintf("%s", target),
|
|
|
|
"--daemon",
|
|
|
|
"--s3-provider=AWS",
|
|
|
|
"--s3-env-auth=true",
|
|
|
|
fmt.Sprintf("--s3-region=%s", rclone.region),
|
|
|
|
fmt.Sprintf("--s3-endpoint=%s", rclone.url),
|
|
|
|
"--allow-other",
|
|
|
|
// TODO: make this configurable
|
|
|
|
"--vfs-cache-mode=writes",
|
|
|
|
}
|
|
|
|
os.Setenv("AWS_ACCESS_KEY_ID", rclone.accessKeyID)
|
|
|
|
os.Setenv("AWS_SECRET_ACCESS_KEY", rclone.secretAccessKey)
|
|
|
|
return fuseMount(target, rcloneCmd, args)
|
|
|
|
}
|