package main import ( "bufio" "errors" "flag" "fmt" "log" "os" "git.zom.bi/fanir/feedizer/cmd/feedizer/internal/config" "git.zom.bi/fanir/feedizer/cmd/feedizer/internal/database" "git.zom.bi/fanir/feedizer/cmd/feedizer/internal/database/migrator" "git.zom.bi/fanir/feedizer/cmd/feedizer/internal/server" "github.com/golang-migrate/migrate/v4" ) func Usage() { fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s:\n", os.Args[0]) fmt.Println(` Flags:`) flag.PrintDefaults() fmt.Println(` Commands: run (default action) Run the server. newconfig Write a new config file. purgedb Purge the database by undoing all migrations. help Show this help. Default Config Search Paths:`) for _, path := range config.SearchPaths() { fmt.Println(" ", path) } fmt.Println(` All paths are read in order, skipping non existant files. Settings in later files overwrite previous ones.`) } func main() { configFile := flag.String("C", "", "custom config file path") autoMigrate := flag.Bool("m", true, "Automatically migrate the database to the highest version.") flag.Parse() flag.Usage = Usage switch flag.Arg(0) { case "", "run": startApp(*autoMigrate) case "help": flag.Usage() case "newconfig": path, err := config.WriteFile(*configFile) if err != nil { fmt.Printf("cannot write config file %s: %s", path, err) os.Exit(1) } fmt.Println("wrote config file", path) case "purgedb": purgeDB() default: fmt.Printf("invalid action %s\n\n", flag.Arg(0)) fmt.Println("valid actions are probably: run (default), newconfig, purgedb") } } func startApp(automigrate bool) { cfg, err := config.Load() if err != nil { log.Fatalln(err) } if !cfg.AllowRoot && os.Geteuid() == 0 { log.Fatalln("do not run feedizer as root") } if automigrate { log.Println("migrating database...") if err = migrator.New(cfg.Database).Migrate(); err != nil && !errors.Is(err, migrate.ErrNoChange) { log.Fatalln(err) } log.Println("migration successful") } log.Println("starting server...") server.Start(cfg) } func purgeDB() { cfg, err := config.Load() if err != nil { log.Fatalln(err) } _, err = database.ParseConfig(cfg.Database) if err != nil { log.Fatalln(err) } fmt.Printf("PURGE database %s? You will loose all data. [yes/no]\n", database.LogName) in, err := bufio.NewReader(os.Stdin).ReadString('\n') if err != nil { log.Fatalln(err) } if in != "yes\n" { fmt.Println("Aborting. (You must type \"yes\" to continue)") return } fmt.Println("purging database...") if err = migrator.New(cfg.Database).Purge(); err != nil && !errors.Is(err, migrate.ErrNoChange) { log.Fatalln(err) } fmt.Println("purging successful") }