On 2025-03-26 11:37, Jim Garrison via Cygwin wrote:
Referring to Referring to Brian Inglis's response in
https://cygwin.com/pipermail/cygwin/2024-February/255425.html
I added a Cygwin postinstall script:
/etc/postinstall/0p_l_etc_resolv_conf.dash
to create resolv.conf from `ipconfig /all` DNS servers, an internal list of
open public DNS servers, and search domains, update:
/var/run/resolvconf/resolv.conf
when changed, and `ln -frsvt /etc/`, also run from a Scheduled Task on System
Restart.
The script seems to have disappeared in more recent iterations, and seems to
have been explicitly removed.
$ ls -1 /etc/postinstall/0p*
/etc/postinstall/0p_000_autorebase.dash
/etc/postinstall/0p_update-info-dir.dash
Was that a deliberate change? Not complaining here, just asking, so I know to
recreate resolv.conf if/when my delegated IPv6 prefix changes.
Never distributed - custom DIY AWK hack plus 0p_l_... local - attached.
Also includes a bunch of ISP, Canadian, alternate DNS and DoH services, and
alternate local private subnets, as things change, sometimes without notice.
--
Take care. Thanks, Brian Inglis Calgary, Alberta, Canada
La perfection est atteinte Perfection is achieved
non pas lorsqu'il n'y a plus rien à ajouter not when there is no more to add
mais lorsqu'il n'y a plus rien à retrancher but when there is no more to cut
-- Antoine de Saint-Exupéry
#!/bin/dash
# 0p_l_etc_resolv_conf.dash - update /etc/resolv.conf if changed
r=resolv
cr=/usr/local/bin/cyg-$r.awk
run=/var/run/${r}conf
rrc=$run/$r.conf
SYSCONFDIR=${SYSCONFDIR:-/etc}
conf=$SYSCONFDIR/$r.conf
/bin/mkdir -pv -- $run/ && \
ip=$(/usr/bin/which -- ipconfig) && \
tmp=$(/bin/mktemp -t -- .XXXXXXXX.) && \
$ip /all | $cr > $tmp && \
[ -s $tmp ] && \
[ -w $rrc ] || : > $rrc
if ! /usr/bin/cmp -s -- $tmp $rrc; then
/bin/cp -fv -- $tmp $rrc
/bin/ln -frsTv -- $rrc $conf
fi
/bin/rm -f -- $tmp
#!/usr/bin/awk -f
# cyg-resolv.awk - create Cygwin resolv.conf from Windows ipconfig /all output
BEGIN {
# ISP domains
CISP = "# ISP Shaw/Rogers"
isp_domains = "shaw[^.]*[.]|sjrb[.]"
isp = "shaw.ca."
# suffixes
SUF = "cg.shawcable.net. shawcable.net. shaw.ca. sjrb.ca.
SystematicSW.ab.ca. ca. org. net. edu. uk. com."
# public name servers Quad 9, Cloudflare, Cisco OpenDNS, Google Public DNS,
Comodo Secure DNS
# Quad9 dns.quad9.net Malware Blocking, DNSSEC Validation
# Quad9 dns11.quad9.net Secured w/ECS: Malware blocking, DNSSEC Validation, ECS
enabled
# Quad9 dns10.quad9.net Unsecured: No Malware blocking, no DNSSEC validation
# Quad9 dns12.quad9.net Secured w/ECS: No Malware blocking, No DNSSEC
Validation, ECS enabled
# CloudFlare security.cloudflare-dns.com Malware Blocking
# CloudFlare one.one.one.one 1dot1dot1dot1.cloudflare-dns.com No Malware or
Adult Content Blocking
# CloudFlare family.cloudflare-dns.com Malware and Adult Content Blocking
# Cisco OpenDNS dns.opendns.com. -> resolver2.opendns.com.
resolver1.opendns.com. Secured w/ECS: Malware blocking, DNSSEC Validation, ECS
enabled
# Cisco OpenDNS familyshield.opendns.com. Secured w/ECS: Malware and Adult
Content blocking, DNSSEC Validation, ECS enabled
# Cisco OpenDNS sandbox.opendns.com. Secured w/ECS: No Malware blocking, DNSSEC
Validation, ECS enabled
# Google Public DNS dns.google. -> google-public-dns-b.google.com.
google-public-dns-a.google.com.
# Google Public DNS dns64.dns.google. NAT64 DNS64
NS = "dns.quad9.net. dns11.quad9.net. dns10.quad9.net. dns12.quad9.net. " \
"security.cloudflare-dns.com. family.cloudflare-dns.com.
1dot1dot1dot1.cloudflare-dns.com. " \
"dns.opendns.com. familyshield.opendns.com. sandbox.opendns.com. " \
"ns2.recursive.dnsbycomodo.com. ns1.recursive.dnsbycomodo.com. " \
"dns.google. dns64.dns.google. " \
""
# CleanBrowsing
# "security-filter-dns.cleanbrowsing.org. " \
# "adult-filter-dns.cleanbrowsing.org. " \
# "family-filter-dns.cleanbrowsing.org. " \
# CIRA Canadian Shield Protected+malware+phishing
# "CAshieldProtected" \
# resolv.conf comments
CFHD = "# /etc/resolv.conf"
CFHD = CFHD " - Internet Domain Name System resolver configuration file"
CDS = "# domain suffix"
CSSL = "# suffix search list"
# hosts command
hosts = "/usr/bin/getent ahosts"
# IP v4
# digit patterns: [0-9], [1-9], [6-9], [0-4], [0-5], [0[0]]0-255,
.[0[0]]0-255, .[0]16-31
z9 = "[0-9]"
o9 = "[1-9]"
s9 = "[6-9]"
z4 = "[0-4]"
z5 = "[0-5]"
p0_255 = "(0{0,2}" z9 "|0{0,1}" o9 z9 "|1" z9 z9 "|2(" z4 z9 "|5" z5
"))"
d0_255 = "(." p0_255 ")"
d16_31 = ".0?(1" s9 "|2" z9 "|3[01])"
ipv4 = "^" p0_255 d0_255 "{3}$"
# private subnets
# 10.0.0.0-.255.255.255
p10 = "^10" d0_255 "{3}$"
# 169.254.0.0-.255.255 Zeroconf Link-Local (IPv4LL) Automatic Private IP
Addressing (APIPA)
p169 = "^169.254" d0_255 "{2}$"
# 172.16.0.0-.31.255.255
p172 = "^172" d16_31 d0_255 "{2}$"
# 192.168.0.0-.255.255
p192 = "^192.168" d0_255 "{2}$"
# IP v6
# hex, id
px = "[0-9A-Fa-f]"
gx = px "{0,4}"
cx = ":" gx
id = "[0-9A-Za-z]"
ipv6 = "^" gx "(" cx "){1,7}" "(%" id "+)?$"
# private subnets
# fc00::/7 fc-fe + ff bit 7 local
pfc00 = "^[Ff][C-Fc-f]" px "{2}:"
# seen to avoid duplication
used["127.0.0.1"] = "127.0.0.1"
}
function nextaddr( addr, name, ns, nameserveraddr, nameserverhostname
,private,n) {
if (DEBUG) print addr, name, ns > DEBUG
# private subnets
if (!(addr in used || addr ~ p10 || addr ~ p169 || addr ~ p172 || addr ~
p192 || addr ~ pfc00)) {
n = ++ns
if (addr) { nameserveraddr[n] = addr }
if (name) { nameserverhostname[n] = name }
if (DEBUG) print addr, name, ns > DEBUG
used[addr] = addr
}
return ns
}
function addrs( NS, nameserveraddr, ns ,c) {
# $ getent ahosts $NS
# 1.0.0.1 STREAM one.one.one.one
# 1.0.0.1 DGRAM one.one.one.one
# 1.1.1.1 STREAM
# 1.1.1.1 DGRAM
# 149.112.112.112 0 dns.quad9.net
# 9.9.9.9 0
# 208.67.220.220 0 resolver2.opendns.com
# 208.67.222.222 0 resolver1.opendns.com
# 8.8.4.4 0 google-public-dns-b.google.com
# 8.8.8.8 0 google-public-dns-a.google.com
# 149.112.122.20 0 CAshieldProtected
# 149.112.121.20 0
c = hosts " " NS
while ((c | getline) > 0) {
ns = nextaddr( $1, $3, ns, nameserveraddr, nameserverhostname)
}
close( c )
return ns
}
/\r/ { sub( /\r/, "", $NF) } # trim \r
# collect DNS domain suffixes
/D[Nn][Ss]\sSuffix[^:]*:\s\S/ {
last = $NF
if (last ~ /\./ && last !~ /\.$/) last = last "."; # add root dot
if (!(last in domain)) {
domain[last] = last
domains = domains " " last
}
while (last ~ /\..+\..+/) { # strip labels if more than two for domain
sub(/^[^.]+./, "", last)
if (last ~ /\./ && last !~ /\.$/) last = last "."; # add root dot
if (!(last in domain)) {
domain[last] = last
domains = domains " " last
}
}
}
# collect DNS search suffixes
/Search\sList[^:]*:\s\S/ {
for (d in domain) {
if (!(d in search)) search[d] = d
if (d ~ isp_domains) {
last = isp
if (!(last in search)) {
search[last] = last
domains = domains " " last
}
}
}
last = $NF
if (last ~ /\./ && last !~ /\.$/) last = last "."; # add root dot
if (!(last in search)) {
search[last] = last
domains = domains " " last
}
while (last ~ /\..+\..+/) { # strip labels if more than two for domain
sub(/^[^.]+./, "", last)
if (last ~ /\./ && last !~ /\.$/) last = last "."; # add root dot
if (!(last in search)) {
search[last] = last
domains = domains " " last
}
}
ns = split( SUF, sa)
for (s = 1; s <= ns; ++s) {
last = sa[s]
if (last ~ /\./ && last !~ /\.$/) last = last "."; # add root dot
if (!(last in search)) {
search[last] = last
domains = domains " " last
}
}
}
# collect DNS server IP addresses
/DNS\sServers[^:]*:\s\S/ { dns = 1 } # start - enable
dns && ($NF ~ ipv4 || $NF ~ ipv6) { # collect IP addrs
ns = nextaddr( $NF, last, ns, nameserveraddr, nameserverhostname)
last = ""
}
dns && $NF !~ ipv6 && $NF !~ ipv4 { dns = 0 } # non-IP disable
# output unique resolv.conf entries
END {
print CFHD
print CISP
ns = addrs( NS, nameserveraddr, ns)
for (n = 0; n <= ns; ++n) {
if (n in nameserverhostname && nameserverhostname[n]) {
print "#", nameserverhostname[n]
}
if (n in nameserveraddr && nameserveraddr[n]) {
print "nameserver", nameserveraddr[n]
}
}
if (!domains) domains = SUF
last = 0
for (d in domain) { ++last }
d = gensub(/\s.*$/, "", 1, domains)
if (!last) domain[d] = d
print CDS
for (d in domain) { print "domain", d; ++last; }
print CSSL
if (domains) print "search", domains
}
--
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple