mirror of https://github.com/writeas/writefreely
parent
343f67dc97
commit
16473c97b7
@ -0,0 +1,81 @@ |
||||
package writefreely |
||||
|
||||
import ( |
||||
"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() { |
||||
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) { |
||||
} |
@ -0,0 +1 @@ |
||||
writefreely |
@ -0,0 +1,9 @@ |
||||
package main |
||||
|
||||
import ( |
||||
"github.com/writeas/writefreely" |
||||
) |
||||
|
||||
func main() { |
||||
writefreely.Serve() |
||||
} |
@ -0,0 +1,85 @@ |
||||
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", |
||||
}, |
||||
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) |
||||
} |
@ -0,0 +1,26 @@ |
||||
package writefreely |
||||
|
||||
import ( |
||||
"io/ioutil" |
||||
) |
||||
|
||||
type keychain struct { |
||||
cookieAuthKey, cookieKey []byte |
||||
} |
||||
|
||||
func initKeys(app *app) error { |
||||
var err error |
||||
app.keys = &keychain{} |
||||
|
||||
app.keys.cookieAuthKey, err = ioutil.ReadFile("keys/cookies_auth.aes256") |
||||
if err != nil { |
||||
return err |
||||
} |
||||
|
||||
app.keys.cookieKey, err = ioutil.ReadFile("keys/cookies_enc.aes256") |
||||
if err != nil { |
||||
return err |
||||
} |
||||
|
||||
return nil |
||||
} |
@ -0,0 +1,31 @@ |
||||
package writefreely |
||||
|
||||
import ( |
||||
"github.com/gorilla/mux" |
||||
"github.com/writeas/web-core/log" |
||||
"github.com/writeas/writefreely/config" |
||||
"strings" |
||||
) |
||||
|
||||
func initRoutes(handler *Handler, r *mux.Router, cfg *config.Config) { |
||||
isSingleUser := !cfg.App.MultiUser |
||||
|
||||
// Write.as router
|
||||
hostSubroute := cfg.Server.Host[strings.Index(cfg.Server.Host, "://")+3:] |
||||
if isSingleUser { |
||||
hostSubroute = "{domain}" |
||||
} else { |
||||
if strings.HasPrefix(hostSubroute, "localhost") { |
||||
hostSubroute = "localhost" |
||||
} |
||||
} |
||||
|
||||
if isSingleUser { |
||||
log.Info("Adding %s routes (single user)...", hostSubroute) |
||||
|
||||
return |
||||
} |
||||
|
||||
// Primary app routes
|
||||
log.Info("Adding %s routes (multi-user)...", hostSubroute) |
||||
} |
Loading…
Reference in new issue