private string PrintPlanning( SortedDic <String, clsTaskList> frequentlyDic, SortedDic <String, clsTaskList> dailyDic, SortedDic <String, clsTaskList> weeklyDic, SortedDic <String, clsTaskList> monthlyDic) { var sb = new StringBuilder("Planning:" + crLf); var now = DateTime.Now; int nbHoursLocalTime = (int)(now - now.ToUniversalTime()).TotalHours; if (frequentlyDic.Count > 0) { sb.AppendLine(""); sb.AppendLine("Frequently:"); int nbTasks = 0; const int nbTasksMax = 10; foreach (clsTaskList taskList in frequentlyDic.Sort("date")) { foreach (clsTask task in taskList.taskList) { if (CronScheduling.CronDaemon.useLocalTime) { sb.AppendLine(task.date.ToString(formatHM) + " : " + task.task + " : " + task.descr); } else { sb.AppendLine(task.date.ToString(formatHM) + " (" + task.date.AddHours(nbHoursLocalTime).ToString(formatHM) + ") : " + task.task + " : " + task.descr); } if (++nbTasks >= nbTasksMax) { sb.AppendLine("..."); break; } } if (nbTasks >= nbTasksMax) { break; } } } if (dailyDic.Count > 0) { sb.AppendLine(""); sb.AppendLine("Daily:"); foreach (clsTaskList taskList in dailyDic.Sort("date")) { foreach (clsTask task in taskList.taskList) { if (CronScheduling.CronDaemon.useLocalTime) { sb.AppendLine(task.date.ToString(formatHM) + " : " + task.task + " : " + task.descr); } else { sb.AppendLine(task.date.ToString(formatHM) + " (" + task.date.AddHours(nbHoursLocalTime).ToString(formatHM) + ") : " + task.task + " : " + task.descr); } } } } if (weeklyDic.Count > 0) { sb.AppendLine(""); sb.AppendLine("Weekly:"); foreach (clsTaskList taskList in weeklyDic.Sort("date")) { foreach (clsTask task in taskList.taskList) { if (CronScheduling.CronDaemon.useLocalTime) { sb.AppendLine(task.date.ToString("ddd ") + task.date.ToString(formatHM) + " : " + task.task + " : " + task.descr); } else { sb.AppendLine(task.date.ToString("ddd ") + task.date.ToString(formatHM) + " (" + task.date.AddHours(nbHoursLocalTime).ToString(formatHM) + ") : " + task.task + " : " + task.descr); } } } } if (monthlyDic.Count > 0) { sb.AppendLine(""); sb.AppendLine("Monthly:"); foreach (clsTaskList taskList in monthlyDic.Sort("date")) { foreach (clsTask task in taskList.taskList) { if (CronScheduling.CronDaemon.useLocalTime) { sb.AppendLine(task.date.ToString("dd HH:mm") + " : " + task.task + " : " + task.descr); } else { sb.AppendLine(task.date.ToString("dd HH:mm") + " (" + task.date.AddHours(nbHoursLocalTime).ToString(formatHM) + ") : " + task.task + " : " + task.descr); } } } } return(sb.ToString()); }
protected override void OnStart(string[] args) { //ProcessExtensions.StartProcessAsCurrentUser("calc.exe"); // Quick test: Ok! //return; // Handle exception on a Windows Service: // https://stackoverflow.com/questions/2456819/how-can-i-set-up-net-unhandledexception-handling-in-a-windows-service AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(ExceptionHandler); string serviceExePath = GetServiceExePath(); m_path = FileHelper.GetParentDirectoryPath(serviceExePath); m_logPath = m_path + "\\winCron.log"; string tasksPath = m_path + "\\Tasks.txt"; #pragma warning disable CS0162 // Unreachable code detected if (ProjectInstaller.invisibleUserService) { m_logPath = m_path + "\\winCronInv.log"; tasksPath = m_path + "\\TasksInv.txt"; } #pragma warning restore CS0162 // Unreachable code detected string serviceVersion = ""; DateTime serviceExeDate = nullDate; // new DateTime(1900, 1, 1); FileHelper.GetAssemblyVersion(serviceExePath, ref serviceVersion, ref serviceExeDate); string userService = (ProjectInstaller.invisibleUserService ? "(invisible user service)" : "(visible local system service)"); string msg = "Service started! " + userService + " " + serviceVersion + " " + serviceExeDate.ToString(formatDateHM) + crLf; string errMsg = ""; string[] txtCrons = FileHelper.ReadFile(tasksPath, out errMsg); var cronList = new List <string>(); foreach (string cron in txtCrons) { if (cron.StartsWith("//")) { continue; // Task comment } if (String.IsNullOrEmpty(cron.Trim())) { continue; // Task blank line } cronList.Add(cron.Trim()); } var frequentlyDic = new SortedDic <String, clsTaskList>(); var hourlyDic = new SortedDic <String, clsTaskList>(); var dailyDic = new SortedDic <String, clsTaskList>(); var weeklyDic = new SortedDic <String, clsTaskList>(); var monthlyDic = new SortedDic <String, clsTaskList>(); bool errFound = false; int nbCronsOK = 0; foreach (string cronTaskLine in cronList) { string[] fields = cronTaskLine.Split(':'); if (fields.Length < 2) { msg += " -> Syntax error: [" + cronTaskLine + "]" + crLf; continue; } string cron = ""; string task = ""; string strNoLog = ""; bool noLog = false; int ub = fields.GetUpperBound(0); if (ub >= 0) { cron = fields[0].Trim(); } if (ub >= 1) { task = fields[1].Trim(); } if (ub >= 2) { strNoLog = fields[2].Trim(); } if (strNoLog == "NoLog") { noLog = true; strNoLog = " (no log)"; } if (checkFilePathCmd && !File.Exists(m_path + "\\" + task)) { msg += " -> Can't find: [" + m_path + "\\" + task + "]" + crLf; continue; } // Display periodicity in plain text string cronDescr = CronExpressionDescriptor.ExpressionDescriptor.GetDescription(cron); msg += " " + task + ": [" + cron + "]: " + cronDescr + strNoLog + crLf; if (!MakePlanning(cron, task, cronDescr, frequentlyDic, hourlyDic, dailyDic, weeklyDic, monthlyDic, ref errMsg)) { msg += " -> Syntax error: " + errMsg + crLf; continue; } if (!StartTasks(cron, task, noLog, ref errMsg)) { msg += " Crons bug: " + errMsg + crLf; errFound = true; break; } nbCronsOK++; } if (nbCronsOK == 0) { msg += " No cron found!" + crLf; } else if (!errFound) { msg += " Crons ok!" + crLf; } LogMessage(msg); LogMessage(PrintPlanning(frequentlyDic, dailyDic, weeklyDic, monthlyDic)); }
private bool MakePlanning(string cron, string task, string taskDescr, SortedDic <String, clsTaskList> frequentlyDic, SortedDic <String, clsTaskList> hourlyDic, SortedDic <String, clsTaskList> dailyDic, SortedDic <String, clsTaskList> weeklyDic, SortedDic <String, clsTaskList> monthlyDic, ref string errMsg) { errMsg = ""; NCrontab.CrontabSchedule s = null; try { s = NCrontab.CrontabSchedule.Parse(cron); } catch (Exception ex) { errMsg = ex.Message; return(false); } var cronL = cron.ToLower(); var firstDay = DateTime.Today.FirstDayOfMonth(); var isRecurrent = false; string taskDescrL = taskDescr.ToLower(); if (taskDescrL.Contains("every")) { isRecurrent = true; } if (taskDescrL.Contains("tous")) { isRecurrent = true; // French } if (taskDescrL.Contains("toutes")) { isRecurrent = true; // French } bool mon = cronL.Contains(" mon"); bool tue = cronL.Contains(" tue"); bool wed = cronL.Contains(" wed"); bool thu = cronL.Contains(" thu"); bool fri = cronL.Contains(" fri"); bool sat = cronL.Contains(" sat"); bool sun = cronL.Contains(" sun"); bool isWeekly = mon || tue || wed || thu || fri || sat || sun; bool onDay = taskDescrL.Contains("on day") || taskDescrL.Contains("le"); // French bool ofTheMonth = taskDescrL.Contains("of the month") || taskDescrL.Contains("du mois"); // French bool isMonthly = onDay && ofTheMonth; if (isRecurrent && !isWeekly && !isMonthly) { var hourlyStartDate = firstDay; var hourlyEndDate = hourlyStartDate.AddHours(24); var hourlyOccurrences = s.GetNextOccurrences(hourlyStartDate, hourlyEndDate); foreach (DateTime date in hourlyOccurrences) { string key = taskDescr; if (!hourlyDic.ContainsKey(key)) { var lst = new List <clsTask> { new clsTask(date, task, taskDescr) }; hourlyDic.Add(key, new clsTaskList(date, lst)); } else { var lst = hourlyDic[key]; lst.taskList.Add(new clsTask(date, task, taskDescr)); } key = date.ToString(formatHM); if (!frequentlyDic.ContainsKey(key)) { var lst = new List <clsTask> { new clsTask(date, task, taskDescr) }; frequentlyDic.Add(key, new clsTaskList(date, lst)); } else { var lst = frequentlyDic[key]; lst.taskList.Add(new clsTask(date, task, taskDescr)); } } } if (!isRecurrent && !isWeekly && !isMonthly) { var dailyStartDate = firstDay; var dailyEndDate = dailyStartDate.AddDays(1); var dailyOccurrences = s.GetNextOccurrences(dailyStartDate, dailyEndDate); foreach (DateTime date in dailyOccurrences) { string key = taskDescr; if (hourlyDic.ContainsKey(key)) { continue; } if (!dailyDic.ContainsKey(key)) { var lst = new List <clsTask> { new clsTask(date, task, taskDescr) }; dailyDic.Add(key, new clsTaskList(date, lst)); } else { var lst = dailyDic[key]; lst.taskList.Add(new clsTask(date, task, taskDescr)); } } } if (!isRecurrent && isWeekly && !isMonthly) { //var weeklyStartDate = getMondayBefore(firstDay); var weeklyStartDate = firstDay.GetMondayBefore(); var weeklyEndDate = weeklyStartDate.AddDays(7); var weeklyOccurrences = s.GetNextOccurrences(weeklyStartDate, weeklyEndDate); foreach (DateTime date in weeklyOccurrences) { string key = taskDescr; if (hourlyDic.ContainsKey(key)) { continue; } if (dailyDic.ContainsKey(key)) { continue; } if (!weeklyDic.ContainsKey(key)) { var lst = new List <clsTask> { new clsTask(date, task, taskDescr) }; weeklyDic.Add(key, new clsTaskList(date, lst)); } else { var lst = weeklyDic[key]; lst.taskList.Add(new clsTask(date, task, taskDescr)); } } } if (!isRecurrent && !isWeekly && isMonthly) { var monthlyStartDate = firstDay; var monthlyEndDate = monthlyStartDate.AddMonths(1); var monthlyOccurrences = s.GetNextOccurrences(monthlyStartDate, monthlyEndDate); foreach (DateTime date in monthlyOccurrences) { string key = taskDescr; if (hourlyDic.ContainsKey(key)) { continue; } if (dailyDic.ContainsKey(key)) { continue; } if (weeklyDic.ContainsKey(key)) { continue; } if (!monthlyDic.ContainsKey(key)) { var lst = new List <clsTask> { new clsTask(date, task, taskDescr) }; monthlyDic.Add(key, new clsTaskList(date, lst)); } else { var lst = monthlyDic[key]; lst.taskList.Add(new clsTask(date, task, taskDescr)); } } } return(true); }