Whoops...
Adding files
This commit is contained in:
		
							
								
								
									
										132
									
								
								config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								config.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | |||||||
|  | // Package userConfig eases the use of config files in a user's home directory | ||||||
|  | package userConfig | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bufio" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
|  | 	"launchpad.net/go-xdg" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Config is a stuct for managing the config | ||||||
|  | type Config struct { | ||||||
|  | 	name          string | ||||||
|  | 	generalConfig *ConfigFile | ||||||
|  | 	// ConfigFiles are files that have key/value pairs | ||||||
|  | 	ConfigFiles []ConfigFile | ||||||
|  | 	// RawFiles are other files (dbs, etc.) | ||||||
|  | 	RawFiles map[string]string | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewConfig generates a Config struct | ||||||
|  | func NewConfig(name string) (*Config, error) { | ||||||
|  | 	c := &Config{name: name} | ||||||
|  | 	if err := c.Load(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return c, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Set at the config level sets a value in the <c.name>.conf file | ||||||
|  | func (c *Config) Set(k, v string) error { | ||||||
|  | 	return c.generalConfig.Set(k, v) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get at the config level retrieves a value from the <c.name>.conf file | ||||||
|  | func (c *Config) Get(k string) string { | ||||||
|  | 	return c.generalConfig.Get(k) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Load loads config files into the config | ||||||
|  | func (c *Config) Load() error { | ||||||
|  | 	var err error | ||||||
|  | 	// Clear the data, we're reloading | ||||||
|  | 	c.ConfigFiles = c.ConfigFiles[:0] | ||||||
|  | 	c.RawFiles = make(map[string]string) | ||||||
|  | 	var conf generalConfig | ||||||
|  | 	c.data = conf | ||||||
|  |  | ||||||
|  | 	if strings.TrimSpace(c.name) == "" { | ||||||
|  | 		return errors.New("Invalid Config Name: " + c.name) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var cfgPath string | ||||||
|  | 	cfgPath = xdg.Config.Dirs()[0] | ||||||
|  | 	if cfgPath != "" { | ||||||
|  | 		cfgPath = cfgPath + "/" + c.name | ||||||
|  | 		if err = c.verifyOrCreateDirectory(cfgPath); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		// We always have a <name>.conf file | ||||||
|  | 		cfgPath = cfgPath + "/" + c.name + ".conf" | ||||||
|  | 	} | ||||||
|  | 	// Load general config | ||||||
|  | 	if c.generalConfig, err = NewConfigFile(c.name, cfgPath, c.data); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Save writes the config to file(s) | ||||||
|  | func (c *Config) Save() error { | ||||||
|  | 	var err error | ||||||
|  | 	c.generalConfig.Save() | ||||||
|  |  | ||||||
|  | 	var cfgPath string | ||||||
|  | 	var configLines []string | ||||||
|  | 	//configLines = append(configLines, "server="+client.ServerAddr) | ||||||
|  | 	//configLines = append(configLines, "key="+client.ServerKey) | ||||||
|  | 	cfgPath = os.Getenv("HOME") | ||||||
|  | 	if cfgPath != "" { | ||||||
|  | 		cfgPath = cfgPath + "/.config" | ||||||
|  | 		if err := c.verifyOrCreateDirectory(cfgPath); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		cfgPath = cfgPath + "/" + c.name | ||||||
|  | 	} | ||||||
|  | 	if cfgPath != "" { | ||||||
|  | 		file, err := os.Create(cfgPath) | ||||||
|  | 		if err != nil { | ||||||
|  | 			// Couldn't load config even though one was specified | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		defer file.Close() | ||||||
|  |  | ||||||
|  | 		w := bufio.NewWriter(file) | ||||||
|  | 		for _, line := range configLines { | ||||||
|  | 			fmt.Fprintln(w, line) | ||||||
|  | 		} | ||||||
|  | 		if err = w.Flush(); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // verifyOrCreateDirectory is a helper function for building an | ||||||
|  | // individual directory | ||||||
|  | func (c *Config) verifyOrCreateDirectory(path string) error { | ||||||
|  | 	var tstDir *os.File | ||||||
|  | 	var tstDirInfo os.FileInfo | ||||||
|  | 	var err error | ||||||
|  | 	if tstDir, err = os.Open(path); err != nil { | ||||||
|  | 		if err = os.Mkdir(path, 0755); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		if tstDir, err = os.Open(path); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if tstDirInfo, err = tstDir.Stat(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if !tstDirInfo.IsDir() { | ||||||
|  | 		return errors.New(path + " exists and is not a directory") | ||||||
|  | 	} | ||||||
|  | 	// We were able to open the path and it was a directory | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										112
									
								
								config_file.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								config_file.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | |||||||
|  | // Package userConfig eases the use of config files in a user's home directory | ||||||
|  | package userConfig | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bufio" | ||||||
|  | 	"bytes" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"os" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
|  | 	"github.com/BurntSushi/toml" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type generalConfig struct { | ||||||
|  | 	ConfigFiles []string          `toml:"additional_config"` | ||||||
|  | 	RawFiles    []string          `toml:"raw_files"` | ||||||
|  | 	Values      map[string]string `toml:"general"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ConfigFile is a file that has key/value pairs in the config | ||||||
|  | type ConfigFile struct { | ||||||
|  | 	Name string | ||||||
|  | 	Path string | ||||||
|  | 	data interface{} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // NewConfigFile generates a Config struct | ||||||
|  | func NewConfigFile(name, path string, dt interface{}) (*ConfigFile, error) { | ||||||
|  | 	cf := &ConfigFile{Name: name, Path: path, data: dt} | ||||||
|  | 	if err := cf.Load(); err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return cf, nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Set sets a key/value pair in cf, if unable to save, revert to old value | ||||||
|  | // (and return the error) | ||||||
|  | func (cf *ConfigFile) Set(k, v string) error { | ||||||
|  | 	oldVal := cf.values[k] | ||||||
|  | 	cf.values[k] = v | ||||||
|  | 	if err := cf.Save(); err != nil { | ||||||
|  | 		cf.values[k] = oldVal | ||||||
|  | 	} | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Get gets a key/value pair from cf | ||||||
|  | func (cf *ConfigFile) Get(k string) string { | ||||||
|  | 	return cf.values[k] | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Load loads config files into the config | ||||||
|  | func (cf *ConfigFile) Load() error { | ||||||
|  | 	if strings.TrimSpace(cf.Name) == "" && strings.TrimSpace(cf.Path) { | ||||||
|  | 		return errors.New("Invalid ConfigFile Name: " + cf.Path + "/" + cf.Name) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Config files end with .conf | ||||||
|  | 	cfgPath := cf.Path + "/" + cf.Name + ".conf" | ||||||
|  | 	tomlData, err := ioutil.ReadFile(cfgPath) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if _, err := toml.Decode(tomlData, &cf.data); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Save writes the config to file(s) | ||||||
|  | func (cf *ConfigFile) Save() error { | ||||||
|  | 	if strings.TrimSpace(cf.Name) == "" && strings.TrimSpace(cf.Path) { | ||||||
|  | 		return errors.New("Invalid ConfigFile Name: " + cf.Path + "/" + cf.Name + ".conf") | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	filePath := cf.path + "/" + cf.Name + ".conf" | ||||||
|  | 	var err error | ||||||
|  | 	buf := new(bytes.Buffer) | ||||||
|  | 	enc := toml.NewEncoder(buf).Encode(data) | ||||||
|  | 	err = ioutil.WriteFile(filePath, buf, 0644) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	cfgPath = os.Getenv("HOME") | ||||||
|  | 	if cfgPath != "" { | ||||||
|  | 		cfgPath = cfgPath + "/.config" | ||||||
|  | 		if err := c.verifyOrCreateDirectory(cfgPath); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		cfgPath = cfgPath + "/" + c.name | ||||||
|  | 	} | ||||||
|  | 	if cfgPath != "" { | ||||||
|  | 		file, err := os.Create(cfgPath) | ||||||
|  | 		if err != nil { | ||||||
|  | 			// Couldn't load config even though one was specified | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		defer file.Close() | ||||||
|  |  | ||||||
|  | 		w := bufio.NewWriter(file) | ||||||
|  | 		for _, line := range configLines { | ||||||
|  | 			fmt.Fprintln(w, line) | ||||||
|  | 		} | ||||||
|  | 		if err = w.Flush(); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user