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.
129 lines
2.9 KiB
129 lines
2.9 KiB
package main |
|
|
|
import ( |
|
"encoding/json" |
|
"log" |
|
"math/rand" |
|
"net/http" |
|
"os" |
|
"path/filepath" |
|
"runtime" |
|
"strings" |
|
"time" |
|
|
|
"./pool" |
|
"./stratum" |
|
|
|
"github.com/goji/httpauth" |
|
"github.com/gorilla/mux" |
|
"github.com/hashicorp/go-version" |
|
"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 checkRedisVersion(info string) bool { |
|
var versionStr string |
|
parts := strings.Split(info, "\r\n") |
|
for _, line := range parts { |
|
if strings.Index(line, ":") != -1 { |
|
valParts := strings.Split(line, ":") |
|
if valParts[0] == "redis_version" { |
|
versionStr = valParts[1] |
|
break |
|
} |
|
} |
|
} |
|
if versionStr == "" { |
|
log.Printf("Could not detect redis version - must be super old or broken") |
|
return false |
|
} |
|
minVersion, _ := version.NewVersion("2.6") |
|
curVersion, err := version.NewVersion(versionStr) |
|
if err != nil { |
|
log.Printf("Could not check redis version: " + err.Error()) |
|
return false |
|
} |
|
if curVersion.LessThan(minVersion) { |
|
log.Printf("You're using redis version %s the minimum required version is 2.6. Follow the damn usage instructions...", versionStr) |
|
return false |
|
} |
|
return true |
|
} |
|
|
|
func main() { |
|
info, err := stratum.RedisClient.Info().Result() |
|
if err != nil { |
|
log.Fatal("Cannot start redis server.") |
|
} |
|
if !checkRedisVersion(info) { |
|
os.Exit(1) |
|
} |
|
rand.Seed(time.Now().UTC().UnixNano()) |
|
readConfig(&cfg) |
|
startNewrelic() |
|
startStratum() |
|
}
|
|
|