Base Crawler¶
pcapkit.vendor.default contains Vendor
only, which is the base meta class for all vendor crawlers.
- class pcapkit.vendor.default.Vendor[source]¶
Bases:
objectDefault vendor generator.
Inherit this class with
FLAG&LINKattributes, etc., to implement a new vendor generator.- rename(name, code, *, original=None)[source]¶
Rename duplicated fields.
- Parameters:
- Return type:
- Returns:
Revised field name.
Example
If
namehas multiple occurrences in the source registry, the field name will be sanitised as${name}_${code}.Otherwise, the plain
namewill be returned.
- _request()[source]¶
Fetch CSV data from
LINK.This is the low-level call of
request().If
LINKisNone, it will directly call the upper methodrequest()with NO arguments.The method will first try to GET the content of
LINK. Should any exception raised, it will first try with proxy settings fromget_proxies().Note
Since some
LINKlinks are from Wikipedia, etc., they might not be available in certain areas, e.g. the amazing PRC :)Would proxies failed again, it will prompt for user intervention, i.e. it will use
webbrowser.open()to open the page in browser for you, and you can manually load that page and save the HTML source at the location it provides.That last resort is only taken when somebody can actually act on it, i.e. when
PCAPKIT_CI_MODEis unset andstdin_is_interactive()finds a terminal. A non-interactive run – under a pipe, in a container, from a scheduled job – is failed with the fetch error instead, the same wayPCAPKIT_CI_MODEfails it, rather than printing instructions nobody will read. See #522.- Return type:
- Returns:
CSV data.
- Raises:
requests.RequestException – If the registry could not be fetched and manual intervention is unavailable, i.e. under
PCAPKIT_CI_MODE, with no interactivestdin, or where the prompt itself fails becausestdinwent away mid-wait.- Warns:
VendorRequestWarning – If connection failed with and/or without proxies.
See also
- _dest_path()[source]¶
Resolve the
const/file this crawler’s module mirrors.__module__sits somewhere under thepcapkit.vendorpackage – today always exactly one level down, e.g.pcapkit.vendor.reg.apptype, but #732 needs deeper nesting such aspcapkit.vendor.reg.apptype.tcp. The output file mirrors that same position, whatever its depth, underpcapkit.constinstead.This used to split the module’s absolute path into exactly two levels (
ROOT, STEM = os.path.split(temp)) and assume the second was always the module’s one-and-only position undervendor/. That holds for the flatvendor/<stem>/<file>.pylayout every crawler has today, but breaks for any deeper nesting – e.g.vendor/reg/apptype/tcp.pyresolved tovendor/const/apptype/tcp.py, insidevendor/itself rather than underpcapkit/const/at all.Anchoring on the
vendorpackage’s own__file__instead of a fixed split count handles arbitrary nesting: whatever path a module sits at relative tovendor/, the same relative path is mirrored underconst/, which also happens to be what the flat case already did – so every crawler that exists today keeps writing to exactly the file it writes to now.pcapkit.vendoris imported here, inside the method, rather than at module scope: it imports this module while it is still initialising (seepcapkit/vendor/__init__.py), so a module-level import would have to reason about that partial state. By the time any concreteVendorsubclass is instantiated,pcapkit.vendorhas always finished importing.That relative-path mirroring is only safe once the module is confirmed to actually sit under
vendor_root–const/andvendor/are siblings at equal depth, so for a modulemthat is not undervendor_root,os.path.relpath(m, vendor_root)starts with enough..segments that re-joining them underconst_rootcancels back out tomitself. That is reachable: every crawler endssys.exit(SomeCrawler()), so running one from a second checkout, or from a module that never sits undervendor/at all, resolvespcapkit.vendorfrom wherever it is installed whileinspect.getfile(type(self))names a file elsewhere entirely – andVendor.__init__then opens that path with'w', silently truncating whatever__module__actually names instead of raising. So the escape is rejected outright, rather than trusted to produce a harmless-looking wrong path.- Return type:
- Returns:
Absolute path of the constant module this crawler should write.
- Raises:
VendorPathNotFound – If this crawler’s own module is not located under the
pcapkit.vendorpackage root, so mirroring it underpcapkit.constcannot be done safely.
Internal Definitions¶
- class pcapkit.vendor.default.VendorMeta(name, bases, namespace, /, **kwargs)[source]¶
Bases:
ABCMetaMeta class to add dynamic support to
Vendor.This meta class is used to generate necessary attributes for the
Vendorclass. It can be useful to reduce unnecessary registry calls and simplify the customisation process.
- pcapkit.vendor.default.LINE(NAME, DOCS, FLAG, ENUM, MISS, MODL)¶
Default constant template of enumeration registry from IANA CSV.
- Parameters:
NAME (str) – name of the constant enumeration class
DOCS (str) – docstring for the constant enumeration class
FLAG (str) – threshold value validator (range of valid values)
ENUM (str) – enumeration data (class attributes)
MISS (str) – missing value handler (default value)
MODL (str) – module name of the constant enumeration class
- Return type:
- pcapkit.vendor.default.get_proxies()[source]¶
Get proxy for blocked sites.
The function will read
PCAPKIT_HTTP_PROXYandPCAPKIT_HTTPS_PROXY, if any, for the proxy settings ofrequests.