1package main
2
3import (
4 "context"
5 "fmt"
6 "os"
7 "os/signal"
8 "syscall"
9 "time"
10
11 "github.com/charmbracelet/log"
12
13 "github.com/charmbracelet/soft-serve/server"
14 "github.com/charmbracelet/soft-serve/server/config"
15 "github.com/spf13/cobra"
16)
17
18var (
19 serveCmd = &cobra.Command{
20 Use: "serve",
21 Short: "Start the server",
22 Long: "Start the server",
23 Args: cobra.NoArgs,
24 RunE: func(cmd *cobra.Command, args []string) error {
25 cfg := config.DefaultConfig()
26 s := server.NewServer(cfg)
27
28 log.Print("Starting SSH server", "addr", fmt.Sprintf("%s:%d", cfg.BindAddr, cfg.Port))
29
30 done := make(chan os.Signal, 1)
31 lch := make(chan error, 1)
32 go func() {
33 defer close(lch)
34 defer close(done)
35 lch <- s.Start()
36 }()
37
38 signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
39 <-done
40
41 log.Print("Stopping SSH server", "addr", fmt.Sprintf("%s:%d", cfg.BindAddr, cfg.Port))
42 ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
43 defer cancel()
44 if err := s.Shutdown(ctx); err != nil {
45 return err
46 }
47
48 // wait for serve to finish
49 return <-lch
50 },
51 }
52)