package app import ( "flag" "os" "os/signal" "syscall" cml04eventer "git.espin.casa/albert/cml04-eventer" "git.espin.casa/albert/cml04-gdm-int/pkg/api" "git.espin.casa/albert/cml04-l2-rsm-in/internal/logging" "git.espin.casa/albert/cml04-l2-rsm-in/internal/server" "git.espin.casa/albert/cml04-l2-rsm-in/internal/service" "git.espin.casa/albert/logger" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" ) func Run() error { // flags l2InAddr := flag.String("l2-in-addr", "0.0.0.0:5012", "tcp l2 server address") apiAddr := flag.String("l2-out-addr", "localhost:3333", "tcp adress") nsqAddr := flag.String("nsq-addr", "10.1.152.13", "nsq server address") nsqPort := flag.Int("nsq-port", 4150, "nsq server port") logLevel := flag.String("log-level", "debug", "trace debug level") flag.Parse() // setup logger log := logger.New(os.Stdout, *logLevel) // log fields logFields := logger.LogFields{ "log_level": *logLevel, "l2_in_address": *l2InAddr, "api_adress": *apiAddr, "nsq_address": *nsqAddr, "nsq_port": *nsqPort, } // create event publisher publisher, err := cml04eventer.NewPublisher(&cml04eventer.PublisherImplConfig{ NSQAddress: *nsqAddr, NSQPort: *nsqPort, Marshaler: cml04eventer.JSONMarshaler{}, }, log) if err != nil { log.Error("failed to create event publisher", err, logFields) return err } defer publisher.Close() // api dial conn, err := grpc.Dial(*apiAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Error("failed to dial api server", err, logger.LogFields{}) } // create api client client := api.NewRollDataServiceClient(conn) defer conn.Close() // create service svc := service.NewService(client, publisher) svc = logging.NewLoggingService(log, svc) // create server server := server.NewServer(*l2InAddr, log, svc) // start tcp server (telegrams) go func() { if err := server.Run(); err != nil { log.Error("server error", err, logFields) } }() // info banner log.Info("started cml04-l2-rsm-in telegram service", logFields) // wait signal to finish signal := WaitSignal() log.Info("signal received", logFields.Add(logger.LogFields{ "signal": signal, })) return nil } // WaitSignal catching exit signal func WaitSignal() os.Signal { ch := make(chan os.Signal, 2) signal.Notify( ch, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM, ) for { sig := <-ch switch sig { case syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM: return sig } } }