blob: 0693b09316af38986b0844e40fbcd4abfa12657e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tango.Core.Helpers;
using Tango.Logging;
using Tango.PPC.Common.WatchDog;
using Tango.SharedUI;
using Tango.SharedUI.Components;
namespace Tango.PPC.WatchDog
{
public class MainWindowVM : ViewModel
{
private const String tango_process_name = "Tango.PPC.UI";
private WatchDogClient _watchdog;
public TextController Log { get; set; }
public MainWindowVM()
{
var logger = new SimpleStringLogger();
logger.LogReceived += Logger_LogReceived;
LogManager.RegisterLogger(logger);
_watchdog = new WatchDogClient();
_watchdog.ServerNotResponding += _watchdog_ServerNotResponding;
Log = new TextController();
_watchdog.Start();
}
private void Logger_LogReceived(object sender, LogItemBase e)
{
if (e is ExceptionLogItem)
{
Log.WriteLine(e.ToString());
}
else
{
Log.WriteLine($"[{e.TimeStamp.ToString()}] {e.Message}");
}
}
private void _watchdog_ServerNotResponding(object sender, EventArgs e)
{
LogManager.Log("PPC application failed to respond!", LogCategory.Warning);
LogManager.Log("Ensuring PPC application is down...");
var appProcess = Process.GetProcessesByName(tango_process_name).FirstOrDefault();
Process p = new Process();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.FileName = "wmic";
p.StartInfo.Arguments = String.Format("process where name='{0}' delete", tango_process_name);
try
{
if (appProcess != null)
{
LogManager.Log("PPC application process found and seems to be frozen. Trying to kill the process...");
appProcess.Kill();
appProcess = Process.GetProcessesByName(tango_process_name).FirstOrDefault();
if (appProcess != null)
{
LogManager.Log("Process kill failed. Trying again...");
p.Start();
Thread.Sleep(2000);
appProcess = Process.GetProcessesByName(tango_process_name).FirstOrDefault();
if (appProcess == null)
{
LogManager.Log("PPC application is down.");
}
}
else
{
LogManager.Log("PPC application is down.");
}
}
}
catch
{
try
{
LogManager.Log("Process kill failed. Trying again...");
p.Start();
Thread.Sleep(2000);
appProcess = Process.GetProcessesByName(tango_process_name).FirstOrDefault();
if (appProcess == null)
{
LogManager.Log("PPC application is down.");
}
}
catch { }
}
LogManager.Log("Restarting PPC application...");
try
{
var process = Process.Start(Path.Combine(AssemblyHelper.GetCurrentAssemblyFolder(), tango_process_name + ".exe"));
LogManager.Log("PPC application started.");
LogManager.Log("Waiting for the application to enter an idle state....");
if (process.WaitForInputIdle((int)TimeSpan.FromMinutes(1).TotalMilliseconds))
{
LogManager.Log("Application is in idle state. waiting another 10 seconds...");
Thread.Sleep(TimeSpan.FromSeconds(10));
_watchdog.Start();
}
else
{
LogManager.Log("The PPC application did not enter to an idle state within 1 minute. The Watchdog will not start again!");
}
}
catch (Exception ex)
{
LogManager.Log(ex, "Error starting PPC application.");
}
}
}
}
|