package grpc_server import ( "bufio" "context" "flag" "fmt" "grpc_server/auth" "grpc_server/gen" "log" "net" "os" "runtime" "strconv" "strings" "syscall" "time" "github.com/matsuridayo/libneko/neko_common" grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" "google.golang.org/grpc" ) type BaseServer struct { gen.LibcoreServiceServer } func (s *BaseServer) Exit(ctx context.Context, in *gen.EmptyReq) (out *gen.EmptyResp, _ error) { out = &gen.EmptyResp{} // Connection closed os.Exit(0) return } func RunCore(setupCore func(), server gen.LibcoreServiceServer) { _token := flag.String("token", "", "") _port := flag.Int("port", 19810, "") _debug := flag.Bool("debug", false, "") flag.CommandLine.Parse(os.Args[2:]) neko_common.Debug = *_debug go func() { parent, err := os.FindProcess(os.Getppid()) if err != nil { log.Fatalln("find parent:", err) } if runtime.GOOS == "windows" { state, err := parent.Wait() log.Fatalln("parent exited:", state, err) } else { for { time.Sleep(time.Second * 10) err = parent.Signal(syscall.Signal(0)) if err != nil { log.Fatalln("parent exited:", err) } } } }() // Libcore setupCore() // GRPC lis, err := net.Listen("tcp", "127.0.0.1:"+strconv.Itoa(*_port)) if err != nil { log.Fatalf("failed to listen: %v", err) } token := *_token if token == "" { os.Stderr.WriteString("Please set a token: ") s := bufio.NewScanner(os.Stdin) if s.Scan() { token = strings.TrimSpace(s.Text()) } } if token == "" { fmt.Println("You must set a token") os.Exit(0) } os.Stderr.WriteString("token is set\n") auther := auth.Authenticator{ Token: token, } s := grpc.NewServer( grpc.StreamInterceptor(grpc_auth.StreamServerInterceptor(auther.Authenticate)), grpc.UnaryInterceptor(grpc_auth.UnaryServerInterceptor(auther.Authenticate)), ) gen.RegisterLibcoreServiceServer(s, server) name := "nekoray_core" if neko_common.RunMode == neko_common.RunMode_NekoBox_Core { name = "nekobox_core" } log.Printf("%s grpc server listening at %v\n", name, lis.Addr()) if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }