From nobody Sat Feb 25 14:26:39 2023 X-Original-To: dev-commits-ports-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4PP8G74sL2z3tDnn; Sat, 25 Feb 2023 14:26:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4PP8G74SlPz4d0y; Sat, 25 Feb 2023 14:26:39 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1677335199; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=aSjQxwO2jGbEAQ4l2AwYq5yGjSCUGIEoaYsSVeiZdxc=; b=y2SdF3sVSjMa/Q+O2komf9aEqQF7RHMx+np1/kujC//YJPyX4y0En9NirC3QBN16M5ye3d 3cvnEfCMNJ+9zXigFpVMHoq/fZxUcnrNU2JNJ+Yfb6keo+GoSkN7+Q7nnd71EMOmgEk9qN tE84QhRH/icgeYnOCmh1xTI4OK0hvb0uS84t0j2p5pDkKrNqPOZy3YwqFLpPrQ4/WRXhOu LkevvLvMW6DFKiVN1ZkSgR7MleuRJ0lWE48kJIzVQ/31RfwkPiFmYB5+ok1Dav3lUYe0Mu 4SiqSvDu8VDd1+ooit7YJHj4PJcrN55+pQaUvb53lE44d4WiBO/CIlmOiAtNaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1677335199; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=aSjQxwO2jGbEAQ4l2AwYq5yGjSCUGIEoaYsSVeiZdxc=; b=ZRZHOBGBpUcpBDF0BZ9L9zmkanj/x9bqVtRI7mMNBOX54u2QynKt1T8JxD9g0tPPlvpqY8 Oli/cZtjcpv/kPdwFZX9NbHoVtQ6MSpplt+dJU4+Z0gTUmoCTZCrNFEXBTyKrAg6oKSt8t IGVqbuY5jNAcEOuJLTrJXxEOHz33ARJ27w4ZxZzSvERu/fjlNIfdWEAp76w383HYqLc1XK Yw84Sz1U+sXgZVL91UIrEIQtJibkELWv7tsFNcQdVC0JdiWjw0AB/RzQXUMBRYYCVHWnNW /jPBC5cCrjBkRNzRDPpdRBLVEb9mK88XTjmZcfwUxsgKyWXfrVULDKt9kNNZbg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1677335199; a=rsa-sha256; cv=none; b=jvWBsvUkz3gU+UdV/7f++hYUTw+OVmiVx9txpqinZujIOtnJydPjY1tHpQSroa5De1WYOW R3WomwjvY1jRDpIB4HiIUuhjqoUmUJatVzS6RgkvLiXiVjfLulVV9LKBN2TpO2eM9ULV0i nNXUOKeQGT8zsjT8qKfcuk6nItRC9AbaKF4WbugadzYGGHhW/Yzwa/RcRj3k54Y/7zoVWm FHEPoJQ+BOHs64c72m9ifR7aAtHY80Y4t11zCBA+o0gI+FTF6hQFkPhaJiFcOySUhya4xh P4/S1luI9bpiO8FaN+tk1c7Tw68JLV/XFUzec4awpsC7pYQECUGBtn6lrWGdgA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4PP8G73KH0z16VR; Sat, 25 Feb 2023 14:26:39 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 31PEQdPo070337; Sat, 25 Feb 2023 14:26:39 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 31PEQdZ4070336; Sat, 25 Feb 2023 14:26:39 GMT (envelope-from git) Date: Sat, 25 Feb 2023 14:26:39 GMT Message-Id: <202302251426.31PEQdZ4070336@gitrepo.freebsd.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org From: Carlo Strub Subject: git: d4bd29fc009f - main - net-p2p/reticulum: Self-configuring, encrypted and resilient mesh networking stack List-Id: Commits to the main branch of the FreeBSD ports repository List-Archive: https://lists.freebsd.org/archives/dev-commits-ports-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-ports-main@freebsd.org X-BeenThere: dev-commits-ports-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: cs X-Git-Repository: ports X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: d4bd29fc009f1b7e72802e183bf8e6208fdd41aa Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by cs: URL: https://cgit.FreeBSD.org/ports/commit/?id=d4bd29fc009f1b7e72802e183bf8e6208fdd41aa commit d4bd29fc009f1b7e72802e183bf8e6208fdd41aa Author: Carlo Strub AuthorDate: 2023-02-25 14:24:18 +0000 Commit: Carlo Strub CommitDate: 2023-02-25 14:24:18 +0000 net-p2p/reticulum: Self-configuring, encrypted and resilient mesh networking stack --- GIDs | 2 +- UIDs | 2 +- net-p2p/Makefile | 1 + net-p2p/reticulum/Makefile | 31 ++ net-p2p/reticulum/distinfo | 3 + net-p2p/reticulum/files/config.sample | 342 +++++++++++++++++++++ net-p2p/reticulum/files/patch-RNS_Reticulum.py | 105 +++++++ .../reticulum/files/patch-RNS_Utilities_rnsd.py | 12 + net-p2p/reticulum/files/reticulum.in | 39 +++ net-p2p/reticulum/pkg-descr | 4 + net-p2p/reticulum/pkg-plist | 239 ++++++++++++++ 11 files changed, 778 insertions(+), 2 deletions(-) diff --git a/GIDs b/GIDs index 4b5cb168fbc5..c6882f3386e8 100644 --- a/GIDs +++ b/GIDs @@ -267,7 +267,7 @@ hedgedoc:*:317: # free: 324 dkfilter:*:325: smfs:*:326: -# free: 327 +_reticulum:*:327: # free: 328 # free: 329 orthanc:*:330: diff --git a/UIDs b/UIDs index c2ecbb8c766b..7326744a45a4 100644 --- a/UIDs +++ b/UIDs @@ -272,7 +272,7 @@ icingadirector:*:318:183::0:0:icingadirector user:/nonexistent:/usr/sbin/nologin # free: 324 dkfilter:*:325:325::0:0:DK Filter Owner:/nonexistent:/usr/sbin/nologin smfs:*:326:326::0:0:SMFSAV Owner:/nonexistent:/usr/sbin/nologin -# free: 327 +_reticulum:*:327:327::0:0:Reticulum Daemon:/nonexistent:/usr/sbin/nologin # free: 328 # free: 329 orthanc:*:330:330::0:0:Orthanc Daemon:/nonexistent:/usr/sbin/nologin diff --git a/net-p2p/Makefile b/net-p2p/Makefile index a41e3fccd086..ae05f1de3307 100644 --- a/net-p2p/Makefile +++ b/net-p2p/Makefile @@ -86,6 +86,7 @@ SUBDIR += qtum SUBDIR += radarr SUBDIR += readarr + SUBDIR += reticulum SUBDIR += retroshare SUBDIR += rslsync SUBDIR += rtorrent diff --git a/net-p2p/reticulum/Makefile b/net-p2p/reticulum/Makefile new file mode 100644 index 000000000000..04db957b30f5 --- /dev/null +++ b/net-p2p/reticulum/Makefile @@ -0,0 +1,31 @@ +PORTNAME= reticulum +DISTVERSION= 0.4.9 +CATEGORIES= net-p2p +MASTER_SITES= PYPI +DISTNAME= rns-${DISTVERSION} + +MAINTAINER= cs@FreeBSD.org +COMMENT= Self-configuring, encrypted and resilient mesh networking stack +WWW= https://reticulum.network/ + +LICENSE= MIT + +RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}netifaces>=0:net/py-netifaces@${PY_FLAVOR} + +USES= python:3.4+ +USE_PYTHON= distutils +USE_RC_SUBR= reticulum +GROUPS= _reticulum +USERS= _reticulum +SUB_LIST= USERS="${USERS}" \ + GROUPS="${GROUPS}" \ + PYTHON=${PYTHON_CMD} +PLIST_SUB= USERS="${USERS}" GROUPS="${GROUPS}" + +NO_ARCH= yes + +post-install: + @${MKDIR} ${STAGEDIR}${ETCDIR} ${STAGEDIR}/var/db/reticulum ${STAGEDIR}/var/run/reticulum ${STAGEDIR}/var/log/reticulum + ${INSTALL_DATA} ${PATCHDIR}/config.sample ${STAGEDIR}${ETCDIR}/config.sample + +.include diff --git a/net-p2p/reticulum/distinfo b/net-p2p/reticulum/distinfo new file mode 100644 index 000000000000..096cee875af1 --- /dev/null +++ b/net-p2p/reticulum/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1677070961 +SHA256 (rns-0.4.9.tar.gz) = ba575410360912e1af47e116a2ecc3b928c8bf7882961f4170876389ec849f38 +SIZE (rns-0.4.9.tar.gz) = 276828 diff --git a/net-p2p/reticulum/files/config.sample b/net-p2p/reticulum/files/config.sample new file mode 100644 index 000000000000..003c06bd5872 --- /dev/null +++ b/net-p2p/reticulum/files/config.sample @@ -0,0 +1,342 @@ +# This is an example Reticulum config file. +# You should probably edit it to include any additional, +# interfaces and settings you might need. + +[reticulum] + +# Define the DB directory +dbdir = "/var/db/reticulum" + +# If you enable Transport, your system will route traffic +# for other peers, pass announces and serve path requests. +# This should be done for systems that are suited to act +# as transport nodes, ie. if they are stationary and +# always-on. This directive is optional and can be removed +# for brevity. + +enable_transport = False + + +# By default, the first program to launch the Reticulum +# Network Stack will create a shared instance, that other +# programs can communicate with. Only the shared instance +# opens all the configured interfaces directly, and other +# local programs communicate with the shared instance over +# a local socket. This is completely transparent to the +# user, and should generally be turned on. This directive +# is optional and can be removed for brevity. + +share_instance = Yes + + +# If you want to run multiple *different* shared instances +# on the same system, you will need to specify different +# shared instance ports for each. The defaults are given +# below, and again, these options can be left out if you +# don't need them. + +shared_instance_port = 37428 +instance_control_port = 37429 + +# You can configure Reticulum to panic and forcibly close +# if an unrecoverable interface error occurs, such as the +# hardware device for an interface disappearing. This is +# an optional directive, and can be left out for brevity. +# This behaviour is disabled by default. + +panic_on_interface_error = No + + +[logging] +# Valid log levels are 0 through 7: +# 0: Log only critical information +# 1: Log errors and lower log levels +# 2: Log warnings and lower log levels +# 3: Log notices and lower log levels +# 4: Log info and lower (this is the default) +# 5: Verbose logging +# 6: Debug logging +# 7: Extreme logging + +loglevel = 4 + + +# The interfaces section defines the physical and virtual +# interfaces Reticulum will use to communicate on. This +# section will contain examples for a variety of interface +# types. You can modify these or use them as a basis for +# your own config, or simply remove the unused ones. + +[interfaces] + + # This interface enables communication with other + # link-local Reticulum nodes over UDP. It does not + # need any functional IP infrastructure like routers + # or DHCP servers, but will require that at least link- + # local IPv6 is enabled in your operating system, which + # should be enabled by default in almost any OS. See + # the Reticulum Manual for more configuration options. + + [[Default Interface]] + type = AutoInterface + enabled = yes + + + # The following example enables communication with other + # local Reticulum peers using UDP broadcasts. + + [[UDP Interface]] + type = UDPInterface + enabled = no + listen_ip = 0.0.0.0 + listen_port = 4242 + forward_ip = 255.255.255.255 + forward_port = 4242 + + # The above configuration will allow communication + # within the local broadcast domains of all local + # IP interfaces. + + # Instead of specifying listen_ip, listen_port, + # forward_ip and forward_port, you can also bind + # to a specific network device like below. + + # device = eth0 + # port = 4242 + + # Assuming the eth0 device has the address + # 10.55.0.72/24, the above configuration would + # be equivalent to the following manual setup. + # Note that we are both listening and forwarding to + # the broadcast address of the network segments. + + # listen_ip = 10.55.0.255 + # listen_port = 4242 + # forward_ip = 10.55.0.255 + # forward_port = 4242 + + # You can of course also communicate only with + # a single IP address + + # listen_ip = 10.55.0.15 + # listen_port = 4242 + # forward_ip = 10.55.0.16 + # forward_port = 4242 + + + # This example demonstrates a TCP server interface. + # It will listen for incoming connections on the + # specified IP address and port number. + + [[TCP Server Interface]] + type = TCPServerInterface + enabled = no + + # This configuration will listen on all IP + # interfaces on port 4242 + + listen_ip = 0.0.0.0 + listen_port = 4242 + + # Alternatively you can bind to a specific IP + + # listen_ip = 10.0.0.88 + # listen_port = 4242 + + # Or a specific network device + + # device = eth0 + # port = 4242 + + + # To connect to a TCP server interface, you would + # naturally use the TCP client interface. Here's + # an example. The target_host can either be an IP + # address or a hostname + + [[TCP Client Interface]] + type = TCPClientInterface + enabled = no + target_host = 127.0.0.1 + target_port = 4242 + + + # This example shows how to make your Reticulum + # instance available over I2P, and connect to + # another I2P peer. Please be aware that you + # must have an I2P router running on your system + # with the SAMv3 API enabled for this to work. + + [[I2P]] + type = I2PInterface + enabled = no + connectable = yes + peers = ykzlw5ujbaqc2xkec4cpvgyxj257wcrmmgkuxqmqcur7cq3w3lha.b32.i2p + + + # Here's an example of how to add a LoRa interface + # using the RNode LoRa transceiver. + + [[RNode LoRa Interface]] + type = RNodeInterface + + # Enable interface if you want use it! + enabled = no + + # Serial port for the device + port = /dev/ttyUSB0 + + # Set frequency to 867.2 MHz + frequency = 867200000 + + # Set LoRa bandwidth to 125 KHz + bandwidth = 125000 + + # Set TX power to 7 dBm (5 mW) + txpower = 7 + + # Select spreading factor 8. Valid + # range is 7 through 12, with 7 + # being the fastest and 12 having + # the longest range. + spreadingfactor = 8 + + # Select coding rate 5. Valid range + # is 5 throough 8, with 5 being the + # fastest, and 8 the longest range. + codingrate = 5 + + # You can configure the RNode to send + # out identification on the channel with + # a set interval by configuring the + # following two parameters. The trans- + # ceiver will only ID if the set + # interval has elapsed since it's last + # actual transmission. The interval is + # configured in seconds. + # This option is commented out and not + # used by default. + # id_callsign = MYCALL-0 + # id_interval = 600 + + # For certain homebrew RNode interfaces + # with low amounts of RAM, using packet + # flow control can be useful. By default + # it is disabled. + flow_control = False + + + # An example KISS modem interface. Useful for running + # Reticulum over packet radio hardware. + + [[Packet Radio KISS Interface]] + type = KISSInterface + + # Enable interface if you want use it! + enabled = no + + # Serial port for the device + port = /dev/ttyUSB1 + + # Set the serial baud-rate and other + # configuration parameters. + speed = 115200 + databits = 8 + parity = none + stopbits = 1 + + # Set the modem preamble. A 150ms + # preamble should be a reasonable + # default, but may need to be + # increased for radios with slow- + # opening squelch and long TX/RX + # turnaround + preamble = 150 + + # Set the modem TX tail. In most + # cases this should be kept as low + # as possible to not waste airtime. + txtail = 10 + + # Configure CDMA parameters. These + # settings are reasonable defaults. + persistence = 200 + slottime = 20 + + # You can configure the interface to send + # out identification on the channel with + # a set interval by configuring the + # following two parameters. The KISS + # interface will only ID if the set + # interval has elapsed since it's last + # actual transmission. The interval is + # configured in seconds. + # This option is commented out and not + # used by default. + # id_callsign = MYCALL-0 + # id_interval = 600 + + # Whether to use KISS flow-control. + # This is useful for modems that have + # a small internal packet buffer, but + # support packet flow control instead. + flow_control = false + + + # If you're using Reticulum on amateur radio spectrum, + # you might want to use the AX.25 KISS interface. This + # way, Reticulum will automatically encapsulate it's + # traffic in AX.25 and also identify your stations + # transmissions with your callsign and SSID. + # + # Only do this if you really need to! Reticulum doesn't + # need the AX.25 layer for anything, and it incurs extra + # overhead on every packet to encapsulate in AX.25. + # + # A more efficient way is to use the plain KISS interface + # with the beaconing functionality described above. + + [[Packet Radio AX.25 KISS Interface]] + type = AX25KISSInterface + + # Set the station callsign and SSID + callsign = NO1CLL + ssid = 0 + + # Enable interface if you want use it! + enabled = no + + # Serial port for the device + port = /dev/ttyUSB2 + + # Set the serial baud-rate and other + # configuration parameters. + speed = 115200 + databits = 8 + parity = none + stopbits = 1 + + # Whether to use KISS flow-control. + # This is useful for modems with a + # small internal packet buffer. + flow_control = false + + # Set the modem preamble. A 150ms + # preamble should be a reasonable + # default, but may need to be + # increased for radios with slow- + # opening squelch and long TX/RX + # turnaround + preamble = 150 + + # Set the modem TX tail. In most + # cases this should be kept as low + # as possible to not waste airtime. + txtail = 10 + + # Configure CDMA parameters. These + # settings are reasonable defaults. + persistence = 200 + slottime = 20 + + diff --git a/net-p2p/reticulum/files/patch-RNS_Reticulum.py b/net-p2p/reticulum/files/patch-RNS_Reticulum.py new file mode 100644 index 000000000000..6ddf70beb844 --- /dev/null +++ b/net-p2p/reticulum/files/patch-RNS_Reticulum.py @@ -0,0 +1,105 @@ +--- RNS/Reticulum.py.orig 2022-11-03 16:31:20 UTC ++++ RNS/Reticulum.py +@@ -141,6 +141,7 @@ class Reticulum: + # named ".reticulum" inside the current users home directory + userdir = os.path.expanduser("~") + configdir = None ++ dbdir = "" + configpath = "" + storagepath = "" + cachepath = "" +@@ -181,7 +182,9 @@ class Reticulum: + if configdir != None: + Reticulum.configdir = configdir + else: +- if os.path.isdir("/etc/reticulum") and os.path.isfile("/etc/reticulum/config"): ++ if os.path.isdir("/usr/local/etc/reticulum") and os.path.isfile("/usr/local/etc/reticulum/config"): ++ Reticulum.configdir = "/usr/local/etc/reticulum" ++ elif os.path.isdir("/etc/reticulum") and os.path.isfile("/etc/reticulum/config"): + Reticulum.configdir = "/etc/reticulum" + elif os.path.isdir(Reticulum.userdir+"/.config/reticulum") and os.path.isfile(Reticulum.userdir+"/.config/reticulum/config"): + Reticulum.configdir = Reticulum.userdir+"/.config/reticulum" +@@ -193,10 +196,7 @@ class Reticulum: + RNS.logfile = Reticulum.configdir+"/logfile" + + Reticulum.configpath = Reticulum.configdir+"/config" +- Reticulum.storagepath = Reticulum.configdir+"/storage" +- Reticulum.cachepath = Reticulum.configdir+"/storage/cache" +- Reticulum.resourcepath = Reticulum.configdir+"/storage/resources" +- Reticulum.identitypath = Reticulum.configdir+"/storage/identities" ++ Reticulum.dbdir = Reticulum.configdir + + Reticulum.__transport_enabled = False + Reticulum.__use_implicit_proof = True +@@ -226,18 +226,6 @@ class Reticulum: + self.last_data_persist = time.time() + self.last_cache_clean = 0 + +- if not os.path.isdir(Reticulum.storagepath): +- os.makedirs(Reticulum.storagepath) +- +- if not os.path.isdir(Reticulum.cachepath): +- os.makedirs(Reticulum.cachepath) +- +- if not os.path.isdir(Reticulum.resourcepath): +- os.makedirs(Reticulum.resourcepath) +- +- if not os.path.isdir(Reticulum.identitypath): +- os.makedirs(Reticulum.identitypath) +- + if os.path.isfile(self.configpath): + try: + self.config = ConfigObj(self.configpath) +@@ -253,7 +241,7 @@ class Reticulum: + + self.__apply_config() + RNS.log("Configuration loaded from "+self.configpath, RNS.LOG_VERBOSE) +- ++ + RNS.Identity.load_known_destinations() + + RNS.Transport.start(self) +@@ -345,6 +333,9 @@ class Reticulum: + if "reticulum" in self.config: + for option in self.config["reticulum"]: + value = self.config["reticulum"][option] ++ if option == "dbdir": ++ value = self.config["reticulum"][option] ++ Reticulum.dbdir = value + if option == "share_instance": + value = self.config["reticulum"].as_bool(option) + self.share_instance = value +@@ -369,6 +360,23 @@ class Reticulum: + if v == False: + Reticulum.__use_implicit_proof = False + ++ Reticulum.storagepath = Reticulum.dbdir+"/storage" ++ Reticulum.cachepath = Reticulum.dbdir+"/storage/cache" ++ Reticulum.resourcepath = Reticulum.dbdir+"/storage/resources" ++ Reticulum.identitypath = Reticulum.dbdir+"/storage/identities" ++ ++ if not os.path.isdir(Reticulum.storagepath): ++ os.makedirs(Reticulum.storagepath) ++ ++ if not os.path.isdir(Reticulum.cachepath): ++ os.makedirs(Reticulum.cachepath) ++ ++ if not os.path.isdir(Reticulum.resourcepath): ++ os.makedirs(Reticulum.resourcepath) ++ ++ if not os.path.isdir(Reticulum.identitypath): ++ os.makedirs(Reticulum.identitypath) ++ + self.__start_local_interface() + + if self.is_shared_instance or self.is_standalone_instance: +@@ -1275,6 +1283,9 @@ __default_rns_config__ = '''# This is the default Reti + + + [reticulum] ++ ++# Define the DB directory ++dbdir = "/var/db/reticulum" + + # If you enable Transport, your system will route traffic + # for other peers, pass announces and serve path requests. diff --git a/net-p2p/reticulum/files/patch-RNS_Utilities_rnsd.py b/net-p2p/reticulum/files/patch-RNS_Utilities_rnsd.py new file mode 100644 index 000000000000..33f61985b665 --- /dev/null +++ b/net-p2p/reticulum/files/patch-RNS_Utilities_rnsd.py @@ -0,0 +1,12 @@ +--- RNS/Utilities/rnsd.py.orig 2023-02-23 17:25:44 UTC ++++ RNS/Utilities/rnsd.py +@@ -80,6 +80,9 @@ __example_rns_config__ = '''# This is an example Retic + + [reticulum] + ++# Define the DB directory ++dbdir = "/var/db/reticulum" ++ + # If you enable Transport, your system will route traffic + # for other peers, pass announces and serve path requests. + # This should be done for systems that are suited to act diff --git a/net-p2p/reticulum/files/reticulum.in b/net-p2p/reticulum/files/reticulum.in new file mode 100644 index 000000000000..482aa6bd9913 --- /dev/null +++ b/net-p2p/reticulum/files/reticulum.in @@ -0,0 +1,39 @@ +#!/bin/sh + +# PROVIDE: reticulum +# REQUIRE: DAEMON FILESYSTEMS +# BEFORE: LOGIN +# +# Add these lines to /etc/rc.conf.local or /etc/rc.conf +# to enable this service: +# +# reticulum_enable (bool): Set to NO by default. +# Set it to YES to enable reticulum. +# reticulum_config (path): Set to %%PREFIX%%/etc/reticulum/ +# by default. +# reticulum_user (str): Reticulum daemon user. Default: %%USERS%% +# reticulum_group (str): Reticulum daemon group. Default: %%GROUPS%% + +. /etc/rc.subr + +name="reticulum" +rcvar="reticulum_enable" + +load_rc_config $name + +: ${reticulum_enable:="NO"} +: ${reticulum_config="%%PREFIX%%/etc/reticulum/"} +: ${reticulum_user="%%USERS%%"} +: ${reticulum_group="%%GROUPS%%"} + +pidfiledir="/var/run/${name}" +pidfile="${pidfiledir}/${name}.pid" +logfiledir="/var/log/${name}" +logfile="${logfiledir}/${name}.log" +command="/usr/sbin/daemon" +command_interpreter=%%PYTHON%% +procname="%%PREFIX%%/bin/rnsd" + +command_args="-f -o $logfile -p $pidfile $procname --config $reticulum_config" + +run_rc_command "$1" diff --git a/net-p2p/reticulum/pkg-descr b/net-p2p/reticulum/pkg-descr new file mode 100644 index 000000000000..a7b2456983f3 --- /dev/null +++ b/net-p2p/reticulum/pkg-descr @@ -0,0 +1,4 @@ +Reticulum is a cryptography-based networking stack for building local and +wide-area networks with readily available hardware. Reticulum can continue to +operate even in adverse conditions with very high latency and extremely low +bandwidth. diff --git a/net-p2p/reticulum/pkg-plist b/net-p2p/reticulum/pkg-plist new file mode 100644 index 000000000000..5909c46c908e --- /dev/null +++ b/net-p2p/reticulum/pkg-plist @@ -0,0 +1,239 @@ +bin/rncp +bin/rnid +bin/rnodeconf +bin/rnpath +bin/rnprobe +bin/rnsd +bin/rnstatus +bin/rnx +@sample %%ETCDIR%%/config.sample +@owner %%USERS%% +@group %%GROUPS%% +@dir /var/db/reticulum +@dir /var/log/reticulum +@dir /var/run/reticulum +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/AES.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/Ed25519.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/Fernet.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/HKDF.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/HMAC.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/Hashes.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/PKCS7.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/Provider.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/Proxies.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/SHA256.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/SHA512.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/X25519.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__init__.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/AES%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/AES%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Ed25519%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Ed25519%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Fernet%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Fernet%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/HKDF%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/HKDF%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/HMAC%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/HMAC%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Hashes%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Hashes%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/PKCS7%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/PKCS7%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Provider%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Provider%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Proxies%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Proxies%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/SHA256%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/SHA256%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/SHA512%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/SHA512%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/X25519%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/X25519%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/__init__.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/__pycache__/aes%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/__pycache__/aes%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/__pycache__/utils%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/__pycache__/utils%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/aes.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/utils.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__init__.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__pycache__/_ed25519%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__pycache__/_ed25519%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__pycache__/basic%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__pycache__/basic%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__pycache__/ed25519_oop%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__pycache__/ed25519_oop%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__pycache__/eddsa%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/__pycache__/eddsa%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/_ed25519.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/basic.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/ed25519_oop.py +%%PYTHON_SITELIBDIR%%/RNS/Cryptography/pure25519/eddsa.py +%%PYTHON_SITELIBDIR%%/RNS/Destination.py +%%PYTHON_SITELIBDIR%%/RNS/Identity.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/AX25KISSInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/KISSInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/RNodeInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/SerialInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/__init__.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/__pycache__/KISSInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/__pycache__/KISSInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/__pycache__/RNodeInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/__pycache__/RNodeInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/__pycache__/SerialInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/__pycache__/SerialInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Android/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/AutoInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/I2PInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/Interface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/KISSInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/LocalInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/PipeInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/RNodeInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/SerialInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/TCPInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/UDPInterface.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__init__.py +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/AX25KISSInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/AX25KISSInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/AutoInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/AutoInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/I2PInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/I2PInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/Interface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/Interface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/KISSInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/KISSInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/LocalInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/LocalInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/PipeInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/PipeInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/RNodeInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/RNodeInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/SerialInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/SerialInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/TCPInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/TCPInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/UDPInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/UDPInterface%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Link.py +%%PYTHON_SITELIBDIR%%/RNS/Packet.py +%%PYTHON_SITELIBDIR%%/RNS/Resource.py +%%PYTHON_SITELIBDIR%%/RNS/Reticulum.py +%%PYTHON_SITELIBDIR%%/RNS/Transport.py +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__init__.py +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rncp%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rncp%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnid%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnid%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnodeconf%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnodeconf%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnpath%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnpath%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnprobe%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnprobe%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnsd%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnsd%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnstatus%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnstatus%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnx%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/__pycache__/rnx%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/Utilities/rncp.py +%%PYTHON_SITELIBDIR%%/RNS/Utilities/rnid.py +%%PYTHON_SITELIBDIR%%/RNS/Utilities/rnodeconf.py +%%PYTHON_SITELIBDIR%%/RNS/Utilities/rnpath.py +%%PYTHON_SITELIBDIR%%/RNS/Utilities/rnprobe.py +%%PYTHON_SITELIBDIR%%/RNS/Utilities/rnsd.py +%%PYTHON_SITELIBDIR%%/RNS/Utilities/rnstatus.py +%%PYTHON_SITELIBDIR%%/RNS/Utilities/rnx.py +%%PYTHON_SITELIBDIR%%/RNS/__init__.py +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Destination%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Destination%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Identity%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Identity%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Link%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Link%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Packet%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Packet%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Resource%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Resource%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Reticulum%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Reticulum%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Transport%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/Transport%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/_version%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/__pycache__/_version%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/_version.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/__init__.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/__pycache__/configobj%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/__pycache__/configobj%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/__pycache__/platformutils%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/__pycache__/platformutils%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/__pycache__/six%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/__pycache__/six%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/__pycache__/umsgpack%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/__pycache__/umsgpack%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/configobj.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__init__.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/__version__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/__version__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/aiosam%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/aiosam%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/exceptions%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/exceptions%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/log%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/log%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/sam%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/sam%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/tunnel%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/tunnel%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/utils%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__pycache__/utils%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/__version__.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/aiosam.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/exceptions.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/log.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/sam.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/tunnel.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/i2plib/utils.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/platformutils.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/six.py +%%PYTHON_SITELIBDIR%%/RNS/vendor/umsgpack.py +%%PYTHON_SITELIBDIR%%/rns-0.4.9-py%%PYTHON_VER%%.egg-info/PKG-INFO +%%PYTHON_SITELIBDIR%%/rns-0.4.9-py%%PYTHON_VER%%.egg-info/SOURCES.txt +%%PYTHON_SITELIBDIR%%/rns-0.4.9-py%%PYTHON_VER%%.egg-info/dependency_links.txt +%%PYTHON_SITELIBDIR%%/rns-0.4.9-py%%PYTHON_VER%%.egg-info/entry_points.txt +%%PYTHON_SITELIBDIR%%/rns-0.4.9-py%%PYTHON_VER%%.egg-info/requires.txt +%%PYTHON_SITELIBDIR%%/rns-0.4.9-py%%PYTHON_VER%%.egg-info/top_level.txt +%%PYTHON_SITELIBDIR%%/tests/__init__.py +%%PYTHON_SITELIBDIR%%/tests/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/tests/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/tests/__pycache__/all%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/tests/__pycache__/all%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/tests/__pycache__/hashes%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/tests/__pycache__/hashes%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/tests/__pycache__/identity%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/tests/__pycache__/identity%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/tests/__pycache__/link%%PYTHON_EXT_SUFFIX%%.opt-1.pyc +%%PYTHON_SITELIBDIR%%/tests/__pycache__/link%%PYTHON_EXT_SUFFIX%%.pyc +%%PYTHON_SITELIBDIR%%/tests/all.py +%%PYTHON_SITELIBDIR%%/tests/hashes.py +%%PYTHON_SITELIBDIR%%/tests/identity.py +%%PYTHON_SITELIBDIR%%/tests/link.py