package main import ( "encoding/json" "log" "math/rand" "net/http" "os" "path/filepath" "runtime" "time" "./pool" "./stratum" "github.com/goji/httpauth" "github.com/gorilla/mux" "github.com/yvasiyarov/gorelic" ) var cfg pool.Config func startStratum() { if cfg.Threads > 0 { runtime.GOMAXPROCS(cfg.Threads) log.Printf("Running with %v threads", cfg.Threads) } else { n := runtime.NumCPU() runtime.GOMAXPROCS(n) log.Printf("Running with default %v threads", n) } s := stratum.NewStratum(&cfg) if cfg.Frontend.Enabled { go startFrontend(&cfg, s) } s.Listen() } func startFrontend(cfg *pool.Config, s *stratum.StratumServer) { r := mux.NewRouter() r.HandleFunc("/stats", s.StatsIndex) r.PathPrefix("/").Handler(http.FileServer(http.Dir("./www/"))) var err error if len(cfg.Frontend.Password) > 0 { auth := httpauth.SimpleBasicAuth(cfg.Frontend.Login, cfg.Frontend.Password) err = http.ListenAndServe(cfg.Frontend.Listen, auth(r)) } else { err = http.ListenAndServe(cfg.Frontend.Listen, r) } if err != nil { log.Fatal(err) } } func startNewrelic() { // Run NewRelic if cfg.NewrelicEnabled { nr := gorelic.NewAgent() nr.Verbose = cfg.NewrelicVerbose nr.NewrelicLicense = cfg.NewrelicKey nr.NewrelicName = cfg.NewrelicName nr.Run() } } func readConfig(cfg *pool.Config) { configFileName := "config.json" if len(os.Args) > 1 { configFileName = os.Args[1] } configFileName, _ = filepath.Abs(configFileName) log.Printf("Loading config: %v", configFileName) configFile, err := os.Open(configFileName) if err != nil { log.Fatal("File error: ", err.Error()) } defer configFile.Close() jsonParser := json.NewDecoder(configFile) if err = jsonParser.Decode(&cfg); err != nil { log.Fatal("Config error: ", err.Error()) } } func main() { rand.Seed(time.Now().UTC().UnixNano()) readConfig(&cfg) startNewrelic() startStratum() }