如何扩展 Scanopy:自定义服务发现与插件开发完整指南 如何扩展 Scanopy自定义服务发现与插件开发完整指南【免费下载链接】scanopyNetwork diagrams that update themselves项目地址: https://gitcode.com/gh_mirrors/ne/scanopyScanopy 是一款自动网络拓扑发现工具能定时扫描你的网络并生成持续更新的网络文档。当默认的 230 多种服务定义无法覆盖你环境中的设备时你可以通过扩展 Scanopy 来实现自定义服务发现从最轻量的“服务定义插件”新增一个被识别的服务到更深层的“发现集成插件”接入 Docker、SNMP、UniFi 之外的新数据源。本文带你分两步走通这两条插件开发路径。一、扩展前先了解Scanopy 的服务发现架构Scanopy 采用「服务端 守护进程」的双组件架构二者的扩展点不同组件位置职责服务端backend/src/server/服务定义注册、扫描结果的存储与拓扑计算守护进程backend/src/daemon/discovery/真正执行网络扫描、端口探测与集成采集好消息是绝大多数“扩展需求”识别一个新服务、新设备都只需要改服务端的服务定义一行注册即可生效无需编译守护进程、无需写复杂的网络代码。只有当你需要接入全新协议的数据源比如某个厂商的管理 API才需要开发第二层——发现集成。二、插件路径一添加自定义服务定义推荐新手服务定义是官方推荐的第一个贡献方向位于 contributing.md 的 “Adding Service Definitions” 章节也是社区贡献最集中的地方。2.1 第一步创建服务定义文件服务定义集中存放于backend/src/server/services/definitions/目录该目录下已有 257 个现成定义如home_assistant.rs、plex.rs可作模板。新建一个以你的服务命名的文件例如myapp.rs核心是四件事命名、分类、声明“怎么发现它”最后注册#[derive(Default, Clone, Eq, PartialEq, Hash)] pub struct MyApp; impl ServiceDefinition for MyApp { fn name(self) - static str { MyApp } fn description(self) - static str { My custom app } fn category(self) - ServiceCategory { ServiceCategory::Web } fn discovery_pattern(self) - Pattern_ { Pattern::Endpoint(PortBase::Http, /health, MyApp) } } // 这一行宏让服务进入自动发现注册表 inventory::submit!(ServiceDefinitionFactory::new(create_service::MyApp));随后在backend/src/server/services/definitions/mod.rs中登记pub mod myapp;就完成了整个插件开发。2.2 挑选合适的发现模式discovery_pattern决定识别精度官方支持的组合方式如下Endpoint首选探测某 HTTP 路径并检查响应内容信号最强适合有 Web 界面的服务Port仅按端口匹配适合无 Web 接口的服务如数据库、缓存自定义端口用PortBase::new_tcp(6379)这类写法AnyOf / AllOf / Not逻辑组合多个条件避免误报例如“某端口开放且页面含服务名”特殊模式IsGateway主机是网关、MacVendor按 MAC 厂商识别设备、SubnetIsType限定子网类型可用来精确锁定物理设备。 经验之谈短服务名容易误匹配如 “Plex” 会出现在单词 “Complex” 中建议 Endpoint 匹配用特征短语再叠加一个端口条件保险。2.3 可选增强图标与分类定义中还可通过dashboard_icons_path/logo_url为服务配图标is_generic标记通用型服务。如果现有分类不合适分类枚举在backend/src/server/services/types/categories.rs中可扩展。三、插件路径二开发新的发现集成进阶当你要让 Scanopy 从新协议源不只是端口扫描拉取数据——例如像 Docker、Podman、SNMP、UniFi 那样的集成——需要实现DiscoveryIntegrationtrait其源码位于backend/src/daemon/discovery/integration/mod.rs。所有集成遵循统一的三段式流程见该文件头部注释probe()—— 用给定凭据探测目标是否响应成功结果还会反哺服务匹配凭据匹配—— 管线按凭据映射自动分发编排器中没有任何集成专属代码execute()—— 采集数据丰富主机信息或创建新实体。你要实现的核心方法只有四个credential_type()声明处理哪种凭据类型凭据类型定义在backend/src/daemon/discovery/credentials.rsestimated_seconds()/timeout()供进度估算与超时控制probe()与execute()实际的探测与采集逻辑。调度逻辑由backend/src/daemon/discovery/integration/dispatch.rs统一处理对每个 IP 逐一尝试凭据失败会被自动分类并转化为扫描警告凭据问题会在 UI 中清晰呈现。参考实现可直接研读integration/snmp/SNMP 会话、OID 查询拆分清晰或integration/docker/目录。四、搭建开发环境并验证你的插件开发环境搭建指南在 contributing.md 中要点如下克隆仓库git clone https://gitcode.com/gh_mirrors/ne/netvisor安装依赖Linux 执行make install-dev-linuxmacOS 执行make install-dev-mac需 Rust、Node.js 20、PostgreSQL 17初始化数据库make setup-db启动本地开发环境热重载make dev-server # 终端 1服务端 make dev-ui # 终端 2前端界面 make dev-daemon # 终端 3守护进程集成插件才需要触发一次网络扫描后在 UI 的服务列表与拓扑视图中确认你的新服务出现即代表自定义服务发现生效。若贡献给社区记得按贡献指南补充测试并提交。五、小结两种扩展方式怎么选想让 Scanopy 认出某个服务/设备→ 写一个服务定义文件第二节改动小、见效快是新手第一插件的最佳起点想让 Scanopy 对接新的数据源协议→ 实现DiscoveryIntegrationtrait第三节深入守护进程扫描管线。无论是哪种路径Scanopy 的注册表机制inventory宏 trait 分发都保证了新插件“放入即生效”无需改动核心编排代码。输出文章【免费下载链接】scanopyNetwork diagrams that update themselves项目地址: https://gitcode.com/gh_mirrors/ne/scanopy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考