From cacdb3aaa583909c0a3297b313cd61a59c8f2bc7 Mon Sep 17 00:00:00 2001 From: Vincent Batts Date: Mon, 5 Aug 2013 23:06:05 -0400 Subject: [PATCH] major cleanup of config handling --- config/config.go | 45 +++++++++----- imgsrv.go | 152 ++++++++++++++++------------------------------- server.go | 28 ++++++--- 3 files changed, 102 insertions(+), 123 deletions(-) diff --git a/config/config.go b/config/config.go index 6971e18..02016a9 100644 --- a/config/config.go +++ b/config/config.go @@ -5,13 +5,23 @@ import ( "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 -func (c *Config) GetBool(option string) (value bool) { - conf := Config{} - conf = *c - switch conf[option] { +func (c Config) GetBool(option string) (value bool) { + switch c.Map[option] { default: value = false 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 -func (c *Config) GetString(option string) (value string) { - conf := Config{} - conf = *c - value, _ = conf[option].(string) +func (c Config) GetString(option string) (value string) { + value, _ = c.Map[option].(string) 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 -func ReadConfigFile(filename string) (config Config, err error) { +func ReadConfigFile(filename string) (*Config, error) { bytes, err := ioutil.ReadFile(filename) if err != nil { - return + return nil, err } - err = goyaml.Unmarshal(bytes, &config) - if err != nil { - return + config := Config{} + if err = goyaml.Unmarshal(bytes, &config); err != nil { + return nil, err } - return config, nil + return &config, nil } /* diff --git a/imgsrv.go b/imgsrv.go index dc6896e..74aa5ed 100644 --- a/imgsrv.go +++ b/imgsrv.go @@ -10,69 +10,68 @@ package main import ( "flag" "fmt" - "github.com/vbatts/imgsrv/client" - "github.com/vbatts/imgsrv/config" - "github.com/vbatts/imgsrv/util" - "labix.org/v2/mgo" "log" "net/url" "os" "path/filepath" + + "github.com/vbatts/imgsrv/client" + "github.com/vbatts/imgsrv/config" + "github.com/vbatts/imgsrv/util" ) var ( ConfigFile = fmt.Sprintf("%s/.imgsrv.yaml", os.Getenv("HOME")) - DefaultRunAsServer = false - RunAsServer = DefaultRunAsServer + DefaultConfig = &config.Config{ + Server: false, + Ip: "0.0.0.0", + Port: "7777", + MongoHost: "localhost", + MongoDB: "filesrv", + MongoUsername: "", + MongoPassword: "", + RemoteHost: "", + } - DefaultServerIP = "0.0.0.0" - ServerIP = DefaultServerIP - DefaultServerPort = "7777" - 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 = "" + PutFile = "" + FetchUrl = "" + FileKeywords = "" ) func main() { flag.Parse() 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) } // loads either default or flag specified config // 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) if err != nil { log.Println(err) return } log.Println(file) - } else if RunAsServer { - log.Printf("%s", ServerIP) - runServer(ServerIP, ServerPort) + } else { - if len(RemoteHost) == 0 { + // we're pushing up a file + + if len(DefaultConfig.RemoteHost) == 0 { log.Println("Please provide a remotehost!") return } @@ -87,7 +86,7 @@ func main() { } else { 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 { log.Println(err) return @@ -98,7 +97,7 @@ func main() { log.Println(err) 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") /* Server-side */ - flag.BoolVar(&RunAsServer, + flag.BoolVar(&DefaultConfig.Server, "server", - RunAsServer, + DefaultConfig.Server, "Run as an image server (defaults to client-side)") - flag.StringVar(&ServerIP, + flag.StringVar(&DefaultConfig.Ip, "ip", - ServerIP, + DefaultConfig.Ip, "IP to bind to (if running as a server)('ip' in the config)") - flag.StringVar(&ServerPort, + flag.StringVar(&DefaultConfig.Port, "port", - ServerPort, + DefaultConfig.Port, "Port to listen on (if running as a server)('port' in the config)") /* MongoDB settings */ - flag.StringVar(&MongoHost, + flag.StringVar(&DefaultConfig.MongoHost, "mongo-host", - MongoHost, + DefaultConfig.MongoHost, "Mongo Host to connect to ('mongohost' in the config)") - flag.StringVar(&MongoDB, + flag.StringVar(&DefaultConfig.MongoDB, "mongo-db", - MongoDB, + DefaultConfig.MongoDB, "Mongo db to connect to ('mongodb' in the config)") - flag.StringVar(&MongoUsername, + flag.StringVar(&DefaultConfig.MongoUsername, "mongo-username", - MongoUsername, + DefaultConfig.MongoUsername, "Mongo username to auth with (if needed) ('mongousername' in the config)") - flag.StringVar(&MongoPassword, + flag.StringVar(&DefaultConfig.MongoPassword, "mongo-password", - MongoPassword, + DefaultConfig.MongoPassword, "Mongo password to auth with (if needed) ('mongopassword' in the config)") /* Client-side */ @@ -152,9 +151,9 @@ func init() { FetchUrl, "Just fetch the file from this url") - flag.StringVar(&RemoteHost, + flag.StringVar(&DefaultConfig.RemoteHost, "remotehost", - RemoteHost, + DefaultConfig.RemoteHost, "Remote host to get/put files on ('remotehost' in the config)") flag.StringVar(&PutFile, "put", @@ -166,50 +165,3 @@ func init() { "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 -} diff --git a/server.go b/server.go index a246e1f..61085f2 100644 --- a/server.go +++ b/server.go @@ -16,15 +16,26 @@ import ( "github.com/vbatts/imgsrv/hash" "github.com/vbatts/imgsrv/types" "github.com/vbatts/imgsrv/util" + "github.com/vbatts/imgsrv/config" "labix.org/v2/mgo" "labix.org/v2/mgo/bson" ) -var defaultPageLimit int = 25 +var ( + defaultPageLimit int = 25 + serverConfig config.Config -/* Run as the image server */ -func runServer(ip, port string) { - var addr = fmt.Sprintf("%s:%s", ip, port) + mongo_session *mgo.Session // FIXME make this not global + images_db *mgo.Database // FIXME make this not global + gfs *mgo.GridFS // FIXME make this not global + +) + +/* +Run as the file/image server +*/ +func runServer(c *config.Config) { + serverConfig = *c initMongo() defer mongo_session.Close() @@ -44,18 +55,19 @@ func runServer(ip, port string) { http.HandleFunc("/ext/", routeExt) http.HandleFunc("/md5/", routeMD5s) + addr := fmt.Sprintf("%s:%s", c.Ip, c.Port) log.Printf("Serving on %s ...", addr) log.Fatal(http.ListenAndServe(addr, nil)) } func initMongo() { - mongo_session, err := mgo.Dial(MongoHost) + mongo_session, err := mgo.Dial(serverConfig.MongoHost) if err != nil { log.Panic(err) } - images_db = mongo_session.DB(MongoDB) - if len(MongoUsername) > 0 && len(MongoPassword) > 0 { - err = images_db.Login(MongoUsername, MongoPassword) + images_db = mongo_session.DB(serverConfig.MongoDB) + if len(serverConfig.MongoUsername) > 0 && len(serverConfig.MongoPassword) > 0 { + err = images_db.Login(serverConfig.MongoUsername, serverConfig.MongoPassword) if err != nil { log.Panic(err) }