You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
1.9 KiB
91 lines
1.9 KiB
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() |
|
}
|
|
|