using System.IO; using MaksIT.UScheduler.ScheduleManager.Models; namespace MaksIT.UScheduler.ScheduleManager.Services; /// /// Service for managing script status files (lock files, last run). /// public class ScriptStatusService { /// /// Gets the status of a script from its scriptsettings.json path. /// public ScriptStatus GetScriptStatus(string scriptSettingsPath) { var directory = Path.GetDirectoryName(scriptSettingsPath) ?? string.Empty; var scriptName = Path.GetFileName(directory); // Find the .ps1 file in the same directory var scriptFiles = Directory.GetFiles(directory, "*.ps1", SearchOption.TopDirectoryOnly); var scriptPath = scriptFiles.FirstOrDefault() ?? string.Empty; if (string.IsNullOrEmpty(scriptPath)) { return new ScriptStatus { ScriptPath = string.Empty, ScriptName = scriptName, HasLockFile = false, LastRun = null }; } var lockFilePath = Path.ChangeExtension(scriptPath, ".lock"); var lastRunFilePath = Path.ChangeExtension(scriptPath, ".lastRun"); return new ScriptStatus { ScriptPath = scriptPath, ScriptName = scriptName, HasLockFile = File.Exists(lockFilePath), LockFilePath = lockFilePath, LastRun = GetLastRunTime(lastRunFilePath), LastRunFilePath = lastRunFilePath }; } /// /// Removes the lock file for a script. /// public bool RemoveLockFile(string lockFilePath) { try { if (File.Exists(lockFilePath)) { File.Delete(lockFilePath); return true; } return false; } catch { return false; } } /// /// Reads the last run time from the .lastRun file. /// private static DateTime? GetLastRunTime(string lastRunFilePath) { try { if (!File.Exists(lastRunFilePath)) return null; var content = File.ReadAllText(lastRunFilePath).Trim(); if (DateTime.TryParse( content, null, System.Globalization.DateTimeStyles.AdjustToUniversal | System.Globalization.DateTimeStyles.AssumeUniversal, out var lastRun)) { return lastRun; } return null; } catch { return null; } } }