diff --git a/cmd/writefreely/config.go b/cmd/writefreely/config.go index d572036..c5ff455 100644 --- a/cmd/writefreely/config.go +++ b/cmd/writefreely/config.go @@ -1,63 +1,61 @@ /* * Copyright © 2020 A Bunch Tell LLC. * * This file is part of WriteFreely. * * WriteFreely is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, included * in the LICENSE file in this source code package. */ package main import ( "github.com/writeas/writefreely" "github.com/urfave/cli/v2" ) var ( cmdConfig cli.Command = cli.Command{ Name: "config", Usage: "config management tools", Subcommands: []*cli.Command{ &cmdConfigGenerate, &cmdConfigInteractive, }, } cmdConfigGenerate cli.Command = cli.Command{ Name: "generate", Aliases: []string{"gen"}, Usage: "Generate a basic configuration", - Action: genConfigAction, + Action: genConfigAction, } cmdConfigInteractive cli.Command = cli.Command{ - Name: "interactive", - Aliases: []string{"i"}, - Usage: "Interactive configuration process", + Name: "start", + Usage: "Interactive configuration process", Action: interactiveConfigAction, Flags: []cli.Flag{ &cli.StringFlag{ Name: "sections", Value: "server db app", - Usage: "Which sections of the configuration to go through (requires --config)\n" + - "valid values are any combination of 'server', 'db' and 'app' \n" + - "example: writefreely --config --sections \"db app\"", + Usage: "Which sections of the configuration to go through\n" + + "valid values of sections flag are any combination of 'server', 'db' and 'app' \n" + + "example: writefreely config start --sections \"db app\"", }, }, } - ) func genConfigAction(c *cli.Context) error { app := writefreely.NewApp(c.String("c")) return writefreely.CreateConfig(app) } func interactiveConfigAction(c *cli.Context) error { app := writefreely.NewApp(c.String("c")) writefreely.DoConfig(app, c.String("sections")) return nil -} \ No newline at end of file +} diff --git a/cmd/writefreely/db.go b/cmd/writefreely/db.go index fa5110d..badc805 100644 --- a/cmd/writefreely/db.go +++ b/cmd/writefreely/db.go @@ -1,50 +1,50 @@ /* * Copyright © 2020 A Bunch Tell LLC. * * This file is part of WriteFreely. * * WriteFreely is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, included * in the LICENSE file in this source code package. */ package main import ( "github.com/writeas/writefreely" "github.com/urfave/cli/v2" ) var ( cmdDB cli.Command = cli.Command{ Name: "db", Usage: "db management tools", Subcommands: []*cli.Command{ &cmdDBInit, &cmdDBMigrate, }, } cmdDBInit cli.Command = cli.Command{ - Name: "init", - Usage: "Initialize Database", + Name: "init", + Usage: "Initialize Database", Action: initDBAction, } cmdDBMigrate cli.Command = cli.Command{ - Name: "migrate", - Usage: "Migrate Database", - Action: migrateDBAction, + Name: "migrate", + Usage: "Migrate Database", + Action: migrateDBAction, } ) func initDBAction(c *cli.Context) error { app := writefreely.NewApp(c.String("c")) return writefreely.CreateSchema(app) } func migrateDBAction(c *cli.Context) error { app := writefreely.NewApp(c.String("c")) return writefreely.Migrate(app) -} \ No newline at end of file +} diff --git a/cmd/writefreely/keys.go b/cmd/writefreely/keys.go index 7e81475..9028f51 100644 --- a/cmd/writefreely/keys.go +++ b/cmd/writefreely/keys.go @@ -1,40 +1,39 @@ /* * Copyright © 2020 A Bunch Tell LLC. * * This file is part of WriteFreely. * * WriteFreely is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, included * in the LICENSE file in this source code package. */ package main import ( "github.com/writeas/writefreely" "github.com/urfave/cli/v2" ) var ( cmdKeys cli.Command = cli.Command{ Name: "keys", Usage: "key management tools", Subcommands: []*cli.Command{ &cmdGenerateKeys, }, } cmdGenerateKeys cli.Command = cli.Command{ Name: "generate", Aliases: []string{"gen"}, Usage: "Generate encryption and authentication keys", - Action: genKeysAction, + Action: genKeysAction, } - ) func genKeysAction(c *cli.Context) error { app := writefreely.NewApp(c.String("c")) return writefreely.GenerateKeyFiles(app) -} \ No newline at end of file +} diff --git a/cmd/writefreely/main.go b/cmd/writefreely/main.go index 55f97be..45dfb80 100644 --- a/cmd/writefreely/main.go +++ b/cmd/writefreely/main.go @@ -1,181 +1,184 @@ /* * Copyright © 2018-2020 A Bunch Tell LLC. * * This file is part of WriteFreely. * * WriteFreely is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, included * in the LICENSE file in this source code package. */ package main import ( "fmt" "os" "strings" "github.com/writeas/web-core/log" "github.com/writeas/writefreely" "github.com/gorilla/mux" "github.com/urfave/cli/v2" ) func main() { + cli.VersionPrinter = func(c *cli.Context) { + fmt.Printf("%s\n", c.App.Version) + } app := &cli.App{ Name: "WriteFreely", Usage: "A beautifully pared-down blogging platform", Version: writefreely.FormatVersion(), Action: legacyActions, // legacy due to use of flags for switching actions Flags: []cli.Flag{ &cli.BoolFlag{ Name: "create-config", Value: false, Usage: "Generate a basic configuration", Hidden: true, }, &cli.BoolFlag{ Name: "config", Value: false, Usage: "Interactive configuration process", Hidden: true, }, &cli.StringFlag{ Name: "sections", Value: "server db app", Usage: "Which sections of the configuration to go through (requires --config)\n" + "valid values are any combination of 'server', 'db' and 'app' \n" + "example: writefreely --config --sections \"db app\"", Hidden: true, }, &cli.BoolFlag{ Name: "gen-keys", Value: false, Usage: "Generate encryption and authentication keys", Hidden: true, }, &cli.BoolFlag{ Name: "init-db", Value: false, Usage: "Initialize app database", Hidden: true, }, &cli.BoolFlag{ Name: "migrate", Value: false, Usage: "Migrate the database", Hidden: true, }, &cli.StringFlag{ Name: "create-admin", Usage: "Create an admin with the given username:password", Hidden: true, }, &cli.StringFlag{ Name: "create-user", Usage: "Create a regular user with the given username:password", Hidden: true, }, &cli.StringFlag{ Name: "delete-user", Usage: "Delete a user with the given username", Hidden: true, }, &cli.StringFlag{ Name: "reset-pass", Usage: "Reset the given user's password", Hidden: true, }, }, // legacy flags (set to hidden to eventually switch to bash-complete compatible format) } defaultFlags := []cli.Flag{ &cli.StringFlag{ Name: "c", Value: "config.ini", Usage: "Load configuration from `FILE`", }, &cli.BoolFlag{ Name: "debug", Value: false, Usage: "Enables debug logging", }, } app.Flags = append(app.Flags, defaultFlags...) app.Commands = []*cli.Command{ &cmdUser, &cmdDB, &cmdConfig, &cmdKeys, &cmdServe, } err := app.Run(os.Args) if err != nil { log.Error(err.Error()) os.Exit(1) } } func legacyActions(c *cli.Context) error { app := writefreely.NewApp(c.String("c")) switch true { case c.IsSet("create-config"): return writefreely.CreateConfig(app) case c.IsSet("config"): writefreely.DoConfig(app, c.String("sections")) return nil case c.IsSet("gen-keys"): return writefreely.GenerateKeyFiles(app) case c.IsSet("init-db"): return writefreely.CreateSchema(app) case c.IsSet("migrate"): return writefreely.Migrate(app) case c.IsSet("create-admin"): username, password, err := parseCredentials(c.String("create-admin")) if err != nil { return err } return writefreely.CreateUser(app, username, password, true) case c.IsSet("create-user"): username, password, err := parseCredentials(c.String("create-user")) if err != nil { return err } return writefreely.CreateUser(app, username, password, false) case c.IsSet("delete-user"): return writefreely.DoDeleteAccount(app, c.String("delete-user")) case c.IsSet("reset-pass"): return writefreely.ResetPassword(app, c.String("reset-pass")) } // Initialize the application var err error log.Info("Starting %s...", writefreely.FormatVersion()) app, err = writefreely.Initialize(app, c.Bool("debug")) if err != nil { return err } // Set app routes r := mux.NewRouter() writefreely.InitRoutes(app, r) app.InitStaticRoutes(r) // Serve the application writefreely.Serve(app, r) return nil } func parseCredentials(credentialString string) (string, string, error) { creds := strings.Split(credentialString, ":") if len(creds) != 2 { return "", "", fmt.Errorf("invalid format for passed credentials, must be username:password") } return creds[0], creds[1], nil } diff --git a/cmd/writefreely/user.go b/cmd/writefreely/user.go index c87129a..f6bdd84 100644 --- a/cmd/writefreely/user.go +++ b/cmd/writefreely/user.go @@ -1,89 +1,89 @@ /* * Copyright © 2020 A Bunch Tell LLC. * * This file is part of WriteFreely. * * WriteFreely is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, included * in the LICENSE file in this source code package. */ package main import ( "github.com/writeas/writefreely" "github.com/urfave/cli/v2" ) var ( cmdUser cli.Command = cli.Command{ Name: "user", Usage: "user management tools", Subcommands: []*cli.Command{ &cmdAddUser, &cmdDelUser, &cmdResetPass, // TODO: possibly add a user list command }, } cmdAddUser cli.Command = cli.Command{ - Name: "add", + Name: "create", Usage: "Add new user", - Aliases: []string{"a"}, + Aliases: []string{"a", "add"}, Flags: []cli.Flag{ &cli.BoolFlag{ Name: "admin", Value: false, Usage: "Create admin user", }, }, Action: addUserAction, } cmdDelUser cli.Command = cli.Command{ Name: "delete", Usage: "Delete user", Aliases: []string{"del", "d"}, Action: delUserAction, } cmdResetPass cli.Command = cli.Command{ Name: "reset-pass", Usage: "Reset user's password", Aliases: []string{"resetpass", "reset"}, Action: resetPassAction, } ) func addUserAction(c *cli.Context) error { credentials := "" if c.NArg() > 0 { credentials = c.Args().Get(0) } username, password, err := parseCredentials(credentials) if err != nil { return err } app := writefreely.NewApp(c.String("c")) return writefreely.CreateUser(app, username, password, c.Bool("admin")) } func delUserAction(c *cli.Context) error { username := "" if c.NArg() > 0 { username = c.Args().Get(0) } app := writefreely.NewApp(c.String("c")) return writefreely.DoDeleteAccount(app, username) } func resetPassAction(c *cli.Context) error { username := "" if c.NArg() > 0 { username = c.Args().Get(0) } app := writefreely.NewApp(c.String("c")) return writefreely.ResetPassword(app, username) } diff --git a/cmd/writefreely/web.go b/cmd/writefreely/web.go index e848f8b..a687548 100644 --- a/cmd/writefreely/web.go +++ b/cmd/writefreely/web.go @@ -1,49 +1,49 @@ /* * Copyright © 2020 A Bunch Tell LLC. * * This file is part of WriteFreely. * * WriteFreely is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, included * in the LICENSE file in this source code package. */ package main import ( "github.com/writeas/web-core/log" "github.com/writeas/writefreely" "github.com/gorilla/mux" "github.com/urfave/cli/v2" ) var ( cmdServe cli.Command = cli.Command{ - Name: "serve", + Name: "serve", Aliases: []string{"web"}, - Usage: "Run web application", - Action: serveAction, + Usage: "Run web application", + Action: serveAction, } ) func serveAction(c *cli.Context) error { // Initialize the application app := writefreely.NewApp(c.String("c")) var err error log.Info("Starting %s...", writefreely.FormatVersion()) app, err = writefreely.Initialize(app, c.Bool("debug")) if err != nil { return err } // Set app routes r := mux.NewRouter() writefreely.InitRoutes(app, r) app.InitStaticRoutes(r) // Serve the application writefreely.Serve(app, r) return nil -} \ No newline at end of file +}