1
2
3
4
5
6
7
8
9
10
11
12
13
14 import Globals
15 from Products.ZenRRD.CommandParser import CommandParser
16 from Products.ZenEvents.ZenEventClasses import Status_OSProcess
17
18 AllPids = {}
19
20 emptySet = set()
21
22 -class ps(CommandParser):
23
31
33
34
35 dps = {}
36 for dp in cmd.points:
37 dps.setdefault(dp.data['processName'], []).append(dp)
38
39
40 running = {}
41 for line in cmd.result.output.split('\n')[1:]:
42 if not line: continue
43 try:
44 pid, rss, cpu, args = line.split(None, 3)
45 days = 0
46 if cpu.find('-') > -1:
47 days, cpu = cpu.split('-')
48 days = int(days)
49 cpu = map(int, cpu.split(':'))
50 if len(cpu) == 3:
51 cpu = (days * 24 * 60 * 60 +
52 cpu[0] * 60 * 60 +
53 cpu[1] * 60 +
54 cpu[2])
55 elif len(cpu) == 2:
56 cpu = (days * 24 * 60 * 60 +
57 cpu[0] * 60 +
58 cpu[1])
59 rss = int(rss)
60 pid = int(pid)
61 lst = running.setdefault(args, [])
62 lst.append( (pid, rss, cpu) )
63 lst = running.setdefault(args.split()[0], [])
64 lst.append( (pid, rss, cpu) )
65 except ValueError:
66 continue
67
68 for process, points in dps.items():
69 match = running.get(process, [])
70 if not match:
71 results.events.append(dict(
72 summary='Process not running: ' + process,
73 eventClass=Status_OSProcess,
74 eventGroup='Process',
75 component=process,
76 severity=points[0].data['failSeverity']
77 ))
78 else:
79 totalRss = sum([rss for pid, rss, cpu in match])
80 totalCpu = sum([cpu for pid, rss, cpu in match])
81 for dp in points:
82 if 'cpu' in dp.id:
83 results.values.append( (dp, totalCpu) )
84 if 'mem' in dp.id:
85 results.values.append( (dp, totalRss) )
86 if 'count' in dp.id:
87 results.values.append( (dp, len(match)) )
88
89
90 device = cmd.deviceConfig.device
91 before = AllPids.get( (device, process), emptySet)
92 after = set([pid for pid, rss, cpu in match])
93 alertOnRestart = points[0].data['alertOnRestart']
94 if before != after:
95 if len(before) > len(after) and alertOnRestart:
96 pids = ', '.join(map(str, before - after))
97 results.events.append(dict(
98 summary='Pid(s) %s stopped: %s' % (pids, process),
99 eventClass=Status_OSProcess,
100 eventGroup='Process',
101 component=process,
102 severity=points[0].data['failSeverity']
103 ))
104 if len(before) == len(after) and alertOnRestart:
105
106 pids = ', '.join(map(str, before - after))
107 results.events.append(dict(
108 summary='Pid(s) %s restarted: %s' % (pids, process),
109 eventClass=Status_OSProcess,
110 eventGroup='Process',
111 component=process,
112 severity=points[0].data['failSeverity']
113 ))
114 if len(before) < len(after):
115 if len(before) == 0:
116 results.events.append(dict(
117 summary='Process running: %s' % process,
118 eventClass=Status_OSProcess,
119 eventGroup='Process',
120 component=process,
121 severity=0
122 ))
123
124 AllPids[device, process] = after
125