await-enrollment param persistence and added agent command line to logfile

This commit is contained in:
Oliver Kieselbach
2026-03-09 23:10:38 +01:00
parent e9b9c6ebe0
commit d0e148daea
4 changed files with 81 additions and 1 deletions
@@ -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<AwaitEnrollmentConfigFile>(json);
if (awaitConfig != null)
{
awaitEnrollment = true;
awaitEnrollmentTimeoutMinutes = awaitConfig.TimeoutMinutes;
}
}
catch { /* ignore corrupt file */ }
}
var useBootstrapToken = !string.IsNullOrEmpty(bootstrapToken);
return new AgentConfiguration
@@ -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}\"";
@@ -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 <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);
}
/// <summary>
/// Checks if another AutopilotMonitor.Agent.exe process is already running.
/// </summary>
@@ -287,4 +322,15 @@ namespace AutopilotMonitor.Agent
public string BootstrapToken { get; set; }
public string TenantId { get; set; }
}
/// <summary>
/// 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.
/// </summary>
class AwaitEnrollmentConfigFile
{
public int TimeoutMinutes { get; set; } = 480;
}
}
@@ -1 +1 @@
386
388