/* Copyright © 2022 Victor Lacasse-Beaudoin */ package cmd import ( "git.agecem.com/agecem/bottin/bottin" "git.agecem.com/agecem/bottin/data" "github.com/spf13/cobra" "github.com/spf13/viper" "log" "time" ) var ( json_insert_path string ) // serverCmd represents the server command var serverCmd = &cobra.Command{ Use: "server", Short: "Run the bottin server", Run: func(cmd *cobra.Command, args []string) { // Timer db_retry_timer := time.Duration(viper.GetInt("db.retry-timer")) // Open and migrate db for { err := data.OpenDatabase() if err != nil { log.Println(err) time.Sleep(db_retry_timer * time.Second) continue } err = data.MigrateDatabase() if err != nil { log.Println(err) time.Sleep(db_retry_timer * time.Second) continue } break } bottin.UpdateFlags() // Import from flag if json_insert_path != "" { bottin.InsertJson(json_insert_path) } // Run web app bottin.RunServer() }, } func init() { declareFlags() rootCmd.AddCommand(serverCmd) } func declareFlags() { // db.type serverCmd.PersistentFlags().String( "db-type", "", "Database type (config: 'db.type')") viper.BindPFlag( "db.type", serverCmd.PersistentFlags().Lookup("db-type")) serverCmd.MarkPersistentFlagRequired("db.type") // db.sqlite.path serverCmd.PersistentFlags().String( "db-sqlite-path", "", "Path to sqlite database (config: 'db.sqlite.path')") viper.BindPFlag( "db.sqlite.path", serverCmd.PersistentFlags().Lookup("db-sqlite-path")) // server.port serverCmd.PersistentFlags().Int( "server-port", 1312, "The port on which the web application will server content (config: 'server.port')") viper.BindPFlag( "server.port", serverCmd.PersistentFlags().Lookup("server-port")) // server.static_dir serverCmd.PersistentFlags().String( "static-dir", "/var/lib/bottin/static", "The directory containing static assets (config: 'server.static_dir')") viper.BindPFlag( "server.static_dir", serverCmd.PersistentFlags().Lookup("static-dir")) // login.username serverCmd.PersistentFlags().String( "login-username", "bottin", "The username to login to the web ui. (config: 'login.username')") viper.BindPFlag( "login.username", serverCmd.PersistentFlags().Lookup("login-username")) // login.password serverCmd.PersistentFlags().String( "login-password", "bottin", "The password to login to the web ui. (config: 'login.password')") viper.BindPFlag( "login.password", serverCmd.PersistentFlags().Lookup("login-password")) // import.insert-batch-size serverCmd.PersistentFlags().Int( "insert-batch-size", 500, "The amount of inserts to do per batch (config: 'import.insert_batch_size')") viper.BindPFlag( "import.insert_batch_size", serverCmd.PersistentFlags().Lookup("insert-batch-size")) // json-insert-path serverCmd.PersistentFlags().StringVar( &json_insert_path, "json-insert-path", "", "The location of a json file containing Membres to insert.") /* // Not using viper for json-insert-path since it would make it too easy // to forget to remove from the config every time, which heavily risks // doubling values. // // It would at least need to check for doubles before importing the file, // for it to be a kind of automatic differential update of the database. viper.BindPFlag( "import.json-insert-path", serverCmd.PersistentFlags().Lookup("json-insert-path")) */ // db.retry-timer serverCmd.PersistentFlags().Int( "db-retry-timer", 2, "Time between failed database connection retries, in seconds.") viper.BindPFlag( "db.retry-timer", serverCmd.PersistentFlags().Lookup("db-retry-timer")) }