package main import ( "context" "flag" "net/url" "os" "os/signal" "replicator/replicator" "syscall" "time" "gopkg.in/yaml.v3" ) func main() { ctx, can := signal.NotifyContext(context.Background(), syscall.SIGINT) defer can() config, err := getConfig() if err != nil { panic(err) } if err := replicator.Main(ctx, config); err != nil && ctx.Err() == nil { panic(err) } } func getConfig() (replicator.Config, error) { var config replicator.Config if p := os.Getenv("CONFIG"); p != "" { f, err := os.Open(p) if err != nil { return config, err } defer f.Close() if err := yaml.NewDecoder(f).Decode(&config); err != nil { return config, err } } var srcDriver, destDriver, interval string flag.StringVar(&srcDriver, "src", "map://", "source db") flag.StringVar(&destDriver, "dest", "map://", "dest db") flag.StringVar(&interval, "interval", "1s", "interval") flag.Parse() if srcDriver, err := url.Parse(srcDriver); err != nil { return config, err } else { config.Src.Driver = *srcDriver } if destDriver, err := url.Parse(destDriver); err != nil { return config, err } else { config.Dest.Driver = *destDriver } if interval, err := time.ParseDuration(interval); err != nil { return config, err } else { config.Interval = replicator.Duration(interval) } return config, nil }