aboutsummaryrefslogtreecommitdiffstats
path: root/debian/lib/python/debian_linux/firmware.py
blob: 35770c2e0b32bd48fb0008f86329dc60d14cc97c (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
import re

class FirmwareFile(object):
    def __init__(self, binary, desc=None, source=None, version=None):
        self.binary = binary
        self.desc = desc
        self.source = source
        self.version = version

class FirmwareSection(object):
    def __init__(self, driver, files, licence):
        self.driver = driver
        self.files = files
        self.licence = licence

class FirmwareWhence(list):
    def __init__(self, file):
        self.read(file)

    def read(self, file):
        in_header = True
        driver = None
        files = {}
        licence = None
        binary = None
        desc = None
        source = []
        version = None

        for line in file:
            if line.startswith('----------'):
                if in_header:
                    in_header = False
                else:
                    # Finish old section
                    if driver:
                        self.append(FirmwareSection(driver, files, licence))
                    driver = None
                    files = {}
                    licence = None
                continue

            if in_header:
                continue

            if line == '\n':
                # End of field; end of file fields
                if binary:
                    files[binary] = FirmwareFile(binary, desc, source, version)
                binary = None
                desc = None
                source = []
                version = None
                continue

            match = re.match(
                r'(Driver|File|Info|Licen[cs]e|Source|Version'
                r'|Original licen[cs]e info(?:rmation)?):\s*(.*)\n',
                line)
            if match:
                keyword, value = match.group(1, 2)
                if keyword == 'Driver':
                    driver = value.split(' ')[0].lower()
                elif keyword == 'File':
                    match = re.match(r'(\S+)(?:\s+--\s+(.*))?', value)
                    binary = match.group(1)
                    desc = match.group(2)
                elif keyword in ['Info', 'Version']:
                    version = value
                elif keyword == 'Source':
                    source.append(value)
                else:
                    licence = value
            elif licence is not None:
                licence = (licence + '\n' +
                           re.sub(r'^(?:[/ ]\*| \*/)?\s*(.*?)\s*$', r'\1', line))

        # Finish last section if non-empty
        if binary:
            files[binary] = FirmwareFile(binary, desc, source, version)
        if driver:
            self.append(FirmwareSection(driver, files, licence))