1
2
3
4
5
6
7
8
9 """
10 Agent zephir de surveillance des connexions (ip conntrack)
11 """
12
13 from twisted.python import log
14 from twisted.internet import defer
15 from twisted.internet.utils import getProcessOutput
16
17 from zephir.monitor.agentmanager.agent import Agent
18 from zephir.monitor.agentmanager import status
19 from zephir.monitor.agentmanager.data import HTMLData, TableData
20 from zephir.monitor.agentmanager.util import percent
21
22 from pyctd.conntracking import DataCollector
23 from pyctd.server import serializeConnectionSet
24
25
26 IPPROTO_ICMP = 1
27 IPPROTO_TCP = 6
28 IPPROTO_UDP = 17
29 IPPROTO_SCTP = 132
30
31
32 IPPROTO_NAMES = {
33 IPPROTO_ICMP: "icmp",
34 IPPROTO_TCP: "tcp",
35 IPPROTO_UDP: "udp",
36 IPPROTO_SCTP: "sctp",
37 }
38
40
43 Agent.__init__(self, name, **params)
44 self.table = TableData([
45 ('id', 'Id_cnx', {'align':'right'}, None),
46 ('proto', 'Protocole', {'align':'left'}, None),
47
48
49 ('timeout', 'Timeout', {'align':'left'}, None),
50
51 ('src', 'Source', {'align':'right'}, None),
52 ('dst', 'Destination', {'align':'right'}, None),
53 ('rate_in', 'Débit Entrant', {'align':'right'}, None),
54 ('rate_out', 'Débit Sortant', {'align':'right'}, None)])
55 self.data = [self.table]
56 self.collector = None
57
59 if self.collector == None:
60 self.collector = DataCollector('conntrack')
61 self.collector.refresh()
62
63
64 meas_data = []
65 ctdata = self.collector.current.dict
66 for id, conn in ctdata.items():
67 conn_data = conn.conntrack
68 tuple = conn_data.tuple[0]
69 fields = {}
70 fields['id'] = id
71 fields['mark'] = conn_data.mark
72 fields['user'] = ""
73 fields['timeout'] = conn_data.timeout
74 fields['status'] = conn_data.status
75 fields['src'] = tuple.src.getIPv4().strNormal()
76 fields['dst'] = tuple.dst.getIPv4().strNormal()
77
78 if t.protonum == IPPROTO_ICMP:
79 fields["l4src"] = int(t.l4src.icmp.id)
80 fields["l4dst"] = int(t.l4dst.icmp.type)
81 else:
82 fields["l4src"] = int(ntohs(t.l4src.getValue(tuple.protonum)))
83 fields["l4dst"] = int(ntohs(t.l4dst.getValue(tuple.protonum)))
84 fields['proto'] = "%s/%s" % (fields["l4src"],fields["l4dst"])
85
86
87
88 fields['rate_in'] = float(conn.byterate[0])
89 fields['rate_out'] = float(conn.byterate[1])
90 meas_data.append(fields)
91 return {'statistics': meas_data}
92
96
100
102 Agent.write_data(self)
103 if self.last_measure is not None:
104 self.table.table_data = self.last_measure.value['statistics']
105