feedizer/cmd/feedizer/main.go
fanir a7d08500f5 database and migrator revisions, help output, data model changes
- database:
  - moved to jackc/pgx from database/sql
  - revised migrator and moved it into it's own package
  - separated ParseConfig into it's own function
- config:
  - database config is now a DSN or URL instead of a struct
  - SearchPaths are now available through a function
- improved help / usage output
- modified data model
2022-02-22 00:08:19 +01:00

124 lines
2.7 KiB
Go

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")
}