From 36151d1ba9387e8d296cea879b783406c65d3724 Mon Sep 17 00:00:00 2001 From: Nicola Murino Date: Thu, 5 Nov 2020 12:12:11 +0100 Subject: [PATCH] subsystem mode: add base-home-dir flag --- cmd/startsubsys.go | 19 ++++++++++-- docs/sftp-subsystem.md | 67 +++++++++++++++++++++++------------------- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/cmd/startsubsys.go b/cmd/startsubsys.go index 749edd97..6a5167ef 100644 --- a/cmd/startsubsys.go +++ b/cmd/startsubsys.go @@ -22,6 +22,7 @@ import ( var ( logJournalD = false preserveHomeDir = false + baseHomeDir = "" subsystemCmd = &cobra.Command{ Use: "startsubsys", Short: "Use SFTPGo as SFTP file transfer subsystem", @@ -54,8 +55,8 @@ Command-line flags should be specified in the Subsystem declaration. } username := osUser.Username homedir := osUser.HomeDir - logger.Info(logSender, connectionID, "starting SFTPGo %v as subsystem, user %#v home dir %#v config dir %#v", - version.Get(), username, homedir, configDir) + logger.Info(logSender, connectionID, "starting SFTPGo %v as subsystem, user %#v home dir %#v config dir %#v base home dir %#v", + version.Get(), username, homedir, configDir, baseHomeDir) err = config.LoadConfig(configDir, configFile) if err != nil { logger.Error(logSender, connectionID, "unable to load configuration: %v", err) @@ -95,7 +96,12 @@ Command-line flags should be specified in the Subsystem declaration. } } else { user.Username = username - user.HomeDir = homedir + if baseHomeDir != "" && filepath.IsAbs(baseHomeDir) { + user.HomeDir = filepath.Join(baseHomeDir, username) + } else { + user.HomeDir = filepath.Clean(homedir) + } + logger.Debug(logSender, connectionID, "home dir for new user %#v", user.HomeDir) user.Password = connectionID user.Permissions = make(map[string][]string) user.Permissions["/"] = []string{dataprovider.PermAny} @@ -119,6 +125,13 @@ Command-line flags should be specified in the Subsystem declaration. func init() { subsystemCmd.Flags().BoolVarP(&preserveHomeDir, "preserve-home", "p", false, `If the user already exists, the existing home directory will not be changed`) + subsystemCmd.Flags().StringVarP(&baseHomeDir, "base-home-dir", "d", "", `If the user does not exist specify an alternate +starting directory. The home directory for a new +user will be: + +/ + +base-home-dir must be an absolute path.`) subsystemCmd.Flags().BoolVarP(&logJournalD, "log-to-journald", "j", false, `Send logs to journald. Only available on Linux. Use: diff --git a/docs/sftp-subsystem.md b/docs/sftp-subsystem.md index b743a48b..641a143c 100644 --- a/docs/sftp-subsystem.md +++ b/docs/sftp-subsystem.md @@ -16,38 +16,45 @@ Usage: sftpgo startsubsys [flags] Flags: - -c, --config-dir string Location for SFTPGo config dir. This directory - should contain the "sftpgo" configuration file - or the configured config-file and it is used as - the base for files with a relative path (eg. the - private keys for the SFTP server, the SQLite - database if you use SQLite as data provider). - This flag can be set using SFTPGO_CONFIG_DIR - env var too. (default ".") - -f, --config-file string Name for SFTPGo configuration file. It must be - the name of a file stored in config-dir not the - absolute path to the configuration file. The - specified file name must have no extension we - automatically load JSON, YAML, TOML, HCL and - Java properties. Therefore if you set "sftpgo" - then "sftpgo.json", "sftpgo.yaml" and so on - are searched. - This flag can be set using SFTPGO_CONFIG_FILE - env var too. (default "sftpgo") - -h, --help help for startsubsys - -j, --log-to-journald Send logs to journald. Only available on Linux. - Use: + -d, --base-home-dir string If the user does not exist specify an alternate + starting directory. The home directory for a new + user will be: - $ journalctl -o verbose -f + / - To see full logs. - If not set, the logs will be sent to the standard - error - -v, --log-verbose Enable verbose logs. This flag can be set - using SFTPGO_LOG_VERBOSE env var too. - (default true) - -p, --preserve-home If the user already exists, the existing home - directory will not be changed + base-home-dir must be an absolute path. + -c, --config-dir string Location for SFTPGo config dir. This directory + should contain the "sftpgo" configuration file + or the configured config-file and it is used as + the base for files with a relative path (eg. the + private keys for the SFTP server, the SQLite + database if you use SQLite as data provider). + This flag can be set using SFTPGO_CONFIG_DIR + env var too. (default ".") + -f, --config-file string Name for SFTPGo configuration file. It must be + the name of a file stored in config-dir not the + absolute path to the configuration file. The + specified file name must have no extension we + automatically load JSON, YAML, TOML, HCL and + Java properties. Therefore if you set "sftpgo" + then "sftpgo.json", "sftpgo.yaml" and so on + are searched. + This flag can be set using SFTPGO_CONFIG_FILE + env var too. (default "sftpgo") + -h, --help help for startsubsys + -j, --log-to-journald Send logs to journald. Only available on Linux. + Use: + + $ journalctl -o verbose -f + + To see full logs. + If not set, the logs will be sent to the standard + error + -v, --log-verbose Enable verbose logs. This flag can be set + using SFTPGO_LOG_VERBOSE env var too. + (default true) + -p, --preserve-home If the user already exists, the existing home + directory will not be changed ``` In this mode `bolt` and `sqlite` providers are not usable as the same database file cannot be shared among multiple processes, if one of these provider is configured it will be automatically changed to `memory` provider.