1 Диаграмма
Лопатин Михаил Евгеньевич edited this page 2026-10-15 13:29:40 +00:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

flowchart TB
    %% ==================== ВХОДЫ ====================
    subgraph INPUTS["📥 Входные данные"]
        direction TB
        YML["hosts.yml<br/><i>Ansible YAML</i>"]
        INI["hosts.ini<br/><i>Ansible INI</i>"]
        EXC["etc/exclude-ips.txt<br/><i>чёрный список IP</i>"]
        UNR["etc/unresolvable.txt<br/><i>имя + IP без DNS</i>"]
    end

    %% ==================== ОРКЕСТРАТОР ====================
    ORCH["🎛️ bin/gen-inventory.sh<br/><i>оркестратор</i><br/>flock · trap · цвета · тайминги"]

    %% ==================== МОДУЛЬ 1 ====================
    subgraph M1["① extract_hosts.py"]
        direction TB
        M1_PARSE["Парсер<br/>YAML / INI"]
        M1_EXPAND["Разворот диапазонов<br/>192.168.0.[10:20]"]
        M1_EXCL["Фильтр exclude-ips"]
        M1_UNR["Добавление unresolvable<br/><i>forced = true</i>"]
    end

    %% ==================== МОДУЛЬ 2 ====================
    subgraph M2["② check_ports.py"]
        direction TB
        M2_TCP["Параллельный TCP-connect<br/>workers=40 · timeout=5s"]
        M2_PTR["PTR для IP-целей<br/><i>--no-ptr отключает</i>"]
        M2_NOPTR["Список IP без PTR"]
    end

    %% ==================== МОДУЛЬ 3 ====================
    subgraph M3["③ filter_records.py"]
        direction TB
        M3_MATCH["Сопоставление<br/>resolver ↔ hints"]
        M3_INC["--include<br/>оставить совпавшие"]
        M3_EXC["--exclude<br/>выкинуть совпавшие"]
        M3_EXCH["--exclude-ips-hosts<br/><i>применяется и к forced</i>"]
        M3_NAME["Определение итогового имени<br/>hint.hostname → PTR → target"]
    end

    %% ==================== МОДУЛЬ 4 ====================
    subgraph M4["④ compose_inventory.py"]
        direction TB
        M4_UPD["Обновить last_online<br/>для online"]
        M4_PRUNE["Удалить устаревшие<br/>delete-older = 90 дней"]
        M4_MERGE["Слить online ∪ кэш"]
        M4_GROUP["Группировка + дедуп<br/>по имени в группе"]
        M4_WRITE["Запись hosts.ini"]
    end

    %% ==================== ПРОМЕЖУТОЧНЫЕ ФАЙЛЫ ====================
    subgraph RUN["🗂️ run/ — промежуточные файлы"]
        T_TARGETS["targets.txt<br/><i>плоский список целей</i>"]
        T_HINTS["hints.json<br/><i>{target: {type, hostname,<br/>forced, entries}}</i>"]
        T_RESOLVER["resolver.jsonl<br/><i>{name, ip, status, details}</i>"]
        T_FILTERED["filtered.jsonl<br/><i>+ entries, forced</i>"]
        T_NOPTR["online_no_ptr.txt<br/><i>IP без PTR</i>"]
    end

    %% ==================== ВЫХОД ====================
    subgraph OUTPUTS["📤 Результат"]
        OUT_INI["hosts.ini<br/><i>Ansible inventory</i>"]
        OUT_CACHE["hosts.ini.cache.json<br/><i>{target: {name, ip, last_online}}</i>"]
        OUT_BAK["hosts.ini.TIMESTAMP<br/><i>при --backup</i>"]
    end

    %% ==================== СЕТИ ====================
    NET_TARGETS["🌐 Целевая сеть<br/><i>TCP :22</i>"]
    NET_DNS["🌐 DNS<br/><i>PTR-запросы</i>"]

    %% ==================== ПОТОК ДАННЫХ ====================
    ORCH -.->|шаг 1| M1
    ORCH -.->|шаг 2| M2
    ORCH -.->|шаг 3| M3
    ORCH -.->|шаг 4| M4

    YML --> M1_PARSE
    INI --> M1_PARSE
    EXC --> M1_EXCL
    UNR --> M1_UNR

    M1_PARSE --> M1_EXPAND --> M1_EXCL --> M1_UNR
    M1_UNR --> T_TARGETS
    M1_UNR --> T_HINTS

    T_TARGETS --> M2_TCP
    M2_TCP -->|открыт порт| M2_PTR
    M2_TCP -->|refused| M2_PTR
    M2_TCP -->|timeout| T_RESOLVER
    M2_PTR -->|online + нет PTR| M2_NOPTR
    M2_PTR --> T_RESOLVER
    M2_NOPTR --> T_NOPTR
    M2_TCP -.-> NET_TARGETS
    M2_PTR -.-> NET_DNS

    T_RESOLVER --> M3_MATCH
    T_HINTS --> M3_MATCH
    M3_MATCH --> M3_NAME --> M3_INC --> M3_EXC --> M3_EXCH
    M3_EXCH --> T_FILTERED

    T_FILTERED --> M4_UPD --> M4_PRUNE --> M4_MERGE --> M4_GROUP --> M4_WRITE
    OUT_CACHE <-.->|загрузка/сохранение| M4_UPD
    OUT_CACHE <-.->|загрузка| M4_MERGE
    M4_PRUNE -.-> OUT_CACHE
    M4_WRITE --> OUT_INI
    M4_WRITE -->|--backup| OUT_BAK

    %% ==================== СТИЛИ ====================
    classDef inputNode fill:#e3f2fd,stroke:#1976d2,stroke-width:2px,color:#000
    classDef orchNode fill:#fff3e0,stroke:#f57c00,stroke-width:3px,color:#000
    classDef moduleNode fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px,color:#000
    classDef fileNode fill:#e8f5e9,stroke:#388e3c,stroke-width:1px,color:#000
    classDef outNode fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px,color:#000
    classDef netNode fill:#ffebee,stroke:#c62828,stroke-width:1px,color:#000
    classDef subGraphStyle fill:#fafafa,stroke:#9e9e9e,stroke-dasharray:5 5

    class YML,INI,EXC,UNR inputNode
    class ORCH orchNode
    class M1_PARSE,M1_EXPAND,M1_EXCL,M1_UNR,M2_TCP,M2_PTR,M2_NOPTR,M3_MATCH,M3_INC,M3_EXC,M3_EXCH,M3_NAME,M4_UPD,M4_PRUNE,M4_MERGE,M4_GROUP,M4_WRITE moduleNode
    class T_TARGETS,T_HINTS,T_RESOLVER,T_FILTERED,T_NOPTR fileNode
    class OUT_INI,OUT_CACHE,OUT_BAK outNode
    class NET_TARGETS,NET_DNS netNode

    class INPUTS,RUN,OUTPUTS subGraphStyle