diff --git a/src/Agent/AutopilotMonitor.Agent/Program.Configuration.cs b/src/Agent/AutopilotMonitor.Agent/Program.Configuration.cs index b8e4983e..bd41f3b2 100644 --- a/src/Agent/AutopilotMonitor.Agent/Program.Configuration.cs +++ b/src/Agent/AutopilotMonitor.Agent/Program.Configuration.cs @@ -171,6 +171,24 @@ namespace AutopilotMonitor.Agent catch { /* ignore corrupt file */ } } + // Await-enrollment config: if no --await-enrollment CLI arg, check for persisted config file. + // RunInstallMode persists await-enrollment.json so the Scheduled Task picks it up on restart. + var awaitConfigPath = Path.Combine(dataDirectory, "await-enrollment.json"); + if (!awaitEnrollment && File.Exists(awaitConfigPath)) + { + try + { + var json = File.ReadAllText(awaitConfigPath); + var awaitConfig = Newtonsoft.Json.JsonConvert.DeserializeObject(json); + if (awaitConfig != null) + { + awaitEnrollment = true; + awaitEnrollmentTimeoutMinutes = awaitConfig.TimeoutMinutes; + } + } + catch { /* ignore corrupt file */ } + } + var useBootstrapToken = !string.IsNullOrEmpty(bootstrapToken); return new AgentConfiguration diff --git a/src/Agent/AutopilotMonitor.Agent/Program.InstallMode.cs b/src/Agent/AutopilotMonitor.Agent/Program.InstallMode.cs index e261dbd7..51112568 100644 --- a/src/Agent/AutopilotMonitor.Agent/Program.InstallMode.cs +++ b/src/Agent/AutopilotMonitor.Agent/Program.InstallMode.cs @@ -58,6 +58,22 @@ namespace AutopilotMonitor.Agent logger.Info("Bootstrap config persisted for Scheduled Task"); } + // Persist await-enrollment config if --await-enrollment was provided. + // The Scheduled Task command line has no args, so the agent reads this file on restart. + if (args.Contains("--await-enrollment")) + { + var dataDir = Environment.ExpandEnvironmentVariables(Constants.AgentDataDirectory); + var awaitConfigPath = Path.Combine(dataDir, "await-enrollment.json"); + var awaitTimeoutArg = GetArgValue(args, "--await-enrollment-timeout"); + var timeoutMinutes = 480; + if (!string.IsNullOrEmpty(awaitTimeoutArg) && int.TryParse(awaitTimeoutArg, out var parsed)) + timeoutMinutes = parsed; + + var awaitConfig = new AwaitEnrollmentConfigFile { TimeoutMinutes = timeoutMinutes }; + File.WriteAllText(awaitConfigPath, Newtonsoft.Json.JsonConvert.SerializeObject(awaitConfig)); + logger.Info($"Await-enrollment config persisted for Scheduled Task (timeout: {timeoutMinutes}min)"); + } + var taskName = Constants.ScheduledTaskName; var taskCommand = $"\"{targetExePath}\""; diff --git a/src/Agent/AutopilotMonitor.Agent/Program.cs b/src/Agent/AutopilotMonitor.Agent/Program.cs index 00d1453e..c21e8ae2 100644 --- a/src/Agent/AutopilotMonitor.Agent/Program.cs +++ b/src/Agent/AutopilotMonitor.Agent/Program.cs @@ -92,6 +92,7 @@ namespace AutopilotMonitor.Agent logger.Info($"======================= Agent starting ({(consoleMode ? "console" : "background/SYSTEM")}) ======================="); logger.Info($"Agent version: {agentVersion}"); + logger.Info($"Command line: {FormatArgsForLog(args)}"); // Check for enrollment complete marker (handles scheduled task cleanup retry) if (CheckEnrollmentCompleteMarker(config, logger, consoleMode)) @@ -169,6 +170,23 @@ namespace AutopilotMonitor.Agent logger.Warning("Await-enrollment: MDM certificate found but TenantId not yet in registry"); } } + + // Remove persisted config so subsequent restarts proceed normally + try + { + var awaitConfigPath = Path.Combine( + Environment.ExpandEnvironmentVariables(Constants.AgentDataDirectory), + "await-enrollment.json"); + if (File.Exists(awaitConfigPath)) + { + File.Delete(awaitConfigPath); + logger.Info("Await-enrollment: Config file removed — subsequent starts will proceed normally"); + } + } + catch (Exception ex) + { + logger.Warning($"Await-enrollment: Could not remove config file: {ex.Message}"); + } } using (var service = new MonitoringService(config, logger, agentVersion)) @@ -256,6 +274,23 @@ namespace AutopilotMonitor.Agent Console.WriteLine(" --replay-speed-factor Time compression factor (default: 50)"); } + static string FormatArgsForLog(string[] args) + { + if (args == null || args.Length == 0) + return "(none)"; + + var parts = new string[args.Length]; + for (int i = 0; i < args.Length; i++) + { + if (i > 0 && string.Equals(args[i - 1], "--bootstrap-token", StringComparison.OrdinalIgnoreCase)) + parts[i] = "***REDACTED***"; + else + parts[i] = args[i]; + } + + return string.Join(" ", parts); + } + /// /// Checks if another AutopilotMonitor.Agent.exe process is already running. /// @@ -287,4 +322,15 @@ namespace AutopilotMonitor.Agent public string BootstrapToken { get; set; } public string TenantId { get; set; } } + + /// + /// Persisted await-enrollment configuration. + /// Saved to %ProgramData%\AutopilotMonitor\await-enrollment.json by RunInstallMode + /// so the Scheduled Task enters await-enrollment mode on startup. + /// Deleted after the MDM certificate is found. + /// + class AwaitEnrollmentConfigFile + { + public int TimeoutMinutes { get; set; } = 480; + } } diff --git a/src/Agent/AutopilotMonitor.Agent/buildcounter.txt b/src/Agent/AutopilotMonitor.Agent/buildcounter.txt index aeccadf7..2c60641d 100644 --- a/src/Agent/AutopilotMonitor.Agent/buildcounter.txt +++ b/src/Agent/AutopilotMonitor.Agent/buildcounter.txt @@ -1 +1 @@ -386 +388