#!/usr/bin/env python3
+# © Copyright 2021-2022, Scott Gasch
+
"""A caching layer around the kernel's network mapping between IPs and MACs"""
cfg.add_argument(
'--arper_cache_max_staleness',
type=argparse_utils.valid_duration,
- default=datetime.timedelta(seconds=60 * 15),
+ default=datetime.timedelta(seconds=60 * 30),
metavar='DURATION',
help='Max acceptable age of the kernel arp table cache',
)
@persistent.persistent_autoloaded_singleton() # type: ignore
class Arper(persistent.Persistent):
+ """A caching layer around the kernel's network mapping between IPs and
+ MACs. This class restores persisted state that expires
+ periodically (see --arper_cache_max_staleness) at program startup
+ time. If it's unable to use the file's contents, it queries the
+ kernel (via arp) and uses an auxillary utility called arp-scan to
+ query the network. If it has to do this there's a latency hit but
+ it persists the collected data in the cache file. Either way, the
+ class behaves as a global singleton hosting this data thereafter.
+
+ """
+
def __init__(
self,
cached_local_state: Optional[BiDict] = None,
@classmethod
def load_state(
- cls,
- cache_file: str,
- freshness_threshold_sec: int,
- state: BiDict,
+ cls,
+ cache_file: str,
+ freshness_threshold_sec: int,
+ state: BiDict,
):
if not file_utils.file_is_readable(cache_file):
logger.debug('Can\'t read %s', cache_file)