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