2 个不稳定版本

0.2.0 2022 年 12 月 31 日
0.1.0 2021 年 11 月 14 日

#29 in #套接字

GPL-3.0-or-later

225KB
7.5K SLoC

CNSPRCY (alpha)

CNSPRCY 是一个守护进程,它连接您的个人计算设备(即台式机、笔记本电脑和手机,但不包括可穿戴设备)。通过不断尝试建立并维护设备之间的连接,它可以为需要在不同设备之间交换数据的程序和脚本提供信息中心。此外,如果不需要专用连接,消息可以直接通过协议发送,在接收设备上调用脚本(称为“事件处理器”)。

相同的守护进程在每个设备上运行,操作一个完全去中心化的网状网络,使用八卦式事件传播来减少和均衡设备间的负载。它始终知道所有对等体的状态(即它们是否可访问),并通过 UNIX 套接字公开这些信息,包括可用时的 IP 地址和延迟。此套接字可以直接使用 JSON 查询,或通过提供的 CLI 应用程序进行查询。

由于并非所有应用程序和脚本都需要打开专用连接,因此 CNSPRCY 也使设备之间的消息发送变得简单。消息是协议的一部分,并通过守护进程已经维护的连接发送 - 因此它们也使用 ChaCha20-Poly1305 密码套件加密和验证。在接收设备上,使用消息内容和发送者调用一个脚本。为了确定调用哪个脚本(显然它也可能是二进制文件),每个消息都包含一个用户定义的标签,该标签映射到处理器目录中的目录结构和文件名。有关更多信息,请参阅 event_handlers.md

CNSPRCY 旨在针对 (最近的) Linux 发行版。它完全使用 (异步) Rust 编写,使用 Tokio 运行时。它的主要灵感来自 serf “服务编排和管理工具”,并试图将其从数据中心/服务器环境带到个人计算机环境。

当前状态

这个Rust库实现了名为cnspr的二进制文件,它与serf二进制文件非常相似,既可以作为守护进程(./cnspr serve),也可以作为查询它的客户端(请参阅./cnspr help)。
目前,CNSPRCY是alpha质量的软件,虽然守护进程的底层协议和架构已经相当完善,但仍有几个重要功能缺失。

其中之一是与系统服务(如NetworkManager)的集成,以便在接口可用时自动开始监听网络接口。这对于像笔记本电脑和手机这样的设备至关重要,因为这些设备的连接性不断变化。
此外,还缺少一种机制,让设备能够在同一局域网中相互发现。这将以Syncthing的方式实现,主要使用IP多播协议(如SSDP),也许最终会使用全球的“rendezvous”服务器。

最终一致性的分布式数据存储

然而,目前最缺失的重要功能是一个持久、最终一致性的分布式数据存储。最初,计划在CNSPRCY消息协议更加完善时,在这个组件的“上层”构建这个组件,但现在已经很清楚,这两个组件过于紧密耦合;数据存储是CNSPRCY的一部分,而不是它的扩展。CNSPRCY协议需要这个持久数据存储来高效地传播信息,而数据存储反过来又需要紧密集成到CNSPRCY中。

仅从名称来看可能并不明显,但这个功能的承诺远不止“高效传播信息”:有了在所有电脑之间始终同步的数据库,就不再需要“云”软件了!

通过将此数据存储暴露给其他应用程序,CNSPRCY提供了创建出色的“离线优先”应用程序的关键成分,这些应用程序按其应有的方式工作:无论你使用哪台电脑,当互联网断开时,一切都不会立即崩溃,你的数据不会被挖掘、分析、出售或勒索。

依赖项

~20–33MB
~507K SLoC