fix(config): require explicit mode and workers

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Virgil 2026-04-04 17:26:55 +00:00
parent 69eb908fe8
commit 8225649394
3 changed files with 43 additions and 13 deletions

View file

@ -46,11 +46,16 @@ func (c *Config) Validate() error {
if c == nil {
return errors.New("config is nil")
}
if c.Mode != "" && c.Mode != "nicehash" && c.Mode != "simple" {
if strings.TrimSpace(c.Mode) == "" {
return errors.New("mode is empty")
}
if c.Mode != "nicehash" && c.Mode != "simple" {
return errors.New("mode is invalid")
}
if c.Workers != "" &&
c.Workers != WorkersByRigID &&
if strings.TrimSpace(string(c.Workers)) == "" {
return errors.New("workers mode is empty")
}
if c.Workers != WorkersByRigID &&
c.Workers != WorkersByUser &&
c.Workers != WorkersByPass &&
c.Workers != WorkersByPassword &&
@ -101,12 +106,13 @@ func (w *ConfigWatcher) Start() {
return
}
if info, errorValue := os.Stat(w.path); errorValue == nil {
w.lastModifiedAt = info.ModTime()
}
go func() {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
if info, errorValue := os.Stat(w.path); errorValue == nil {
w.lastModifiedAt = info.ModTime()
}
for {
select {

View file

@ -8,9 +8,10 @@ import (
func TestConfig_Validate_Good(t *testing.T) {
cfg := &Config{
Mode: "nicehash",
Bind: []BindAddr{{Host: "127.0.0.1", Port: 3333}},
Pools: []PoolConfig{{URL: "pool-a:3333", Enabled: true}},
Mode: "nicehash",
Workers: WorkersByRigID,
Bind: []BindAddr{{Host: "127.0.0.1", Port: 3333}},
Pools: []PoolConfig{{URL: "pool-a:3333", Enabled: true}},
}
if errorValue := cfg.Validate(); errorValue != nil {
@ -30,6 +31,17 @@ func TestConfig_Validate_Bad(t *testing.T) {
}
}
func TestConfig_Validate_EmptyMode(t *testing.T) {
cfg := &Config{
Bind: []BindAddr{{Host: "127.0.0.1", Port: 3333}},
Pools: []PoolConfig{{URL: "pool-a:3333", Enabled: true}},
}
if errorValue := cfg.Validate(); errorValue == nil {
t.Fatal("expected empty mode to fail validation")
}
}
func TestConfig_Validate_Ugly(t *testing.T) {
cfg := &Config{
Mode: "simple",
@ -43,6 +55,18 @@ func TestConfig_Validate_Ugly(t *testing.T) {
}
}
func TestConfig_Validate_EmptyWorkers(t *testing.T) {
cfg := &Config{
Mode: "simple",
Bind: []BindAddr{{Host: "127.0.0.1", Port: 3333}},
Pools: []PoolConfig{{URL: "pool-a:3333", Enabled: true}},
}
if errorValue := cfg.Validate(); errorValue == nil {
t.Fatal("expected empty workers mode to fail validation")
}
}
func TestConfig_Validate_EnabledPoolURL(t *testing.T) {
cfg := &Config{
Mode: "simple",
@ -57,7 +81,7 @@ func TestConfig_Validate_EnabledPoolURL(t *testing.T) {
func TestConfigWatcher_Start_Bad(t *testing.T) {
path := t.TempDir() + "/config.json"
errorValue := os.WriteFile(path, []byte(`{"bind":[{"host":"127.0.0.1","port":3333}],"pools":[{"url":"pool-a:3333","enabled":true}]}`), 0o644)
errorValue := os.WriteFile(path, []byte(`{"mode":"nicehash","workers":"rig-id","bind":[{"host":"127.0.0.1","port":3333}],"pools":[{"url":"pool-a:3333","enabled":true}]}`), 0o644)
if errorValue != nil {
t.Fatal(errorValue)
}
@ -69,7 +93,7 @@ func TestConfigWatcher_Start_Bad(t *testing.T) {
watcher.Start()
defer watcher.Stop()
errorValue = os.WriteFile(path, []byte(`{"bind":[{"host":"127.0.0.1","port":3333}],"pools":[{"url":"pool-b:3333","enabled":true}]}`), 0o644)
errorValue = os.WriteFile(path, []byte(`{"mode":"nicehash","workers":"rig-id","bind":[{"host":"127.0.0.1","port":3333}],"pools":[{"url":"pool-b:3333","enabled":true}]}`), 0o644)
if errorValue != nil {
t.Fatal(errorValue)
}

View file

@ -166,7 +166,7 @@ func TestSimpleMapper_JobForID_BadClientID(t *testing.T) {
func TestConfigWatcher_Start_Ugly(t *testing.T) {
path := t.TempDir() + "/config.json"
errorValue := os.WriteFile(path, []byte(`{"bind":[{"host":"127.0.0.1","port":3333}],"pools":[{"url":"pool-a:3333","enabled":true}]}`), 0o644)
errorValue := os.WriteFile(path, []byte(`{"mode":"simple","workers":"rig-id","bind":[{"host":"127.0.0.1","port":3333}],"pools":[{"url":"pool-a:3333","enabled":true}]}`), 0o644)
if errorValue != nil {
t.Fatal(errorValue)
}
@ -184,7 +184,7 @@ func TestConfigWatcher_Start_Ugly(t *testing.T) {
case <-time.After(1200 * time.Millisecond):
}
if errorValue = os.WriteFile(path, []byte(`{"bind":[{"host":"127.0.0.1","port":3333}],"pools":[{"url":"pool-b:3333","enabled":true}]}`), 0o644); errorValue != nil {
if errorValue = os.WriteFile(path, []byte(`{"mode":"simple","workers":"rig-id","bind":[{"host":"127.0.0.1","port":3333}],"pools":[{"url":"pool-b:3333","enabled":true}]}`), 0o644); errorValue != nil {
t.Fatal(errorValue)
}