git: 6bb8492e4ff2 - main - net-p2p/reticulum: Update to 0.9.6

From: Carlo Strub <cs_at_FreeBSD.org>
Date: Sun, 15 Jun 2025 20:10:45 UTC
The branch main has been updated by cs:

URL: https://cgit.FreeBSD.org/ports/commit/?id=6bb8492e4ff2f5a36767eb2e58941153b22b7d6b

commit 6bb8492e4ff2f5a36767eb2e58941153b22b7d6b
Author:     Carlo Strub <cs@FreeBSD.org>
AuthorDate: 2025-06-15 20:09:58 +0000
Commit:     Carlo Strub <cs@FreeBSD.org>
CommitDate: 2025-06-15 20:09:58 +0000

    net-p2p/reticulum: Update to 0.9.6
    
    - License changes to Reticulum License
---
 net-p2p/reticulum/Makefile                         | 16 +++---
 net-p2p/reticulum/distinfo                         |  6 +--
 net-p2p/reticulum/files/config.sample              | 57 +++++++++++++++++---
 net-p2p/reticulum/files/patch-RNS_Reticulum.py     | 55 +++++++++----------
 .../reticulum/files/patch-RNS_Utilities_rnsd.py    |  6 +--
 net-p2p/reticulum/pkg-plist                        | 61 ++++++++++------------
 6 files changed, 121 insertions(+), 80 deletions(-)

diff --git a/net-p2p/reticulum/Makefile b/net-p2p/reticulum/Makefile
index d31c6c6c2093..a86d44d8d095 100644
--- a/net-p2p/reticulum/Makefile
+++ b/net-p2p/reticulum/Makefile
@@ -1,20 +1,23 @@
 PORTNAME=	reticulum
-DISTVERSION=	0.7.7
-PORTREVISION=	1
+DISTVERSION=	0.9.6
 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
+LICENSE=	UNKNOWN
+LICENSE_NAME=	Reticulum License
+LICENSE_FILE=	${WRKSRC}/LICENSE
+LICENSE_PERMS=	dist-mirror dist-sell pkg-mirror pkg-sell auto-accept
 
 RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}netifaces>=0:net/py-netifaces@${PY_FLAVOR} \
 		${PYTHON_PKGNAMEPREFIX}pyserial>0:comms/py-pyserial@${PY_FLAVOR}
 
+WRKSRC=		${WRKDIR}/Reticulum-${PORTVERSION}
 USES=		python
+USE_GITHUB=	yes
+GH_ACCOUNT=	markqvist
 USE_PYTHON=	cryptography distutils
 USE_RC_SUBR=	reticulum
 GROUPS=		_reticulum
@@ -27,7 +30,8 @@ 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
+	@${MKDIR} ${STAGEDIR}${ETCDIR} ${STAGEDIR}${ETCDIR}/interfaces ${STAGEDIR}/var/db/reticulum \
+		${STAGEDIR}/var/run/reticulum ${STAGEDIR}/var/log/reticulum
 	${INSTALL_DATA} ${PATCHDIR}/config.sample ${STAGEDIR}${ETCDIR}/config.sample
 
 .include <bsd.port.mk>
diff --git a/net-p2p/reticulum/distinfo b/net-p2p/reticulum/distinfo
index 4cd94c6520e0..33a0ea430607 100644
--- a/net-p2p/reticulum/distinfo
+++ b/net-p2p/reticulum/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1726335418
-SHA256 (rns-0.7.7.tar.gz) = 123f2a1f7e3b254a6c13c76bdb3811956d83e5f04221329f86929a64232c43db
-SIZE (rns-0.7.7.tar.gz) = 13049034
+TIMESTAMP = 1750013080
+SHA256 (markqvist-reticulum-0.9.6_GH0.tar.gz) = 0f3e1c5f341416bbedfd94c89d40f463aa136e1294cfe88c5cfc9de31e24123f
+SIZE (markqvist-reticulum-0.9.6_GH0.tar.gz) = 18189948
diff --git a/net-p2p/reticulum/files/config.sample b/net-p2p/reticulum/files/config.sample
index cc9dc03ac02e..2cb199d49829 100644
--- a/net-p2p/reticulum/files/config.sample
+++ b/net-p2p/reticulum/files/config.sample
@@ -4,7 +4,7 @@
 
 [reticulum]
 
-# Define the DB directory
+# Define database directory
 dbdir = "/var/db/reticulum"
 
 # If you enable Transport, your system will route traffic
@@ -31,12 +31,24 @@ 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.
+# instance names for each. On platforms supporting domain
+# sockets, this can be done with the instance_name option:
 
-shared_instance_port = 37428
-instance_control_port = 37429
+instance_name = default
+
+# Some platforms don't support domain sockets, and if that
+# is the case, you can isolate different instances by
+# specifying a unique set of ports for each:
+
+# shared_instance_port = 37428
+# instance_control_port = 37429
+
+
+# If you want to explicitly use TCP for shared instance
+# communication, instead of domain sockets, this is also
+# possible, by using the following option:
+
+# shared_instance_type = tcp
 
 
 # On systems where running instances may not have access
@@ -50,13 +62,25 @@ instance_control_port = 37429
 # rpc_key = e5c032d3ec4e64a6aca9927ba8ab73336780f6d71790
 
 
+# It is possible to allow remote management of Reticulum
+# systems using the various built-in utilities, such as
+# rnstatus and rnpath. You will need to specify one or
+# more Reticulum Identity hashes for authenticating the
+# queries from client programs. For this purpose, you can
+# use existing identity files, or generate new ones with
+# the rnid utility.
+
+# enable_remote_management = yes
+# remote_management_allowed = 9fb6d773498fb3feda407ed8ef2c3229, 2d882c5586e548d79b5af27bca1776dc
+
+
 # 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
+# panic_on_interface_error = No
 
 
 # When Transport is enabled, it is possible to allow the
@@ -67,7 +91,7 @@ panic_on_interface_error = No
 # Transport Instance, and printed to the log at startup.
 # Optional, and disabled by default.
 
-respond_to_probes = No
+# respond_to_probes = No
 
 
 [logging]
@@ -209,6 +233,23 @@ loglevel = 4
     # Serial port for the device
     port = /dev/ttyUSB0
 
+    # It is also possible to use BLE devices
+    # instead of wired serial ports. The
+    # target RNode must be paired with the
+    # host device before connecting. BLE
+    # devices can be connected by name,
+    # BLE MAC address or by any available.
+    
+    # Connect to specific device by name
+    # port = ble://RNode 3B87
+
+    # Or by BLE MAC address
+    # port = ble://F4:12:73:29:4E:89
+
+    # Or connect to the first available,
+    # paired device
+    # port = ble://
+
     # Set frequency to 867.2 MHz
     frequency = 867200000
 
diff --git a/net-p2p/reticulum/files/patch-RNS_Reticulum.py b/net-p2p/reticulum/files/patch-RNS_Reticulum.py
index 6ddf70beb844..9b9049e157a7 100644
--- a/net-p2p/reticulum/files/patch-RNS_Reticulum.py
+++ b/net-p2p/reticulum/files/patch-RNS_Reticulum.py
@@ -1,6 +1,6 @@
---- RNS/Reticulum.py.orig	2022-11-03 16:31:20 UTC
+--- RNS/Reticulum.py.orig	2025-05-15 20:24:33 UTC
 +++ RNS/Reticulum.py
-@@ -141,6 +141,7 @@ class Reticulum:
+@@ -165,6 +165,7 @@ class Reticulum:
      # named ".reticulum" inside the current users home directory
      userdir          = os.path.expanduser("~")
      configdir        = None
@@ -8,30 +8,33 @@
      configpath       = ""
      storagepath      = ""
      cachepath        = ""
-@@ -181,7 +182,9 @@ class Reticulum:
+@@ -231,8 +232,11 @@ 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"
++                Reticulum.interfacepath = Reticulum.configdir+"interfaces"
++            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"
+             else:
+@@ -246,11 +250,8 @@ class Reticulum:
+             RNS.logcall = logdest
          
          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.interfacepath = Reticulum.configdir+"/interfaces"
 +        Reticulum.dbdir         = Reticulum.configdir
  
          Reticulum.__transport_enabled = False
-         Reticulum.__use_implicit_proof = True
-@@ -226,18 +226,6 @@ class Reticulum:
+         Reticulum.__link_mtu_discovery = Reticulum.LINK_MTU_DISCOVERY
+@@ -291,21 +292,6 @@ class Reticulum:
          self.last_data_persist = time.time()
          self.last_cache_clean = 0
  
@@ -41,25 +44,19 @@
 -        if not os.path.isdir(Reticulum.cachepath):
 -            os.makedirs(Reticulum.cachepath)
 -
+-        if not os.path.isdir(os.path.join(Reticulum.cachepath, "announces")):
+-            os.makedirs(os.path.join(Reticulum.cachepath, "announces"))
+-
 -        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()
+         if not os.path.isdir(Reticulum.interfacepath):
+             os.makedirs(Reticulum.interfacepath)
  
-         RNS.Transport.start(self)
-@@ -345,6 +333,9 @@ class Reticulum:
+@@ -450,6 +436,9 @@ class Reticulum:
          if "reticulum" in self.config:
              for option in self.config["reticulum"]:
                  value = self.config["reticulum"][option]
@@ -69,21 +66,25 @@
                  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
+@@ -531,6 +520,27 @@ class Reticulum:
+         if self.local_socket_path == None and self.use_af_unix:
+             self.local_socket_path = "default"
  
++
 +        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(os.path.join(Reticulum.cachepath, "announces")):
++            os.makedirs(os.path.join(Reticulum.cachepath, "announces"))
++
 +        if not os.path.isdir(Reticulum.resourcepath):
 +            os.makedirs(Reticulum.resourcepath)
 +
@@ -93,12 +94,12 @@
          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
+@@ -1360,6 +1370,9 @@ __default_rns_config__ = '''# This is the default Reti
  
  
  [reticulum]
 +
-+# Define the DB directory
++# Define database directory
 +dbdir = "/var/db/reticulum"
  
  # If you enable Transport, your system will route traffic
diff --git a/net-p2p/reticulum/files/patch-RNS_Utilities_rnsd.py b/net-p2p/reticulum/files/patch-RNS_Utilities_rnsd.py
index 33f61985b665..2f737441e71a 100644
--- a/net-p2p/reticulum/files/patch-RNS_Utilities_rnsd.py
+++ b/net-p2p/reticulum/files/patch-RNS_Utilities_rnsd.py
@@ -1,10 +1,10 @@
---- RNS/Utilities/rnsd.py.orig	2023-02-23 17:25:44 UTC
+--- RNS/Utilities/rnsd.py.orig	2025-05-15 20:24:33 UTC
 +++ RNS/Utilities/rnsd.py
-@@ -80,6 +80,9 @@ __example_rns_config__ = '''# This is an example Retic
+@@ -93,6 +93,9 @@ __example_rns_config__ = '''# This is an example Retic
  
  [reticulum]
  
-+# Define the DB directory
++# Define database directory
 +dbdir = "/var/db/reticulum"
 +
  # If you enable Transport, your system will route traffic
diff --git a/net-p2p/reticulum/pkg-plist b/net-p2p/reticulum/pkg-plist
index 630912d53f67..28b5fef427a7 100644
--- a/net-p2p/reticulum/pkg-plist
+++ b/net-p2p/reticulum/pkg-plist
@@ -8,11 +8,13 @@ bin/rnsd
 bin/rnstatus
 bin/rnx
 @sample %%ETCDIR%%/config.sample
+%%PYTHON_SITELIBDIR%%/CRNS/__init__.py
+%%PYTHON_SITELIBDIR%%/CRNS/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/CRNS/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc
 %%PYTHON_SITELIBDIR%%/RNS/Buffer.py
 %%PYTHON_SITELIBDIR%%/RNS/Channel.py
 %%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
@@ -21,14 +23,13 @@ bin/rnx
 %%PYTHON_SITELIBDIR%%/RNS/Cryptography/Proxies.py
 %%PYTHON_SITELIBDIR%%/RNS/Cryptography/SHA256.py
 %%PYTHON_SITELIBDIR%%/RNS/Cryptography/SHA512.py
+%%PYTHON_SITELIBDIR%%/RNS/Cryptography/Token.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
@@ -45,6 +46,8 @@ bin/rnx
 %%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__/Token%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/RNS/Cryptography/__pycache__/Token%%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
@@ -52,12 +55,12 @@ bin/rnx
 %%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/aes/__pycache__/aes128%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/__pycache__/aes128%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/__pycache__/aes256%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/__pycache__/aes256%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/aes128.py
+%%PYTHON_SITELIBDIR%%/RNS/Cryptography/aes/aes256.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
@@ -89,6 +92,7 @@ bin/rnx
 %%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/BackboneInterface.py
 %%PYTHON_SITELIBDIR%%/RNS/Interfaces/I2PInterface.py
 %%PYTHON_SITELIBDIR%%/RNS/Interfaces/Interface.py
 %%PYTHON_SITELIBDIR%%/RNS/Interfaces/KISSInterface.py
@@ -104,6 +108,8 @@ bin/rnx
 %%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__/BackboneInterface%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/RNS/Interfaces/__pycache__/BackboneInterface%%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
@@ -126,6 +132,12 @@ bin/rnx
 %%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/Interfaces/util/__init__.py
+%%PYTHON_SITELIBDIR%%/RNS/Interfaces/util/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/RNS/Interfaces/util/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON_SITELIBDIR%%/RNS/Interfaces/util/__pycache__/netinfo%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/RNS/Interfaces/util/__pycache__/netinfo%%PYTHON_EXT_SUFFIX%%.pyc
+%%PYTHON_SITELIBDIR%%/RNS/Interfaces/util/netinfo.py
 %%PYTHON_SITELIBDIR%%/RNS/Link.py
 %%PYTHON_SITELIBDIR%%/RNS/Packet.py
 %%PYTHON_SITELIBDIR%%/RNS/Resolver.py
@@ -195,8 +207,6 @@ bin/rnx
 %%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
@@ -224,30 +234,15 @@ bin/rnx
 %%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/ifaddr/__init__.py
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/__pycache__/__init__%%PYTHON_EXT_SUFFIX%%.pyc
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/__pycache__/_posix%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/__pycache__/_posix%%PYTHON_EXT_SUFFIX%%.pyc
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/__pycache__/_shared%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/__pycache__/_shared%%PYTHON_EXT_SUFFIX%%.pyc
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/__pycache__/_win32%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/__pycache__/_win32%%PYTHON_EXT_SUFFIX%%.pyc
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/__pycache__/niwrapper%%PYTHON_EXT_SUFFIX%%.opt-1.pyc
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/__pycache__/niwrapper%%PYTHON_EXT_SUFFIX%%.pyc
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/_posix.py
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/_shared.py
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/_win32.py
-%%PYTHON_SITELIBDIR%%/RNS/vendor/ifaddr/niwrapper.py
 %%PYTHON_SITELIBDIR%%/RNS/vendor/platformutils.py
-%%PYTHON_SITELIBDIR%%/RNS/vendor/six.py
 %%PYTHON_SITELIBDIR%%/RNS/vendor/umsgpack.py
-%%PYTHON_SITELIBDIR%%/rns-0.7.7-py%%PYTHON_VER%%.egg-info/PKG-INFO
-%%PYTHON_SITELIBDIR%%/rns-0.7.7-py%%PYTHON_VER%%.egg-info/SOURCES.txt
-%%PYTHON_SITELIBDIR%%/rns-0.7.7-py%%PYTHON_VER%%.egg-info/dependency_links.txt
-%%PYTHON_SITELIBDIR%%/rns-0.7.7-py%%PYTHON_VER%%.egg-info/entry_points.txt
-%%PYTHON_SITELIBDIR%%/rns-0.7.7-py%%PYTHON_VER%%.egg-info/requires.txt
-%%PYTHON_SITELIBDIR%%/rns-0.7.7-py%%PYTHON_VER%%.egg-info/top_level.txt
+%%PYTHON_SITELIBDIR%%/rns-0.9.6-py%%PYTHON_VER%%.egg-info/PKG-INFO
+%%PYTHON_SITELIBDIR%%/rns-0.9.6-py%%PYTHON_VER%%.egg-info/SOURCES.txt
+%%PYTHON_SITELIBDIR%%/rns-0.9.6-py%%PYTHON_VER%%.egg-info/dependency_links.txt
+%%PYTHON_SITELIBDIR%%/rns-0.9.6-py%%PYTHON_VER%%.egg-info/entry_points.txt
+%%PYTHON_SITELIBDIR%%/rns-0.9.6-py%%PYTHON_VER%%.egg-info/requires.txt
+%%PYTHON_SITELIBDIR%%/rns-0.9.6-py%%PYTHON_VER%%.egg-info/top_level.txt
+@dir %%ETCDIR%%/interfaces
 @owner %%USERS%%
 @group %%GROUPS%%
 @dir /var/db/reticulum