package main import ( "flag" "net" "os" "time" "github.com/ilyakaznacheev/cleanenv" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "github.com/rs/zerolog/pkgerrors" "google.golang.org/grpc" "google.golang.org/grpc/reflection" "git.entr0py.de/garionion/gstreamer-graphix/api" "git.entr0py.de/garionion/gstreamer-graphix/gstreamer" ) type Config struct { Outputs []string `yaml:"outputs"` Address string `yaml:"address" env:"ADDRESS" env-default:"localhost:3000"` LogFile string `yaml:"logfile" env:"LOGFILE" env-default:"./gstreamer-graphix.log"` } var cfg = Config{ Address: "localhost:3000", LogFile: "./gstreamer-graphix.log", } func main() { zerolog.TimeFieldFormat = time.RFC1123Z consoleWriter := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC1123Z} log.Logger = log.Output(consoleWriter).With().Timestamp().Caller().Logger() if err := cleanenv.ReadConfig("config.toml", &cfg); err != nil { log.Err(err).Msg("No configfile, continuing without") } fset := flag.NewFlagSet("config", flag.ContinueOnError) fset.Usage = cleanenv.FUsage(fset.Output(), &cfg, nil, fset.Usage) if err := fset.Parse(os.Args[1:]); err != nil { log.Fatal().Err(err).Msg("failed to parse flags") } if cfg.LogFile != "" { l, _ := os.OpenFile(cfg.LogFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0664) multi := zerolog.MultiLevelWriter(consoleWriter, l) log.Logger = zerolog.New(multi).With().Timestamp().Caller().Logger() } if log.Logger.GetLevel() == zerolog.DebugLevel { zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack } log.Debug().Msgf("config: %+v", cfg) log.Info().Msgf("listening on %s", cfg.Address) ln, err := net.Listen("tcp", cfg.Address) if err != nil { log.Fatal().Err(err) } gst := gstreamer.Init() pipelineService := &api.PipelineService{Gstreamer: gst} g := grpc.NewServer() reflection.Register(g) api.RegisterPipelineServiceServer(g, pipelineService) log.Fatal().Msgf("Failed to serve: %v", g.Serve(ln)) }