Add ssm_document spread lane for owned EC2 via SSM Run Command.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
package main
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
@@ -40,27 +40,27 @@ func (w *wsLogWriter) Write(p []byte) (n int, err error) {
|
||||
}
|
||||
|
||||
const aetherBanner = `
|
||||
╔══════════════════════════════════════════════════════════════════╗
|
||||
║ ║
|
||||
║ ✦ · · · · · · ◈ · · · · · · ✦ ║
|
||||
║ · \ | / · ║
|
||||
║ · \ | / · ▲▲▲ ║
|
||||
║ · ○─────●─────○ · ▲▲▲▲▲ ║
|
||||
║ · / | \ · ▲▲▲▲▲ ║
|
||||
║ · / | \ · ████ ║
|
||||
║ ✦ · · · · ◈ · · · · ✦ ██ ████ ██ ║
|
||||
║ ○───────────○ ██ ██ ██ ║
|
||||
║ / \ / \ ║
|
||||
║ / ●───────● \ A E T H E R F O R G E ║
|
||||
║ / / \ / \ \ ───────────────────────── ║
|
||||
║ ○───● ○───○ ●───○ LAN Mining Command Deck ║
|
||||
║ \ \ / \ / / ║
|
||||
║ \ ●───────● / ║
|
||||
║ \ / \ / ║
|
||||
║ ○───────────○ ║
|
||||
║ ✦ · · · · ◈ · · · · ✦ ║
|
||||
║ ║
|
||||
╚══════════════════════════════════════════════════════════════════╝`
|
||||
ΓòöΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòù
|
||||
Γòæ Γòæ
|
||||
║ ✦ · · · · · · ◈ · · · · · · ✦ ║
|
||||
Γòæ ┬╖ \ | / ┬╖ Γòæ
|
||||
Γòæ ┬╖ \ | / ┬╖ Γû▓Γû▓Γû▓ Γòæ
|
||||
Γòæ ┬╖ ΓùïΓöÇΓöÇΓöÇΓöÇΓöÇΓùÅΓöÇΓöÇΓöÇΓöÇΓöÇΓùï ┬╖ Γû▓Γû▓Γû▓Γû▓Γû▓ Γòæ
|
||||
Γòæ ┬╖ / | \ ┬╖ Γû▓Γû▓Γû▓Γû▓Γû▓ Γòæ
|
||||
Γòæ ┬╖ / | \ ┬╖ ΓûêΓûêΓûêΓûê Γòæ
|
||||
║ ✦ · · · · ◈ · · · · ✦ ██ ████ ██ ║
|
||||
Γòæ ΓùïΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓùï ΓûêΓûê ΓûêΓûê ΓûêΓûê Γòæ
|
||||
Γòæ / \ / \ Γòæ
|
||||
Γòæ / ΓùÅΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓùÅ \ A E T H E R F O R G E Γòæ
|
||||
Γòæ / / \ / \ \ ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇ Γòæ
|
||||
Γòæ ΓùïΓöÇΓöÇΓöÇΓùÅ ΓùïΓöÇΓöÇΓöÇΓùï ΓùÅΓöÇΓöÇΓöÇΓùï LAN Mining Command Deck Γòæ
|
||||
Γòæ \ \ / \ / / Γòæ
|
||||
Γòæ \ ΓùÅΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓùÅ / Γòæ
|
||||
Γòæ \ / \ / Γòæ
|
||||
Γòæ ΓùïΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓùï Γòæ
|
||||
║ ✦ · · · · ◈ · · · · ✦ ║
|
||||
Γòæ Γòæ
|
||||
ΓòÜΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓòÉΓò¥`
|
||||
|
||||
func main() {
|
||||
fmt.Println(aetherBanner)
|
||||
@@ -85,12 +85,12 @@ func main() {
|
||||
defer cloudflared.Stop()
|
||||
}
|
||||
} else if tunnelExternal {
|
||||
log.Println("[tunnel] External connector (AF_TUNNEL_EXTERNAL) — skipping in-process cloudflared start")
|
||||
log.Println("[tunnel] External connector (AF_TUNNEL_EXTERNAL) ΓÇö skipping in-process cloudflared start")
|
||||
} else {
|
||||
log.Println("[tunnel] No connector token configured")
|
||||
}
|
||||
|
||||
// Generate fleet secret once — persisted in config.json so all future forges
|
||||
// Generate fleet secret once ΓÇö persisted in config.json so all future forges
|
||||
// carry the same secret and agents keep working across server restarts.
|
||||
if cfg.Server.FleetSecret == "" {
|
||||
b := make([]byte, 32)
|
||||
@@ -99,9 +99,9 @@ func main() {
|
||||
}
|
||||
cfg.Server.FleetSecret = hex.EncodeToString(b)
|
||||
if err := cfg.Save(); err != nil {
|
||||
log.Printf("[auth] Warning: could not persist fleet secret: %v — agents forged this session will still work", err)
|
||||
log.Printf("[auth] Warning: could not persist fleet secret: %v ΓÇö agents forged this session will still work", err)
|
||||
} else {
|
||||
log.Printf("[auth] Fleet secret generated and saved — re-forge agents to pick it up")
|
||||
log.Printf("[auth] Fleet secret generated and saved ΓÇö re-forge agents to pick it up")
|
||||
}
|
||||
} else {
|
||||
log.Printf("[auth] Fleet secret loaded (first 8 chars: %s...)", cfg.Server.FleetSecret[:8])
|
||||
@@ -162,7 +162,7 @@ func main() {
|
||||
builderHandler.SetFleetSecret(cfg.Server.FleetSecret)
|
||||
log.Printf("Builder handler initialized (agent source: %s)", agentSrcDir)
|
||||
|
||||
// Wire fleet secret rotation — now that both wsHub and builderHandler are ready.
|
||||
// Wire fleet secret rotation ΓÇö now that both wsHub and builderHandler are ready.
|
||||
api.SetRotateSecretFn(func() (string, error) {
|
||||
b := make([]byte, 32)
|
||||
if _, err := rand.Read(b); err != nil {
|
||||
@@ -244,7 +244,7 @@ func main() {
|
||||
wsHub.SetEventNotifier(eventNotifier)
|
||||
builderHandler.SetEventNotifier(eventNotifier)
|
||||
|
||||
// Fleet alert evaluator (thresholds from Calibrate → alerts config)
|
||||
// Fleet alert evaluator (thresholds from Calibrate → alerts config)
|
||||
alertEvaluator := alerts.NewEvaluator(database, func() alerts.Thresholds {
|
||||
return alerts.Thresholds{
|
||||
OfflineMinutes: cfg.Alerts.OfflineThresholdMinutes,
|
||||
@@ -496,24 +496,24 @@ func (p *serverConfigProvider) UpdateConfigFromJSON(data json.RawMessage) error
|
||||
return fmt.Errorf("invalid config: %w", err)
|
||||
}
|
||||
|
||||
// Semantic validation — reject values that would break the server at runtime.
|
||||
// Semantic validation ΓÇö reject values that would break the server at runtime.
|
||||
if incoming.Port != 0 && (incoming.Port < 1 || incoming.Port > 65535) {
|
||||
return fmt.Errorf("invalid config: port %d out of range (1–65535)", incoming.Port)
|
||||
return fmt.Errorf("invalid config: port %d out of range (1ΓÇô65535)", incoming.Port)
|
||||
}
|
||||
if incoming.Pool.Port != 0 && (incoming.Pool.Port < 1 || incoming.Pool.Port > 65535) {
|
||||
return fmt.Errorf("invalid config: pool.port %d out of range (1–65535)", incoming.Pool.Port)
|
||||
return fmt.Errorf("invalid config: pool.port %d out of range (1ΓÇô65535)", incoming.Pool.Port)
|
||||
}
|
||||
if incoming.Server.MaxAgents < 0 {
|
||||
return fmt.Errorf("invalid config: server.max_agents must be ≥ 0")
|
||||
return fmt.Errorf("invalid config: server.max_agents must be ≥ 0")
|
||||
}
|
||||
if incoming.Server.StatsRetentionHours < 0 {
|
||||
return fmt.Errorf("invalid config: server.stats_retention_hours must be ≥ 0")
|
||||
return fmt.Errorf("invalid config: server.stats_retention_hours must be ≥ 0")
|
||||
}
|
||||
if incoming.Server.BuildRetentionDays < 0 {
|
||||
return fmt.Errorf("invalid config: server.build_retention_days must be ≥ 0")
|
||||
return fmt.Errorf("invalid config: server.build_retention_days must be ≥ 0")
|
||||
}
|
||||
if incoming.Server.MaxBuildSizeMB < 0 {
|
||||
return fmt.Errorf("invalid config: server.max_build_size_mb must be ≥ 0")
|
||||
return fmt.Errorf("invalid config: server.max_build_size_mb must be ≥ 0")
|
||||
}
|
||||
|
||||
// Determine which top-level keys were explicitly present in the JSON payload.
|
||||
@@ -561,7 +561,7 @@ func (p *serverConfigProvider) UpdateFleetAIConfig(v api.FleetAIConfigView) erro
|
||||
return fmt.Errorf("config unavailable")
|
||||
}
|
||||
if v.AIDecisionIntervalSec < 0 {
|
||||
return fmt.Errorf("ai_decision_interval_sec must be ≥ 0")
|
||||
return fmt.Errorf("ai_decision_interval_sec must be ≥ 0")
|
||||
}
|
||||
payload, err := json.Marshal(map[string]interface{}{
|
||||
"server": map[string]interface{}{
|
||||
@@ -626,7 +626,7 @@ func findAgentSourceDir() string {
|
||||
// <repo>/data even when miner-server.exe is started from server/ or bin/.
|
||||
func validateListenPort(port int) error {
|
||||
if port < 1 || port > 65535 {
|
||||
return fmt.Errorf("port %d out of range (1–65535)", port)
|
||||
return fmt.Errorf("port %d out of range (1ΓÇô65535)", port)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user