Functional inputs.run multiservice launcher. But it still mixes all the raw streams...
[ais.git] / bin / inputs / peers.py
1 # -*- coding: utf-8 -*-
2 '''
3 Peers definition
4 '''
5
6 __all__ = [
7     'peers_get_config',
8     'source_get_infoin']
9
10 #TODO: rename this to config.py or config reader or whatever
11
12 import logging
13 import pprint
14 from ais.ntools import str_split_column_ipv6
15 from ais.inputs.config import SOURCES
16
17 __source_normalized__ = False
18 def peers_get_config():
19     '''
20     SOURCES normalization & checks
21     '''
22     global __source_normalized__
23     if __source_normalized__:
24         return SOURCES
25     logging.debug('SOURCES (raw):\n%s', pprint.pformat(SOURCES))
26     for id4, settings in SOURCES.iteritems():
27         assert len(id4) == 4, \
28             'Invalid ID %s in SOURCES. It should be 4 characters long.'
29
30         try:
31             in_ = settings['in']
32         except KeyError:
33             continue
34     
35         assert type(in_) == str, \
36             "SOURCES['%s']['in'] should be of type str, not %s'." % \
37             (id4, type(in_))
38         in_ = settings.get('in')
39         spl = str_split_column_ipv6(in_)
40         protocol, parameters = spl[0], spl[1:]
41         assert parameters, \
42             "SOURCES['%s']['in'] should contain parameters after %s" % \
43             (id4, protocol)
44            
45         if protocol == 'udp':
46             assert len(parameters) == 4, \
47                 "SOURCES['%s']['in'] udp: protocol requires 4 parameters." % \
48                 id4
49             host_local = parameters[0]
50             if host_local == '*':
51                 host_local = ''
52             port_local = parameters[1]
53             assert port_local.isdigit(), \
54                 "SOURCES['%s']['in'] udp: illegal local port" % \
55                 id4
56             port_local = int(port_local)
57             host_remote = parameters[2]
58             if host_remote == '*':
59                 host_remote = ''
60             port_remote = parameters[3]
61             source_port_discreminate = False
62             if port_remote == '*':
63                 port_remote = ''
64             elif port_remote == '!':
65                 port_remote = ''
66                 source_port_discreminate = True
67             else:
68                 assert port_remote.isdigit(), \
69                     "SOURCES['%s']['in'] udp: illegal remote port" % \
70                     id4
71                 port_remote = int(port_remote)
72          
73             SOURCES[id4]['in'] = ('Udp', host_local, port_local, host_remote, port_remote, source_port_discreminate)
74
75         elif protocol == 'serial':
76             assert len(parameters) == 1, \
77                 "SOURCES['%s']['in'] serial: protocol requires 1 parameter." % \
78                 id4
79             SOURCES[id4]['in'] = tuple(['Serial'] + parameters)
80
81         elif protocol == 'tcpout':
82             assert len(parameters) == 2, \
83                 "SOURCES['%s']['in'] tcpout: protocol requires 2 parameters." % \
84                 id4
85             SOURCES[id4]['in'] = tuple(['TcpOut'] + parameters)
86
87         else:
88             logging.error(
89                 "Unsupported source protocol '%s' for SOURCES['%s']: %s",
90                 protocol, id4, in_)
91     __source_normalized__ = True
92     logging.debug('SOURCES (normalised):\n%s', pprint.pformat(SOURCES))
93     return SOURCES
94
95
96
97 def source_get_infoin(*args):
98     '''
99     Gets a list of matching info in SOURCES[*]['in']:
100     example: get_source_infoin('Udp', '', 1234)
101       might return [ ['SRC1', '12.23.34.45', '', False],
102                      ['SRC2', '98.87.76.65', '', True]]
103     '''
104     result = []
105     for id4, source_info in peers_get_config().iteritems():
106         rawin = source_info.get('in', None)
107         if not rawin:
108             continue
109         if args == rawin[:len(args)]:
110             newmatch = [id4] + [rawin[i] for i in range(len(args), len(rawin))]
111             result.append(newmatch)
112     return result
113         
114