Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package doggo for openSUSE:Factory checked in at 2026-01-13 21:26:50 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/doggo (Old) and /work/SRC/openSUSE:Factory/.doggo.new.1928 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "doggo" Tue Jan 13 21:26:50 2026 rev:7 rq:1326799 version:1.1.4 Changes: -------- --- /work/SRC/openSUSE:Factory/doggo/doggo.changes 2025-12-22 22:51:53.871594675 +0100 +++ /work/SRC/openSUSE:Factory/.doggo.new.1928/doggo.changes 2026-01-13 21:27:20.918073438 +0100 @@ -1,0 +2,11 @@ +Mon Jan 12 06:40:35 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 1.1.4: + * Bug fixes + - 8ea55b6: fix(darwin): filter out scoped, Supplemental and + domain-specific resolvers from scutil (@mr-karan) + * Others + - 84808d4: chore(deps): update dependencies (@mr-karan) + - b0c0e89: chore(web): add umami analytics script (@mr-karan) + +------------------------------------------------------------------- Old: ---- doggo-1.1.3.obscpio New: ---- doggo-1.1.4.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ doggo.spec ++++++ --- /var/tmp/diff_new_pack.KMVDDw/_old 2026-01-13 21:27:22.050120162 +0100 +++ /var/tmp/diff_new_pack.KMVDDw/_new 2026-01-13 21:27:22.050120162 +0100 @@ -1,7 +1,7 @@ # # spec file for package doggo # -# Copyright (c) 2025 SUSE LLC and contributors +# Copyright (c) 2026 SUSE LLC and contributors # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: doggo -Version: 1.1.3 +Version: 1.1.4 Release: 0 Summary: CLI tool and API server DNS client implemented in Go License: GPL-3.0-only ++++++ _service ++++++ --- /var/tmp/diff_new_pack.KMVDDw/_old 2026-01-13 21:27:22.090121813 +0100 +++ /var/tmp/diff_new_pack.KMVDDw/_new 2026-01-13 21:27:22.098122144 +0100 @@ -2,7 +2,7 @@ <service name="obs_scm" mode="manual"> <param name="scm">git</param> <param name="url">https://github.com/mr-karan/doggo.git</param> - <param name="revision">v1.1.3</param> + <param name="revision">v1.1.4</param> <param name="match-tag">*</param> <param name="versionrewrite-pattern">v(\d+\.\d+\.\d+)</param> <param name="versionformat">@PARENT_TAG@</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.KMVDDw/_old 2026-01-13 21:27:22.126123299 +0100 +++ /var/tmp/diff_new_pack.KMVDDw/_new 2026-01-13 21:27:22.138123795 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/mr-karan/doggo.git</param> - <param name="changesrevision">46a1de3ae6ee61267b678e7493a52657fde1bf74</param></service></servicedata> + <param name="changesrevision">84808d48aff88dadfbb8a28c0f473d05fd8ced00</param></service></servicedata> (No newline at EOF) ++++++ doggo-1.1.3.obscpio -> doggo-1.1.4.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/doggo-1.1.3/.github/dependabot.yaml new/doggo-1.1.4/.github/dependabot.yaml --- old/doggo-1.1.3/.github/dependabot.yaml 2025-12-20 15:05:13.000000000 +0100 +++ new/doggo-1.1.4/.github/dependabot.yaml 1970-01-01 01:00:00.000000000 +0100 @@ -1,11 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "gomod" - directory: "/" - schedule: - interval: "monthly" - open-pull-requests-limit: 10 - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "monthly" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/doggo-1.1.3/.github/workflows/release.yml new/doggo-1.1.4/.github/workflows/release.yml --- old/doggo-1.1.3/.github/workflows/release.yml 2025-12-20 15:05:13.000000000 +0100 +++ new/doggo-1.1.4/.github/workflows/release.yml 2026-01-04 04:39:23.000000000 +0100 @@ -13,7 +13,7 @@ runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Go @@ -28,7 +28,7 @@ password: ${{ secrets.GITHUB_TOKEN }} - name: Cache node modules - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: ./docs/node_modules key: ${{ runner.os }}-npm-${{ hashFiles('**/docs/package-lock.json') }} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/doggo-1.1.3/go.mod new/doggo-1.1.4/go.mod --- old/doggo-1.1.3/go.mod 2025-12-20 15:05:13.000000000 +0100 +++ new/doggo-1.1.4/go.mod 2026-01-04 04:39:23.000000000 +0100 @@ -15,14 +15,14 @@ github.com/knadh/koanf/v2 v2.3.0 github.com/miekg/dns v1.1.69 github.com/olekukonko/tablewriter v1.1.2 - github.com/quic-go/quic-go v0.57.1 + github.com/quic-go/quic-go v0.58.0 github.com/spf13/pflag v1.0.10 golang.org/x/net v0.48.0 golang.org/x/sys v0.39.0 ) require ( - github.com/AdguardTeam/golibs v0.35.5 // indirect + github.com/AdguardTeam/golibs v0.35.7 // indirect github.com/andybalholm/brotli v1.2.0 // indirect github.com/clipperhouse/displaywidth v0.6.2 // indirect github.com/clipperhouse/stringish v0.1.1 // indirect @@ -39,7 +39,6 @@ github.com/olekukonko/errors v1.1.0 // indirect github.com/olekukonko/ll v0.1.3 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/rivo/uniseg v0.4.7 // indirect go.uber.org/mock v0.6.0 // indirect golang.org/x/crypto v0.46.0 // indirect golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 // indirect diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/doggo-1.1.3/go.sum new/doggo-1.1.4/go.sum --- old/doggo-1.1.3/go.sum 2025-12-20 15:05:13.000000000 +0100 +++ new/doggo-1.1.4/go.sum 2026-01-04 04:39:23.000000000 +0100 @@ -1,7 +1,5 @@ -github.com/AdguardTeam/golibs v0.35.2 h1:GVlx/CiCz5ZXQmyvFrE3JyeGsgubE8f4rJvRshYJVVs= -github.com/AdguardTeam/golibs v0.35.2/go.mod h1:p/l6tG7QCv+Hi5yVpv1oZInoatRGOWoyD1m+Ume+ZNY= -github.com/AdguardTeam/golibs v0.35.5 h1:qbe7jkjm+qtvPJGo3UnAp0lsPVpuHULfivXUkyVujZE= -github.com/AdguardTeam/golibs v0.35.5/go.mod h1:meFdRqMtG/PLW6LD20MYAlcRbwAVowlbunHgE17xz9s= +github.com/AdguardTeam/golibs v0.35.7 h1:pTQpixUos7mALr3jqb0pigfrkiqPAX1hiYUi/yeBWiA= +github.com/AdguardTeam/golibs v0.35.7/go.mod h1:meFdRqMtG/PLW6LD20MYAlcRbwAVowlbunHgE17xz9s= github.com/ameshkov/dnscrypt/v2 v2.4.0 h1:if6ZG2cuQmcP2TwSY+D0+8+xbPfoatufGlOQTMNkI9o= github.com/ameshkov/dnscrypt/v2 v2.4.0/go.mod h1:WpEFV2uhebXb8Jhes/5/fSdpmhGV8TL22RDaeWwV6hI= github.com/ameshkov/dnsstamps v1.0.3 h1:Srzik+J9mivH1alRACTbys2xOxs0lRH9qnTA7Y1OYVo= @@ -34,8 +32,6 @@ github.com/knadh/koanf/parsers/toml v0.1.0/go.mod h1:yUprhq6eo3GbyVXFFMdbfZSo928ksS+uo0FFqNMnO18= github.com/knadh/koanf/providers/env v1.1.0 h1:U2VXPY0f+CsNDkvdsG8GcsnK4ah85WwWyJgef9oQMSc= github.com/knadh/koanf/providers/env v1.1.0/go.mod h1:QhHHHZ87h9JxJAn2czdEl6pdkNnDh/JS1Vtsyt65hTY= -github.com/knadh/koanf/providers/file v1.2.0 h1:hrUJ6Y9YOA49aNu/RSYzOTFlqzXSCpmYIDXI7OJU6+U= -github.com/knadh/koanf/providers/file v1.2.0/go.mod h1:bp1PM5f83Q+TOUu10J/0ApLBd9uIzg+n9UgthfY+nRA= github.com/knadh/koanf/providers/file v1.2.1 h1:bEWbtQwYrA+W2DtdBrQWyXqJaJSG3KrP3AESOJYp9wM= github.com/knadh/koanf/providers/file v1.2.1/go.mod h1:bp1PM5f83Q+TOUu10J/0ApLBd9uIzg+n9UgthfY+nRA= github.com/knadh/koanf/providers/posflag v1.0.1 h1:EnMxHSrPkYCFnKgBUl5KBgrjed8gVFrcXDzaW4l/C6Y= @@ -48,8 +44,6 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= -github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA= -github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps= github.com/miekg/dns v1.1.69 h1:Kb7Y/1Jo+SG+a2GtfoFUfDkG//csdRPwRLkCsxDG9Sc= github.com/miekg/dns v1.1.69/go.mod h1:7OyjD9nEba5OkqQ/hB4fy3PIoxafSZJtducccIelz3g= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= @@ -60,24 +54,16 @@ github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6/go.mod h1:rEKTHC9roVVicUIfZK7DYrdIoM0EOr8mK1Hj5s3JjH0= github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM= github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y= -github.com/olekukonko/ll v0.1.2 h1:lkg/k/9mlsy0SxO5aC+WEpbdT5K83ddnNhAepz7TQc0= -github.com/olekukonko/ll v0.1.2/go.mod h1:b52bVQRRPObe+yyBl0TxNfhesL0nedD4Cht0/zx55Ew= github.com/olekukonko/ll v0.1.3 h1:sV2jrhQGq5B3W0nENUISCR6azIPf7UBUpVq0x/y70Fg= github.com/olekukonko/ll v0.1.3/go.mod h1:b52bVQRRPObe+yyBl0TxNfhesL0nedD4Cht0/zx55Ew= -github.com/olekukonko/tablewriter v1.1.0 h1:N0LHrshF4T39KvI96fn6GT8HEjXRXYNDrDjKFDB7RIY= -github.com/olekukonko/tablewriter v1.1.0/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo= github.com/olekukonko/tablewriter v1.1.2 h1:L2kI1Y5tZBct/O/TyZK1zIE9GlBj/TVs+AY5tZDCDSc= github.com/olekukonko/tablewriter v1.1.2/go.mod h1:z7SYPugVqGVavWoA2sGsFIoOVNmEHxUAAMrhXONtfkg= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/quic-go/quic-go v0.55.0 h1:zccPQIqYCXDt5NmcEabyYvOnomjs8Tlwl7tISjJh9Mk= -github.com/quic-go/quic-go v0.55.0/go.mod h1:DR51ilwU1uE164KuWXhinFcKWGlEjzys2l8zUl5Ss1U= -github.com/quic-go/quic-go v0.57.1 h1:25KAAR9QR8KZrCZRThWMKVAwGoiHIrNbT72ULHTuI10= -github.com/quic-go/quic-go v0.57.1/go.mod h1:ly4QBAjHA2VhdnxhojRsCUOeJwKYg+taDlos92xb1+s= -github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= -github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/quic-go/quic-go v0.58.0 h1:ggY2pvZaVdB9EyojxL1p+5mptkuHyX5MOSv4dgWF4Ug= +github.com/quic-go/quic-go v0.58.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= @@ -86,37 +72,21 @@ github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= -golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= -golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= -golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= -golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93 h1:fQsdNF2N+/YewlRZiricy4P1iimyPKZ/xwniHj8Q2a0= golang.org/x/exp v0.0.0-20251219203646-944ab1f22d93/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= -golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= -golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= -golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/doggo-1.1.3/pkg/config/config_darwin.go new/doggo-1.1.4/pkg/config/config_darwin.go --- old/doggo-1.1.3/pkg/config/config_darwin.go 2025-12-20 15:05:13.000000000 +0100 +++ new/doggo-1.1.4/pkg/config/config_darwin.go 2026-01-04 04:39:23.000000000 +0100 @@ -1,3 +1,4 @@ +//go:build darwin // +build darwin package config @@ -21,6 +22,7 @@ domain string searchDomains []string options []string + flags []string } // GetDefaultServers retrieves DNS configuration from macOS SystemConfiguration @@ -58,10 +60,13 @@ return nil, 0, nil, fmt.Errorf("failed to parse scutil output: %w", err) } - // Filter out mDNS resolvers + // Filter out resolvers that shouldn't be used for general queries: + // - mDNS resolvers (for .local domains) + // - Supplemental resolvers (flagged as domain-specific) + // - Domain-specific resolvers (have explicit domain field) validResolvers := make([]scutilResolver, 0) for _, r := range resolvers { - if !isMDNS(r) && len(r.nameservers) > 0 { + if !isMDNS(r) && !isSupplemental(r) && !isDomainSpecific(r) && len(r.nameservers) > 0 { validResolvers = append(validResolvers, r) } } @@ -100,6 +105,9 @@ } // parseScutilOutput parses the output of scutil --dns +// It only parses the main "DNS configuration" section and stops at +// "DNS configuration (for scoped queries)" since scoped resolvers +// are interface-specific and shouldn't be used for general queries. func parseScutilOutput(output string) ([]scutilResolver, error) { lines := strings.Split(output, "\n") resolvers := make([]scutilResolver, 0) @@ -110,8 +118,13 @@ domainRe := regexp.MustCompile(`^\s+domain\s*:\s*(.+)`) searchDomainRe := regexp.MustCompile(`^\s+search domain\[\d+\]\s*:\s*(.+)`) optionsRe := regexp.MustCompile(`^\s+options\s*:\s*(.+)`) + flagsRe := regexp.MustCompile(`^\s+flags\s*:\s*(.+)`) for _, line := range lines { + if strings.Contains(line, "DNS configuration (for scoped queries)") { + break + } + // Check for resolver start if matches := resolverRe.FindStringSubmatch(line); matches != nil { if current != nil { @@ -123,6 +136,7 @@ nameservers: make([]string, 0), searchDomains: make([]string, 0), options: make([]string, 0), + flags: make([]string, 0), } continue } @@ -155,6 +169,15 @@ current.options = append(current.options, opts...) continue } + + // Parse flags (comma-separated, e.g., "Supplemental, Request A records") + if matches := flagsRe.FindStringSubmatch(line); matches != nil { + flagStr := strings.TrimSpace(matches[1]) + for _, f := range strings.Split(flagStr, ",") { + current.flags = append(current.flags, strings.TrimSpace(f)) + } + continue + } } // Don't forget the last resolver @@ -175,6 +198,23 @@ return false } +func isSupplemental(r scutilResolver) bool { + for _, flag := range r.flags { + if flag == "Supplemental" { + return true + } + } + return false +} + +// isDomainSpecific checks if a resolver is configured for a specific domain only. +// Per scutil(8): "Those supplemental configurations containing a 'domain' name +// will be used for queries matching the specified domain." +// These should NOT be used for general DNS queries. +func isDomainSpecific(r scutilResolver) bool { + return r.domain != "" +} + // aggregateSearchDomains collects search domains from all resolvers func aggregateSearchDomains(resolvers []scutilResolver) []string { seen := make(map[string]bool) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/doggo-1.1.3/pkg/config/config_darwin_test.go new/doggo-1.1.4/pkg/config/config_darwin_test.go --- old/doggo-1.1.3/pkg/config/config_darwin_test.go 1970-01-01 01:00:00.000000000 +0100 +++ new/doggo-1.1.4/pkg/config/config_darwin_test.go 2026-01-04 04:39:23.000000000 +0100 @@ -0,0 +1,189 @@ +//go:build darwin + +package config + +import ( + "reflect" + "testing" +) + +const sampleScutilOutput = ` +DNS configuration + +resolver #1 + search domain[0] : dove-climb.ts.net + nameserver[0] : 100.100.100.100 + if_index : 34 (utun12) + flags : Supplemental, Request A records, Request AAAA records + reach : 0x00000003 (Reachable,Transient Connection) + order : 101200 + +resolver #2 + nameserver[0] : 1.1.1.1 + nameserver[1] : 8.8.8.8 + if_index : 14 (en0) + flags : Request A records + reach : 0x00000002 (Reachable) + order : 200000 + +resolver #3 + domain : dove-climb.ts.net. + nameserver[0] : 100.100.100.100 + if_index : 34 (utun12) + flags : Supplemental, Request A records, Request AAAA records + reach : 0x00000003 (Reachable,Transient Connection) + order : 101201 + +resolver #4 + domain : local + options : mdns + timeout : 5 + flags : Request A records + reach : 0x00000000 (Not Reachable) + order : 300000 + +resolver #5 + domain : 254.169.in-addr.arpa + options : mdns + timeout : 5 + flags : Request A records + reach : 0x00000000 (Not Reachable) + order : 300200 + +resolver #6 + domain : 8.e.f.ip6.arpa + options : mdns + timeout : 5 + flags : Request A records + reach : 0x00000000 (Not Reachable) + order : 300400 + +resolver #7 + domain : 9.e.f.ip6.arpa + options : mdns + timeout : 5 + flags : Request A records + reach : 0x00000000 (Not Reachable) + order : 300600 + +resolver #8 + domain : a.e.f.ip6.arpa + options : mdns + timeout : 5 + flags : Request A records + reach : 0x00000000 (Not Reachable) + order : 300800 + +resolver #9 + domain : b.e.f.ip6.arpa + options : mdns + timeout : 5 + flags : Request A records + reach : 0x00000000 (Not Reachable) + order : 301000 + +DNS configuration (for scoped queries) + +resolver #1 + nameserver[0] : 1.1.1.1 + nameserver[1] : 8.8.8.8 + if_index : 14 (en0) + flags : Scoped, Request A records + reach : 0x00000002 (Reachable) + +resolver #2 + search domain[0] : dove-climb.ts.net + nameserver[0] : 100.100.100.100 + if_index : 34 (utun12) + flags : Scoped, Request A records, Request AAAA records + reach : 0x00000003 (Reachable,Transient Connection) +` + +func TestParseScutilOutputStopsAtScoped(t *testing.T) { + resolvers, err := parseScutilOutput(sampleScutilOutput) + if err != nil { + t.Fatalf("parseScutilOutput error: %v", err) + } + + if len(resolvers) != 9 { + t.Fatalf("expected 9 resolvers before scoped section, got %d", len(resolvers)) + } + + if resolvers[8].number != 9 { + t.Fatalf("expected last resolver to be #9, got #%d", resolvers[8].number) + } +} + +func TestFilterScutilResolvers(t *testing.T) { + resolvers, err := parseScutilOutput(sampleScutilOutput) + if err != nil { + t.Fatalf("parseScutilOutput error: %v", err) + } + + valid := make([]scutilResolver, 0) + for _, r := range resolvers { + if !isMDNS(r) && !isSupplemental(r) && !isDomainSpecific(r) && len(r.nameservers) > 0 { + valid = append(valid, r) + } + } + + if len(valid) != 1 { + t.Fatalf("expected 1 valid resolver, got %d", len(valid)) + } + + if valid[0].number != 2 { + t.Fatalf("expected resolver #2 to remain, got #%d", valid[0].number) + } + + gotNameservers := valid[0].nameservers + wantNameservers := []string{"1.1.1.1", "8.8.8.8"} + if !reflect.DeepEqual(gotNameservers, wantNameservers) { + t.Fatalf("nameservers mismatch: got %v want %v", gotNameservers, wantNameservers) + } +} + +func TestFilterDomainSpecificWithoutSupplementalFlag(t *testing.T) { + input := ` +DNS configuration + +resolver #1 + search domain[0] : lan + nameserver[0] : 8.8.8.8 + nameserver[1] : 1.1.1.1 + flags : Request A records + reach : 0x00000002 (Reachable) + +resolver #2 + domain : test + nameserver[0] : 127.0.0.1 + flags : Request A records, Request AAAA records + reach : 0x00030002 (Reachable,Local Address,Directly Reachable Address) + +DNS configuration (for scoped queries) +` + resolvers, err := parseScutilOutput(input) + if err != nil { + t.Fatalf("parseScutilOutput error: %v", err) + } + + valid := make([]scutilResolver, 0) + for _, r := range resolvers { + if !isMDNS(r) && !isSupplemental(r) && !isDomainSpecific(r) && len(r.nameservers) > 0 { + valid = append(valid, r) + } + } + + if len(valid) != 1 { + t.Fatalf("expected 1 valid resolver (resolver #2 with domain:test should be filtered), got %d", len(valid)) + } + + if valid[0].number != 1 { + t.Fatalf("expected resolver #1 to remain, got #%d", valid[0].number) + } + + gotNameservers := valid[0].nameservers + wantNameservers := []string{"8.8.8.8", "1.1.1.1"} + if !reflect.DeepEqual(gotNameservers, wantNameservers) { + t.Fatalf("nameservers mismatch: got %v want %v", gotNameservers, wantNameservers) + } +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/doggo-1.1.3/web/faq.html new/doggo-1.1.4/web/faq.html --- old/doggo-1.1.3/web/faq.html 2025-12-20 15:05:13.000000000 +0100 +++ new/doggo-1.1.4/web/faq.html 2026-01-04 04:39:23.000000000 +0100 @@ -142,6 +142,9 @@ <!-- Stylesheets --> <link rel="stylesheet" href="assets/terminal.css"> <link href="assets/style.css" rel="stylesheet"> + + <!-- Analytics --> + <script defer src="https://um.mrkaran.dev/script.js" data-website-id="f9c569ff-af43-4875-ae1e-d6d2a6dedfd9"></script> </head> <body> <div class="container"> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/doggo-1.1.3/web/index.html new/doggo-1.1.4/web/index.html --- old/doggo-1.1.3/web/index.html 2025-12-20 15:05:13.000000000 +0100 +++ new/doggo-1.1.4/web/index.html 2026-01-04 04:39:23.000000000 +0100 @@ -121,6 +121,9 @@ <!-- Stylesheets --> <link rel="stylesheet" href="assets/terminal.css"> <link href="assets/style.css" rel="stylesheet"> + + <!-- Analytics --> + <script defer src="https://um.mrkaran.dev/script.js" data-website-id="f9c569ff-af43-4875-ae1e-d6d2a6dedfd9"></script> </head> <body> <div class="container"> ++++++ doggo.obsinfo ++++++ --- /var/tmp/diff_new_pack.KMVDDw/_old 2026-01-13 21:27:22.474137662 +0100 +++ /var/tmp/diff_new_pack.KMVDDw/_new 2026-01-13 21:27:22.482137993 +0100 @@ -1,5 +1,5 @@ name: doggo -version: 1.1.3 -mtime: 1766239513 -commit: 46a1de3ae6ee61267b678e7493a52657fde1bf74 +version: 1.1.4 +mtime: 1767497963 +commit: 84808d48aff88dadfbb8a28c0f473d05fd8ced00 ++++++ vendor.tar.xz ++++++ ++++ 1880 lines of diff (skipped)
