private void DeleteOldResults() { // get the list of input tasks string[] strTasks = RegistryUtils.GetRegistryKeyValueNames(RegistryInputKey); 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 = RegistryUtils.GetRegistryKeyValueNames(RegistryOutputKey); 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)) { DeleteRegistryKeyValue(RegistryOutputKey, strResult); ServiceLog.WriteInfo(string.Format("Deleted activity result: {0}", strResult)); deletedResults++; } } } if (deletedResults > 0) { ServiceLog.WriteEnd(string.Format("{0} result(s) deleted", deletedResults)); } }
private void ProcessTasks() { // delete old results DeleteOldResults(); //process all tasks while (true) { //load completed tasks results string[] strResults = RegistryUtils.GetRegistryKeyValueNames(RegistryOutputKey); 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 = RegistryUtils.GetRegistryKeyValueNames(RegistryInputKey); 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; } //start timers StartPollTimer(); //starts task processing after poll interval 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 = RegistryUtils.GetRegistryKeyStringValue(RegistryInputKey, 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)); DeleteRegistryKeyValue(RegistryInputKey, 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)); DeleteRegistryKeyValue(RegistryInputKey, taskDefinition); //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; res = ModuleLoader.Run(type, ref context); 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); //DeleteRegistryKeyValue(RegistryInputKey, context.ActivityDefinition); if (res.RebootRequired) { rebootRequired = true; } } } }