Source code for pcapkit.vendor.reg.linktype
# -*- coding: utf-8 -*-
"""Link-Layer Header Type Values
===================================
.. module:: pcapkit.vendor.reg.linktype
This module contains the vendor crawler for **Link-Layer Header Type Values**,
which is automatically generating :class:`pcapkit.const.reg.linktype.LinkType`.
"""
import collections
import re
import sys
from typing import TYPE_CHECKING
import bs4
from pcapkit.vendor.default import Vendor
if TYPE_CHECKING:
from collections import Counter
from bs4.element import Tag
__all__ = ['LinkType']
[docs]
class LinkType(Vendor):
"""Link-Layer Header Type Values"""
#: Value limit checker.
FLAG = 'isinstance(value, int) and 0x00000000 <= value <= 0xFFFFFFFF'
#: Link to registry.
LINK = 'http://www.tcpdump.org/linktypes.html'
def count(self, data: 'list[str]') -> 'Counter[str]':
"""Count field records."""
return collections.Counter()
def request(self, text: 'str') -> 'list[Tag]': # type: ignore[override] # pylint: disable=signature-differs
"""Fetch registry table.
Args:
text: Context from :attr:`~LinkType.LINK`.
Returns:
Rows (``tr``) from registry table (``table``).
"""
soup = bs4.BeautifulSoup(text, 'html5lib')
table = soup.select('table.linktypedlt')[0]
return table.select('tr')[1:]
def process(self, data: 'list[Tag]') -> 'tuple[list[str], list[str]]':
"""Process registry data.
Args:
data: Registry data.
Returns:
Enumeration fields and missing fields.
"""
enum = [] # type: list[str]
miss = [
"return extend_enum(cls, 'Unassigned_%d' % value, value)",
]
for content in data:
name = content.select('td.symbol')[0].text.strip()[9:].strip()
temp = content.select('td.number')[0].text.strip()
desc = content.select('td.symbol')[1].text.strip()
cmmt = re.sub(r'\s+', ' ', content.select('td')[3].text.strip()).replace("''", '``').replace('_', r'\_')
if not name:
name = desc[4:]
try:
code, _ = temp, int(temp)
pres = f"{name} = {code}"
if desc:
sufs = "#: %s" % self.wrap_comment(f"[``{desc}``] {cmmt}") # pylint: disable=consider-using-f-string
else:
sufs = "#: %s" % self.wrap_comment(cmmt)
# if len(pres) > 74:
# sufs = f"\n{' '*80}{sufs}"
# enum.append(f'{pres.ljust(76)}{sufs}')
enum.append(f'{sufs}\n {pres}')
except ValueError:
start, stop = map(int, temp.split('–'))
for code in range(start, stop+1):
name = f'USER{code-start}'
desc = f'DLT_USER{code-start}'
pres = f"{name} = {code}"
sufs = "#: %s" % self.wrap_comment(f"[``{desc}``] {cmmt}") # pylint: disable=consider-using-f-string
# if len(pres) > 74:
# sufs = f"\n{' '*80}{sufs}"
# enum.append(f'{pres.ljust(76)}{sufs}')
enum.append(f'{sufs}\n {pres}')
return enum, miss
if __name__ == '__main__':
sys.exit(LinkType()) # type: ignore[arg-type]