Package: auto-apt-proxy
Severity: normal
X-Debbugs-Cc: [email protected]

I reported this originally in bug #1051481
"apt-cacher-ng: Illegal SRV name (underscore not valid except first character 
of label)"
in September 2023 and it was fixed in f9330e88 2024-07-17.

At that time it seems I forgot to also report it for auto-apt-proxy!

Got bitten by it again now whilst writing an extension that uses
systemd-resolved/resolvectl instead of avahi-browse to do the lookup.

Specifically, systemd-resolved correctly refuses to advertise the
illegal SRV name so look-ups were failing 'mysteriously'.

systemd-resolved[1424470]: /etc/systemd/dnssd/squid-deb-proxy.dnssd:3: Service 
type is invalid. Ignoring.

$ cat /etc/systemd/dnssd/squid-deb-proxy.dnssd
[Service]
Name=Squid deb proxy on %H systemd
Type=_apt_proxy._tcp
Port=8000

The definition is in RFC6335 section 5.1 "Service Name Syntax":

Valid service names are hereby normatively defined as follows:

   o  MUST be at least 1 character and no more than 15 characters long

   o  MUST contain only US-ASCII [ANSI.X3.4-1986] letters 'A' - 'Z' and
      'a' - 'z', digits '0' - '9', and hyphens ('-', ASCII 0x2D or
      decimal 45)

   o  MUST contain at least one letter ('A' - 'Z' or 'a' - 'z')

   o  MUST NOT begin or end with a hyphen

   o  hyphens MUST NOT be adjacent to other hyphens
>From b821f0c4a33e2272558d49f90a2eb1a4e92a7fa9 Mon Sep 17 00:00:00 2001
From: Tj <[email protected]>
Date: Sun, 15 Feb 2026 12:46:21 +0000
Subject: [PATCH] use legal SRV name

RFC6335 section 5.1 Service Name Syntax does not allow underscores in
the SRV name itself; only as the leading character in each part.

-_apt_proxy._tcp
+_apt-proxy._tcp

apt-cacher-ng originally advertised only the illegal form but since
commit f9330e88 configures avahi to advertise both.

systemd-resolved refuses to asvertise the illegal form.

Signed-off-by: Tj <[email protected]>
Signed-off-by: Tj <[email protected]>
---
 auto-apt-proxy | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/auto-apt-proxy b/auto-apt-proxy
index 1063074..e49f834 100755
--- a/auto-apt-proxy
+++ b/auto-apt-proxy
@@ -43,6 +43,10 @@ log_debug_if_present() {
   log_debug "${msg}"
 }
 
+SERVICE_NAME="${SERVICE_NAME:-_apt-proxy._tcp}"
+# illegal format; RFC6335 section 5.1
+service_name_legacy="_apt_proxy._tcp"
+
 uid=$(id -u)
 cache_dir=${TMPDIR:-/tmp}/.auto-apt-proxy-${uid}
 if [ -d "${cache_dir}" ]; then
@@ -208,10 +212,12 @@ detect_DNS_SRV_record() {
   local domain
   domain="$(hostname --domain 2>/dev/null)"
   search_domains=$(get_search_domains)
+  local service
+  service="${1:-${SERVICE_NAME}}"
   for d in $domain $search_domains; do
-    log_debug "Looking up SRV entry for _apt_proxy._tcp.${d}"
+    log_debug "Looking up SRV entry for ${service}.${d}"
     result=$(
-      /usr/lib/apt/apt-helper srv-lookup _apt_proxy._tcp."${d}" 2>/dev/null |
+      /usr/lib/apt/apt-helper srv-lookup "${service}.${d}" 2>/dev/null |
       shuf |
       awk '/^[^#]/{print "http://"; $1 ":" $4;found=1;exit}END{exit !found}'
     )
@@ -230,9 +236,11 @@ detect_avahi_local() {
     return 1
   fi
 
-  log_debug "Looking up _apt_proxy._tcp on mDNS (avahi)"
+  local service
+  service="${1:-${SERVICE_NAME}}"
+  log_debug "Looking up ${service} on mDNS (avahi)"
 
-  data=$(avahi-browse --terminate --no-db-lookup --resolve --parsable 
_apt_proxy._tcp | awk -F ';' '/^=;/ { print($7, $8, $9); exit}')
+  data=$(avahi-browse --terminate --no-db-lookup --resolve --parsable 
"${service}" | awk -F ';' '/^=;/ { print($7, $8, $9); exit}')
   if [ -z "${data}" ]; then
     return 1
   fi
@@ -375,7 +383,11 @@ __detect__() {
   # Check for explicitly configured proxies
   detect_from v4_explicit_proxy_etc_hosts v6_explicit_proxy_etc_hosts && 
return 0
   detect_DNS_SRV_record && return 0
+  # fallback to lookup the legacy 'illegal' name
+  detect_DNS_SRV_record "${service_name_legacy}" && return 0
   detect_avahi_local && return 0
+  # fallback to lookup the legacy 'illegal' name
+  detect_avahi_local "${service_name_legacy}" && return 0
 
   # Check special hosts on the network
   detect_from v4_gateway v6_gateway && return 0
-- 
2.39.5

Reply via email to