File: net_remap.py

package info (click to toggle)
oarc-dsc-datatool 1.4.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 492 kB
  • sloc: python: 1,151; xml: 859; sh: 125; makefile: 4
file content (77 lines) | stat: -rw-r--r-- 2,079 bytes parent folder | download
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
"""dsc_datatool.transformer.net_remap

See `man dsc-datatool-transformer netremap`.

Part of dsc_datatool.

:copyright: 2024 OARC, Inc.
"""

import ipaddress

from dsc_datatool import Transformer, args


class NetRemap(Transformer):
    v4net = None
    v6net = None
    nonstrict = False


    def __init__(self, opts):
        Transformer.__init__(self, opts)
        net = opts.get('net', None)
        self.v4net = opts.get('v4net', net)
        self.v6net = opts.get('v6net', net)

        if not self.v4net:
            raise Exception('v4net (or net) must be given')
        if not self.v6net:
            raise Exception('v6net (or net) must be given')

        if opts.get('nonstrict', False):
            self.nonstrict = True


    def _process(self, dimension):
        if not dimension.values:
            for d2 in dimension.dimensions:
                self._process(d2)
            return

        values = dimension.values
        dimension.values = {}

        for k, v in values.items():
            if k == args.skipped_key:
                continue
            elif k == args.skipped_sum_key:
                dimension.values['0'] = v
                continue

            try:
                ip = ipaddress.ip_address(k)
            except Exception as e:
                if not self.nonstrict:
                    raise e
                continue
            if ip.version == 4:
                nkey = str(ipaddress.IPv4Network('%s/%s' % (ip, self.v4net), strict=False).network_address)
            else:
                nkey = str(ipaddress.IPv6Network('%s/%s' % (ip, self.v6net), strict=False).network_address)

            if not nkey in dimension.values:
                dimension.values[nkey] = v
            else:
                dimension.values[nkey] += v


    def process(self, datasets):
        for dataset in datasets:
            for dimension in dataset.dimensions:
                self._process(dimension)


import sys
if sys.version_info[0] == 3 and sys.version_info[1] == 5: # pragma: no cover
    Transformer.__init_subclass__(NetRemap)