Files
kubevpn/pkg/daemon/daemon.go
2023-10-02 13:44:23 +08:00

80 lines
1.9 KiB
Go

package daemon
import (
"context"
"net"
"net/http"
"os"
"time"
log "github.com/sirupsen/logrus"
"google.golang.org/grpc"
"google.golang.org/grpc/admin"
"google.golang.org/grpc/health"
"google.golang.org/grpc/health/grpc_health_v1"
"google.golang.org/grpc/reflection"
"github.com/wencaiwulue/kubevpn/pkg/daemon/action"
"github.com/wencaiwulue/kubevpn/pkg/daemon/rpc"
"github.com/wencaiwulue/kubevpn/pkg/util"
)
type SvrOption struct {
ctx context.Context
cancel context.CancelFunc
uptime int64
svr *grpc.Server
IsSudo bool
}
func (o *SvrOption) Start(ctx context.Context) error {
file, err := os.OpenFile(action.GetDaemonLogPath(), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666)
if err != nil {
log.Errorf("open log file error: %v", err)
return err
}
defer file.Close()
util.InitLogger(true)
log.StandardLogger().SetOutput(file)
o.ctx, o.cancel = context.WithCancel(ctx)
var lc net.ListenConfig
lis, err := lc.Listen(o.ctx, "unix", GetSockPath(o.IsSudo))
if err != nil {
return err
}
defer lis.Close()
err = os.Chmod(GetSockPath(o.IsSudo), 0666)
if err != nil {
return err
}
o.svr = grpc.NewServer()
cleanup, err := admin.Register(o.svr)
if err != nil {
log.Errorf("failed to register admin: %v", err)
return err
}
grpc_health_v1.RegisterHealthServer(o.svr, health.NewServer())
defer cleanup()
reflection.Register(o.svr)
// [tun-client] 223.254.0.101 - 127.0.0.1:8422: dial tcp 127.0.0.1:55407: connect: can't assign requested address
http.DefaultTransport.(*http.Transport).MaxIdleConnsPerHost = 100
rpc.RegisterDaemonServer(o.svr, &action.Server{Cancel: o.Stop, IsSudo: o.IsSudo, GetClient: GetClient, LogFile: file})
o.uptime = time.Now().Unix()
return o.svr.Serve(lis)
}
func (o *SvrOption) Stop() {
o.cancel()
if o.svr != nil {
//o.svr.GracefulStop()
o.svr.Stop()
}
path := GetSockPath(o.IsSudo)
_ = os.Remove(path)
}