diff --git a/app.go b/app.go index 63bc9cc..f51908c 100644 --- a/app.go +++ b/app.go @@ -1,81 +1,93 @@ package writefreely import ( + "flag" "fmt" _ "github.com/go-sql-driver/mysql" "net/http" "os" "os/signal" "syscall" "github.com/gorilla/mux" "github.com/gorilla/sessions" "github.com/writeas/web-core/log" "github.com/writeas/writefreely/config" ) const ( staticDir = "static/" ) type app struct { router *mux.Router cfg *config.Config keys *keychain sessionStore *sessions.CookieStore } var shttp = http.NewServeMux() func Serve() { + createConfig := flag.Bool("create-config", false, "Creates a basic configuration and exits") + flag.Parse() + + if *createConfig { + log.Info("Creating configuration...") + c := config.New() + log.Info("Saving configuration...") + config.Save(c) + os.Exit(0) + } + log.Info("Initializing...") log.Info("Loading configuration...") cfg, err := config.Load() if err != nil { log.Error("Unable to load configuration: %v", err) os.Exit(1) } app := &app{ cfg: cfg, } // Load keys log.Info("Loading encryption keys...") err = initKeys(app) if err != nil { log.Error("\n%s\n", err) } // Initialize modules r := mux.NewRouter() handler := NewHandler(app.sessionStore) // Handle app routes initRoutes(handler, r, app.cfg) // Handle static files fs := http.FileServer(http.Dir(staticDir)) shttp.Handle("/", fs) r.PathPrefix("/").Handler(fs) // Handle shutdown c := make(chan os.Signal, 2) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c log.Info("Shutting down...") shutdown(app) log.Info("Done.") os.Exit(0) }() // Start web application server http.Handle("/", r) log.Info("Serving on http://localhost:%d\n", app.cfg.Server.Port) log.Info("---") http.ListenAndServe(fmt.Sprintf(":%d", app.cfg.Server.Port), nil) } func shutdown(app *app) { } diff --git a/config/config.go b/config/config.go index 8dff369..9defa9e 100644 --- a/config/config.go +++ b/config/config.go @@ -1,85 +1,86 @@ package config import ( "gopkg.in/ini.v1" ) const ( configFile = "config.ini" ) type ( ServerCfg struct { Host string `ini:"host"` Port int `ini:"port"` } DatabaseCfg struct { Type string `ini:"type"` User string `ini:"username"` Pass string `ini:"password"` Host string `ini:"host"` Port int `ini:"port"` } AppCfg struct { MultiUser bool `ini:"multiuser"` OpenSignups bool `ini:"open_signups"` Federation bool `ini:"federation"` Name string `ini:"site_name"` JSDisabled bool `ini:"disable_js"` // User registration MinUsernameLen int `ini:"min_username_len"` } Config struct { Server ServerCfg `ini:"server"` Database DatabaseCfg `ini:"database"` App AppCfg `ini:"app"` } ) func New() *Config { return &Config{ Server: ServerCfg{ Host: "http://localhost:8080", Port: 8080, }, Database: DatabaseCfg{ Type: "mysql", Host: "localhost", + Port: 3306, }, App: AppCfg{ Federation: true, MinUsernameLen: 3, }, } } func Load() (*Config, error) { cfg, err := ini.Load(configFile) if err != nil { return nil, err } // Parse INI file uc := &Config{} err = cfg.MapTo(uc) if err != nil { return nil, err } return uc, nil } func Save(uc *Config) error { cfg := ini.Empty() err := ini.ReflectFrom(cfg, uc) if err != nil { return err } return cfg.SaveTo(configFile) }