major cleanup of config handling

This commit is contained in:
Vincent Batts 2013-08-05 23:06:05 -04:00
parent 25f42cf2be
commit cacdb3aaa5
3 changed files with 102 additions and 123 deletions

View File

@ -5,13 +5,23 @@ import (
"launchpad.net/goyaml" "launchpad.net/goyaml"
) )
type Config map[string]interface{} type Config struct {
Server bool // Run as server, if different than false (server)
Ip string // Bind address, if different than 0.0.0.0 (server)
Port string // listen port, if different than '7777' (server)
MongoHost string // mongoDB host, if different than 'localhost' (server)
MongoDB string // mongoDB db name, if different than 'filesrv' (server)
MongoUsername string // mongoDB username, if any (server)
MongoPassword string // mongoDB password, if any (server)
RemoteHost string // imgsrv server to push files to (client)
Map map[string]interface{} // key/value options (not used currently)
}
// Of the configurations, provided option, return the value as a bool // Of the configurations, provided option, return the value as a bool
func (c *Config) GetBool(option string) (value bool) { func (c Config) GetBool(option string) (value bool) {
conf := Config{} switch c.Map[option] {
conf = *c
switch conf[option] {
default: default:
value = false value = false
case "yes", "on", "true": case "yes", "on", "true":
@ -21,26 +31,31 @@ func (c *Config) GetBool(option string) (value bool) {
} }
// Of the configurations, provided option, return the value as a string // Of the configurations, provided option, return the value as a string
func (c *Config) GetString(option string) (value string) { func (c Config) GetString(option string) (value string) {
conf := Config{} value, _ = c.Map[option].(string)
conf = *c
value, _ = conf[option].(string)
return return
} }
func (c *Config) Merge(other *Config) error {
if other == nil {
return nil
}
return nil
}
// Given a filename to a YAML file, unmarshal it, and return a Config // Given a filename to a YAML file, unmarshal it, and return a Config
func ReadConfigFile(filename string) (config Config, err error) { func ReadConfigFile(filename string) (*Config, error) {
bytes, err := ioutil.ReadFile(filename) bytes, err := ioutil.ReadFile(filename)
if err != nil { if err != nil {
return return nil, err
} }
err = goyaml.Unmarshal(bytes, &config) config := Config{}
if err != nil { if err = goyaml.Unmarshal(bytes, &config); err != nil {
return return nil, err
} }
return config, nil return &config, nil
} }
/* /*

152
imgsrv.go
View File

@ -10,69 +10,68 @@ package main
import ( import (
"flag" "flag"
"fmt" "fmt"
"github.com/vbatts/imgsrv/client"
"github.com/vbatts/imgsrv/config"
"github.com/vbatts/imgsrv/util"
"labix.org/v2/mgo"
"log" "log"
"net/url" "net/url"
"os" "os"
"path/filepath" "path/filepath"
"github.com/vbatts/imgsrv/client"
"github.com/vbatts/imgsrv/config"
"github.com/vbatts/imgsrv/util"
) )
var ( var (
ConfigFile = fmt.Sprintf("%s/.imgsrv.yaml", os.Getenv("HOME")) ConfigFile = fmt.Sprintf("%s/.imgsrv.yaml", os.Getenv("HOME"))
DefaultRunAsServer = false DefaultConfig = &config.Config{
RunAsServer = DefaultRunAsServer Server: false,
Ip: "0.0.0.0",
Port: "7777",
MongoHost: "localhost",
MongoDB: "filesrv",
MongoUsername: "",
MongoPassword: "",
RemoteHost: "",
}
DefaultServerIP = "0.0.0.0" PutFile = ""
ServerIP = DefaultServerIP FetchUrl = ""
DefaultServerPort = "7777" FileKeywords = ""
ServerPort = DefaultServerPort
DefaultMongoHost = "localhost"
MongoHost = DefaultMongoHost
DefaultMongoDB = "filesrv"
MongoDB = DefaultMongoDB
DefaultMongoUsername = ""
MongoUsername = DefaultMongoUsername
DefaultMongoPassword = ""
MongoPassword = DefaultMongoPassword
mongo_session *mgo.Session
images_db *mgo.Database
gfs *mgo.GridFS
DefaultRemoteHost = ""
RemoteHost = DefaultRemoteHost
PutFile = ""
FetchUrl = ""
FileKeywords = ""
) )
func main() { func main() {
flag.Parse() flag.Parse()
for _, arg := range flag.Args() { for _, arg := range flag.Args() {
// What to do with these floating args ... // TODO What to do with these floating args ...
// Assume they're files and upload them?
log.Printf("%s", arg) log.Printf("%s", arg)
} }
// loads either default or flag specified config // loads either default or flag specified config
// to override variables // to override variables
loadConfiguration(ConfigFile) if c, err := config.ReadConfigFile(ConfigFile); err == nil {
DefaultConfig.Merge(c)
}
if DefaultConfig.Server {
// Run the server!
runServer(DefaultConfig)
} else if len(FetchUrl) > 0 {
// not sure that this ought to be exposed in the client tool
if len(FetchUrl) > 0 {
file, err := util.FetchFileFromURL(FetchUrl) file, err := util.FetchFileFromURL(FetchUrl)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return
} }
log.Println(file) log.Println(file)
} else if RunAsServer {
log.Printf("%s", ServerIP)
runServer(ServerIP, ServerPort)
} else { } else {
if len(RemoteHost) == 0 { // we're pushing up a file
if len(DefaultConfig.RemoteHost) == 0 {
log.Println("Please provide a remotehost!") log.Println("Please provide a remotehost!")
return return
} }
@ -87,7 +86,7 @@ func main() {
} else { } else {
log.Println("WARN: you didn't provide any keywords :-(") log.Println("WARN: you didn't provide any keywords :-(")
} }
url, err := url.Parse(RemoteHost + "/v/" + queryParams) url, err := url.Parse(DefaultConfig.RemoteHost + "/v/" + queryParams)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return
@ -98,7 +97,7 @@ func main() {
log.Println(err) log.Println(err)
return return
} }
log.Printf("New Image!: %s%s\n", RemoteHost, url_path) log.Printf("New Image!: %s%s\n", DefaultConfig.RemoteHost, url_path)
} }
} }
@ -115,35 +114,35 @@ func init() {
"Provide alternate configuration file") "Provide alternate configuration file")
/* Server-side */ /* Server-side */
flag.BoolVar(&RunAsServer, flag.BoolVar(&DefaultConfig.Server,
"server", "server",
RunAsServer, DefaultConfig.Server,
"Run as an image server (defaults to client-side)") "Run as an image server (defaults to client-side)")
flag.StringVar(&ServerIP, flag.StringVar(&DefaultConfig.Ip,
"ip", "ip",
ServerIP, DefaultConfig.Ip,
"IP to bind to (if running as a server)('ip' in the config)") "IP to bind to (if running as a server)('ip' in the config)")
flag.StringVar(&ServerPort, flag.StringVar(&DefaultConfig.Port,
"port", "port",
ServerPort, DefaultConfig.Port,
"Port to listen on (if running as a server)('port' in the config)") "Port to listen on (if running as a server)('port' in the config)")
/* MongoDB settings */ /* MongoDB settings */
flag.StringVar(&MongoHost, flag.StringVar(&DefaultConfig.MongoHost,
"mongo-host", "mongo-host",
MongoHost, DefaultConfig.MongoHost,
"Mongo Host to connect to ('mongohost' in the config)") "Mongo Host to connect to ('mongohost' in the config)")
flag.StringVar(&MongoDB, flag.StringVar(&DefaultConfig.MongoDB,
"mongo-db", "mongo-db",
MongoDB, DefaultConfig.MongoDB,
"Mongo db to connect to ('mongodb' in the config)") "Mongo db to connect to ('mongodb' in the config)")
flag.StringVar(&MongoUsername, flag.StringVar(&DefaultConfig.MongoUsername,
"mongo-username", "mongo-username",
MongoUsername, DefaultConfig.MongoUsername,
"Mongo username to auth with (if needed) ('mongousername' in the config)") "Mongo username to auth with (if needed) ('mongousername' in the config)")
flag.StringVar(&MongoPassword, flag.StringVar(&DefaultConfig.MongoPassword,
"mongo-password", "mongo-password",
MongoPassword, DefaultConfig.MongoPassword,
"Mongo password to auth with (if needed) ('mongopassword' in the config)") "Mongo password to auth with (if needed) ('mongopassword' in the config)")
/* Client-side */ /* Client-side */
@ -152,9 +151,9 @@ func init() {
FetchUrl, FetchUrl,
"Just fetch the file from this url") "Just fetch the file from this url")
flag.StringVar(&RemoteHost, flag.StringVar(&DefaultConfig.RemoteHost,
"remotehost", "remotehost",
RemoteHost, DefaultConfig.RemoteHost,
"Remote host to get/put files on ('remotehost' in the config)") "Remote host to get/put files on ('remotehost' in the config)")
flag.StringVar(&PutFile, flag.StringVar(&PutFile,
"put", "put",
@ -166,50 +165,3 @@ func init() {
"Keywords to associate with file. (comma delimited) (needs -put)") "Keywords to associate with file. (comma delimited) (needs -put)")
} }
func loadConfiguration(filename string) (c config.Config) {
//log.Printf("Attempting to load config file: %s", filename)
c, err := config.ReadConfigFile(filename)
if err != nil {
//log.Println(err)
return config.Config{}
}
cRunAsServer := c.GetBool("server")
cServerIp := c.GetString("ip")
cServerPort := c.GetString("port")
cMongoHost := c.GetString("mongohost")
cMongoDB := c.GetString("mongodb")
cMongoUsername := c.GetString("mongousername")
cMongoPassword := c.GetString("mongopassword")
cRemoteHost := c.GetString("remotehost")
// Only set variables from config file,
// if they weren't passed as flags
if DefaultRunAsServer == RunAsServer && cRunAsServer {
RunAsServer = cRunAsServer
}
if DefaultServerIP == ServerIP && len(cServerIp) > 0 {
ServerIP = cServerIp
}
if DefaultServerPort == ServerPort && len(cServerPort) > 0 {
ServerPort = cServerPort
}
if DefaultMongoHost == MongoHost && len(cMongoHost) > 0 {
MongoHost = cMongoHost
}
if DefaultMongoDB == MongoDB && len(cMongoDB) > 0 {
MongoDB = cMongoDB
}
if DefaultMongoUsername == MongoUsername && len(cMongoUsername) > 0 {
MongoUsername = cMongoUsername
}
if DefaultMongoPassword == MongoPassword && len(cMongoPassword) > 0 {
MongoPassword = cMongoPassword
}
if DefaultRemoteHost == RemoteHost && len(cRemoteHost) > 0 {
RemoteHost = cRemoteHost
}
return c
}

View File

@ -16,15 +16,26 @@ import (
"github.com/vbatts/imgsrv/hash" "github.com/vbatts/imgsrv/hash"
"github.com/vbatts/imgsrv/types" "github.com/vbatts/imgsrv/types"
"github.com/vbatts/imgsrv/util" "github.com/vbatts/imgsrv/util"
"github.com/vbatts/imgsrv/config"
"labix.org/v2/mgo" "labix.org/v2/mgo"
"labix.org/v2/mgo/bson" "labix.org/v2/mgo/bson"
) )
var defaultPageLimit int = 25 var (
defaultPageLimit int = 25
serverConfig config.Config
/* Run as the image server */ mongo_session *mgo.Session // FIXME make this not global
func runServer(ip, port string) { images_db *mgo.Database // FIXME make this not global
var addr = fmt.Sprintf("%s:%s", ip, port) gfs *mgo.GridFS // FIXME make this not global
)
/*
Run as the file/image server
*/
func runServer(c *config.Config) {
serverConfig = *c
initMongo() initMongo()
defer mongo_session.Close() defer mongo_session.Close()
@ -44,18 +55,19 @@ func runServer(ip, port string) {
http.HandleFunc("/ext/", routeExt) http.HandleFunc("/ext/", routeExt)
http.HandleFunc("/md5/", routeMD5s) http.HandleFunc("/md5/", routeMD5s)
addr := fmt.Sprintf("%s:%s", c.Ip, c.Port)
log.Printf("Serving on %s ...", addr) log.Printf("Serving on %s ...", addr)
log.Fatal(http.ListenAndServe(addr, nil)) log.Fatal(http.ListenAndServe(addr, nil))
} }
func initMongo() { func initMongo() {
mongo_session, err := mgo.Dial(MongoHost) mongo_session, err := mgo.Dial(serverConfig.MongoHost)
if err != nil { if err != nil {
log.Panic(err) log.Panic(err)
} }
images_db = mongo_session.DB(MongoDB) images_db = mongo_session.DB(serverConfig.MongoDB)
if len(MongoUsername) > 0 && len(MongoPassword) > 0 { if len(serverConfig.MongoUsername) > 0 && len(serverConfig.MongoPassword) > 0 {
err = images_db.Login(MongoUsername, MongoPassword) err = images_db.Login(serverConfig.MongoUsername, serverConfig.MongoPassword)
if err != nil { if err != nil {
log.Panic(err) log.Panic(err)
} }