Complete private Monero miner control stack.

Implement Windows agent with RandomX mining and WebSocket fleet reporting, wire dashboard settings into the builder with saved exe paths, and add project README.
This commit is contained in:
drjones
2026-05-26 22:51:47 -07:00
commit 6c42f2b600
48 changed files with 10001 additions and 0 deletions

View File

@@ -0,0 +1,62 @@
package api
import (
"encoding/json"
"net/http"
"crypto-miner-server/internal/db"
)
// ConfigHandler handles GET/PUT for server configuration settings
type ConfigHandler struct {
db *db.Database
config ConfigProvider
}
// ConfigProvider is an interface for the server config so we don't import main package
type ConfigProvider interface {
GetConfigJSON() json.RawMessage
UpdateConfigFromJSON(data json.RawMessage) error
}
func NewConfigHandler(database *db.Database, cp ConfigProvider) *ConfigHandler {
return &ConfigHandler{
db: database,
config: cp,
}
}
func (h *ConfigHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
h.getConfig(w, r)
case http.MethodPut:
h.updateConfig(w, r)
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
}
// GET /api/v1/config
func (h *ConfigHandler) getConfig(w http.ResponseWriter, r *http.Request) {
configJSON := h.config.GetConfigJSON()
w.Header().Set("Content-Type", "application/json")
w.Write(configJSON)
}
// PUT /api/v1/config
func (h *ConfigHandler) updateConfig(w http.ResponseWriter, r *http.Request) {
var body json.RawMessage
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
http.Error(w, `{"error":"Invalid JSON"}`, http.StatusBadRequest)
return
}
if err := h.config.UpdateConfigFromJSON(body); err != nil {
http.Error(w, `{"error":"`+err.Error()+`"}`, http.StatusInternalServerError)
return
}
// Return updated config
h.getConfig(w, r)
}