Fix stop not cleaning up WireGuard interface (#286)

This commit is contained in:
Givi Khojanashvili
2022-03-25 16:21:04 +04:00
committed by GitHub
parent a15d52b263
commit 2aaeeac7f6
10 changed files with 101 additions and 125 deletions

View File

@ -1,6 +1,8 @@
package cmd
import (
"context"
"fmt"
"net"
"os"
"strings"
@ -19,41 +21,40 @@ import (
func (p *program) Start(svc service.Service) error {
// Start should not block. Do the actual work async.
log.Info("starting service") //nolint
go func() {
// in any case, even if configuration does not exists we run daemon to serve CLI gRPC API.
p.serv = grpc.NewServer()
// in any case, even if configuration does not exists we run daemon to serve CLI gRPC API.
p.serv = grpc.NewServer()
split := strings.Split(daemonAddr, "://")
switch split[0] {
case "unix":
// cleanup failed close
stat, err := os.Stat(split[1])
if err == nil && !stat.IsDir() {
if err := os.Remove(split[1]); err != nil {
log.Debugf("remove socket file: %v", err)
}
split := strings.Split(daemonAddr, "://")
switch split[0] {
case "unix":
// cleanup failed close
stat, err := os.Stat(split[1])
if err == nil && !stat.IsDir() {
if err := os.Remove(split[1]); err != nil {
log.Debugf("remove socket file: %v", err)
}
case "tcp":
default:
log.Errorf("unsupported daemon address protocol: %v", split[0])
return
}
case "tcp":
default:
return fmt.Errorf("unsupported daemon address protocol: %v", split[0])
}
listen, err := net.Listen(split[0], split[1])
if err != nil {
log.Fatalf("failed to listen daemon interface: %v", err)
}
listen, err := net.Listen(split[0], split[1])
if err != nil {
return fmt.Errorf("failed to listen daemon interface: %w", err)
}
go func() {
defer listen.Close()
if split[0] == "unix" {
err = os.Chmod(split[1], 0666)
err = os.Chmod(split[1], 0o666)
if err != nil {
log.Errorf("failed setting daemon permissions: %v", split[1])
return
}
}
serverInstance := server.New(p.ctx, managementURL, configPath, stopCh, cleanupCh)
serverInstance := server.New(p.ctx, managementURL, configPath)
if err := serverInstance.Start(); err != nil {
log.Fatalf("failed start daemon: %v", err)
}
@ -67,21 +68,14 @@ func (p *program) Start(svc service.Service) error {
return nil
}
func (p *program) Stop(service.Service) error {
go func() {
stopCh <- 1
}()
func (p *program) Stop(srv service.Service) error {
p.cancel()
// stop CLI daemon service
if p.serv != nil {
p.serv.GracefulStop()
p.serv.Stop()
}
select {
case <-cleanupCh:
case <-time.After(time.Second * 10):
log.Warnf("failed waiting for service cleanup, terminating")
}
time.Sleep(time.Second * 2)
log.Info("stopped Wiretrustee service") //nolint
return nil
}
@ -98,9 +92,10 @@ var runCmd = &cobra.Command{
return
}
SetupCloseHandler()
ctx, cancel := context.WithCancel(cmd.Context())
SetupCloseHandler(ctx, cancel)
s, err := newSVC(newProgram(cmd, args), newSVCConfig())
s, err := newSVC(newProgram(ctx, cancel), newSVCConfig())
if err != nil {
cmd.PrintErrln(err)
return
@ -125,7 +120,10 @@ var startCmd = &cobra.Command{
log.Errorf("failed initializing log %v", err)
return err
}
s, err := newSVC(newProgram(cmd, args), newSVCConfig())
ctx, cancel := context.WithCancel(cmd.Context())
s, err := newSVC(newProgram(ctx, cancel), newSVCConfig())
if err != nil {
cmd.PrintErrln(err)
return err
@ -150,7 +148,10 @@ var stopCmd = &cobra.Command{
if err != nil {
log.Errorf("failed initializing log %v", err)
}
s, err := newSVC(newProgram(cmd, args), newSVCConfig())
ctx, cancel := context.WithCancel(cmd.Context())
s, err := newSVC(newProgram(ctx, cancel), newSVCConfig())
if err != nil {
cmd.PrintErrln(err)
return
@ -174,7 +175,10 @@ var restartCmd = &cobra.Command{
if err != nil {
log.Errorf("failed initializing log %v", err)
}
s, err := newSVC(newProgram(cmd, args), newSVCConfig())
ctx, cancel := context.WithCancel(cmd.Context())
s, err := newSVC(newProgram(ctx, cancel), newSVCConfig())
if err != nil {
cmd.PrintErrln(err)
return