From 375933c7bc5878b6d5eb1cb7888c03b65447eb20 Mon Sep 17 00:00:00 2001 From: ston1th Date: Fri, 26 Oct 2018 17:28:50 +0200 Subject: [PATCH] added support for config files, openbsd, pledge and unveil --- Makefile | 9 ++++- README.md | 26 ++++++++++++ pkg/cmd/cmd.go | 51 ++++++++++++++++++------ pkg/core/pledge.go | 7 ---- pkg/core/pledge_openbsd.go | 11 ----- pkg/core/types.go | 20 +++++----- pkg/db/db.go | 8 +++- pkg/db/page.go | 1 - pkg/index/index.go | 5 +++ pkg/log/log.go | 9 ++++- pkg/render/render.go | 3 -- pkg/server/server.go | 5 +++ scripts/{install.sh => install_linux.sh} | 0 scripts/install_openbsd.sh | 32 +++++++++++++++ 14 files changed, 138 insertions(+), 49 deletions(-) delete mode 100644 pkg/core/pledge.go delete mode 100644 pkg/core/pledge_openbsd.go rename scripts/{install.sh => install_linux.sh} (100%) create mode 100755 scripts/install_openbsd.sh diff --git a/Makefile b/Makefile index 34b11ef..8733d9d 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ VERSION=$(shell cat VERSION) GCFLAGS=-gcflags '-e' LDFLAGS=-ldflags '-X main.version=$(VERSION) -s -w' PROGRAM=gowiki +ENV=CGO_ENABLED=0 all: $(PROGRAM) @@ -11,10 +12,10 @@ setup: $(CC) get github.com/client9/misspell vendor: clean codeqa - CGO_ENABLED=0 $(CC) $(BUILD) -mod=vendor $(LDFLAGS) + $(ENV) $(CC) $(BUILD) -mod=vendor $(LDFLAGS) $(PROGRAM): clean codeqa - CGO_ENABLED=0 $(CC) $(BUILD) $(LDFLAGS) + $(ENV) $(CC) $(BUILD) $(LDFLAGS) clean: $(CC) clean -x @@ -36,9 +37,13 @@ misspell: test: ifeq ($(shell go env GOARCH), $(shell go env GOHOSTARCH)) +ifeq ($(shell go env GOOS), $(shell go env GOHOSTOS)) $(CC) test ./... else $(info skipping tests of other platforms) endif +else + $(info skipping tests of other platforms) +endif .PHONY: setup vendor build clean codeqa generate gofmt golint misspell test diff --git a/README.md b/README.md index facd9d6..eb96770 100644 --- a/README.md +++ b/README.md @@ -1 +1,27 @@ # GoWiki - a simple wiki engine written in Go + +## Building + +Linux: + +``` +make + +or offline + +make vendor +``` + +OpenBSD: + +``` +GOOS=openbsd make + +or offline + +GOOS=openbsd make vendor +``` + +## Install + +See the `scripts/` directory on how to install gowiki on Linux or OpenBSD. diff --git a/pkg/cmd/cmd.go b/pkg/cmd/cmd.go index 327d9c0..88353d9 100644 --- a/pkg/cmd/cmd.go +++ b/pkg/cmd/cmd.go @@ -3,6 +3,7 @@ package cmd import ( + "encoding/json" "git.giftfish.de/ston1th/godrop/v2" "git.giftfish.de/ston1th/gowiki/pkg/core" "git.giftfish.de/ston1th/gowiki/pkg/db" @@ -29,10 +30,11 @@ const ( var ( conf core.Config dumpFile string + config string ) func initServer(conf core.Config) (err error) { - if err = core.Pledge("stdio rpath wpath cpath inet fattr flock proc exec id", ""); err != nil { + if err = godrop.PledgePromises("stdio rpath wpath cpath inet fattr flock proc exec id unveil"); err != nil { return } dropCfg := godrop.Config{ @@ -50,17 +52,17 @@ func initServer(conf core.Config) (err error) { return } - if err = core.Pledge("stdio rpath wpath cpath inet fattr flock", ""); err != nil { + if err = godrop.PledgePromises("stdio rpath wpath cpath inet fattr flock unveil"); err != nil { return } - log.InitLogger(conf.DataDir, conf.LogFile, conf.Debug) - l, err := godrop.GetListener() if err != nil { return } + log.InitLogger(conf.DataDir, conf.LogFile, conf.Debug) + srv := server.NewHTTPServer(l, conf) err = srv.Start() if err != nil { @@ -70,7 +72,7 @@ func initServer(conf core.Config) (err error) { sigs := make(chan os.Signal) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) sig := <-sigs - log.Println("caught " + sig.String()) + log.Println("signal: " + sig.String()) go func() { time.Sleep(time.Second * 20) log.Fatal("stop timed out: killing") @@ -83,6 +85,21 @@ func initServer(conf core.Config) (err error) { return } +func loadConfig() error { + if config == "" { + return nil + } + file, err := os.Open(config) + if err != nil { + return err + } + err = json.NewDecoder(file).Decode(&conf) + if err != nil { + return err + } + return file.Close() +} + func Run(version string) { app := cli.NewApp() app.Name = "gowiki" @@ -94,9 +111,12 @@ func Run(version string) { Usage: "start gowiki server", Flags: defaultFlags(serverFlags()), Action: func(c *cli.Context) error { + if err := loadConfig(); err != nil { + stdlog.Fatal("server: ", err) + } conf.Version = app.Version if err := initServer(conf); err != nil { - stdlog.Fatal(err) + stdlog.Fatal("server: ", err) } return nil }, @@ -110,15 +130,15 @@ func Run(version string) { file = os.Stdout err error ) + if err = loadConfig(); err != nil { + stdlog.Fatal("dump: ", err) + } if dumpFile != "-" { file, err = os.OpenFile(dumpFile, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0640) if err != nil { stdlog.Fatal("dump: ", err) } } - if err = os.Chdir(conf.DataDir); err != nil { - stdlog.Fatal("dump: ", err) - } DB, err := db.New(conf.DataDir) if err != nil { stdlog.Fatal("dump: ", err) @@ -143,15 +163,15 @@ func Run(version string) { file = os.Stdin err error ) + if err = loadConfig(); err != nil { + stdlog.Fatal("restore: ", err) + } if dumpFile != "-" { file, err = os.Open(dumpFile) if err != nil { - stdlog.Fatal("dump: ", err) + stdlog.Fatal("restore: ", err) } } - if err = os.Chdir(conf.DataDir); err != nil { - stdlog.Fatal("restore: ", err) - } DB, err := db.New(conf.DataDir) if err != nil { stdlog.Fatal("restore: ", err) @@ -233,6 +253,11 @@ func dumpRestoreFlags() []cli.Flag { func defaultFlags(f []cli.Flag) []cli.Flag { return append([]cli.Flag{ + cli.StringFlag{ + Name: "config, c", + Usage: "config file", + Destination: &config, + }, cli.StringFlag{ Name: "data, d", Value: defDataDir, diff --git a/pkg/core/pledge.go b/pkg/core/pledge.go deleted file mode 100644 index ecc374a..0000000 --- a/pkg/core/pledge.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (C) 2018 Marius Schellenberger - -// +build !openbsd - -package core - -func Pledge(promises, execpromises string) error { return nil } diff --git a/pkg/core/pledge_openbsd.go b/pkg/core/pledge_openbsd.go deleted file mode 100644 index 5f0ec84..0000000 --- a/pkg/core/pledge_openbsd.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (C) 2018 Marius Schellenberger - -// +build openbsd - -package core - -import "golang.org/x/sys/unix" - -func Pledge(promises, execpromises string) error { - return unix.Pledge(promises, execpromises) -} diff --git a/pkg/core/types.go b/pkg/core/types.go index 98f48fc..0b87320 100644 --- a/pkg/core/types.go +++ b/pkg/core/types.go @@ -43,14 +43,14 @@ type Result struct { } type Config struct { - DataDir string - User string - Group string - ListenAddr string - LogFile string - Version string - Secret string - Foreground bool - SecureCookie bool - Debug bool + DataDir string `json:"data_dir,omitempty"` + User string `json:"user,omitempty"` + Group string `json:"group,omitempty"` + ListenAddr string `json:"listen_addr,omitempty"` + LogFile string `json:"log_file,omitempty"` + Version string `json:"-"` + Secret string `json:"secret,omitempty"` + Foreground bool `json:"foreground,omitempty"` + SecureCookie bool `json:"secure_cookie,omitempty"` + Debug bool `json:"debug,omitempty"` } diff --git a/pkg/db/db.go b/pkg/db/db.go index 5eef932..18606cb 100644 --- a/pkg/db/db.go +++ b/pkg/db/db.go @@ -3,6 +3,7 @@ package db import ( + "git.giftfish.de/ston1th/godrop/v2" "git.giftfish.de/ston1th/gowiki/pkg/cache" "git.giftfish.de/ston1th/gowiki/pkg/core" "git.giftfish.de/ston1th/gowiki/pkg/index" @@ -32,7 +33,12 @@ type DB struct { func New(dir string) (db *DB, err error) { db = &DB{cache: cache.NewCache()} - db.store, err = store.NewBoltStore(filepath.Join(dir, storeFile), nil) + dbFile := filepath.Join(dir, storeFile) + err = godrop.Unveil(dbFile, "rwc") + if err != nil { + return + } + db.store, err = store.NewBoltStore(dbFile, nil) if err != nil { return } diff --git a/pkg/db/page.go b/pkg/db/page.go index f528729..c7dc552 100644 --- a/pkg/db/page.go +++ b/pkg/db/page.go @@ -79,7 +79,6 @@ func (db *DB) CreatePage(title, section, markdown, username string, p core.Permi } st := render.StoreTitle(section, render.Title(title)) _, err = db.getPage(st, username) - //if err == nil || (err != nil && err != store.ErrKeyNotFound) { if err != store.ErrKeyNotFound { return } diff --git a/pkg/index/index.go b/pkg/index/index.go index b3c0749..e254ae5 100644 --- a/pkg/index/index.go +++ b/pkg/index/index.go @@ -4,6 +4,7 @@ package index import ( "errors" + "git.giftfish.de/ston1th/godrop/v2" "git.giftfish.de/ston1th/gowiki/pkg/core" "github.com/blevesearch/bleve" "html/template" @@ -24,6 +25,10 @@ type Index struct { func NewIndex(path string) (i *Index, err error) { var bi bleve.Index + err = godrop.Unveil(path, "rwc") + if err != nil { + return + } if _, err = os.Stat(path); os.IsNotExist(err) { mapping := bleve.NewIndexMapping() bi, err = bleve.New(path, mapping) diff --git a/pkg/log/log.go b/pkg/log/log.go index c7e2e64..5e2427f 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -3,6 +3,7 @@ package log import ( + "git.giftfish.de/ston1th/godrop/v2" stdlog "log" "os" "path/filepath" @@ -18,7 +19,13 @@ func InitLogger(dir, file string, d bool) { if file == "-" { return } - f, err := os.OpenFile(filepath.Join(dir, file), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0640) + logfile := filepath.Join(dir, file) + err := godrop.Unveil(logfile, "rwc") + if err != nil { + stdlog.Fatal(err) + return + } + f, err := os.OpenFile(logfile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0640) if err != nil { stdlog.Fatal(err) } diff --git a/pkg/render/render.go b/pkg/render/render.go index e74ec61..d57c732 100644 --- a/pkg/render/render.go +++ b/pkg/render/render.go @@ -109,9 +109,6 @@ func openTag(j int) (ret string) { for i := 0; i < j; i++ { ret += `