Skip to content

Commit 35a190c

Browse files
authored
feat: re-add ssh server (#17)
1 parent ade87d9 commit 35a190c

6 files changed

Lines changed: 231 additions & 22 deletions

File tree

go.mod

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,33 @@ require (
1111
github.com/charmbracelet/fang v0.4.0
1212
github.com/charmbracelet/glamour v0.10.0
1313
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834
14+
github.com/charmbracelet/ssh v0.0.0-20250826160808-ebfa259c7309
15+
github.com/charmbracelet/wish v1.4.7
1416
github.com/muesli/termenv v0.16.0
1517
github.com/spf13/cobra v1.10.1
1618
github.com/stretchr/testify v1.11.1
1719
github.com/yuin/goldmark v1.7.13
1820
)
1921

2022
require (
23+
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
24+
github.com/charmbracelet/keygen v0.5.3 // indirect
2125
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3 // indirect
26+
github.com/charmbracelet/log v0.4.1 // indirect
27+
github.com/charmbracelet/x/conpty v0.1.0 // indirect
28+
github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86 // indirect
2229
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250603201427-c31516f43444 // indirect
30+
github.com/charmbracelet/x/input v0.3.4 // indirect
31+
github.com/charmbracelet/x/termios v0.1.0 // indirect
32+
github.com/charmbracelet/x/windows v0.2.0 // indirect
33+
github.com/creack/pty v1.1.21 // indirect
34+
github.com/go-logfmt/logfmt v0.6.0 // indirect
2335
github.com/muesli/mango v0.1.0 // indirect
2436
github.com/muesli/mango-cobra v1.2.0 // indirect
2537
github.com/muesli/mango-pflag v0.1.0 // indirect
2638
github.com/muesli/roff v0.1.0 // indirect
39+
golang.org/x/crypto v0.37.0 // indirect
40+
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
2741
)
2842

2943
require (
@@ -55,7 +69,7 @@ require (
5569
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
5670
github.com/yuin/goldmark-emoji v1.0.5 // indirect
5771
go.abhg.dev/goldmark/frontmatter v0.2.0
58-
golang.org/x/net v0.33.0 // indirect
72+
golang.org/x/net v0.36.0 // indirect
5973
golang.org/x/sys v0.36.0 // indirect
6074
golang.org/x/term v0.31.0 // indirect
6175
golang.org/x/text v0.24.0 // indirect

go.sum

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46
66
github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I=
77
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
88
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
9+
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
10+
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
911
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
1012
github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
1113
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
@@ -24,29 +26,51 @@ github.com/charmbracelet/fang v0.4.0 h1:boBxmdcFghTeotqkD2itXi7SMBozdIlcslRqjboS
2426
github.com/charmbracelet/fang v0.4.0/go.mod h1:9gCUAHmVx5BwSafeyNr3GI0GgvlB1WYjL21SkPp1jyU=
2527
github.com/charmbracelet/glamour v0.10.0 h1:MtZvfwsYCx8jEPFJm3rIBFIMZUfUJ765oX8V6kXldcY=
2628
github.com/charmbracelet/glamour v0.10.0/go.mod h1:f+uf+I/ChNmqo087elLnVdCiVgjSKWuXa/l6NU2ndYk=
29+
github.com/charmbracelet/keygen v0.5.3 h1:2MSDC62OUbDy6VmjIE2jM24LuXUvKywLCmaJDmr/Z/4=
30+
github.com/charmbracelet/keygen v0.5.3/go.mod h1:TcpNoMAO5GSmhx3SgcEMqCrtn8BahKhB8AlwnLjRUpk=
2731
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 h1:ZR7e0ro+SZZiIZD7msJyA+NjkCNNavuiPBLgerbOziE=
2832
github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834/go.mod h1:aKC/t2arECF6rNOnaKaVU6y4t4ZeHQzqfxedE/VkVhA=
2933
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3 h1:W6DpZX6zSkZr0iFq6JVh1vItLoxfYtNlaxOJtWp8Kis=
3034
github.com/charmbracelet/lipgloss/v2 v2.0.0-beta.3/go.mod h1:65HTtKURcv/ict9ZQhr6zT84JqIjMcJbyrZYHHKNfKA=
35+
github.com/charmbracelet/log v0.4.1 h1:6AYnoHKADkghm/vt4neaNEXkxcXLSV2g1rdyFDOpTyk=
36+
github.com/charmbracelet/log v0.4.1/go.mod h1:pXgyTsqsVu4N9hGdHmQ0xEA4RsXof402LX9ZgiITn2I=
37+
github.com/charmbracelet/ssh v0.0.0-20250826160808-ebfa259c7309 h1:dCVbCRRtg9+tsfiTXTp0WupDlHruAXyp+YoxGVofHHc=
38+
github.com/charmbracelet/ssh v0.0.0-20250826160808-ebfa259c7309/go.mod h1:R9cISUs5kAH4Cq/rguNbSwcR+slE5Dfm8FEs//uoIGE=
39+
github.com/charmbracelet/wish v1.4.7 h1:O+jdLac3s6GaqkOHHSwezejNK04vl6VjO1A+hl8J8Yc=
40+
github.com/charmbracelet/wish v1.4.7/go.mod h1:OBZ8vC62JC5cvbxJLh+bIWtG7Ctmct+ewziuUWK+G14=
3141
github.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7D2jVDQ=
3242
github.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE=
3343
github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k=
3444
github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
45+
github.com/charmbracelet/x/conpty v0.1.0 h1:4zc8KaIcbiL4mghEON8D72agYtSeIgq8FSThSPQIb+U=
46+
github.com/charmbracelet/x/conpty v0.1.0/go.mod h1:rMFsDJoDwVmiYM10aD4bH2XiRgwI7NYJtQgl5yskjEQ=
47+
github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86 h1:JSt3B+U9iqk37QUU2Rvb6DSBYRLtWqFqfxf8l5hOZUA=
48+
github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0=
3549
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250603201427-c31516f43444 h1:IJDiTgVE56gkAGfq0lBEloWgkXMk4hl/bmuPoicI4R0=
3650
github.com/charmbracelet/x/exp/charmtone v0.0.0-20250603201427-c31516f43444/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0=
3751
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ=
3852
github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
3953
github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf h1:rLG0Yb6MQSDKdB52aGX55JT1oi0P0Kuaj7wi1bLUpnI=
4054
github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf/go.mod h1:B3UgsnsBZS/eX42BlaNiJkD1pPOUa+oF1IYC6Yd2CEU=
55+
github.com/charmbracelet/x/input v0.3.4 h1:Mujmnv/4DaitU0p+kIsrlfZl/UlmeLKw1wAP3e1fMN0=
56+
github.com/charmbracelet/x/input v0.3.4/go.mod h1:JI8RcvdZWQIhn09VzeK3hdp4lTz7+yhiEdpEQtZN+2c=
4157
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
4258
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
59+
github.com/charmbracelet/x/termios v0.1.0 h1:y4rjAHeFksBAfGbkRDmVinMg7x7DELIGAFbdNvxg97k=
60+
github.com/charmbracelet/x/termios v0.1.0/go.mod h1:H/EVv/KRnrYjz+fCYa9bsKdqF3S8ouDK0AZEbG7r+/U=
61+
github.com/charmbracelet/x/windows v0.2.0 h1:ilXA1GJjTNkgOm94CLPeSz7rar54jtFatdmoiONPuEw=
62+
github.com/charmbracelet/x/windows v0.2.0/go.mod h1:ZibNFR49ZFqCXgP76sYanisxRyC+EYrBE7TTknD8s1s=
4363
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
64+
github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0=
65+
github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
4466
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4567
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4668
github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
4769
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
4870
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
4971
github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
72+
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
73+
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
5074
github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8=
5175
github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0=
5276
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
@@ -102,10 +126,12 @@ github.com/yuin/goldmark-emoji v1.0.5 h1:EMVWyCGPlXJfUXBXpuMu+ii3TIaxbVBnEX9uaDC
102126
github.com/yuin/goldmark-emoji v1.0.5/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U=
103127
go.abhg.dev/goldmark/frontmatter v0.2.0 h1:P8kPG0YkL12+aYk2yU3xHv4tcXzeVnN+gU0tJ5JnxRw=
104128
go.abhg.dev/goldmark/frontmatter v0.2.0/go.mod h1:XqrEkZuM57djk7zrlRUB02x8I5J0px76YjkOzhB4YlU=
105-
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
106-
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
107-
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
108-
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
129+
golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE=
130+
golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc=
131+
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
132+
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
133+
golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
134+
golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
109135
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
110136
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
111137
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=

internal/server/middleware.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package server
2+
3+
import (
4+
"fmt"
5+
6+
tea "github.com/charmbracelet/bubbletea"
7+
"github.com/charmbracelet/ssh"
8+
"github.com/charmbracelet/wish"
9+
bm "github.com/charmbracelet/wish/bubbletea"
10+
"github.com/muesli/termenv"
11+
)
12+
13+
func slidesMiddleware(srv *Server) wish.Middleware {
14+
newProg := func(m tea.Model, opts ...tea.ProgramOption) *tea.Program {
15+
p := tea.NewProgram(m, opts...)
16+
return p
17+
}
18+
teaHandler := func(s ssh.Session) *tea.Program {
19+
_, _, active := s.Pty()
20+
if !active {
21+
fmt.Println("no active terminal, skipping")
22+
err := s.Exit(1)
23+
if err != nil {
24+
fmt.Println("Error exiting session")
25+
}
26+
return nil
27+
}
28+
return newProg(srv.presentation, tea.WithInput(s), tea.WithOutput(s), tea.WithAltScreen())
29+
}
30+
return bm.MiddlewareWithProgramHandler(teaHandler, termenv.ANSI256)
31+
}

internal/server/server.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package server
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/c0rydoras/folien/internal/model"
8+
"github.com/charmbracelet/ssh"
9+
"github.com/charmbracelet/wish"
10+
)
11+
12+
// Server is the server for hosting this presentation.
13+
type Server struct {
14+
host string
15+
port int
16+
srv *ssh.Server
17+
presentation model.Model
18+
}
19+
20+
// NewServer creates a new server.
21+
func NewServer(keyPath, host string, port int, presentation model.Model) (*Server, error) {
22+
s := &Server{
23+
host: host,
24+
port: port,
25+
presentation: presentation,
26+
}
27+
srv, err := wish.NewServer(
28+
wish.WithHostKeyPath(keyPath),
29+
wish.WithAddress(fmt.Sprintf("%s:%d", host, port)),
30+
wish.WithMiddleware(
31+
slidesMiddleware(s),
32+
),
33+
)
34+
if err != nil {
35+
return nil, err
36+
}
37+
s.srv = srv
38+
return s, nil
39+
}
40+
41+
// Start starts the ssh server.
42+
func (s *Server) Start() error {
43+
return s.srv.ListenAndServe()
44+
}
45+
46+
// Shutdown shuts down the server.
47+
func (s *Server) Shutdown(ctx context.Context) error {
48+
return s.srv.Shutdown(ctx)
49+
}

main.go

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,17 @@ var (
2121
)
2222

2323
func init() {
24-
rootCmd.Flags().BoolVarP(&enableHeadings, "headings", "a", false, "Enable automatic heading addition")
24+
rootCmd.PersistentFlags().BoolVarP(&enableHeadings, "headings", "a", false, "Enable automatic heading addition")
2525

26-
rootCmd.Flags().StringVarP(&tocTitle, "toc", "t", "", "Enable table of contents generation with optional title (default: 'Table of Contents')")
26+
rootCmd.PersistentFlags().StringVarP(&tocTitle, "toc", "t", "", "Enable table of contents generation with optional title (default: 'Table of Contents')")
2727
tocFlag := rootCmd.Flag("toc")
2828
tocFlag.NoOptDefVal = "Table of Contents"
2929

30-
rootCmd.Flags().StringVarP(&tocDescription, "toc-description", "d", "", "Enable table of contents generation with optional description")
30+
rootCmd.PersistentFlags().StringVarP(&tocDescription, "toc-description", "d", "", "Enable table of contents generation with optional description")
3131
tocDescFlag := rootCmd.Flag("toc-description")
3232
tocDescFlag.NoOptDefVal = "Table of Contents Description"
33+
34+
rootCmd.AddCommand(serveCmd)
3335
}
3436

3537
var rootCmd = &cobra.Command{
@@ -50,12 +52,27 @@ func main() {
5052
}
5153

5254
func root(cmd *cobra.Command, args []string) error {
53-
var err error
5455
if len(args) != 1 {
5556
return cmd.Help()
5657
}
57-
fileName := args[0]
5858

59+
presentation, err := newModel(args[0])
60+
if err != nil {
61+
return err
62+
}
63+
64+
p := tea.NewProgram(
65+
presentation,
66+
tea.WithAltScreen(),
67+
tea.WithMouseCellMotion(),
68+
)
69+
if _, err := p.Run(); err != nil {
70+
return err
71+
}
72+
return nil
73+
}
74+
75+
func newModel(fileName string) (model.Model, error) {
5976
preprocessorConfig := preprocessor.NewConfig().WithTOC(tocTitle, tocDescription)
6077
if enableHeadings {
6178
preprocessorConfig = preprocessorConfig.WithHeadings()
@@ -69,18 +86,9 @@ func root(cmd *cobra.Command, args []string) error {
6986
Preprocessor: preprocessorConfig,
7087
HideInternalErrors: model.AllButLast,
7188
}
72-
err = presentation.Load()
89+
err := presentation.Load()
7390
if err != nil {
74-
return err
91+
return model.Model{}, err
7592
}
76-
77-
p := tea.NewProgram(
78-
presentation,
79-
tea.WithAltScreen(),
80-
tea.WithMouseCellMotion(),
81-
)
82-
if _, err := p.Run(); err != nil {
83-
return err
84-
}
85-
return nil
93+
return presentation, nil
8694
}

serve.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log"
6+
"os"
7+
"os/signal"
8+
"strconv"
9+
"syscall"
10+
"time"
11+
12+
"github.com/c0rydoras/folien/internal/server"
13+
"github.com/spf13/cobra"
14+
)
15+
16+
var (
17+
host string
18+
port int
19+
keyPath string
20+
)
21+
22+
// serveCmd is the command for serving the presentation. It starts the slides
23+
// server allowing for connections.
24+
var serveCmd = &cobra.Command{
25+
Use: "serve <file.md>",
26+
Aliases: []string{"server"},
27+
Short: "Start an SSH server to run folien",
28+
Args: cobra.RangeArgs(0, 1),
29+
RunE: func(cmd *cobra.Command, args []string) error {
30+
if len(args) != 1 {
31+
return cmd.Help()
32+
}
33+
34+
k := os.Getenv("FOLIEN_SERVER_KEY_PATH")
35+
if k != "" {
36+
keyPath = k
37+
}
38+
h := os.Getenv("FOLIEN_SERVER_HOST")
39+
if h != "" {
40+
host = h
41+
}
42+
p := os.Getenv("FOLIEN_SERVER_PORT")
43+
if p != "" {
44+
port, _ = strconv.Atoi(p)
45+
}
46+
47+
presentation, err := newModel(args[0])
48+
if err != nil {
49+
return err
50+
}
51+
52+
s, err := server.NewServer(keyPath, host, port, presentation)
53+
if err != nil {
54+
return err
55+
}
56+
57+
done := make(chan os.Signal, 1)
58+
signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
59+
log.Printf("Starting Folien server on %s:%d", host, port)
60+
go func() {
61+
if err = s.Start(); err != nil {
62+
log.Fatalln(err)
63+
}
64+
}()
65+
66+
<-done
67+
log.Print("Stopping Folien server")
68+
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
69+
defer func() { cancel() }()
70+
if err := s.Shutdown(ctx); err != nil {
71+
return err
72+
}
73+
return err
74+
},
75+
}
76+
77+
func init() {
78+
serveCmd.Flags().StringVar(&keyPath, "keyPath", "folien", "Server private key path")
79+
serveCmd.Flags().StringVar(&host, "host", "localhost", "Server host to bind to")
80+
serveCmd.Flags().IntVar(&port, "port", 53531, "Server port to bind to")
81+
}

0 commit comments

Comments
 (0)