From f178ffe732fa821c935036c841aa0400d16efef5 Mon Sep 17 00:00:00 2001 From: a Date: Sat, 3 Aug 2024 14:05:31 -0500 Subject: [PATCH] noot --- ansible/assets/index.html | 98 ++- .../assets/static/android-chrome-192x192.png | Bin 0 -> 7534 bytes .../assets/static/android-chrome-512x512.png | Bin 0 -> 22054 bytes ansible/assets/static/apple-touch-icon.png | Bin 0 -> 6502 bytes ansible/assets/static/favicon-16x16.png | Bin 0 -> 516 bytes ansible/assets/static/favicon-32x32.png | Bin 0 -> 1003 bytes ansible/assets/static/favicon.ico | Bin 0 -> 15406 bytes ansible/assets/static/normalize.css | 349 ++++++++++ ansible/assets/static/sakura.css | 226 ++++++ ansible/assets/static/site.webmanifest | 19 + ansible/assets/static/tacit.min.css | 1 + ansible/files/Caddyfile | 24 + ansible/files/blocky.service | 18 + ansible/files/blocky.yml | 229 +++++++ ansible/files/dns.Caddyfile | 21 - ansible/files/dnscrypt-proxy.toml | 11 + ansible/files/dnsdist.conf | 30 + ansible/files/dnsdist.service | 15 + ansible/files/lb.Caddyfile | 24 - ansible/files/prometheus.yml | 39 ++ ansible/files/sdns.conf | 2 +- ansible/handlers/global.yml | 21 + ansible/inventory.example | 24 +- ansible/playbook.yml | 44 +- ansible/tasks/blocky.yml | 36 + ansible/tasks/caddy-dns.yml | 6 - ansible/tasks/caddy-lb.yml | 6 - ansible/tasks/caddy.yml | 11 - ansible/tasks/debian.yml | 10 + ansible/tasks/dnsdist.yml | 6 + ansible/tasks/dnsproxy.yml | 18 + ansible/tasks/lbsite.yml | 15 + ansible/tasks/prometheus.yml | 23 + dcaddy/go.mod | 147 ++++ dcaddy/go.sum | 646 ++++++++++++++++++ dcaddy/main.go | 12 + dcaddy/plugin/caddydns/caddyfile.go | 14 + 37 files changed, 2055 insertions(+), 90 deletions(-) create mode 100644 ansible/assets/static/android-chrome-192x192.png create mode 100644 ansible/assets/static/android-chrome-512x512.png create mode 100644 ansible/assets/static/apple-touch-icon.png create mode 100644 ansible/assets/static/favicon-16x16.png create mode 100644 ansible/assets/static/favicon-32x32.png create mode 100644 ansible/assets/static/favicon.ico create mode 100644 ansible/assets/static/normalize.css create mode 100644 ansible/assets/static/sakura.css create mode 100644 ansible/assets/static/site.webmanifest create mode 100644 ansible/assets/static/tacit.min.css create mode 100644 ansible/files/Caddyfile create mode 100644 ansible/files/blocky.service create mode 100644 ansible/files/blocky.yml delete mode 100644 ansible/files/dns.Caddyfile create mode 100644 ansible/files/dnscrypt-proxy.toml create mode 100644 ansible/files/dnsdist.conf create mode 100644 ansible/files/dnsdist.service delete mode 100644 ansible/files/lb.Caddyfile create mode 100644 ansible/files/prometheus.yml create mode 100644 ansible/handlers/global.yml create mode 100644 ansible/tasks/blocky.yml delete mode 100644 ansible/tasks/caddy-dns.yml delete mode 100644 ansible/tasks/caddy-lb.yml create mode 100644 ansible/tasks/dnsdist.yml create mode 100644 ansible/tasks/dnsproxy.yml create mode 100644 ansible/tasks/lbsite.yml create mode 100644 ansible/tasks/prometheus.yml create mode 100644 dcaddy/go.mod create mode 100644 dcaddy/go.sum create mode 100644 dcaddy/main.go create mode 100644 dcaddy/plugin/caddydns/caddyfile.go diff --git a/ansible/assets/index.html b/ansible/assets/index.html index 4a82c54..a3ab0f1 100644 --- a/ansible/assets/index.html +++ b/ansible/assets/index.html @@ -2,9 +2,105 @@ mydns + + + + + + -

dns server

+
+
+ +
+
+

+ this is my anonymous dns server. you are free to use it, but just letting you know, this is mine, so it only really has features i care about. +

+

+ it's meant to preserve my privacy (along with anyone who is using its). + in large, my goal is to avoid my dns data being sold to advertisers. +

+

+ the only thing i record are long-term metrics, for the health of the service. + the server is in linode ORD datacenter. if i believe that linode one day is unfit to run this service, i will switch. +

+

+ software used:

+

+
+
+

endpoints

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
typeendpointadditional info
+ DoH/DoH3 + + https://mydns.gay/dns-query + + via ip4, ipv6. TLS powered by caddy +
+ DNS + + 172.232.13.191 / mydns.gay + + port 53 +
+ DNS (ipv6) + + + 2600:3c06::f03c:94ff:fe68:afad + / mydns.gay + + port 53 +
+ DoT + + 172.232.13.191:853 / mydns.gay:853 + + Dns over TLS +
+

+
+ +
diff --git a/ansible/assets/static/android-chrome-192x192.png b/ansible/assets/static/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad964bfb8681ae7cbb3f6eaf7c6096eace6fe59 GIT binary patch literal 7534 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 s++H#?R>H)X`u4|#2;F$Pq)h|=50!Y5mjD0& literal 0 HcmV?d00001 diff --git a/ansible/assets/static/android-chrome-512x512.png b/ansible/assets/static/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..90d520e377f3a9826edda102dd784dbb80b207c5 GIT binary patch literal 22054 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 literal 0 HcmV?d00001 diff --git a/ansible/assets/static/favicon-32x32.png b/ansible/assets/static/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..6904c9b0f727648a5a6b38c087b75080258d5a15 GIT binary patch literal 1003 zcmVe?1H~7vFL}29cp# z!LSKn>0msWzH{W`dCgqhcT}ff7Jo<= zub$q;+Ee^JM%ga*sHj7`699lLPbZ-l^jk19mrrWxqkp-?M2lLl9{|~MyfM5yE&_-O z3&iDe0|PD~aUv###P?xfY+Nhbhf!p!nV1A1`5e5_l=dT;!1|;>0F7UP8%@ByoxZ)3 zFM*DqIwX=iz%rGX@Bt{ODW_m5Go?LeDUdqfClVF{WGBkje;fcp9H11G_iH}@y(9YS zIKRSb_egh10HjoNINNMRyEqXWE-Mz_OPhU{oP7m!4+0|-APlXc?C^S4i4>Iq6ja@z zJU?h^y|OuvJau!Mzi8_ZppuxqkOMT4JIX~ESuD=)5(_0vs&KQzzLB_bk(o=DZcmjp zhC6}yXuz!suy&&VaXV0!4LHdSoy5X3sz3eY8sp`{@YrI;^Q(&CU=^l#lPJ2&bA2L* zpOD{m>k3e^2FObR41-X0lb7#fME@Vt*Hbd2LZ6-f?xrF>;mf`3>E+>2<@a{&;W=uoJt{@=@^g-k)2W;90uf4ECSlH z87TnXQTkQ10zJQhaqgcBLQ?{z>+Y4nx+T_Ws5B!9fK@vdRW6DOP03oh|C<$}X6kDq zRYgnoYCujx*0kdZ7A{jyIBuHbVjxLdD0jS3&A25Bkr+tYs2tY^%%1*gwF8L+z|Ke} z1oh?tMZIW7U##9E1|yjS!fGfLLc-FdSbd^C57C^UX;S`@#zUzh7u2!bJD$htiksD# z{=bKbiV1p}@$=LvkJ=hmb)6!fX1GSdeQHWiGqtXN_BhoV6!<(xGFc}_Bf}v5@0!l@ Z{4a%*tV%#V4x<17002ovPDHLkV1kny!#)52 literal 0 HcmV?d00001 diff --git a/ansible/assets/static/favicon.ico b/ansible/assets/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b847a2f81b4ea5e45c6b27704e8fc50987885395 GIT binary patch literal 15406 zcmeHOYm8l06+VNQKtdFoKtlXsO_cC+OpU=GrjYoiC30}Urk%Yai+^6lqn#MQx7o$~ z^bbYeSSj-217-Rb{$#&Z;IQp9x^l5C{He%+x5{<3Y-C3y2BT-CVV<*oe<%8=*7~gL z*PnN}$m`2QUiy2v4eK8iIr?5Te%6KV`(62SzAv)k4w1LliX0xXiTXdZtGYhxBGIl+ z^zZy1i46DK{#*Z7k>~#?^2{$q_WT>V`AM0MbxL(B`cHYW9@|0Ow1ws1p=Bm7^&f2j zeA?Zz-ru4RciMh@e;9qg!oIumS%-D`^X+%;rM4g0mkZDy>XgsL@14M~+O=QhVQ|zi zehi4xAGD)9ehc9d@MKaw$Bti@N1kW;naN1!A<;jL_4nj=%azY@l4R$cI~M#HvR||cTHb>jM0#!(p$$~g!-unM-~~&&@>dZwB|BhU%A^jAUrX^VD*vrD$vnw-M^85S z^ik?ltJ>n=WLYERldt;o@snSgOT6~_cpBDz%wrgf`+a%-djsX0InyZNoMV$?HO)u4Sn9F<^l@pdh_PeV-_Xx~?2jE|;xkf1*55vkPue^8 zNjNC3LaN6;3D`vZqzU~qX)bIDb}|j=KG^0meA|w60LjE*e1^?)f47G;NEdcoBxmFM zq_#j#ieTK(Pi<4>WUkpe3vvrEEJWH3Oqu34r9+(|*2NgQ4ZOZio(%JNVuIFn_B!)!wy{InVPgTu*uJ%5Qf zaRv6K);*Y`mqQIs2-AiKRU$_*q%0DRwR-WZdvG}ElF(AI>iVa-()O(V=sIt|+*Vb2_ok!97-+=Wv zF*Ei?*=cxR=+mUVk0*X&BW9#Y@JDAMA4*_M`P1NzGwKa}x@2QUwB)%RNRrPm|=++&gCi9Z!P z^IGu(JNNk()Ph^<@b09EK{w<4>pzGs*V{7}uCuBV;!e`=EbQGk$}OlBKkSEll{L*@ zieGcam3h{WV~O8XCi43bKYXi}_+i-%u;r)9X>+GN_bqER`bpQnb;3XGNgKcA-hXxd zry@fX&k$35Fz>v-N_S^H-Z?oIiLK2?9TdF~VOPQ}JYD{1MAU5s(h#Ktoe7qk0Z z%l@GoKPc9yynm_P>!R)WzbyU-*i-ip*%ouwQV4g&>A?S<6+ioe_NDu8ZW}VNyeCAO3Gx!>s1>D&;-pWmSSQSRx-;f?w}QO+-beHi{` zW)#MxZ}h3Q4cYo3PIqJZZq86}4#cypB&54#aa6*ujVYvp0a$&NGyH zY;R-ySM(pSZsP` code { + padding: 0; + background-color: transparent; + white-space: pre; + font-size: 1em; +} + +/* Tables */ +table { + text-align: justify; + width: 100%; + border-collapse: collapse; + margin-bottom: 2rem; +} + +td, th { + padding: 0.5em; + border-bottom: 1px solid #f1f1f1; +} + +/* Buttons, forms and input */ +input, textarea { + border: 1px solid #4a4a4a; +} +input:focus, textarea:focus { + border: 1px solid #1d7484; +} + +textarea { + width: 100%; +} + +.button, button, input[type=submit], input[type=reset], input[type=button], input[type=file]::file-selector-button { + display: inline-block; + padding: 5px 10px; + text-align: center; + text-decoration: none; + white-space: nowrap; + background-color: #1d7484; + color: #f9f9f9; + border-radius: 1px; + border: 1px solid #1d7484; + cursor: pointer; + box-sizing: border-box; +} +.button[disabled], button[disabled], input[type=submit][disabled], input[type=reset][disabled], input[type=button][disabled], input[type=file]::file-selector-button[disabled] { + cursor: default; + opacity: 0.5; +} +.button:hover, button:hover, input[type=submit]:hover, input[type=reset]:hover, input[type=button]:hover, input[type=file]::file-selector-button:hover { + background-color: #982c61; + color: #f9f9f9; + outline: 0; +} +.button:focus-visible, button:focus-visible, input[type=submit]:focus-visible, input[type=reset]:focus-visible, input[type=button]:focus-visible, input[type=file]::file-selector-button:focus-visible { + outline-style: solid; + outline-width: 2px; +} + +textarea, select, input { + color: #4a4a4a; + padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */ + margin-bottom: 10px; + background-color: #f1f1f1; + border: 1px solid #f1f1f1; + border-radius: 4px; + box-shadow: none; + box-sizing: border-box; +} +textarea:focus, select:focus, input:focus { + border: 1px solid #1d7484; + outline: 0; +} + +input[type=checkbox]:focus { + outline: 1px dotted #1d7484; +} + +label, legend, fieldset { + display: block; + margin-bottom: 0.5rem; + font-weight: 600; +} diff --git a/ansible/assets/static/site.webmanifest b/ansible/assets/static/site.webmanifest new file mode 100644 index 0000000..18ab51a --- /dev/null +++ b/ansible/assets/static/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "mydns.gay", + "short_name": "mydns", + "icons": [ + { + "src": "/static/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/static/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/ansible/assets/static/tacit.min.css b/ansible/assets/static/tacit.min.css new file mode 100644 index 0000000..945b868 --- /dev/null +++ b/ansible/assets/static/tacit.min.css @@ -0,0 +1 @@ +input,textarea,select,button,option,body{font:normal 400 normal 1.125rem/1.85625rem system-ui,"Helvetica Neue",Helvetica,Arial,sans-serif}*[hidden]{display:none}th{font-weight:600}td,th{border-bottom:0 solid #595959;padding:0.928125rem 1.125rem;text-align:left;vertical-align:top}thead th{border-bottom-width:0.135rem;padding-bottom:0.39375rem}table{display:table;width:100%}@media all and (max-width:1024px){table{display:none}}@media all and (max-width:1024px){table thead{display:none}}table tr{border-bottom-width:0.135rem}table tr th{border-bottom-width:0.135rem}table tr td,table tr th{overflow:hidden;padding:0.3375rem 0.225rem}@media all and (max-width:1024px){table tr td,table tr th{border:0;display:inline-block}}@media all and (max-width:1024px){table tr{display:inline-block;margin:0.675rem 0}}@media all and (max-width:1024px){table{display:inline-block}}fieldset label,fieldset legend{display:block}fieldset legend{margin:1.125rem 0}input,textarea,select,button{border-radius:3.6px;display:inline-block;padding:0.61875rem}input+label,input+input[type="checkbox"],input+input[type="radio"],textarea+label,textarea+input[type="checkbox"],textarea+input[type="radio"],select+label,select+input[type="checkbox"],select+input[type="radio"],button+label,button+input[type="checkbox"],button+input[type="radio"]{page-break-before:always}input,select,label{margin-right:0.225rem}textarea{min-height:5.625rem;min-width:22.5rem}label{display:inline-block;margin-bottom:0.7875rem}label+*{page-break-before:always}label>input{margin-bottom:0}input[type="submit"],input[type="reset"],button{background:#f2f2f2;color:#191919;cursor:pointer;display:inline;margin-bottom:1.125rem;margin-right:0.45rem;padding:0.4078125rem 1.4625rem;text-align:center}input[type="submit"]:hover,input[type="reset"]:hover,button:hover{background:#d9d9d9;color:#000}input[type="submit"][disabled],input[type="reset"][disabled],button[disabled]{background:#e6e5e5;color:#403f3f;cursor:not-allowed}input[type="submit"],button[type="submit"]{background:#275a90;color:#fff}input[type="submit"]:hover,button[type="submit"]:hover{background:#173454;color:#bfbfbf}input,select,textarea{margin-bottom:1.125rem}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="phone"],input[type="tel"],input[type="number"],input[type="datetime"],input[type="date"],input[type="month"],input[type="week"],input[type="color"],input[type="time"],input[type="search"],input[type="range"],input[type="file"],input[type="datetime-local"],select,textarea{border:1px solid #595959;padding:0.3375rem 0.39375rem}input[type="checkbox"],input[type="radio"]{flex-grow:0;height:1.85625rem;margin-left:0;margin-right:9px;vertical-align:middle}input[type="checkbox"]+label,input[type="radio"]+label{page-break-before:avoid}select[multiple]{min-width:270px}pre,code,kbd,samp,var,output{font:0.9rem Menlo,Monaco,Consolas,"Courier New",monospace}pre{border-left:0 solid #59c072;line-height:1.575rem;overflow:auto;padding-left:18px}pre code{background:none;border:0;line-height:1.85625rem;padding:0}code,kbd{background:#daf1e0;border-radius:3.6px;color:#2a6f3b;display:inline-block;line-height:1.125rem;padding:0.225rem 0.39375rem 0.16875rem}kbd{background:#2a6f3b;color:#fff}mark{background:#ffc;padding:0 0.225rem}h1,h2,h3,h4,h5,h6{color:#000;margin-bottom:1.125rem}h1{font-size:2.25rem;font-weight:500;line-height:2.7rem;margin-top:4.5rem}h2{font-size:1.575rem;font-weight:400;line-height:2.1375rem;margin-top:3.375rem}h3{font-size:1.35rem;line-height:1.6875rem;margin-top:2.25rem}h4{font-size:1.125rem;line-height:1.4625rem;margin-top:1.125rem}h5{font-size:0.9rem;font-weight:bold;line-height:1.35rem;text-transform:uppercase}h6{color:#595959;font-size:0.9rem;font-weight:bold;line-height:1.125rem;text-transform:uppercase}a{color:#275a90;text-decoration:none}a:hover{text-decoration:underline}hr{border-bottom:1px solid #595959}figcaption,small{font-size:0.95625rem}figcaption{color:#595959}var,em,i{font-style:italic}dt,strong,b{font-weight:600}del,s{text-decoration:line-through}ins,u{text-decoration:underline}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}*{border:0;border-collapse:separate;border-spacing:0;box-sizing:border-box;margin:0;max-width:100%;padding:0;vertical-align:baseline}html,body{width:100%}html{height:100%}body{background:#fff;color:#1a1919;padding:36px}p,ul,ol,dl,blockquote,hr,pre,table,form,fieldset,figure,address{margin-bottom:1.85625rem}section{margin-left:auto;margin-right:auto;width:900px}aside{float:right;width:285px}article,header,footer{padding:43.2px}article{background:#fff;border:1px solid #d9d9d9}nav{text-align:center}nav ul{list-style:none;margin-left:0;text-align:center}nav ul li{display:inline-block;margin-left:9px;margin-right:9px;vertical-align:middle}nav ul li:first-child{margin-left:0}nav ul li:last-child{margin-right:0}ol,ul{margin-left:31.5px}li dl,li ol,li ul{margin-bottom:0}dl{display:inline-block}dt{padding:0 1.125rem}dd{padding:0 1.125rem 0.28125rem}dd:last-of-type{border-bottom:0 solid #595959}dd+dt{border-top:0 solid #595959;padding-top:0.5625rem}blockquote{border-left:0 solid #595959;padding:0.28125rem 1.125rem 0.28125rem 0.99rem}blockquote footer{color:#595959;font-size:0.84375rem;margin:0}blockquote p{margin-bottom:0}img{height:auto;margin:0 auto}figure img{display:block}@media (max-width:767px){body{padding:18px 0}article{border:0;padding:18px}header,footer{padding:18px}textarea,input,select{min-width:0}fieldset{min-width:0}fieldset *{flex-grow:1;page-break-before:auto}section{width:auto}x:-moz-any-link{display:table-cell}} \ No newline at end of file diff --git a/ansible/files/Caddyfile b/ansible/files/Caddyfile new file mode 100644 index 0000000..37dfc03 --- /dev/null +++ b/ansible/files/Caddyfile @@ -0,0 +1,24 @@ +{ + admin "localhost:2019" + email a@tuxpa.in + servers { + metrics + } +} + +{{hostvars[inventory_hostname]['public_dns']}} mydns.gay { + handle /dns-query* { + reverse_proxy h2c://127.0.0.1:8053 { + lb_retries 5 + lb_try_duration 5s + lb_try_interval 500ms + } + } + + handle { + root * /var/www/site + file_server + } +} + +# vi: ft=caddyfile diff --git a/ansible/files/blocky.service b/ansible/files/blocky.service new file mode 100644 index 0000000..3682f21 --- /dev/null +++ b/ansible/files/blocky.service @@ -0,0 +1,18 @@ +[Unit] +Description=Blocky is a DNS proxy and ad-blocker +ConditionPathExists=/opt/blocky +After=local-fs.target +[Service] +User=blocky +Group=blocky +Type=simple +WorkingDirectory=/opt/blocky +ExecStart=/opt/blocky/blocky --config /opt/blocky/config.yml +Restart=on-failure +RestartSec=10 +StandardOutput=syslog +StandardError=syslog +SyslogIdentifier=blocky +[Install] +WantedBy=multi-user.target + diff --git a/ansible/files/blocky.yml b/ansible/files/blocky.yml new file mode 100644 index 0000000..c4a798f --- /dev/null +++ b/ansible/files/blocky.yml @@ -0,0 +1,229 @@ +upstream: + default: + - 127.0.0.1:53 + # example for DNS-over-TLS server (DoT) +## - tcp-tls:fdns1.dismail.de:853 + # example for DNS-over-HTTPS (DoH) +## - https://dns.digitale-gesellschaft.ch/dns-query + # optional: use client name (with wildcard support: * - sequence of any characters, [0-9] - range) + # or single ip address / client subnet as CIDR notation +## laptop*: +## - 123.123.123.123 + +# optional: timeout to query the upstream resolver. Default: 2s +upstreamTimeout: 2s + +# optional: If true, blocky will fail to start unless at least one upstream server per group is reachable. Default: false +startVerifyUpstream: false + +# optional: Determines how blocky will create outgoing connections. This impacts both upstreams, and lists. +# accepted: dual, v4, v6 +# default: dual +connectIPVersion: dual + +# optional: custom IP address(es) for domain name (with all sub-domains). Multiple addresses must be separated by a comma +# example: query "printer.lan" or "my.printer.lan" will return 192.168.178.3 +##customDNS: +## customTTL: 1h + # optional: if true (default), return empty result for unmapped query types (for example TXT, MX or AAAA if only IPv4 address is defined). + # if false, queries with unmapped types will be forwarded to the upstream resolver +## filterUnmappedTypes: true + # optional: replace domain in the query with other domain before resolver lookup in the mapping +## rewrite: +## example.com: printer.lan +## mapping: +## printer.lan: 192.168.178.3,2001:0db8:85a3:08d3:1319:8a2e:0370:7344 + +# optional: definition, which DNS resolver(s) should be used for queries to the domain (with all sub-domains). Multiple resolvers must be separated by a comma +# Example: Query client.fritz.box will ask DNS server 192.168.178.1. This is necessary for local network, to resolve clients by host name +##conditional: + # optional: if false (default), return empty result if after rewrite, the mapped resolver returned an empty answer. If true, the original query will be sent to the upstream resolver + # Example: The query "blog.example.com" will be rewritten to "blog.fritz.box" and also redirected to the resolver at 192.168.178.1. If not found and if `fallbackUpstream` was set to `true`, the original query "blog.example.com" will be sent upstream. + # Usage: One usecase when having split DNS for internal and external (internet facing) users, but not all subdomains are listed in the internal domain. +## fallbackUpstream: false + # optional: replace domain in the query with other domain before resolver lookup in the mapping +## rewrite: +## example.com: fritz.box +## mapping: +## fritz.box: 192.168.178.1 +## lan.net: 192.168.178.1,192.168.178.2 + +# optional: use black and white lists to block queries (for example ads, trackers, adult pages etc.) +blocking: + # definition of blacklist groups. Can be external link (http/https) or local file + blackLists: + ads: + - https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts + - https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt + clientGroupsBlock: + # default will be used, if no special definition for a client name exists + default: + - ads + blockType: nxDomain + # optional: TTL for answers to blocked domains + # default: 6h + blockTTL: 2h + # optional: automatically list refresh period (in duration format). Default: 4h. + # Negative value -> deactivate automatically refresh. + # 0 value -> use default + refreshPeriod: 12h + # optional: timeout for list download (each url). Default: 60s. Use large values for big lists or slow internet connections + downloadTimeout: 4m + # optional: Download attempt timeout. Default: 60s + downloadAttempts: 5 + # optional: Time between the download attempts. Default: 1s + downloadCooldown: 10s + # optional: if failOnError, application startup will fail if at least one list can't be downloaded / opened. Default: blocking + startStrategy: failOnError + +# optional: configuration for caching of DNS responses +caching: + # duration how long a response must be cached (min value). + # If <=0, use response's TTL, if >0 use this value, if TTL is smaller + # Default: 0 + minTime: -1 + # duration how long a response must be cached (max value). + # If <0, do not cache responses + # If 0, use TTL + # If > 0, use this value, if TTL is greater + # Default: 0 + maxTime: 0 + # Max number of cache entries (responses) to be kept in cache (soft limit). Useful on systems with limited amount of RAM. + # Default (0): unlimited + maxItemsCount: 0 + # if true, will preload DNS results for often used queries (default: names queried more than 5 times in a 2-hour time window) + # this improves the response time for often used queries, but significantly increases external traffic + # default: false + prefetching: true + # prefetch track time window (in duration format) + # default: 120 + prefetchExpires: 24h + # name queries threshold for prefetch + # default: 5 + prefetchThreshold: 2 + # Max number of domains to be kept in cache for prefetching (soft limit). Useful on systems with limited amount of RAM. + # Default (0): unlimited + prefetchMaxItemsCount: 0 + # Time how long negative results (NXDOMAIN response or empty result) are cached. A value of -1 will disable caching for negative results. + # Default: 30m + cacheTimeNegative: 30m + +# optional: configuration of client name resolution +##clientLookup: + # optional: this DNS resolver will be used to perform reverse DNS lookup (typically local router) +## upstream: 192.168.178.1 + # optional: some routers return multiple names for client (host name and user defined name). Define which single name should be used. + # Example: take second name if present, if not take first name +## singleNameOrder: +## - 2 +## - 1 + # optional: custom mapping of client name to IP addresses. Useful if reverse DNS does not work properly or just to have custom client names. +## clients: +## laptop: +## - 192.168.178.29 +# optional: configuration for prometheus metrics endpoint +prometheus: + # enabled if true + enable: true + # url path, optional (default '/metrics') + path: /metrics + +# optional: write query information (question, answer, client, duration etc.) to daily csv file +##queryLog: + # optional one of: mysql, postgresql, csv, csv-client. If empty, log to console +## type: mysql + # directory (should be mounted as volume in docker) for csv, db connection string for mysql/postgresql +## target: db_user:db_password@tcp(db_host_or_ip:3306)/db_name?charset=utf8mb4&parseTime=True&loc=Local + #postgresql target: postgres://user:password@db_host_or_ip:5432/db_name + # if > 0, deletes log files which are older than ... days +## logRetentionDays: 7 + # optional: Max attempts to create specific query log writer, default: 3 +## creationAttempts: 1 + # optional: Time between the creation attempts, default: 2s +## creationCooldown: 2s + # optional: Which fields should be logged. You can choose one or more from: clientIP, clientName, responseReason, responseAnswer, question, duration. If not defined, it logs all fields +## fields: +## - clientIP +## - duration + +# optional: Blocky can synchronize its cache and blocking state between multiple instances through redis. +##redis: + # Server address and port or master name if sentinel is used +## address: redismaster + # Username if necessary +## username: usrname + # Password if necessary +## password: passwd + # Database, default: 0 +## database: 2 + # Connection is required for blocky to start. Default: false +## required: true + # Max connection attempts, default: 3 +## connectionAttempts: 10 + # Time between the connection attempts, default: 1s +## connectionCooldown: 3s + # Sentinal username if necessary +## sentinelUsername: usrname + # Sentinal password if necessary +## sentinelPassword: passwd + # List with address and port of sentinel hosts(sentinel is activated if at least one sentinel address is configured) +## sentinelAddresses: +## - redis-sentinel1:26379 +## - redis-sentinel2:26379 +## - redis-sentinel3:26379 + +# optional: Mininal TLS version that the DoH and DoT server will use +minTlsServeVersion: 1.3 +# if https port > 0: path to cert and key file for SSL encryption. if not set, self-signed certificate will be generated +#certFile: server.crt +#keyFile: server.key +# optional: use these DNS servers to resolve blacklist urls and upstream DNS servers. It is useful if no system DNS resolver is configured, and/or to encrypt the bootstrap queries. +bootstrapDns: +## - tcp+udp:1.1.1.1 +## - https://1.1.1.1/dns-query +## - upstream: https://dns.digitale-gesellschaft.ch/dns-query +## ips: +## - 185.95.218.42 + +# optional: drop all queries with following query types. Default: empty +##filtering: +## queryTypes: +## - AAAA + +# optional: if path defined, use this file for query resolution (A, AAAA and rDNS). Default: empty +##hostsFile: + # optional: Path to hosts file (e.g. /etc/hosts on Linux) +## filePath: /etc/hosts + # optional: TTL, default: 1h +## hostsTTL: 60m + # optional: Time between hosts file refresh, default: 1h +## refreshPeriod: 30m + # optional: Whether loopback hosts addresses (127.0.0.0/8 and ::1) should be filtered or not, default: false +## filterLoopback: true + +# optional: ports configuration +##port: + # optional: DNS listener port(s) and bind ip address(es), default 53 (UDP and TCP). Example: 53, :53, "127.0.0.1:5353,[::1]:5353" +port: 53 + # optional: Port(s) and bind ip address(es) for DoT (DNS-over-TLS) listener. Example: 853, 127.0.0.1:853 +## tls: 853 + # optional: Port(s) and optional bind ip address(es) to serve HTTPS used for prometheus metrics, pprof, REST API, DoH... If you wish to specify a specific IP, you can do so such as 192.168.0.1:443. Example: 443, :443, 127.0.0.1:443,[::1]:443 +## https: 443 +## # optional: Port(s) and optional bind ip address(es) to serve HTTP used for prometheus metrics, pprof, REST API, DoH... If you wish to specify a specific IP, you can do so such as 192.168.0.1:4000. Example: 4000, :4000, 127.0.0.1:4000,[::1]:4000 +httpPort: 4000 + +# optional: logging configuration +##log: + # optional: Log level (one from debug, info, warn, error). Default: info +## level: info + # optional: Log format (text or json). Default: text +## format: text + # optional: log timestamps. Default: true +## timestamp: true + # optional: obfuscate log output (replace all alphanumeric characters with *) for user sensitive data like request domains or responses to increase privacy. Default: false +## privacy: false + +# optional: add EDE error codes to dns response +ede: + # enabled if true, Default: false + enable: true diff --git a/ansible/files/dns.Caddyfile b/ansible/files/dns.Caddyfile deleted file mode 100644 index 9dce884..0000000 --- a/ansible/files/dns.Caddyfile +++ /dev/null @@ -1,21 +0,0 @@ -{ - admin "unix//run/caddy/admin.socket" - email a@tuxpa.in -} - -{{hostvars[inventory_hostname].public_dns}} { - route /dns-query { - respond "hello" 200 - } - - handle { - root * /var/www - rewrite * index.html - file_server - } -} - -:80 { - respond "ok" -} -# vi: ft=caddyfile diff --git a/ansible/files/dnscrypt-proxy.toml b/ansible/files/dnscrypt-proxy.toml new file mode 100644 index 0000000..cae14e1 --- /dev/null +++ b/ansible/files/dnscrypt-proxy.toml @@ -0,0 +1,11 @@ +server_names = [] +listen_addresses = ['[::]:53'] +max_clients = 1000 + +[local_doh] +listen_addresses = ['127.0.0.1:3000'] +path = '/dns-query' + +[static] +[static.'sdns'] +stamp='sdns://AQYAAAAAAAAADjEyNy4wLjAuMToxMDUzABAyLmRuc2NyeXB0LWNlcnQu' diff --git a/ansible/files/dnsdist.conf b/ansible/files/dnsdist.conf new file mode 100644 index 0000000..14df085 --- /dev/null +++ b/ansible/files/dnsdist.conf @@ -0,0 +1,30 @@ +{% for _host in groups['dns_ord'] if hostvars[_host].internal_ip is defined %} +newServer({address="{{ hostvars[_host].internal_ip }}:1053", pool="sdns"}) +{% endfor %} + +setServerPolicy(leastOutstanding) + +pc = newPacketCache(12800, {maxTTL=86400, minTTL=0, temporaryFailureTTL=60, staleTTL=60, dontAge=false}) +getPool("sdns"):setCache(pc) + + + +tls_cert_crt = "/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/mydns.gay/mydns.gay.crt" +tls_cert_key = "/var/lib/caddy/.local/share/caddy/certificates/acme-v02.api.letsencrypt.org-directory/mydns.gay/mydns.gay.key" + +--tls_cert_crt = "/run/my-unit/target/certificates/acme-v02.api.letsencrypt.org-directory/mydns.gay/mydns.gay.crt" +--tls_cert_key = "/run/my-unit/target/certificates/acme-v02.api.letsencrypt.org-directory/mydns.gay/mydns.gay.key" + +addAction('.', PoolAction("sdns")) + +addAction(MaxQPSIPRule(5, 32, 48, 20), DelayAction(100)) + +webserver("127.0.0.1:6060") +setWebserverConfig({ statsRequireAuthentication=false }) +setLocal("0.0.0.0:53") +addDOHLocal("127.0.0.1:8053", nil, nil, "/dns-query", { reusePort=true, trustForwardedForHeader=true }) +addTLSLocal('0.0.0.0:853', tls_cert_crt, tls_cert_key) +addTLSLocal('[::]:853', tls_cert_crt, tls_cert_key) + +addACL('0.0.0.0/0') +addACL('::/0') diff --git a/ansible/files/dnsdist.service b/ansible/files/dnsdist.service new file mode 100644 index 0000000..22bb0a2 --- /dev/null +++ b/ansible/files/dnsdist.service @@ -0,0 +1,15 @@ +[Unit] +Description=dnsdist public +After=networking.target +[Service] +Type=simple +ExecStartPre=/usr/bin/dnsdist --check-config +ExecStart=/usr/bin/dnsdist --supervised --disable-syslog +Restart=on-failure +RestartSec=10 +StandardOutput=syslog +StandardError=syslog +SyslogIdentifier=dnsdist-public +[Install] +WantedBy=multi-user.target + diff --git a/ansible/files/lb.Caddyfile b/ansible/files/lb.Caddyfile deleted file mode 100644 index 7b4ee10..0000000 --- a/ansible/files/lb.Caddyfile +++ /dev/null @@ -1,24 +0,0 @@ -{ - admin "unix//run/caddy/admin.socket" - email a@tuxpa.in -} - -{{hostvars[inventory_hostname]['public_dns']}} mydns.gay { - route / { - respond "mainpage" 200 - } - - route /dns-query { - respond "hello" 200 - } - {% for host in groups["dns_ord"] %} - "{{ hostvars[host].inventory_hostname }}{{ hostvars[host].ansible_default_ipv4.address }}|cmk-agent|prod|lan|tcp|wato|/" + FOLDER_PATH + "/", - {% endfor %} - - handle { - root * /var/www - rewrite * index.html - file_server - } -} -# vi: ft=caddyfile diff --git a/ansible/files/prometheus.yml b/ansible/files/prometheus.yml new file mode 100644 index 0000000..f8c3a12 --- /dev/null +++ b/ansible/files/prometheus.yml @@ -0,0 +1,39 @@ +remote_write: + - url: https://vm.put.gay/api/v1/write + write_relabel_configs: + - target_label: "host" + replacement: "{{hostvars[inventory_hostname].public_dns}}" + basic_auth: + username: ingest + password: '{{hostvars[inventory_hostname].metrics_password}}' + +global: + scrape_interval: 5s + evaluation_interval: 5s + +scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + labels: + target: 'prometheus' + - job_name: "node_exporter" + static_configs: + - targets: ["localhost:9100"] + labels: + target: 'node_exporter' + - job_name: "sdns" + static_configs: + - targets: ["localhost:8053"] + labels: + target: 'sdns' + - job_name: "caddy" + static_configs: + - targets: ["localhost:2019"] + labels: + target: 'caddy' + - job_name: "dnsdist" + static_configs: + - targets: ["localhost:6060"] + labels: + target: 'dnsdist' diff --git a/ansible/files/sdns.conf b/ansible/files/sdns.conf index 2a03e46..e9948ee 100644 --- a/ansible/files/sdns.conf +++ b/ansible/files/sdns.conf @@ -5,7 +5,7 @@ version = "1.3.3" directory = "/var/lib/sdns" # Address to bind to for the DNS server. -bind = "localhost:1053" +bind = ":1053" # Address to bind to for the DNS-over-TLS server. # bindtls = ":853" diff --git a/ansible/handlers/global.yml b/ansible/handlers/global.yml new file mode 100644 index 0000000..841ca03 --- /dev/null +++ b/ansible/handlers/global.yml @@ -0,0 +1,21 @@ +- name: reload caddy + service: name=caddy state=reloaded enabled=yes + listen: "reload caddy" +- name: restart sshd + service: name=sshd state=restarted enabled=yes + listen: "restart sshd" +- name: restart dnsdist + service: name=dnsdist-public state=restarted enabled=yes daemon-reload=true + listen: "restart dnsdist" +- name: restart prometheus + service: name=prometheus state=restarted enabled=yes + listen: "restart prometheus" +- name: reload prometheus + service: name=prometheus state=reloaded enabled=yes + listen: "reload prometheus" +- name: restart sdns + service: name=sdns state=restarted enabled=yes + listen: "restart sdns" +- name: restart blocky + service: name=blocky state=restarted enabled=yes daemon-reload=true + listen: "restart blocky" diff --git a/ansible/inventory.example b/ansible/inventory.example index 2c2d31e..fdf24a5 100644 --- a/ansible/inventory.example +++ b/ansible/inventory.example @@ -1,9 +1,25 @@ # vi: ft=yaml -dnsserver: +dns_ord: hosts: - 127.0.0.1: + 172.234.203.10: + internal_ip: 10.0.0.2 + public_dns: dns-ord-1.mydns.gay + metrics_password: 'supersecret' + 172.234.22.170: + internal_ip: 10.0.0.3 + public_dns: dns-ord-2.mydns.gay + metrics_password: 'supersecret' vars: -lb: + ansible_user: root + ansible_ssh_private_key_file: ~/.ssh/id_ecdsa + +lb_ord: hosts: - 127.0.0.1: + 172.232.13.191: + internal_ip: 10.0.0.4 + public_dns: lb-ord-1.mydns.gay + metrics_password: 'supersecret' vars: + ansible_user: root + ansible_ssh_private_key_file: ~/.ssh/id_ecdsa + diff --git a/ansible/playbook.yml b/ansible/playbook.yml index b16aa80..d1baec7 100644 --- a/ansible/playbook.yml +++ b/ansible/playbook.yml @@ -5,27 +5,39 @@ tags: ["dns"] tasks: - import_tasks: ./tasks/debian.yml - - import_tasks: ./tasks/caddy.yml - - import_tasks: ./tasks/caddy-dns.yml - import_tasks: ./tasks/dns.yml + - import_tasks: ./tasks/prometheus.yml handlers: - - name: restart sdns - service: name=sdns state=restarted enabled=yes - listen: "restart sdns" - - name: reload caddy - service: name=caddy state=restarted enabled=yes - listen: "reload caddy" + - import_tasks: ./handlers/global.yml - hosts: lb_ord tags: ["lb"] tasks: + - import_tasks: ./tasks/prometheus.yml - import_tasks: ./tasks/debian.yml + - import_tasks: ./tasks/blocky.yml - import_tasks: ./tasks/caddy.yml - - import_tasks: ./tasks/caddy-lb.yml - - import_tasks: ./tasks/envoy.yml + - import_tasks: ./tasks/dnsdist.yml + - import_tasks: ./tasks/lbsite.yml + - name: copy caddy config + template: + src: "{{ playbook_dir }}/files/Caddyfile" + dest: "/etc/caddy/Caddyfile" + notify: "reload caddy" + - name: copy dnsdist service override + template: + src: "{{ playbook_dir }}/files/dnsdist.service" + dest: /etc/systemd/system/dnsdist-public.service + notify: "restart dnsdist" + - name: copy dnsdist config + template: + src: "{{ playbook_dir }}/files/dnsdist.conf" + dest: "/etc/dnsdist/dnsdist.conf" + notify: "restart dnsdist" + - name: copy blocky config + template: + src: "{{ playbook_dir }}/files/blocky.yml" + dest: "/etc/blocky/blocky.yml" + notify: "restart blocky" handlers: - - name: reload caddy - service: name=caddy state=restarted enabled=yes - listen: "reload caddy" - - name: restart sshd - service: name=sshd state=restarted enabled=yes - listen: "restart sshd" + - import_tasks: ./handlers/global.yml + diff --git a/ansible/tasks/blocky.yml b/ansible/tasks/blocky.yml new file mode 100644 index 0000000..86dce28 --- /dev/null +++ b/ansible/tasks/blocky.yml @@ -0,0 +1,36 @@ +# vi: ft=yaml.ansible +- name: create blocky group + group: + name: blocky + state: present +- name: create blocky user + user: + name: blocky + group: blocky +- name: ensure /opt/blocky exists + file: + path: /opt/blocky + state: directory + mode: '0755' + owner: blocky + group: blocky +- name: ensure /etc/blocky exists + file: + path: /etc/blocky + state: directory + mode: '0755' + owner: blocky + group: blocky +- name: install dnsproxy + unarchive: + src: https://github.com/0xERR0R/blocky/releases/download/v0.24/blocky_v0.24_Linux_x86_64.tar.gz + dest: /opt/blocky + include: + - blocky + remote_src: yes + #- name: setup service + # copy: + # src: "{{ playbook_dir }}/files/Caddyfile" + # dest: /etc/systemd/system/blocky.service + #- name: ensure dnsproxy is running + # service: name=dnscrypt-proxy state=started enabled=yes daemon-reload=true diff --git a/ansible/tasks/caddy-dns.yml b/ansible/tasks/caddy-dns.yml deleted file mode 100644 index 4cd4426..0000000 --- a/ansible/tasks/caddy-dns.yml +++ /dev/null @@ -1,6 +0,0 @@ -# vi: ft=yaml.ansible -- name: copy caddy config - template: - src: "{{ playbook_dir }}/files/dns.Caddyfile" - dest: "/etc/caddy/Caddyfile" - notify: "reload caddy" diff --git a/ansible/tasks/caddy-lb.yml b/ansible/tasks/caddy-lb.yml deleted file mode 100644 index 5f92b7f..0000000 --- a/ansible/tasks/caddy-lb.yml +++ /dev/null @@ -1,6 +0,0 @@ -# vi: ft=yaml.ansible -- name: copy caddy config - template: - src: "{{ playbook_dir }}/files/lb.Caddyfile" - dest: "/etc/caddy/Caddyfile" - notify: "reload caddy" diff --git a/ansible/tasks/caddy.yml b/ansible/tasks/caddy.yml index 2d9b28f..d92b6b4 100644 --- a/ansible/tasks/caddy.yml +++ b/ansible/tasks/caddy.yml @@ -9,16 +9,5 @@ mode: '0755' owner: caddy group: caddy -- name: ensure /var/www exists - file: - path: /var/www/site - state: directory - mode: '0755' - owner: caddy - group: caddy -- name: copy index.html - template: - src: "{{ playbook_dir }}/assets/index.html" - dest: "/var/www/site/index.html" - name: ensure caddy is running service: name=caddy state=started enabled=yes diff --git a/ansible/tasks/debian.yml b/ansible/tasks/debian.yml index c3a3684..c8dd2e6 100644 --- a/ansible/tasks/debian.yml +++ b/ansible/tasks/debian.yml @@ -10,6 +10,16 @@ limit_type: soft limit_item: nofile value: 1280000 +- name: populate /etc/environment + lineinfile: + path: "/etc/environment" + state: present + regexp: "^{{ item.key }}=" + line: "{{ item.key }}={{ item.value}}" + with_items: + - key: EDITOR + value: vim + become: yes - name: install ntp apt: pkg=ntp state=present - name: install vim diff --git a/ansible/tasks/dnsdist.yml b/ansible/tasks/dnsdist.yml new file mode 100644 index 0000000..6c70da8 --- /dev/null +++ b/ansible/tasks/dnsdist.yml @@ -0,0 +1,6 @@ +# vi: ft=yaml.ansible +- name: install dnsdist + apt: + name: dnsdist +- name: ensure dnsdist default svc is not running + service: name=dnsdist state=stopped enabled=no diff --git a/ansible/tasks/dnsproxy.yml b/ansible/tasks/dnsproxy.yml new file mode 100644 index 0000000..b5171b4 --- /dev/null +++ b/ansible/tasks/dnsproxy.yml @@ -0,0 +1,18 @@ +# vi: ft=yaml.ansible +- name: install dnsproxy + unarchive: + src: https://github.com/DNSCrypt/dnscrypt-proxy/releases/download/2.1.5/dnscrypt-proxy-linux_x86_64-2.1.5.tar.gz + dest: /opt/ + include: + - linux-x86_64/dnscrypt-proxy + extra_opts: ['--strip-components=1'] + remote_src: yes +- name: setup service + shell: + argv: + - /opt/dnscrypt-proxy + - -service + - install + creates: /etc/systemd/system/dnscrypt-proxy.service +- name: ensure dnsproxy is running + service: name=dnscrypt-proxy state=started enabled=yes daemon-reload=true diff --git a/ansible/tasks/lbsite.yml b/ansible/tasks/lbsite.yml new file mode 100644 index 0000000..1e890fa --- /dev/null +++ b/ansible/tasks/lbsite.yml @@ -0,0 +1,15 @@ +- name: ensure /var/www exists + file: + path: /var/www/site + state: directory + mode: '0755' + owner: caddy + group: caddy +- name: copy static assets + copy: + src: "{{ playbook_dir }}/assets/static/" + dest: "/var/www/site/static/" +- name: copy index.html + template: + src: "{{ playbook_dir }}/assets/index.html" + dest: "/var/www/site/index.html" diff --git a/ansible/tasks/prometheus.yml b/ansible/tasks/prometheus.yml new file mode 100644 index 0000000..46d49a9 --- /dev/null +++ b/ansible/tasks/prometheus.yml @@ -0,0 +1,23 @@ +# vi: ft=yaml.ansible +- name: install prometheus + apt: + name: prometheus +- name: install prometheus node exporter + apt: + name: prometheus-node-exporter +- name: copy prometheus config + template: + src: "{{ playbook_dir }}/files/prometheus.yml" + dest: "/etc/prometheus/prometheus.yml" + notify: "reload prometheus" +- name: set prometheus args + copy: + dest: /etc/default/prometheus + content: | + ARGS="--storage.tsdb.retention.time=2d" + notify: "restart prometheus" +- name: ensure prometheus is running + service: name=prometheus state=started enabled=yes + +- name: ensure node-exporter is running + service: name=prometheus-node-exporter state=started enabled=yes diff --git a/dcaddy/go.mod b/dcaddy/go.mod new file mode 100644 index 0000000..54a44b3 --- /dev/null +++ b/dcaddy/go.mod @@ -0,0 +1,147 @@ +module tuxpa.in/a/dnsservice/dcaddy + +go 1.22.5 + +require github.com/caddyserver/caddy/v2 v2.8.4 + +require ( + filippo.io/edwards25519 v1.1.0 // indirect + github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 // indirect + github.com/BurntSushi/toml v1.3.2 // indirect + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/semver/v3 v3.2.0 // indirect + github.com/Masterminds/sprig/v3 v3.2.3 // indirect + github.com/Microsoft/go-winio v0.6.0 // indirect + github.com/alecthomas/chroma/v2 v2.13.0 // indirect + github.com/antlr4-go/antlr/v4 v4.13.0 // indirect + github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/caddyserver/certmagic v0.21.3 // indirect + github.com/caddyserver/zerossl v0.1.3 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cespare/xxhash v1.1.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/chzyer/readline v1.5.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/dgraph-io/badger v1.6.2 // indirect + github.com/dgraph-io/badger/v2 v2.2007.4 // indirect + github.com/dgraph-io/ristretto v0.1.0 // indirect + github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect + github.com/dlclark/regexp2 v1.11.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fxamacker/cbor/v2 v2.6.0 // indirect + github.com/go-chi/chi/v5 v5.0.12 // indirect + github.com/go-jose/go-jose/v3 v3.0.3 // indirect + github.com/go-kit/kit v0.13.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-sql-driver/mysql v1.7.1 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/golang/glog v1.2.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/cel-go v0.20.1 // indirect + github.com/google/certificate-transparency-go v1.1.8-0.20240110162603-74a5dd331745 // indirect + github.com/google/go-tpm v0.9.0 // indirect + github.com/google/go-tspi v0.3.0 // indirect + github.com/google/pprof v0.0.0-20231212022811-ec68065c825e // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect + github.com/huandu/xstrings v1.3.3 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.14.3 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect + github.com/jackc/pgx/v4 v4.18.3 // indirect + github.com/klauspost/compress v1.17.8 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/libdns/libdns v0.2.2 // indirect + github.com/manifoldco/promptui v0.9.0 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect + github.com/mholt/acmez/v2 v2.0.1 // indirect + github.com/miekg/dns v1.1.59 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/go-ps v1.0.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/onsi/ginkgo/v2 v2.13.2 // indirect + github.com/pires/go-proxyproto v0.7.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_golang v1.19.1 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/quic-go/qpack v0.4.0 // indirect + github.com/quic-go/quic-go v0.44.0 // indirect + github.com/rs/xid v1.5.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/shopspring/decimal v1.2.0 // indirect + github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/slackhq/nebula v1.6.1 // indirect + github.com/smallstep/certificates v0.26.1 // indirect + github.com/smallstep/go-attestation v0.4.4-0.20240109183208-413678f90935 // indirect + github.com/smallstep/nosql v0.6.1 // indirect + github.com/smallstep/pkcs7 v0.0.0-20231024181729-3b98ecc1ca81 // indirect + github.com/smallstep/scep v0.0.0-20231024192529-aee96d7ad34d // indirect + github.com/smallstep/truststore v0.13.0 // indirect + github.com/spf13/cast v1.4.1 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/stoewer/go-strcase v1.2.0 // indirect + github.com/tailscale/tscert v0.0.0-20240517230440-bbccfbf48933 // indirect + github.com/urfave/cli v1.22.14 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/yuin/goldmark v1.7.1 // indirect + github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc // indirect + github.com/zeebo/blake3 v0.2.3 // indirect + go.etcd.io/bbolt v1.3.9 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/contrib/propagators/autoprop v0.42.0 // indirect + go.opentelemetry.io/contrib/propagators/aws v1.17.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.17.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.17.0 // indirect + go.opentelemetry.io/contrib/propagators/ot v1.17.0 // indirect + go.opentelemetry.io/otel v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.24.0 // indirect + go.opentelemetry.io/otel/sdk v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.24.0 // indirect + go.opentelemetry.io/proto/otlp v1.0.0 // indirect + go.step.sm/cli-utils v0.9.0 // indirect + go.step.sm/crypto v0.45.0 // indirect + go.step.sm/linkedca v0.20.1 // indirect + go.uber.org/automaxprocs v1.5.3 // indirect + go.uber.org/mock v0.4.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.uber.org/zap/exp v0.2.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto/x509roots/fallback v0.0.0-20240507223354-67b13616a595 // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + golang.org/x/time v0.5.0 // indirect + golang.org/x/tools v0.21.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 // indirect + google.golang.org/grpc v1.63.2 // indirect + google.golang.org/protobuf v1.34.1 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + howett.net/plist v1.0.0 // indirect +) diff --git a/dcaddy/go.sum b/dcaddy/go.sum new file mode 100644 index 0000000..f282a79 --- /dev/null +++ b/dcaddy/go.sum @@ -0,0 +1,646 @@ +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go/auth v0.4.1 h1:Z7YNIhlWRtrnKlZke7z3GMqzvuYzdc2z98F9D1NV5Hg= +cloud.google.com/go/auth v0.4.1/go.mod h1:QVBuVEKpCn4Zp58hzRGvL0tjRGU0YqdRTdCHM1IHnro= +cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= +cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= +cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/iam v1.1.8 h1:r7umDwhj+BQyz0ScZMp4QrGXjSTI3ZINnpgU2nlB/K0= +cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= +cloud.google.com/go/kms v1.16.0 h1:1yZsRPhmargZOmY+fVAh8IKiR9HzCb0U1zsxb5g2nRY= +cloud.google.com/go/kms v1.16.0/go.mod h1:olQUXy2Xud+1GzYfiBO9N0RhjsJk5IJLU6n/ethLXVc= +cloud.google.com/go/longrunning v0.5.7 h1:WLbHekDbjK1fVFD3ibpFFVoyizlLRl73I7YKuAKilhU= +cloud.google.com/go/longrunning v0.5.7/go.mod h1:8GClkudohy1Fxm3owmBGid8W0pSgodEMwEAztp38Xng= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96 h1:cTp8I5+VIoKjsnZuH8vjyaysT/ses3EvZeaV/1UkF2M= +github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= +github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA= +github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM= +github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/alecthomas/assert/v2 v2.6.0 h1:o3WJwILtexrEUk3cUVal3oiQY2tfgr/FHWiz/v2n4FU= +github.com/alecthomas/assert/v2 v2.6.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= +github.com/alecthomas/chroma/v2 v2.13.0 h1:VP72+99Fb2zEcYM0MeaWJmV+xQvz5v5cxRHd+ooU1lI= +github.com/alecthomas/chroma/v2 v2.13.0/go.mod h1:BUGjjsD+ndS6eX37YgTchSEG+Jg9Jv1GiZs9sqPqztk= +github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= +github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= +github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= +github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b h1:uUXgbcPDK3KpW29o4iy7GtuappbWT0l5NaMo9H9pJDw= +github.com/aryann/difflib v0.0.0-20210328193216-ff5ff6dc229b/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= +github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2/config v1.27.13 h1:WbKW8hOzrWoOA/+35S5okqO/2Ap8hkkFUzoW8Hzq24A= +github.com/aws/aws-sdk-go-v2/config v1.27.13/go.mod h1:XLiyiTMnguytjRER7u5RIkhIqS8Nyz41SwAWb4xEjxs= +github.com/aws/aws-sdk-go-v2/credentials v1.17.13 h1:XDCJDzk/u5cN7Aple7D/MiAhx1Rjo/0nueJ0La8mRuE= +github.com/aws/aws-sdk-go-v2/credentials v1.17.13/go.mod h1:FMNcjQrmuBYvOTZDtOLCIu0esmxjF7RuA/89iSXWzQI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= +github.com/aws/aws-sdk-go-v2/service/kms v1.31.1 h1:5wtyAwuUiJiM3DHYeGZmP5iMonM7DFBWAEaaVPHYZA0= +github.com/aws/aws-sdk-go-v2/service/kms v1.31.1/go.mod h1:2snWQJQUKsbN66vAawJuOGX7dr37pfOq9hb0tZDGIqQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.6 h1:o5cTaeunSpfXiLTIBx5xo2enQmiChtu1IBbzXnfU9Hs= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.6/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0 h1:Qe0r0lVURDDeBQJ4yP+BOrJkvkiCo/3FH/t+wY11dmw= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.24.0/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.7 h1:et3Ta53gotFR4ERLXXHIHl/Uuk1qYpP5uU7cvNql8ns= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.7/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= +github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= +github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/caddyserver/caddy/v2 v2.8.4 h1:q3pe0wpBj1OcHFZ3n/1nl4V4bxBrYoSoab7rL9BMYNk= +github.com/caddyserver/caddy/v2 v2.8.4/go.mod h1:vmDAHp3d05JIvuhc24LmnxVlsZmWnUwbP5WMjzcMPWw= +github.com/caddyserver/certmagic v0.21.3 h1:pqRRry3yuB4CWBVq9+cUqu+Y6E2z8TswbhNx1AZeYm0= +github.com/caddyserver/certmagic v0.21.3/go.mod h1:Zq6pklO9nVRl3DIFUw9gVUfXKdpc/0qwTUAQMBlfgtI= +github.com/caddyserver/zerossl v0.1.3 h1:onS+pxp3M8HnHpN5MMbOMyNjmTheJyWRaZYwn+YTAyA= +github.com/caddyserver/zerossl v0.1.3/go.mod h1:CxA0acn7oEGO6//4rtrRjYgEoa4MFw/XofZnrYwGqG4= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger v1.6.2 h1:mNw0qs90GVgGGWylh0umH5iag1j6n/PeJtNvL6KY/x8= +github.com/dgraph-io/badger v1.6.2/go.mod h1:JW2yswe3V058sS0kZ2h/AXeDSqFjxnZcRrVH//y2UQE= +github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= +github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= +github.com/dgraph-io/ristretto v0.0.2/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= +github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= +github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fxamacker/cbor/v2 v2.6.0 h1:sU6J2usfADwWlYDAFhZBQ6TnLFBHxgesMrQfQgk1tWA= +github.com/fxamacker/cbor/v2 v2.6.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= +github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= +github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-kit/kit v0.4.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= +github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-stack/stack v1.6.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= +github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84= +github.com/google/cel-go v0.20.1/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= +github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= +github.com/google/certificate-transparency-go v1.1.8-0.20240110162603-74a5dd331745 h1:heyoXNxkRT155x4jTAiSv5BVSVkueifPUm+Q8LUXMRo= +github.com/google/certificate-transparency-go v1.1.8-0.20240110162603-74a5dd331745/go.mod h1:zN0wUQgV9LjwLZeFHnrAbQi8hzMVvEWePyk+MhPOk7k= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-tpm v0.9.0 h1:sQF6YqWMi+SCXpsmS3fd21oPy/vSddwZry4JnmltHVk= +github.com/google/go-tpm v0.9.0/go.mod h1:FkNVkc6C+IsvDI9Jw1OveJmxGZUUaKxtrpOS47QWKfU= +github.com/google/go-tpm-tools v0.4.4 h1:oiQfAIkc6xTy9Fl5NKTeTJkBTlXdHsxAofmQyxBKY98= +github.com/google/go-tpm-tools v0.4.4/go.mod h1:T8jXkp2s+eltnCDIsXR84/MTcVU9Ja7bh3Mit0pa4AY= +github.com/google/go-tspi v0.3.0 h1:ADtq8RKfP+jrTyIWIZDIYcKOMecRqNJFOew2IT0Inus= +github.com/google/go-tspi v0.3.0/go.mod h1:xfMGI3G0PhxCdNVcYr1C4C+EizojDg/TXuX5by8CiHI= +github.com/google/pprof v0.0.0-20231212022811-ec68065c825e h1:bwOy7hAFd0C91URzMIEBfr6BAz29yk7Qj0cy6S7DJlU= +github.com/google/pprof v0.0.0-20231212022811-ec68065c825e/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.12.4 h1:9gWcmF85Wvq4ryPFvGFaOgPIs1AQX0d0bcbGw4Z96qg= +github.com/googleapis/gax-go/v2 v2.12.4/go.mod h1:KYEYLorsnIGDi/rPC8b5TdlB9kbKoFubselGIoBMCwI= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4= +github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= +github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= +github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/libdns/libdns v0.2.2 h1:O6ws7bAfRPaBsgAYt8MDe2HcNBGC29hkZ9MX2eUSX3s= +github.com/libdns/libdns v0.2.2/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= +github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/mholt/acmez/v2 v2.0.1 h1:3/3N0u1pLjMK4sNEAFSI+bcvzbPhRpY383sy1kLHJ6k= +github.com/mholt/acmez/v2 v2.0.1/go.mod h1:fX4c9r5jYwMyMsC+7tkYRxHibkOTgta5DIFGoe67e1U= +github.com/miekg/dns v1.1.59 h1:C9EXc/UToRwKLhK5wKU/I4QVsBUc8kE6MkHBkeypWZs= +github.com/miekg/dns v1.1.59/go.mod h1:nZpewl5p6IvctfgrckopVx2OlSEHPRO/U4SYkRklrEk= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc= +github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/onsi/ginkgo/v2 v2.13.2 h1:Bi2gGVkfn6gQcjNjZJVO8Gf0FHzMPf2phUei9tejVMs= +github.com/onsi/ginkgo/v2 v2.13.2/go.mod h1:XStQ8QcGwLyF4HdfcZB8SFOS/MWCgDuXMSBe6zrvLgM= +github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= +github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv/v3 v3.0.1 h1:x06SQA46+PKIUftmEujdwSEpIx8kR+M9eLYsUxeYveU= +github.com/peterbourgon/diskv/v3 v3.0.1/go.mod h1:kJ5Ny7vLdARGU3WUuy6uzO6T0nb/2gWcT1JiBvRmb5o= +github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwyq0Hs= +github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= +github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= +github.com/quic-go/quic-go v0.44.0 h1:So5wOr7jyO4vzL2sd8/pD9Kesciv91zSk8BoFngItQ0= +github.com/quic-go/quic-go v0.44.0/go.mod h1:z4cx/9Ny9UtGITIPzmPTXh1ULfOyWh4qGQlpnPcWmek= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/schollz/jsonstore v1.1.0 h1:WZBDjgezFS34CHI+myb4s8GGpir3UMpy7vWoCeO0n6E= +github.com/schollz/jsonstore v1.1.0/go.mod h1:15c6+9guw8vDRyozGjN3FoILt0wpruJk9Pi66vjaZfg= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/slackhq/nebula v1.6.1 h1:/OCTR3abj0Sbf2nGoLUrdDXImrCv0ZVFpVPP5qa0DsM= +github.com/slackhq/nebula v1.6.1/go.mod h1:UmkqnXe4O53QwToSl/gG7sM4BroQwAB7dd4hUaT6MlI= +github.com/smallstep/assert v0.0.0-20200723003110-82e2b9b3b262 h1:unQFBIznI+VYD1/1fApl1A+9VcBk+9dcqGfnePY87LY= +github.com/smallstep/assert v0.0.0-20200723003110-82e2b9b3b262/go.mod h1:MyOHs9Po2fbM1LHej6sBUT8ozbxmMOFG+E+rx/GSGuc= +github.com/smallstep/certificates v0.26.1 h1:FIUliEBcExSfJJDhRFA/s8aZgMIFuorexnRSKQd884o= +github.com/smallstep/certificates v0.26.1/go.mod h1:OQMrW39IrGKDViKSHrKcgSQArMZ8c7EcjhYKK7mYqis= +github.com/smallstep/go-attestation v0.4.4-0.20240109183208-413678f90935 h1:kjYvkvS/Wdy0PVRDUAA0gGJIVSEZYhiAJtfwYgOYoGA= +github.com/smallstep/go-attestation v0.4.4-0.20240109183208-413678f90935/go.mod h1:vNAduivU014fubg6ewygkAvQC0IQVXqdc8vaGl/0er4= +github.com/smallstep/nosql v0.6.1 h1:X8IBZFTRIp1gmuf23ne/jlD/BWKJtDQbtatxEn7Et1Y= +github.com/smallstep/nosql v0.6.1/go.mod h1:vrN+CftYYNnDM+DQqd863ATynvYFm/6FuY9D4TeAm2Y= +github.com/smallstep/pkcs7 v0.0.0-20231024181729-3b98ecc1ca81 h1:B6cED3iLJTgxpdh4tuqByDjRRKan2EvtnOfHr2zHJVg= +github.com/smallstep/pkcs7 v0.0.0-20231024181729-3b98ecc1ca81/go.mod h1:SoUAr/4M46rZ3WaLstHxGhLEgoYIDRqxQEXLOmOEB0Y= +github.com/smallstep/scep v0.0.0-20231024192529-aee96d7ad34d h1:06LUHn4Ia2X6syjIaCMNaXXDNdU+1N/oOHynJbWgpXw= +github.com/smallstep/scep v0.0.0-20231024192529-aee96d7ad34d/go.mod h1:4d0ub42ut1mMtvGyMensjuHYEUpRrASvkzLEJvoRQcU= +github.com/smallstep/truststore v0.13.0 h1:90if9htAOblavbMeWlqNLnO9bsjjgVv2hQeQJCi/py4= +github.com/smallstep/truststore v0.13.0/go.mod h1:3tmMp2aLKZ/OA/jnFUB0cYPcho402UG2knuJoPh4j7A= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tailscale/tscert v0.0.0-20240517230440-bbccfbf48933 h1:pV0H+XIvFoP7pl1MRtyPXh5hqoxB5I7snOtTHgrn6HU= +github.com/tailscale/tscert v0.0.0-20240517230440-bbccfbf48933/go.mod h1:kNGUQ3VESx3VZwRwA9MSCUegIl6+saPL8Noq82ozCaU= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= +github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.4.15/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.7.1 h1:3bajkSilaCbjdKVsKdZjZCLBNPL9pYzrCakKaf4U49U= +github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+IAOyRda+RLrxa1WC7umKOZRsGq4QrFFMYApOeHzQwQ= +github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I= +github.com/zeebo/assert v1.1.0 h1:hU1L1vLTHsnO8x8c9KAR5GmM5QscxHg5RNU5z5qbUWY= +github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= +github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= +github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= +github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= +go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/contrib/propagators/autoprop v0.42.0 h1:s2RzYOAqHVgG23q8fPWYChobUoZM6rJZ98EnylJr66w= +go.opentelemetry.io/contrib/propagators/autoprop v0.42.0/go.mod h1:Mv/tWNtZn+NbALDb2XcItP0OM3lWWZjAfSroINxfW+Y= +go.opentelemetry.io/contrib/propagators/aws v1.17.0 h1:IX8d7l2uRw61BlmZBOTQFaK+y22j6vytMVTs9wFrO+c= +go.opentelemetry.io/contrib/propagators/aws v1.17.0/go.mod h1:pAlCYRWff4uGqRXOVn3WP8pDZ5E0K56bEoG7a1VSL4k= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0 h1:ImOVvHnku8jijXqkwCSyYKRDt2YrnGXD4BbhcpfbfJo= +go.opentelemetry.io/contrib/propagators/b3 v1.17.0/go.mod h1:IkfUfMpKWmynvvE0264trz0sf32NRTZL4nuAN9AbWRc= +go.opentelemetry.io/contrib/propagators/jaeger v1.17.0 h1:Zbpbmwav32Ea5jSotpmkWEl3a6Xvd4tw/3xxGO1i05Y= +go.opentelemetry.io/contrib/propagators/jaeger v1.17.0/go.mod h1:tcTUAlmO8nuInPDSBVfG+CP6Mzjy5+gNV4mPxMbL0IA= +go.opentelemetry.io/contrib/propagators/ot v1.17.0 h1:ufo2Vsz8l76eI47jFjuVyjyB3Ae2DmfiCV/o6Vc8ii0= +go.opentelemetry.io/contrib/propagators/ot v1.17.0/go.mod h1:SbKPj5XGp8K/sGm05XblaIABgMgw2jDczP8gGeuaVLk= +go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0 h1:cl5P5/GIfFh4t6xyruOgJP5QiA1pw4fYYdv6nc6CBWw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.21.0/go.mod h1:zgBdWWAu7oEEMC06MMKc5NLbA/1YDXV1sMpSqEeLQLg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0 h1:tIqheXEFWAZ7O8A7m+J0aPTmpJN3YQ7qetUAdkkkKpk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.21.0/go.mod h1:nUeKExfxAQVbiVFn32YXpXZZHZ61Cc3s3Rn1pDBGAb0= +go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.step.sm/cli-utils v0.9.0 h1:55jYcsQbnArNqepZyAwcato6Zy2MoZDRkWW+jF+aPfQ= +go.step.sm/cli-utils v0.9.0/go.mod h1:Y/CRoWl1FVR9j+7PnAewufAwKmBOTzR6l9+7EYGAnp8= +go.step.sm/crypto v0.45.0 h1:Z0WYAaaOYrJmKP9sJkPW+6wy3pgN3Ija8ek/D4serjc= +go.step.sm/crypto v0.45.0/go.mod h1:6IYlT0L2jfj81nVyCPpvA5cORy0EVHPhieSgQyuwHIY= +go.step.sm/linkedca v0.20.1 h1:bHDn1+UG1NgRrERkWbbCiAIvv4lD5NOFaswPDTyO5vU= +go.step.sm/linkedca v0.20.1/go.mod h1:Vaq4+Umtjh7DLFI1KuIxeo598vfBzgSYZUjgVJ7Syxw= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= +go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap/exp v0.2.0 h1:FtGenNNeCATRB3CmB/yEUnjEFeJWpB/pMcy7e2bKPYs= +go.uber.org/zap/exp v0.2.0/go.mod h1:t0gqAIdh1MfKv9EwN/dLwfZnJxe9ITAZN78HEWPFWDQ= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto/x509roots/fallback v0.0.0-20240507223354-67b13616a595 h1:TgSqweA595vD0Zt86JzLv3Pb/syKg8gd5KMGGbJPYFw= +golang.org/x/crypto/x509roots/fallback v0.0.0-20240507223354-67b13616a595/go.mod h1:kNa9WdvYnzFwC79zRpLRMJbdEFlhyM5RPFBBZp/wWH8= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= +golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.180.0 h1:M2D87Yo0rGBPWpo1orwfCLehUUL6E7/TYe5gvMQWDh4= +google.golang.org/api v0.180.0/go.mod h1:51AiyoEg1MJPSZ9zvklA8VnRILPXxn1iVen9v25XHAE= +google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda h1:wu/KJm9KJwpfHWhkkZGohVC6KRrc1oJNr4jwtQMOQXw= +google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCeCSir/JJSWosk19BR4NVxGqHUC6rxIRsd7Aw= +google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae h1:AH34z6WAGVNkllnKs5raNq3yRq93VnjBG6rpfub/jYk= +google.golang.org/genproto/googleapis/api v0.0.0-20240506185236-b8a5c65736ae/go.mod h1:FfiGhwUm6CJviekPrc0oJ+7h29e+DmWU6UtjX0ZvI7Y= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 h1:DujSIu+2tC9Ht0aPNA7jgj23Iq8Ewi5sgkQ++wdvonE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= +howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= diff --git a/dcaddy/main.go b/dcaddy/main.go new file mode 100644 index 0000000..5e037b5 --- /dev/null +++ b/dcaddy/main.go @@ -0,0 +1,12 @@ +package main + +import ( + caddycmd "github.com/caddyserver/caddy/v2/cmd" + + // plug in Caddy modules here + _ "github.com/caddyserver/caddy/v2/modules/standard" +) + +func main() { + caddycmd.Main() +} diff --git a/dcaddy/plugin/caddydns/caddyfile.go b/dcaddy/plugin/caddydns/caddyfile.go new file mode 100644 index 0000000..9cda515 --- /dev/null +++ b/dcaddy/plugin/caddydns/caddyfile.go @@ -0,0 +1,14 @@ +package caddydns + +import ( + "github.com/caddyserver/caddy/v2/caddyconfig/httpcaddyfile" + "github.com/caddyserver/caddy/v2/modules/caddyhttp" +) + +func init() { + httpcaddyfile.RegisterHandlerDirective("dns_over_https", func(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error) { + mod := &Handler{} + err := mod.UnmarshalCaddyfile(h.Dispenser) + return mod, err + }) +}