| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | package ethutil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-05-30 19:51:19 +02:00
										 |  |  | 	"flag" | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2014-06-23 12:55:38 +01:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2014-07-26 11:24:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/rakyll/globalconf" | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // Config struct | 
					
						
							| 
									
										
										
										
											2014-07-03 17:30:51 +01:00
										 |  |  | type ConfigManager struct { | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	Db Database | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 17:30:51 +01:00
										 |  |  | 	ExecPath string | 
					
						
							|  |  |  | 	Debug    bool | 
					
						
							| 
									
										
										
										
											2014-07-11 16:04:09 +02:00
										 |  |  | 	Diff     bool | 
					
						
							| 
									
										
										
										
											2014-07-14 00:37:50 +02:00
										 |  |  | 	DiffType string | 
					
						
							| 
									
										
										
										
											2014-07-03 17:30:51 +01:00
										 |  |  | 	Paranoia bool | 
					
						
							| 
									
										
										
										
											2014-10-14 11:48:52 +02:00
										 |  |  | 	VmType   int | 
					
						
							| 
									
										
										
										
											2014-05-30 19:51:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	conf *globalconf.GlobalConf | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 17:30:51 +01:00
										 |  |  | var Config *ConfigManager | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 17:15:44 +02:00
										 |  |  | // Read config | 
					
						
							|  |  |  | // | 
					
						
							| 
									
										
										
										
											2014-06-23 12:55:38 +01:00
										 |  |  | // Initialize Config from Config File | 
					
						
							| 
									
										
										
										
											2014-07-03 17:30:51 +01:00
										 |  |  | func ReadConfig(ConfigFile string, Datadir string, EnvPrefix string) *ConfigManager { | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	if Config == nil { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:45:57 +01:00
										 |  |  | 		// create ConfigFile if does not exist, otherwise globalconf panic when trying to persist flags | 
					
						
							| 
									
										
										
										
											2014-07-26 11:24:44 +02:00
										 |  |  | 		if !FileExist(ConfigFile) { | 
					
						
							| 
									
										
										
										
											2014-06-23 12:55:38 +01:00
										 |  |  | 			fmt.Printf("config file '%s' doesn't exist, creating it\n", ConfigFile) | 
					
						
							| 
									
										
										
										
											2014-06-26 18:45:57 +01:00
										 |  |  | 			os.Create(ConfigFile) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		g, err := globalconf.NewWithOptions(&globalconf.Options{ | 
					
						
							|  |  |  | 			Filename:  ConfigFile, | 
					
						
							|  |  |  | 			EnvPrefix: EnvPrefix, | 
					
						
							| 
									
										
										
										
											2014-06-23 12:55:38 +01:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2014-06-26 18:45:57 +01:00
										 |  |  | 			fmt.Println(err) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			g.ParseAll() | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-07-03 17:30:51 +01:00
										 |  |  | 		Config = &ConfigManager{ExecPath: Datadir, Debug: true, conf: g, Paranoia: true} | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return Config | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-23 12:55:38 +01:00
										 |  |  | // provides persistence for flags | 
					
						
							| 
									
										
										
										
											2014-07-03 17:30:51 +01:00
										 |  |  | func (c *ConfigManager) Save(key string, value interface{}) { | 
					
						
							|  |  |  | 	f := &flag.Flag{Name: key, Value: newConfValue(value)} | 
					
						
							| 
									
										
										
										
											2014-05-30 19:51:19 +02:00
										 |  |  | 	c.conf.Set("", f) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 17:30:51 +01:00
										 |  |  | func (c *ConfigManager) Delete(key string) { | 
					
						
							|  |  |  | 	c.conf.Delete("", key) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // private type implementing flag.Value | 
					
						
							| 
									
										
										
										
											2014-05-30 19:51:19 +02:00
										 |  |  | type confValue struct { | 
					
						
							|  |  |  | 	value string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 17:30:51 +01:00
										 |  |  | // generic constructor to allow persising non-string values directly | 
					
						
							|  |  |  | func newConfValue(value interface{}) *confValue { | 
					
						
							|  |  |  | 	return &confValue{fmt.Sprintf("%v", value)} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-30 19:51:19 +02:00
										 |  |  | func (self confValue) String() string     { return self.value } | 
					
						
							|  |  |  | func (self confValue) Set(s string) error { self.value = s; return nil } |