tMove configuration to a file - partage - File upload system
 (HTM) git clone git://git.z3bra.org/partage.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 9654d0cd90abaa89ac892448dc91596b79cefcf1
 (DIR) parent 8f777a6d331e2e1f53a561d6cf32746c290d7333
 (HTM) Author: Willy Goiffon <dev@z3bra.org>
       Date:   Tue, 19 Oct 2021 11:45:55 +0200
       
       Move configuration to a file
       
       Diffstat:
         M go.mod                              |       1 +
         M partage.go                          |      87 ++++++++++++++++++++-----------
       
       2 files changed, 58 insertions(+), 30 deletions(-)
       ---
 (DIR) diff --git a/go.mod b/go.mod
       t@@ -5,4 +5,5 @@ go 1.17
        require (
                github.com/dustin/go-humanize v1.0.0 // indirect
                github.com/vharitonsky/iniflags v0.0.0-20180513140207-a33cd0b5f3de // indirect
       +        gopkg.in/ini.v1 v1.63.2 // indirect
        )
 (DIR) diff --git a/partage.go b/partage.go
       t@@ -18,7 +18,7 @@ import (
                "encoding/json"
        
                "github.com/dustin/go-humanize"
       -        "github.com/vharitonsky/iniflags"
       +        "gopkg.in/ini.v1"
        )
        
        type templatedata struct {
       t@@ -34,19 +34,19 @@ type metadata struct {
        }
        
        var conf struct {
       -        bind     string
       -        user     string
       -        group    string
       -        baseuri  string
       -        filepath string
       -        metapath string
       -        rootdir  string
       -        chroot   string
       -        templatedir string
       -        filectx  string
       -        metactx  string
       -        maxsize  int64
       -        expiry   int64
       +        user        string
       +        group       string
       +        chroot      string
       +        bind        string
       +        baseuri     string
       +        rootdir     string
       +        tmplpath    string
       +        filepath    string
       +        metapath    string
       +        filectx     string
       +        metactx     string
       +        maxsize     int64
       +        expiry      int64
        }
        
        var verbose bool
       t@@ -117,7 +117,7 @@ func writemeta(filename string, expiry int64) error {
        }
        
        func servetemplate(w http.ResponseWriter, f string, d templatedata) {
       -        t, err := template.ParseFiles(conf.templatedir + "/" + f)
       +        t, err := template.ParseFiles(conf.tmplpath + "/" + f)
                if err != nil {
                        http.Error(w, "Internal error", http.StatusInternalServerError)
                        return
       t@@ -244,21 +244,48 @@ func uploader(w http.ResponseWriter, r *http.Request) {
        }
        
        func main() {
       -        flag.StringVar(&conf.bind,        "bind",        "0.0.0.0:8080", "Address to bind to (default: 0.0.0.0:8080)")
       -        flag.StringVar(&conf.user,        "user",        "", "User to drop privileges to on startup (default: current user)")
       -        flag.StringVar(&conf.group,       "group",       "", "Group to drop privileges to on startup (default: user's group)")
       -        flag.StringVar(&conf.baseuri,     "baseuri",     "http://127.0.0.1:8080", "Base URI to use for links (default: http://127.0.0.1:8080)")
       -        flag.StringVar(&conf.filepath,    "filepath",    "./files", "Path to save files to (default: ./files)")
       -        flag.StringVar(&conf.metapath,    "metapath",    "./meta", "Path to save metadata to (default: ./meta)")
       -        flag.StringVar(&conf.filectx,     "filectx",     "/f/", "Context to serve files from (default: /f/)")
       -        flag.StringVar(&conf.metactx,     "metactx",     "/m/", "Context to serve metadata from (default: /m/)")
       -        flag.StringVar(&conf.rootdir,     "rootdir",     "./static", "Root directory (default: ./static)")
       -        flag.StringVar(&conf.chroot,      "chroot",      "", "Directory to chroot into upon starting (default: no chroot)")
       -        flag.StringVar(&conf.templatedir, "templatedir", "./templates", "Templates directory (default: ./templates)")
       -        flag.Int64Var(&conf.maxsize,      "maxsize",     30064771072, "Maximum file size (default: 28Gib)")
       -        flag.Int64Var(&conf.expiry,       "expiry",      86400, "Link expiration time (default: 24h)")
       -
       -        iniflags.Parse()
       +        var file string
       +        flag.StringVar(&file,  "f", "", "Configuration file")
       +        flag.BoolVar(&verbose, "v", false, "Verbose logging")
       +        flag.Parse()
       +
       +        /* default values */
       +        conf.bind     = "0.0.0.0:8080"
       +        conf.baseuri  = "http://127.0.0.1:8080"
       +        conf.rootdir  = "/htdocs"
       +        conf.tmplpath = "/htdocs/templates"
       +        conf.filepath = "/htdocs/files"
       +        conf.metapath = "/htdocs/meta"
       +        conf.filectx  = "/f/"
       +        conf.metactx  = "/m/"
       +        conf.maxsize  = 34359738368
       +        conf.expiry   = 86400
       +
       +        if file != "" {
       +                if verbose {
       +                        log.Printf("Reading configuration %s", file)
       +                }
       +
       +                cfg, err := ini.Load(file)
       +                if err != nil {
       +                        fmt.Println(err)
       +                        return
       +                }
       +
       +                conf.bind        = cfg.Section("").Key("bind").String()
       +                conf.user        = cfg.Section("").Key("user").String()
       +                conf.group       = cfg.Section("").Key("group").String()
       +                conf.baseuri     = cfg.Section("").Key("baseuri").String()
       +                conf.filepath    = cfg.Section("").Key("filepath").String()
       +                conf.metapath    = cfg.Section("").Key("metapath").String()
       +                conf.filectx     = cfg.Section("").Key("filectx").String()
       +                conf.metactx     = cfg.Section("").Key("metactx").String()
       +                conf.rootdir     = cfg.Section("").Key("rootdir").String()
       +                conf.chroot      = cfg.Section("").Key("chroot").String()
       +                conf.tmplpath    = cfg.Section("").Key("tmplpath").String()
       +                conf.maxsize, _  = cfg.Section("").Key("maxsize").Int64()
       +                conf.expiry, _   = cfg.Section("").Key("expiry").Int64()
       +        }
        
                if verbose {
                        log.Printf("Applied configuration:\n%s", conf)