import pathlib import subprocess import threading from collections import defaultdict from itertools import islice from typing import Dict, Optional, Set, Tuple, Iterable, List, Iterator from ipsiblings import logsetup from ipsiblings.evaluation.keyscan.property import KeyscanResult from ipsiblings.model import const log = logsetup.get_root_logger() class KeyscanProcessHandler: """ Handles ssh-keyscan interaction for a single process. """ def __init__(self, cwd: pathlib.Path, ip_version: int, timeout: int): self._cwd = cwd self.ip_version = ip_version self.timeout = timeout self.results: Dict[str, KeyscanResult] = {} self.thread: Optional[threading.Thread] = None self.failed = False def start(self, in_addrs: Set[str]): if not in_addrs: log.info(f'No input addresses for keyscan {self.ip_version}, skipping.') return
import contextlib import csv import pathlib from typing import Dict from ipsiblings.evaluation.model import SiblingStatus from ipsiblings.evaluation.stats.model import Stats, CrossStats from ipsiblings.logsetup import get_root_logger from ipsiblings.model.const import EvaluatorChoice log = get_root_logger() FIL_SIBLINGS = 'siblings.st.tsv' FIL_STARKE_SIBLINGS = 'starke-siblings.st.tsv' FIL_MULTI_SIBLINGS = 'multi-siblings.st.tsv' FIL_STATUSES = 'classifications.sum.st.tsv' FIL_CROSS_STATS = 'cross-stats.sum.st.tsv' FIL_PEER_STATS_4 = 'peer-stats.v4.st.tsv' FIL_PEER_STATS_6 = 'peer-stats.v6.st.tsv' COL_SIBLINGS_4 = 'ip4' COL_SIBLINGS_6 = 'ip6' COLS_SIBLINGS = [COL_SIBLINGS_4, COL_SIBLINGS_6] COL_STATUS_KEY = 'evaluator' COLS_STATUSES = [COL_STATUS_KEY] + [c.name for c in SiblingStatus] COL_CS_KEY = 'algorithm' COLPFX_CS_POSITIVE = 'pos_' COLPFX_CS_NEGATIVE = 'neg_' COLIFX_CS_TRUE_STATUS = 'was_'