aboutsummaryrefslogblamecommitdiffstats
path: root/ethutil/config.go
blob: 916b0d1862d641b39e24ad51d724a9e9d83b88cc (plain) (tree)
1
2
3
4
5
6
7
8
9


               
             



                 
                 

 
                


                    





                            
                           

 








                     

                  






























                                                                                                                                                 


                                                              
                                                                      
                          
                                               
 
                                                                                
                                      
                                                               
                                                      




                     

                    
                                              




                                                                       

 






                     




                                               
                    
                            


                    

                                                    
 
                              






                                                                                                                                 
                                               



                                              
                                                    


                                              




                                                        

 




                            
                                              
                                          







                                           
                                                            








                                           
                                             








                                           
                                                           
                                        






                                           











                                            
package ethutil

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

// Config struct
type config struct {
    Db Database

    Log          *Logger
    ExecPath     string
    Debug        bool
    Ver          string
    ClientString string
    Pubkey       []byte
    Identifier   string
}

const defaultConf = `
id = ""
port = 30303
upnp = true
maxpeer = 10
rpc = false
rpcport = 8080
`

var Config *config

func ApplicationFolder(base string) string {
    usr, _ := user.Current()
    p := path.Join(usr.HomeDir, base)

    if len(base) > 0 {
        //Check if the logging directory already exists, create it if not
        _, err := os.Stat(p)
        if err != nil {
            if os.IsNotExist(err) {
                log.Printf("Debug logging directory %s doesn't exist, creating it\n", p)
                os.Mkdir(p, 0777)

            }
        }

        iniFilePath := path.Join(p, "conf.ini")
        _, err = os.Stat(iniFilePath)
        if err != nil && os.IsNotExist(err) {
            file, err := os.Create(iniFilePath)
            if err != nil {
                fmt.Println(err)
            } else {
                assetPath := path.Join(os.Getenv("GOPATH"), "src", "github.com", "ethereum", "go-ethereum", "ethereal", "assets")
                file.Write([]byte(defaultConf + "\nasset_path = " + assetPath))
            }
        }
    }

    return p
}

// Read config
//
// Initialize the global Config variable with default settings
func ReadConfig(base string, logTypes LoggerType, id string) *config {
    if Config == nil {
        path := ApplicationFolder(base)

        Config = &config{ExecPath: path, Debug: true, Ver: "0.5.0 RC11"}
        Config.Identifier = id
        Config.Log = NewLogger(logTypes, LogLevelDebug)
        Config.SetClientString("/Ethereum(G)")
    }

    return Config
}

// Set client string
//
func (c *config) SetClientString(str string) {
    id := runtime.GOOS
    if len(c.Identifier) > 0 {
        id = c.Identifier
    }
    Config.ClientString = fmt.Sprintf("%s nv%s/%s", str, c.Ver, id)
}

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
    }

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

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

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

    os.Exit(1)
}