private static void SaveExecutionResult(string name, ExecutionResult res, DateTime started, DateTime ended) { StringBuilder builder = new StringBuilder(); builder.AppendFormat("ResultCode={0}|", res.ResultCode); builder.AppendFormat("RebootRequired={0}|", res.RebootRequired); builder.AppendFormat("ErrorMessage={0}|", res.ErrorMessage); builder.AppendFormat("Value={0}|", res.Value); builder.AppendFormat("Started={0}|", started.ToString("yyyyMMddHHmmss")); builder.AppendFormat("Ended={0}", started.ToString("yyyyMMddHHmmss")); KvpUtils.SetKvpStringValue(OutputKVP, name, builder.ToString()); }
private static void DeleteOldResults() { // get the list of input tasks string[] strTasks = KvpUtils.GetKvpKeys(InputKVP); if (strTasks == null) { return; } List <string> tasks = new List <string>(); foreach (string strTask in strTasks) { if (!string.IsNullOrEmpty(strTask) && strTask.StartsWith(TaskPrefix) && strTask != CurrentTaskName) { //save only SolidCP tasks tasks.Add(strTask); } } // get the list of task results int deletedResults = 0; string[] strResults = KvpUtils.GetKvpKeys(OutputKVP); foreach (string strResult in strResults) { if (!string.IsNullOrEmpty(strResult) && strResult.StartsWith(TaskPrefix) && strResult != CurrentTaskName) { // check if task result exists in the input tasks if (!tasks.Contains(strResult)) { KvpUtils.DeleteKvpKey(OutputKVP, strResult); ServiceLog.WriteInfo(string.Format("Deleted activity result: {0}", strResult)); deletedResults++; } } } if (deletedResults > 0) { ServiceLog.WriteEnd(string.Format("{0} result(s) deleted", deletedResults)); } }
private static void ProcessTasks() { // delete old results DeleteOldResults(); //process all tasks while (true) { //load completed tasks results string[] strResults = KvpUtils.GetKvpKeys(OutputKVP); if (strResults == null) { break; } List <string> results = new List <string>(); foreach (string strResult in strResults) { if (!string.IsNullOrEmpty(strResult) && strResult.StartsWith(TaskPrefix) && strResult != CurrentTaskName) { //save only SolidCP tasks results.Add(strResult); } } // sorted list of tasks - will be sorted by the TaskID (time in ticks) SortedList <long, string> tasks = new SortedList <long, string>(); //load task definitions from input registry key string[] strTasks = KvpUtils.GetKvpKeys(InputKVP); foreach (string strTask in strTasks) { if (results.Contains(strTask)) { continue; // skip completed tasks } if (!string.IsNullOrEmpty(strTask) && strTask.StartsWith(TaskPrefix)) { // extract Task ID parameter int idx = strTask.LastIndexOf('-'); if (idx == -1) { continue; } string strTaskId = strTask.Substring(idx + 1); long taskId = 0; try { taskId = Int64.Parse(strTaskId); } catch { continue; // wrong task format } //save only SolidCP tasks if (!tasks.ContainsKey(taskId)) { tasks.Add(taskId, strTask); } } } if (tasks.Count == 0) { if (rebootRequired) { ServiceLog.WriteInfo("Reboot required"); RebootSystem(); return; } StartIdleTimer(); //stops service if idle //no tasks - exit! return; } else { //stop idle timer as we need to process tasks StopIdleTimer(); } ExecutionContext context = null; foreach (long tid in tasks.Keys) { //find first correct task string taskDefinition = tasks[tid]; string taskParameters = KvpUtils.GetKvpStringValue(InputKVP, taskDefinition); if (taskDefinition.LastIndexOf("-") == -1 || taskDefinition.LastIndexOf('-') == taskDefinition.Length - 1) { ServiceLog.WriteError(string.Format("Task was deleted from queue as its definition is invalid : {0}", taskDefinition)); //go to next task continue; } string taskName = taskDefinition.Substring(0, taskDefinition.LastIndexOf("-")).Substring(TaskPrefix.Length); string taskId = taskDefinition.Substring(taskDefinition.LastIndexOf('-') + 1); if (!provisioningModules.ContainsKey(taskName)) { ServiceLog.WriteError(string.Format("Task was deleted from queue as its definition was not found : {0}", taskName)); //go to next task continue; } //prepare execution context for correct task context = new ExecutionContext(); context.ActivityID = taskId; context.ActivityName = taskName; ParseParameters(context.Parameters, taskParameters); context.ActivityDefinition = taskDefinition; break; } if (context != null) { string type = provisioningModules[context.ActivityName]; ExecutionResult res = null; DateTime start = DateTime.Now; try { //load module and run task ServiceLog.WriteStart(string.Format("Starting '{0}' module...", context.ActivityName)); context.Progress = 0; switch (context.ActivityName) { case "ChangeComputerName": res = ChangeComputerName.Run(ref context); break; case "ChangeAdministratorPassword": res = ChangeAdministratorPassword.Run(ref context); break; case "SetupNetworkAdapter": res = SetupNetworkAdapter.Run(ref context); break; } context.Progress = 100; ServiceLog.WriteEnd(string.Format("'{0}' module finished.", context.ActivityName)); } catch (Exception ex) { ServiceLog.WriteError("Unhandled exception:", ex); res = new ExecutionResult(); res.ResultCode = -1; res.ErrorMessage = string.Format("Unhandled exception : {0}", ex); } DateTime end = DateTime.Now; SaveExecutionResult(context.ActivityDefinition, res, start, end); if (res.RebootRequired) { rebootRequired = true; } } System.Threading.Thread.Sleep(1000); } }