# # Copyright (C) 2026 Daniel Golle # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # include $(TOPDIR)/rules.mk PKG_NAME:=comrade PKG_VERSION:=0.1.1 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/dangowrt/comrade/tar.gz/v$(PKG_VERSION)? PKG_HASH:=b778bbc4aa61e6e77632f4931557a2831eb80ef981f099d175d48b40324d4619 PKG_MAINTAINER:=Daniel Golle PKG_LICENSE:=AGPL-3.0-or-later PKG_LICENSE_FILES:=LICENSE PKG_BUILD_FLAGS:=gc-sections lto include $(INCLUDE_DIR)/package.mk include $(INCLUDE_DIR)/cmake.mk # The GitHub source archive used above carries no submodule content, so # deps/always-online-stun arrives as an empty directory; without the file # below CMake falls back to three hard-coded servers. This is the same list # that submodule would provide, pinned to the commit the v$(PKG_VERSION) tag # references. Either way "comrade stun-update" refreshes the pool at # runtime into the user's data directory. STUN_LIST_VERSION:=0932114f96cd80886f559994545692870df73804 STUN_LIST_FILE:=always-online-stun-$(STUN_LIST_VERSION)-valid_nat_testing_hosts.txt define Download/stunlist FILE:=$(STUN_LIST_FILE) URL:=https://raw.githubusercontent.com/pradt2/always-online-stun/$(STUN_LIST_VERSION) URL_FILE:=valid_nat_testing_hosts.txt HASH:=0aee95ad2cb98a2def9886045d241a62cca64541f77697a010bf0477e02a7322 endef $(eval $(call Download,stunlist)) # comrade adds no crypto library of its own: it reads the DT_NEEDED entries # out of libssh and follows whatever backend that already uses. OpenWrt's # libssh is built against mbedTLS, which implements neither BLAKE2b nor # Ed25519, so this resolves to monocypher (~70 kB) rather than dragging in # libcrypto. Should libssh ever move to OpenSSL, the backend follows it and # libmonocypher below has to become libopenssl. define Package/comrade SECTION:=net CATEGORY:=Network SUBMENU:=SSH TITLE:=Serverless peer-to-peer terminal sharing URL:=https://github.com/dangowrt/comrade DEPENDS:=+libssh +libjuice +libdht +libkcp +libmonocypher +libpthread endef define Package/comrade/description Peer-to-peer terminal sharing with tmate-like semantics and no central server: a host shares a tmux session, a client joins it with a base58 token passed out-of-band. Rendezvous happens on the BitTorrent mainline DHT (or link-local multicast on isolated LANs), connectivity is established by ICE hole punching, and the session itself is end-to-end SSH wrapping stock tmux, with the host key pinned in the token. -L and -R tunnel TCP ports through that same session with ssh's own syntax. Hosting a session needs tmux installed; joining one never does. tmux is therefore not pulled in as a dependency, install it separately on boxes that will host. endef # With no -DCOMRADE_DHT_DIR the build finds and links the shared libdht, # which is what we want: comrade is an ordinary consumer of the packaged # library, exactly as transmission is. comrade defines the four symbols # libdht deliberately leaves undefined (dht_hash, dht_random_bytes, # dht_blacklisted, dht_sendto) and the dynamic linker resolves them back # into the executable. CMAKE_OPTIONS += \ -DBUILD_TESTING=OFF define Build/Prepare $(Build/Prepare/Default) $(INSTALL_DIR) $(PKG_BUILD_DIR)/deps/always-online-stun $(INSTALL_DATA) $(DL_DIR)/$(STUN_LIST_FILE) \ $(PKG_BUILD_DIR)/deps/always-online-stun/valid_nat_testing_hosts.txt endef define Package/comrade/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/comrade $(1)/usr/bin/ endef $(eval $(call BuildPackage,comrade))