| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | package ethutil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	"log" | 
					
						
							|  |  |  | 	"os" | 
					
						
							|  |  |  | 	"os/user" | 
					
						
							|  |  |  | 	"path" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type LogType byte | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	LogTypeStdIn = 1 | 
					
						
							|  |  |  | 	LogTypeFile  = 2 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Config struct isn't exposed | 
					
						
							|  |  |  | type config struct { | 
					
						
							|  |  |  | 	Db Database | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | 	Log      *Logger | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	ExecPath string | 
					
						
							|  |  |  | 	Debug    bool | 
					
						
							|  |  |  | 	Ver      string | 
					
						
							|  |  |  | 	Pubkey   []byte | 
					
						
							|  |  |  | 	Seed     bool | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var Config *config | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Read config doesn't read anything yet. | 
					
						
							|  |  |  | func ReadConfig(base string) *config { | 
					
						
							|  |  |  | 	if Config == nil { | 
					
						
							|  |  |  | 		usr, _ := user.Current() | 
					
						
							|  |  |  | 		path := path.Join(usr.HomeDir, base) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 11:35:17 +01:00
										 |  |  | 		if len(base) > 0 { | 
					
						
							|  |  |  | 			//Check if the logging directory already exists, create it if not | 
					
						
							|  |  |  | 			_, err := os.Stat(path) | 
					
						
							|  |  |  | 			if err != nil { | 
					
						
							|  |  |  | 				if os.IsNotExist(err) { | 
					
						
							| 
									
										
										
										
											2014-02-19 11:40:02 +01:00
										 |  |  | 					log.Printf("Debug logging directory %s doesn't exist, creating it\n", path) | 
					
						
							| 
									
										
										
										
											2014-02-19 11:35:17 +01:00
										 |  |  | 					os.Mkdir(path, 0777) | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | 		Config = &config{ExecPath: path, Debug: true, Ver: "0.3.0"} | 
					
						
							| 
									
										
										
										
											2014-02-19 16:27:22 +01:00
										 |  |  | 		Config.Log = NewLogger(LogFile|LogStd, LogLevelDebug) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return Config | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | type LoggerType byte | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	LogFile = 0x1 | 
					
						
							|  |  |  | 	LogStd  = 0x2 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | type LogSystem interface { | 
					
						
							|  |  |  | 	Println(v ...interface{}) | 
					
						
							|  |  |  | 	Printf(format string, v ...interface{}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | type Logger struct { | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | 	logSys   []LogSystem | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 	logLevel int | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | func NewLogger(flag LoggerType, level int) *Logger { | 
					
						
							|  |  |  | 	var loggers []LogSystem | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 16:27:22 +01:00
										 |  |  | 	flags := log.LstdFlags | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if flag&LogFile > 0 { | 
					
						
							|  |  |  | 		file, err := os.OpenFile(path.Join(Config.ExecPath, "debug.log"), os.O_RDWR|os.O_CREATE|os.O_APPEND, os.ModePerm) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							|  |  |  | 			log.Panic("unable to create file logger", err) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 16:27:22 +01:00
										 |  |  | 		log := log.New(file, "", flags) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		loggers = append(loggers, log) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if flag&LogStd > 0 { | 
					
						
							| 
									
										
										
										
											2014-02-19 16:27:22 +01:00
										 |  |  | 		log := log.New(os.Stdout, "", flags) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 		loggers = append(loggers, log) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | 	return &Logger{logSys: loggers, logLevel: level} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (log *Logger) AddLogSystem(logger LogSystem) { | 
					
						
							|  |  |  | 	log.logSys = append(log.logSys, logger) | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-19 16:27:22 +01:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	LogLevelDebug = iota | 
					
						
							|  |  |  | 	LogLevelInfo | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | func (log *Logger) Debugln(v ...interface{}) { | 
					
						
							| 
									
										
										
										
											2014-02-19 16:27:22 +01:00
										 |  |  | 	if log.logLevel != LogLevelDebug { | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, logger := range log.logSys { | 
					
						
							|  |  |  | 		logger.Println(v...) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | func (log *Logger) Debugf(format string, v ...interface{}) { | 
					
						
							| 
									
										
										
										
											2014-02-19 16:27:22 +01:00
										 |  |  | 	if log.logLevel != LogLevelDebug { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, logger := range log.logSys { | 
					
						
							|  |  |  | 		logger.Printf(format, v...) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | func (log *Logger) Infoln(v ...interface{}) { | 
					
						
							| 
									
										
										
										
											2014-02-19 16:27:22 +01:00
										 |  |  | 	if log.logLevel > LogLevelInfo { | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | 	fmt.Println(len(log.logSys)) | 
					
						
							| 
									
										
										
										
											2014-02-19 16:27:22 +01:00
										 |  |  | 	for _, logger := range log.logSys { | 
					
						
							|  |  |  | 		logger.Println(v...) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-22 01:53:09 +01:00
										 |  |  | func (log *Logger) Infof(format string, v ...interface{}) { | 
					
						
							| 
									
										
										
										
											2014-02-19 16:27:22 +01:00
										 |  |  | 	if log.logLevel > LogLevelInfo { | 
					
						
							| 
									
										
										
										
											2014-02-14 23:56:09 +01:00
										 |  |  | 		return | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for _, logger := range log.logSys { | 
					
						
							|  |  |  | 		logger.Printf(format, v...) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |