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