aboutsummaryrefslogblamecommitdiffstats
path: root/ethutil/config.go
blob: 5fdc8e1c562aca3bacd12e024ccc398b8fcf0bb6 (plain) (tree)
1
2
3
4


               
             
















                              
                        














                                                    




                                                                                         
                                                                                                                   

                                                            


                         
                                                                           
                                                                     











                     




                                               
                    
                            


                    

                                                    
 
                              






                                                                                                                                 
                                               



                                              
                                                    


                                              




                                                        

 




                            
                                              
                                          







                                           
                                                            








                                           
                                             



                                        
                                    




                                           
                                                           
                                        






                                           
package ethutil

import (
    "fmt"
    "log"
    "os"
    "os/user"
    "path"
)

type LogType byte

const (
    LogTypeStdIn = 1
    LogTypeFile  = 2
)

// Config struct isn't exposed
type config struct {
    Db Database

    Log      *Logger
    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)

        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) {
                    log.Printf("Debug logging directory %s doesn't exist, creating it\n", path)
                    os.Mkdir(path, 0777)
                }
            }
        }

        Config = &config{ExecPath: path, Debug: true, Ver: "0.3.1"}
        Config.Log = NewLogger(LogFile|LogStd, LogLevelDebug)
    }

    return Config
}

type LoggerType byte

const (
    LogFile = 0x1
    LogStd  = 0x2
)

type LogSystem interface {
    Println(v ...interface{})
    Printf(format string, v ...interface{})
}

type Logger struct {
    logSys   []LogSystem
    logLevel int
}

func NewLogger(flag LoggerType, level int) *Logger {
    var loggers []LogSystem

    flags := log.LstdFlags

    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)
        }

        log := log.New(file, "", flags)

        loggers = append(loggers, log)
    }
    if flag&LogStd > 0 {
        log := log.New(os.Stdout, "", flags)
        loggers = append(loggers, log)
    }

    return &Logger{logSys: loggers, logLevel: level}
}

func (log *Logger) AddLogSystem(logger LogSystem) {
    log.logSys = append(log.logSys, logger)
}

const (
    LogLevelDebug = iota
    LogLevelInfo
)

func (log *Logger) Debugln(v ...interface{}) {
    if log.logLevel != LogLevelDebug {
        return
    }

    for _, logger := range log.logSys {
        logger.Println(v...)
    }
}

func (log *Logger) Debugf(format string, v ...interface{}) {
    if log.logLevel != LogLevelDebug {
        return
    }

    for _, logger := range log.logSys {
        logger.Printf(format, v...)
    }
}

func (log *Logger) Infoln(v ...interface{}) {
    if log.logLevel > LogLevelInfo {
        return
    }

    fmt.Println(len(log.logSys))
    for _, logger := range log.logSys {
        logger.Println(v...)
    }
}

func (log *Logger) Infof(format string, v ...interface{}) {
    if log.logLevel > LogLevelInfo {
        return
    }

    for _, logger := range log.logSys {
        logger.Printf(format, v...)
    }
}