aboutsummaryrefslogtreecommitdiff
path: root/forged/internal/incoming/ssh/ssh.go
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-08-17 04:34:16 +0800
committerRunxi Yu <me@runxiyu.org>2025-08-17 04:35:17 +0800
commit308ce6c10ce77835a9b4d2ca9a17d449260c6adb (patch)
treeead254909f04c22973536db7b4a0bb5da10917e3 /forged/internal/incoming/ssh/ssh.go
parentFix a few other goroutine leaks with contexts (diff)
downloadforge-308ce6c10ce77835a9b4d2ca9a17d449260c6adb.tar.gz
forge-308ce6c10ce77835a9b4d2ca9a17d449260c6adb.tar.zst
forge-308ce6c10ce77835a9b4d2ca9a17d449260c6adb.zip
Add shutdown timeouts
Diffstat (limited to 'forged/internal/incoming/ssh/ssh.go')
-rw-r--r--forged/internal/incoming/ssh/ssh.go39
1 files changed, 22 insertions, 17 deletions
diff --git a/forged/internal/incoming/ssh/ssh.go b/forged/internal/incoming/ssh/ssh.go
index 77812d1..9f9bdff 100644
--- a/forged/internal/incoming/ssh/ssh.go
+++ b/forged/internal/incoming/ssh/ssh.go
@@ -5,6 +5,7 @@ import (
"errors"
"fmt"
"os"
+ "time"
gliderssh "github.com/gliderlabs/ssh"
"go.lindenii.runxiyu.org/forge/forged/internal/common/misc"
@@ -12,27 +13,30 @@ import (
)
type Config struct {
- Net string `scfg:"net"`
- Addr string `scfg:"addr"`
- Key string `scfg:"key"`
- Root string `scfg:"root"`
+ Net string `scfg:"net"`
+ Addr string `scfg:"addr"`
+ Key string `scfg:"key"`
+ Root string `scfg:"root"`
+ ShutdownTimeout uint32 `scfg:"shutdown_timeout"`
}
type Server struct {
- gliderServer *gliderssh.Server
- privkey gossh.Signer
- pubkeyString string
- pubkeyFP string
- net string
- addr string
- root string
+ gliderServer *gliderssh.Server
+ privkey gossh.Signer
+ pubkeyString string
+ pubkeyFP string
+ net string
+ addr string
+ root string
+ shutdownTimeout uint32
}
func New(config Config) (server *Server, err error) {
server = &Server{
- net: config.Net,
- addr: config.Addr,
- root: config.Root,
+ net: config.Net,
+ addr: config.Addr,
+ root: config.Root,
+ shutdownTimeout: config.ShutdownTimeout,
}
var privkeyBytes []byte
@@ -63,9 +67,10 @@ func (server *Server) Run(ctx context.Context) (err error) {
go func() {
<-ctx.Done()
- _ = server.gliderServer.Close()
- _ = listener.Close() // unnecessary?
- // TODO: Log the error
+ shCtx, cancel := context.WithTimeout(context.Background(), time.Duration(server.shutdownTimeout)*time.Second)
+ defer cancel()
+ _ = server.gliderServer.Shutdown(shCtx)
+ _ = listener.Close()
}()
if err = server.gliderServer.Serve(listener); err != nil {