Files
nekoray/go/grpc_server/grpc.go
2023-05-16 09:45:50 +09:00

112 lines
2.3 KiB
Go

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"
"github.com/matsuridayo/libneko/neko_log"
grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth"
"google.golang.org/grpc"
"golang.org/x/time/rate"
)
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
neko_log.RateLimiter = rate.NewLimiter(rate.Limit(100), 150)
neko_log.RateLimitExit = true
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)
}
}