rclone/vfs/vfscommon/options.go

225 lines
7.9 KiB
Go
Raw Normal View History

package vfscommon
import (
"os"
"runtime"
"time"
"github.com/rclone/rclone/fs"
)
// OptionsInfo describes the Options in use
var OptionsInfo = fs.Options{{
Name: "no_modtime",
Default: false,
Help: "Don't read/write the modification time (can speed things up)",
Groups: "VFS",
}, {
Name: "no_checksum",
Default: false,
Help: "Don't compare checksums on up/download",
Groups: "VFS",
}, {
Name: "no_seek",
Default: false,
Help: "Don't allow seeking in files",
Groups: "VFS",
}, {
Name: "dir_cache_time",
Default: fs.Duration(5 * 60 * time.Second),
Help: "Time to cache directory entries for",
Groups: "VFS",
}, {
Name: "vfs_refresh",
Default: false,
Help: "Refreshes the directory cache recursively in the background on start",
Groups: "VFS",
}, {
Name: "poll_interval",
Default: fs.Duration(time.Minute),
Help: "Time to wait between polling for changes, must be smaller than dir-cache-time and only on supported remotes (set 0 to disable)",
Groups: "VFS",
}, {
Name: "read_only",
Default: false,
Help: "Only allow read-only access",
Groups: "VFS",
}, {
Name: "links",
Default: false,
Help: "Translate symlinks to/from regular files with a '" + fs.LinkSuffix + "' extension",
Groups: "VFS",
ShortOpt: "l",
}, {
Name: "vfs_cache_mode",
Default: CacheModeOff,
Help: "Cache mode off|minimal|writes|full",
Groups: "VFS",
}, {
Name: "vfs_cache_poll_interval",
Default: fs.Duration(60 * time.Second),
Help: "Interval to poll the cache for stale objects",
Groups: "VFS",
}, {
Name: "vfs_cache_max_age",
Default: fs.Duration(3600 * time.Second),
Help: "Max time since last access of objects in the cache",
Groups: "VFS",
}, {
Name: "vfs_cache_max_size",
Default: fs.SizeSuffix(-1),
Help: "Max total size of objects in the cache",
Groups: "VFS",
}, {
Name: "vfs_cache_min_free_space",
Default: fs.SizeSuffix(-1),
Help: "Target minimum free space on the disk containing the cache",
Groups: "VFS",
}, {
Name: "vfs_read_chunk_size",
Default: 128 * fs.Mebi,
Help: "Read the source objects in chunks",
Groups: "VFS",
}, {
Name: "vfs_read_chunk_size_limit",
Default: fs.SizeSuffix(-1),
Help: "If greater than --vfs-read-chunk-size, double the chunk size after each chunk read, until the limit is reached ('off' is unlimited)",
Groups: "VFS",
}, {
Name: "vfs_read_chunk_streams",
Default: 0,
Help: "The number of parallel streams to read at once",
Groups: "VFS",
}, {
Name: "dir_perms",
Default: FileMode(0777),
Help: "Directory permissions",
Groups: "VFS",
}, {
Name: "file_perms",
Default: FileMode(0666),
Help: "File permissions",
Groups: "VFS",
2022-12-08 04:43:41 +08:00
}, {
Name: "link_perms",
Default: FileMode(0666),
Help: "Link permissions",
Groups: "VFS",
}, {
Name: "vfs_case_insensitive",
Default: runtime.GOOS == "windows" || runtime.GOOS == "darwin", // default to true on Windows and Mac, false otherwise,
Help: "If a file name not found, find a case insensitive match",
Groups: "VFS",
}, {
Name: "vfs_block_norm_dupes",
Default: false,
Help: "If duplicate filenames exist in the same directory (after normalization), log an error and hide the duplicates (may have a performance cost)",
Groups: "VFS",
}, {
Name: "vfs_write_wait",
Default: fs.Duration(1000 * time.Millisecond),
Help: "Time to wait for in-sequence write before giving error",
Groups: "VFS",
}, {
Name: "vfs_read_wait",
Default: fs.Duration(20 * time.Millisecond),
Help: "Time to wait for in-sequence read before seeking",
Groups: "VFS",
}, {
Name: "vfs_write_back",
Default: fs.Duration(5 * time.Second),
Help: "Time to writeback files after last use when using cache",
Groups: "VFS",
}, {
Name: "vfs_read_ahead",
Default: 0 * fs.Mebi,
Help: "Extra read ahead over --buffer-size when using cache-mode full",
Groups: "VFS",
}, {
Name: "vfs_used_is_size",
Default: false,
Help: "Use the `rclone size` algorithm for Used size",
Groups: "VFS",
}, {
Name: "vfs_fast_fingerprint",
Default: false,
Help: "Use fast (less accurate) fingerprints for change detection",
Groups: "VFS",
}, {
Name: "vfs_disk_space_total_size",
Default: fs.SizeSuffix(-1),
Help: "Specify the total space of disk",
Groups: "VFS",
}, {
Name: "umask",
Default: FileMode(getUmask()),
Help: "Override the permission bits set by the filesystem (not supported on Windows)",
Groups: "VFS",
}, {
Name: "uid",
Default: getUID(),
Help: "Override the uid field set by the filesystem (not supported on Windows)",
Groups: "VFS",
}, {
Name: "gid",
Default: getGID(),
Help: "Override the gid field set by the filesystem (not supported on Windows)",
Groups: "VFS",
}}
func init() {
fs.RegisterGlobalOptions(fs.OptionsInfo{Name: "vfs", Opt: &Opt, Options: OptionsInfo})
}
// Options is options for creating the vfs
type Options struct {
NoSeek bool `config:"no_seek"` // don't allow seeking if set
NoChecksum bool `config:"no_checksum"` // don't check checksums if set
ReadOnly bool `config:"read_only"` // if set VFS is read only
Links bool `config:"links"` // if set interpret link files
NoModTime bool `config:"no_modtime"` // don't read mod times for files
DirCacheTime fs.Duration `config:"dir_cache_time"` // how long to consider directory listing cache valid
Refresh bool `config:"vfs_refresh"` // refreshes the directory listing recursively on start
PollInterval fs.Duration `config:"poll_interval"`
Umask FileMode `config:"umask"`
UID uint32 `config:"uid"`
GID uint32 `config:"gid"`
DirPerms FileMode `config:"dir_perms"`
FilePerms FileMode `config:"file_perms"`
2022-12-08 04:43:41 +08:00
LinkPerms FileMode `config:"link_perms"`
ChunkSize fs.SizeSuffix `config:"vfs_read_chunk_size"` // if > 0 read files in chunks
ChunkSizeLimit fs.SizeSuffix `config:"vfs_read_chunk_size_limit"` // if > ChunkSize double the chunk size after each chunk until reached
ChunkStreams int `config:"vfs_read_chunk_streams"` // Number of download streams to use
CacheMode CacheMode `config:"vfs_cache_mode"`
CacheMaxAge fs.Duration `config:"vfs_cache_max_age"`
CacheMaxSize fs.SizeSuffix `config:"vfs_cache_max_size"`
CacheMinFreeSpace fs.SizeSuffix `config:"vfs_cache_min_free_space"`
CachePollInterval fs.Duration `config:"vfs_cache_poll_interval"`
CaseInsensitive bool `config:"vfs_case_insensitive"`
BlockNormDupes bool `config:"vfs_block_norm_dupes"`
WriteWait fs.Duration `config:"vfs_write_wait"` // time to wait for in-sequence write
ReadWait fs.Duration `config:"vfs_read_wait"` // time to wait for in-sequence read
WriteBack fs.Duration `config:"vfs_write_back"` // time to wait before writing back dirty files
ReadAhead fs.SizeSuffix `config:"vfs_read_ahead"` // bytes to read ahead in cache mode "full"
UsedIsSize bool `config:"vfs_used_is_size"` // if true, use the `rclone size` algorithm for Used size
FastFingerprint bool `config:"vfs_fast_fingerprint"` // if set use fast fingerprints
DiskSpaceTotalSize fs.SizeSuffix `config:"vfs_disk_space_total_size"`
}
// Opt is the default options modified by the environment variables and command line flags
var Opt Options
2023-03-25 15:10:16 +08:00
// Init the options, making sure everything is within range
func (opt *Options) Init() {
// Mask the permissions with the umask
opt.DirPerms &= ^opt.Umask
opt.FilePerms &= ^opt.Umask
2022-12-08 04:43:41 +08:00
opt.LinkPerms &= ^opt.Umask
// Make sure directories are returned as directories
opt.DirPerms |= FileMode(os.ModeDir)
2022-12-08 04:43:41 +08:00
// Make sure links are returned as links
opt.LinkPerms |= FileMode(os.ModeSymlink)
}