diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index 7c077c72..d536e693 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -880,9 +880,7 @@ CREATE TABLE BackgroundTasks Severity INT NOT NULL, Completed BIT, NotifyOnComplete BIT, - Status INT NOT NULL, - FOREIGN KEY (ScheduleID) REFERENCES Schedule (ScheduleID), - FOREIGN KEY (PackageID) REFERENCES Packages (PackageID) + Status INT NOT NULL ) GO @@ -913,9 +911,8 @@ GO CREATE TABLE BackgroundTaskStack ( - TaskStackID INT NOT NULL PRIMARY KEY, + TaskStackID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, TaskID INT NOT NULL, - Value NVARCHAR(MAX), FOREIGN KEY (TaskID) REFERENCES BackgroundTasks (ID) ) GO @@ -1150,8 +1147,6 @@ CREATE PROCEDURE [dbo].[UpdateBackgroundTask] @TaskID INT, @ScheduleID INT, @PackageID INT, - @UserID INT, - @EffectiveUserID INT, @TaskName NVARCHAR(255), @ItemID INT, @ItemName NVARCHAR(255), @@ -1167,12 +1162,10 @@ CREATE PROCEDURE [dbo].[UpdateBackgroundTask] ) AS -UPDATE BackgroundTask +UPDATE BackgroundTasks SET ScheduleID = @ScheduleID, PackageID = @PackageID, - UserID = @UserID, - EffectiveUserID = @EffectiveUserID, TaskName = @TaskName, ItemID = @ItemID, ItemName = @ItemName, @@ -1259,4 +1252,35 @@ AS DELETE FROM BackgroundTaskStack WHERE TaskID = @TaskID +GO + +CREATE PROCEDURE [dbo].[GetProcessBackgroundTasks] +( + @ActorID INT, + @Status INT +) +AS + +SELECT + T.ID, + T.TaskID, + T.ScheduleId, + T.PackageId, + T.UserId, + T.EffectiveUserId, + T.TaskName, + T.ItemId, + T.ItemName, + T.StartDate, + T.FinishDate, + T.IndicatorCurrent, + T.IndicatorMaximum, + T.MaximumExecutionTime, + T.Source, + T.Severity, + T.Completed, + T.NotifyOnComplete, + T.Status +FROM BackgroundTasks AS T +WHERE T.UserID = @ActorID AND T.Completed = 0 AND T.Status = @Status GO \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTask.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTask.cs index 419ebe91..afc5546e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTask.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTask.cs @@ -41,25 +41,25 @@ namespace WebsitePanel.EnterpriseServer { #region Properties - public int Id { get; protected set; } + public int Id { get; set; } - public String TaskId { get; protected set; } + public String TaskId { get; set; } public int ScheduleId { get; set; } public int PackageId { get; set; } - public int UserId { get; protected set; } + public int UserId { get; set; } - public int EffectiveUserId { get; protected set; } + public int EffectiveUserId { get; set; } - public String TaskName { get; protected set; } + public String TaskName { get; set; } public int ItemId { get; set; } public String ItemName { get; set; } - public DateTime StartDate { get; protected set; } + public DateTime StartDate { get; set; } public DateTime FinishDate { get; set; } @@ -69,7 +69,7 @@ namespace WebsitePanel.EnterpriseServer public int MaximumExecutionTime { get; set; } - public String Source { get; protected set; } + public String Source { get; set; } public int Severity { get; set; } @@ -79,9 +79,9 @@ namespace WebsitePanel.EnterpriseServer public BackgroundTaskStatus Status { get; set; } - public IList Logs { get; set; } + public List Logs { get; set; } - public IList Params { get; set; } + public List Params { get; set; } #endregion @@ -99,10 +99,10 @@ namespace WebsitePanel.EnterpriseServer } public BackgroundTask(String taskId, int userId, int effectiveUserId, String source, String taskName, String itemName, - int itemId, int scheduleId, int packageId, int maximumExecutionTime, IList parameters) + int itemId, int scheduleId, int packageId, int maximumExecutionTime, List parameters) : this() { - TaskId = TaskId; + TaskId = taskId; UserId = userId; EffectiveUserId = effectiveUserId; Source = source; @@ -164,11 +164,11 @@ namespace WebsitePanel.EnterpriseServer { #region Properties - public int ParameterId { get; protected set; } + public int ParameterId { get; set; } - public int TaskId { get; protected set; } + public int TaskId { get; set; } - public String Name { get; protected set; } + public String Name { get; set; } public Object Value { get; set; } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskStatus.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskStatus.cs index 51f33a04..74747641 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskStatus.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Base/Tasks/BackgroundTaskStatus.cs @@ -3,6 +3,8 @@ public enum BackgroundTaskStatus { Run = 1, - Abort = 2 + Abort = 2, + Starting = 3, + Stopping = 4 } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index 2a018650..cc069d0c 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -1852,6 +1852,14 @@ namespace WebsitePanel.EnterpriseServer new SqlParameter("actorId", actorId)); } + public static IDataReader GetProcessBackgroundTasks(int actorId, BackgroundTaskStatus status) + { + return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, + ObjectQualifier + "GetProcessBackgroundTasks", + new SqlParameter("actorId", actorId), + new SqlParameter("status", (int)status)); + } + public static IDataReader GetBackgroundTopTask(int actorId) { return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, @@ -1910,7 +1918,7 @@ namespace WebsitePanel.EnterpriseServer public static IDataReader GetBackgroundTaskLogs(int taskId, DateTime startLogTime) { return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, - ObjectQualifier + "AddBackgroundTaskLogParam", + ObjectQualifier + "GetBackgroundTaskLogs", new SqlParameter("@taskId", taskId), new SqlParameter("@startLogTime", startLogTime)); } @@ -1938,7 +1946,7 @@ namespace WebsitePanel.EnterpriseServer new SqlParameter("@severity", severity), new SqlParameter("@completed", completed), new SqlParameter("@notifyOnComplete", notifyOnComplete), - new SqlParameter("@status", status)); + new SqlParameter("@status", (int)status)); } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs index 8ea81b62..e296c57e 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/ExchangeServer/ExchangeServerController.cs @@ -1456,7 +1456,7 @@ namespace WebsitePanel.EnterpriseServer // place log record - IList parameters = new List(); + List parameters = new List(); parameters.Add(new BackgroundTaskParameter("Domain ID", domainId)); parameters.Add(new BackgroundTaskParameter("Domain Type", domainType.ToString())); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/LyncController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/LyncController.cs index 71895df1..e78b8a10 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/LyncController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/LyncController.cs @@ -881,7 +881,7 @@ namespace WebsitePanel.EnterpriseServer.Code.HostedSolution public static LyncUserResult AddFederationDomain(int itemId, string domainName, string proxyFqdn) { - IList parameters = new List(); + List parameters = new List(); parameters.Add(new BackgroundTaskParameter("domainName", domainName)); parameters.Add(new BackgroundTaskParameter("proxyFqdn", proxyFqdn)); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs index b5755625..8162959d 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/HostedSolution/OrganizationController.cs @@ -291,7 +291,7 @@ namespace WebsitePanel.EnterpriseServer return errorCode; // place log record - IList parameters = new List(); + List parameters = new List(); parameters.Add(new BackgroundTaskParameter("Organization ID", organizationId)); parameters.Add(new BackgroundTaskParameter("DomainName", domainName)); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/MailServers/MailServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/MailServers/MailServerController.cs index e0ca1a40..d7923702 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/MailServers/MailServerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/MailServers/MailServerController.cs @@ -1268,7 +1268,7 @@ namespace WebsitePanel.EnterpriseServer // place log record - IList parameters = new List(); + List parameters = new List(); parameters.Add(new BackgroundTaskParameter("Domain ID", domain.DomainId)); parameters.Add(new BackgroundTaskParameter("Domain pointer", domain.DomainName)); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs index 9a92ecfe..bc8b8490 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs @@ -58,10 +58,8 @@ namespace WebsitePanel.EnterpriseServer public static bool IsScheduleActive(int scheduleId) { Dictionary scheduledTasks = TaskManager.GetScheduledTasks(); - - ScheduleInfo scheduleInfo = SchedulerController.GetSchedule(scheduleId); - - return scheduledTasks.ContainsKey(scheduleId) || scheduleInfo.LastRun > scheduleInfo.LastFinish; + + return scheduledTasks.ContainsKey(scheduleId); } public static void StartSchedule(SchedulerJob schedule) @@ -85,8 +83,10 @@ namespace WebsitePanel.EnterpriseServer public static void ScheduleTasks() { - nextSchedule = SchedulerController.GetNextSchedule(); + RunManualTasks(); + nextSchedule = SchedulerController.GetNextSchedule(); + // set timer if (nextSchedule != null) { @@ -94,9 +94,7 @@ namespace WebsitePanel.EnterpriseServer { // this will put the timer to sleep scheduleTimer.Change(Timeout.Infinite, Timeout.Infinite); - - System.Threading.Thread.Sleep(1000); - + Thread.Sleep(1000); // run immediately RunNextSchedule(null); } @@ -106,13 +104,65 @@ namespace WebsitePanel.EnterpriseServer TimeSpan ts = nextSchedule.ScheduleInfo.NextRun.Subtract(DateTime.Now); if (ts < TimeSpan.Zero) ts = TimeSpan.Zero; // cannot be negative ! - // invoke after the timespan scheduleTimer.Change((long)ts.TotalMilliseconds, Timeout.Infinite); } } } + private static void RunManualTasks() + { + var tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Starting); + foreach (var task in tasks) + { + StartManualTask(task); + } + tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Stopping); + foreach (var task in tasks) + { + TaskManager.StopTask(task.TaskId); + } + } + private static void StartManualTask(BackgroundTask backgroundTask) + { + new Thread(() => RunBackgroundTask(backgroundTask)) { Priority = ThreadPriority.Highest }.Start(); + + backgroundTask.Status = BackgroundTaskStatus.Run; + + TaskController.UpdateTask(backgroundTask); + } + private static void RunBackgroundTask(BackgroundTask backgroundTask) + { + UserInfo user = PackageController.GetPackageOwner(backgroundTask.PackageId); + + SecurityContext.SetThreadPrincipal(user.UserId); + + var schedule = SchedulerController.GetScheduleComplete(backgroundTask.ScheduleId); + + TaskManager.StartTask(backgroundTask.Source, backgroundTask.TaskName, backgroundTask.ItemName, backgroundTask.ItemId, backgroundTask.ScheduleId, backgroundTask.PackageId, backgroundTask.MaximumExecutionTime, backgroundTask.Params); + + try + { + var objTask = (SchedulerTask)Activator.CreateInstance(Type.GetType(schedule.Task.TaskType)); + objTask.DoWork(); + Thread.Sleep(100000); + } + catch (Exception ex) + { + TaskManager.WriteError(ex, "Error executing scheduled task"); + } + finally + { + try + { + TaskManager.CompleteTask(); + } + catch (Exception) + { + } + } + } + // call back for the timer function static void RunNextSchedule(object obj) // obj ignored { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerController.cs index 58bab08f..62c067d8 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerController.cs @@ -31,6 +31,7 @@ using System.Data; using System.Collections.Generic; using System.Text; using System.Xml; +using System.Linq; using WebsitePanel.EnterpriseServer.Base.Scheduling; namespace WebsitePanel.EnterpriseServer @@ -157,30 +158,64 @@ namespace WebsitePanel.EnterpriseServer { // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); - if (accountCheck < 0) return accountCheck; - + + if (accountCheck < 0) + return accountCheck; + SchedulerJob schedule = GetScheduleComplete(scheduleId); if (schedule == null) return 0; - Scheduler.StartSchedule(schedule); + var parameters = schedule.ScheduleInfo.Parameters.Select( + prm => new BackgroundTaskParameter(prm.ParameterId, prm.ParameterValue)).ToList(); + var backgroundTask = new BackgroundTask( + schedule.ScheduleInfo.TaskId, + SecurityContext.User.UserId, + SecurityContext.User.IsPeer + ? SecurityContext.User.OwnerId + : SecurityContext.User.UserId, "SCHEDULER", "RUN_SCHEDULE", + schedule.ScheduleInfo.ScheduleName, + schedule.ScheduleInfo.ScheduleId, + schedule.ScheduleInfo.ScheduleId, + schedule.ScheduleInfo.PackageId, + schedule.ScheduleInfo.MaxExecutionTime, parameters) { Status = BackgroundTaskStatus.Starting }; + + TaskController.AddTask(backgroundTask); + return 0; } public static int StopSchedule(int scheduleId) { - // check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo); - if (accountCheck < 0) return accountCheck; + if (accountCheck < 0) + return accountCheck; + SchedulerJob schedule = GetScheduleComplete(scheduleId); if (schedule == null) return 0; - Scheduler.StopSchedule(schedule); + var parameters = schedule.ScheduleInfo.Parameters.Select( + prm => new BackgroundTaskParameter(prm.ParameterId, prm.ParameterValue)).ToList(); + var backgroundTask = new BackgroundTask( + schedule.ScheduleInfo.TaskId, + SecurityContext.User.UserId, + SecurityContext.User.IsPeer + ? SecurityContext.User.OwnerId + : SecurityContext.User.UserId, "SCHEDULER", "STOP_SCHEDULE", + schedule.ScheduleInfo.ScheduleName, + schedule.ScheduleInfo.ScheduleId, + schedule.ScheduleInfo.ScheduleId, + schedule.ScheduleInfo.PackageId, + schedule.ScheduleInfo.MaxExecutionTime, parameters) { Status = BackgroundTaskStatus.Stopping }; + + TaskController.AddTask(backgroundTask); + return 0; + } public static void CalculateNextStartTime(ScheduleInfo schedule) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerJob.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerJob.cs index 5d8caede..a1053325 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerJob.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/SchedulerJob.cs @@ -89,7 +89,7 @@ namespace WebsitePanel.EnterpriseServer UserInfo user = PackageController.GetPackageOwner(scheduleInfo.PackageId); SecurityContext.SetThreadPrincipal(user.UserId); - IList parameters = new List(); + List parameters = new List(); foreach (ScheduleTaskParameterInfo prm in scheduleInfo.Parameters) { parameters.Add(new BackgroundTaskParameter(prm.ParameterId, prm.ParameterValue)); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs index 71e25808..1959d789 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs @@ -15,6 +15,11 @@ namespace WebsitePanel.EnterpriseServer BackgroundTask task = ObjectUtils.FillObjectFromDataReader( DataProvider.GetBackgroundTask(SecurityContext.User.UserId, taskId)); + if (task == null) + { + return null; + } + task.Params = GetTaskParams(task.Id); return task; @@ -26,6 +31,12 @@ namespace WebsitePanel.EnterpriseServer DataProvider.GetBackgroundTasks(SecurityContext.User.UserId)); } + public static List GetProcessTasks(BackgroundTaskStatus status) + { + return ObjectUtils.CreateListFromDataReader( + DataProvider.GetProcessBackgroundTasks(SecurityContext.User.UserId, status)); + } + public static BackgroundTask GetTopTask() { BackgroundTask task = ObjectUtils.FillObjectFromDataReader( @@ -58,7 +69,7 @@ namespace WebsitePanel.EnterpriseServer AddTaskParams(task.Id, task.Params); - if (task.Completed) + if (task.Completed || task.Status == BackgroundTaskStatus.Abort) { DeleteTaskStack(task.Id); } @@ -66,10 +77,10 @@ namespace WebsitePanel.EnterpriseServer public static void DeleteTaskStack(int taskId) { - DataProvider.DeleteBackgroundTaskParams(taskId); + DataProvider.DeleteBackgroundTaskStack(taskId); } - public static void AddTaskParams(int taskId, IList parameters) + public static void AddTaskParams(int taskId, List parameters) { foreach (BackgroundTaskParameter param in SerializeParams(parameters)) { @@ -77,7 +88,7 @@ namespace WebsitePanel.EnterpriseServer } } - public static IList GetTaskParams(int taskId) + public static List GetTaskParams(int taskId) { List parameters = ObjectUtils.CreateListFromDataReader( DataProvider.GetBackgroundTaskParams(taskId)); @@ -104,8 +115,13 @@ namespace WebsitePanel.EnterpriseServer return logs; } - private static IList SerializeParams(IList parameters) + private static List SerializeParams(List parameters) { + if (parameters == null) + { + return new List(); + } + foreach (BackgroundTaskParameter param in parameters) { XmlSerializer serializer = new XmlSerializer(param.Value.GetType()); @@ -121,11 +137,11 @@ namespace WebsitePanel.EnterpriseServer return parameters; } - private static IList DeserializeParams(IList parameters) + private static List DeserializeParams(List parameters) { foreach (BackgroundTaskParameter param in parameters) { - XmlSerializer deserializer = new XmlSerializer(param.Value.GetType()); + XmlSerializer deserializer = new XmlSerializer(param.SerializerValue.GetType()); StringReader sr = new StringReader(param.SerializerValue); param.Value = deserializer.Deserialize(sr); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs index 7cf6d7a2..c45270f6 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskManager.cs @@ -37,6 +37,8 @@ using System.Web.Caching; using System.Xml; using System.Reflection; using WebsitePanel.Providers.Common; +using System.Diagnostics; +using System.Linq; namespace WebsitePanel.EnterpriseServer { @@ -66,7 +68,7 @@ namespace WebsitePanel.EnterpriseServer StartTask(source, taskName, null, itemId, parameter); } - public static void StartTask(string source, string taskName, int itemId, IList parameters) + public static void StartTask(string source, string taskName, int itemId, List parameters) { StartTask(source, taskName, null, itemId, parameters); } @@ -86,7 +88,7 @@ namespace WebsitePanel.EnterpriseServer StartTask(source, taskName, itemName, 0, parameter); } - public static void StartTask(string source, string taskName, object itemName, IList parameters) + public static void StartTask(string source, string taskName, object itemName, List parameters) { StartTask(source, taskName, itemName, 0, parameters); } @@ -96,14 +98,14 @@ namespace WebsitePanel.EnterpriseServer StartTask(source, taskName, itemName, itemId, 0, parameter); } - public static void StartTask(string source, string taskName, object itemName, int itemId, IList parameters) + public static void StartTask(string source, string taskName, object itemName, int itemId, List parameters) { StartTask(source, taskName, itemName, itemId, 0, 0, -1, parameters); } public static void StartTask(string source, string taskName, object itemName, int itemId, int packageId, BackgroundTaskParameter parameter) { - IList parameters = new List(); + List parameters = new List(); if (parameter != null) { parameters.Add(parameter); @@ -123,13 +125,13 @@ namespace WebsitePanel.EnterpriseServer } public static void StartTask(string source, string taskName, object itemName, int itemId, - int scheduleId, int packageId, int maximumExecutionTime, IList parameters) + int scheduleId, int packageId, int maximumExecutionTime, List parameters) { StartTask(null, source, taskName, itemName, itemId, scheduleId, packageId, maximumExecutionTime, new List()); } public static void StartTask(string taskId, string source, string taskName, object itemName, int itemId, - int scheduleId, int packageId, int maximumExecutionTime, IList parameters) + int scheduleId, int packageId, int maximumExecutionTime, List parameters) { if (String.IsNullOrEmpty(taskId)) { @@ -507,13 +509,43 @@ namespace WebsitePanel.EnterpriseServer BackgroundTask task = GetTask(taskId); if (task == null) + { return; - + } + task.Status = BackgroundTaskStatus.Abort; + StopProcess(task.TaskId); + TaskController.UpdateTask(task); } + public static void StopTask(BackgroundTask task) + { + if (task == null) + { + return; + } + + task.Status = BackgroundTaskStatus.Abort; + + StopProcess(task.TaskId); + + TaskController.UpdateTask(task); + } + + private static void StopProcess(string taskId) + { + var process = Process.GetProcesses().FirstOrDefault( + p => p.ProcessName.Equals(taskId, StringComparison.CurrentCultureIgnoreCase)); + + if (process != null) + { + process.Kill(); + process.WaitForExit(10000); + } + } + public static List GetUserTasks(int userId) { List list = new List(); @@ -717,7 +749,7 @@ namespace WebsitePanel.EnterpriseServer return res; } - public static T StartResultTask(string source, string taskName, int itemId, IList parameters) where T : ResultObject, new() + public static T StartResultTask(string source, string taskName, int itemId, List parameters) where T : ResultObject, new() { StartTask(source, taskName, itemId, parameters); T res = new T(); diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx index 8acbbbc0..30b3a522 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx @@ -13,9 +13,8 @@ - + - @@ -27,16 +26,15 @@ - +
- - In Progress +
+ CausesValidation="false" Text="Stop" OnClientClick="return confirm('Do you really want to terminate this task?');"> diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx.cs index c8465f60..a1933493 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/Tasks.ascx.cs @@ -66,34 +66,13 @@ namespace WebsitePanel.Portal // find controls HyperLink lnkTaskName = (HyperLink)e.Row.FindControl("lnkTaskName"); - Literal litTaskName = (Literal)e.Row.FindControl("litTaskName"); Literal litTaskDuration = (Literal)e.Row.FindControl("litTaskDuration"); - Panel pnlProgressBarContainer = (Panel)e.Row.FindControl("pnlProgressBarContainer"); Panel pnlProgressIndicator = (Panel)e.Row.FindControl("pnlProgressIndicator"); - Literal litProgressIndicator = (Literal)e.Row.FindControl("litProgressIndicator"); LinkButton cmdStop = (LinkButton)e.Row.FindControl("cmdStop"); - if (String.IsNullOrEmpty(task.TaskId)) - { - litTaskName.Visible = true; - litProgressIndicator.Visible = true; - - // bind controls - litTaskName.Text = GetAuditLogTaskName(task.Source, task.TaskName); - } - else - { - lnkTaskName.Visible = true; - pnlProgressBarContainer.Visible = true; - cmdStop.Visible = true; - - // bind controls - lnkTaskName.NavigateUrl = EditUrl("TaskID", task.TaskId, "view_details"); - lnkTaskName.Text = GetAuditLogTaskName(task.Source, task.TaskName); - - // stop button - cmdStop.CommandArgument = task.TaskId; - } + // bind controls + lnkTaskName.Text = GetAuditLogTaskName(task.Source, task.TaskName); + lnkTaskName.NavigateUrl = EditUrl("TaskID", task.TaskId, "view_details"); // duration TimeSpan duration = (TimeSpan)(DateTime.Now - task.StartDate); @@ -107,6 +86,9 @@ namespace WebsitePanel.Portal if (task.IndicatorMaximum > 0) percent = task.IndicatorCurrent * 100 / task.IndicatorMaximum; pnlProgressIndicator.Width = Unit.Percentage(percent); + + // stop button + cmdStop.CommandArgument = task.TaskId; } protected void gvTasks_RowCommand(object sender, GridViewCommandEventArgs e) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/TasksTaskDetails.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/TasksTaskDetails.ascx.cs index 7c7be1d2..a5293d72 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/TasksTaskDetails.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/TasksTaskDetails.ascx.cs @@ -51,7 +51,7 @@ namespace WebsitePanel.Portal private void BindTask() { - DateTime lastLogDate = DateTime.MinValue; + DateTime lastLogDate = DateTime.Now.AddYears(-1); if (ViewState["lastLogDate"] != null) lastLogDate = (DateTime)ViewState["lastLogDate"];