Browse Source

SFTP: support reloading user store on HUP signal (#7651)

Fixes #7650

This change enables the SFTP server to reload the user store configuration
(sftp_userstore.json) when a HUP signal is sent to the process, without
requiring a service restart.

Changes:
- Add Reload() method to FileStore to re-read users from disk
- Add Reload() method to SFTPService to handle reload requests
- Register reload hook with grace.OnReload() in sftp command

This allows administrators to add users or change access policies
dynamically by editing the user store file and sending a HUP signal
(e.g., 'systemctl reload seaweedfs' or 'kill -HUP <pid>').
pull/7652/head
Chris Lu 3 weeks ago
committed by GitHub
parent
commit
982aae6d53
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      weed/command/sftp.go
  2. 12
      weed/sftpd/sftp_service.go
  3. 5
      weed/sftpd/user/filestore.go

4
weed/command/sftp.go

@ -16,6 +16,7 @@ import (
"github.com/seaweedfs/seaweedfs/weed/sftpd" "github.com/seaweedfs/seaweedfs/weed/sftpd"
stats_collect "github.com/seaweedfs/seaweedfs/weed/stats" stats_collect "github.com/seaweedfs/seaweedfs/weed/stats"
"github.com/seaweedfs/seaweedfs/weed/util" "github.com/seaweedfs/seaweedfs/weed/util"
"github.com/seaweedfs/seaweedfs/weed/util/grace"
) )
var ( var (
@ -148,6 +149,9 @@ func (sftpOpt *SftpOptions) startSftpServer() bool {
UserStoreFile: *sftpOpt.userStoreFile, UserStoreFile: *sftpOpt.userStoreFile,
}) })
// Register reload hook for HUP signal
grace.OnReload(service.Reload)
// Set up Unix socket if on non-Windows platforms // Set up Unix socket if on non-Windows platforms
if runtime.GOOS != "windows" { if runtime.GOOS != "windows" {
localSocket := *sftpOpt.localSocket localSocket := *sftpOpt.localSocket

12
weed/sftpd/sftp_service.go

@ -300,3 +300,15 @@ func (s *SFTPService) handleSFTP(channel ssh.Channel, fs *SftpServer) {
glog.Errorf("SFTP server finished with error: %v", err) glog.Errorf("SFTP server finished with error: %v", err)
} }
} }
// Reload reloads the user store from disk, useful for HUP signal handling
func (s *SFTPService) Reload() {
glog.V(0).Info("Reload SFTP server...")
if fileStore, ok := s.userStore.(*user.FileStore); ok {
if err := fileStore.Reload(); err != nil {
glog.Errorf("Failed to reload user store: %v", err)
} else {
glog.V(0).Info("Successfully reloaded SFTP user store")
}
}
}

5
weed/sftpd/user/filestore.go

@ -264,3 +264,8 @@ func (s *FileStore) CreateUser(username, password string) (*User, error) {
return user, nil return user, nil
} }
// Reload reloads users from the file, useful for HUP signal handling
func (s *FileStore) Reload() error {
return s.loadUsers()
}
Loading…
Cancel
Save