Puddy; WebGrep; fast-rustup
The Drop is B.A.C.K. after a brief-ish hiatus from welcoming one of these lads (#2.2) into this messed up world of ours and helping take care of both of them while #2 recovered from an unfortunately “eventful” delivery (she’s doing fine, now, tho).

We’ll ease into the week with some helpful utilities/services that you may not even know you need!
TL;DR
This is an AI-generated summary of today’s content.
- Puddy: A web app and CLI Perl tool for querying public DNS servers to compare DNS resolver results, useful for checking if a hostname or record resolves consistently across different resolvers. It supports both regular DNS queries and DNS-over-HTTPS (DoH) from various public DoH providers. The tool simplifies what would otherwise be a tedious manual process (puddy).
- WebGrep: A self-contained Python tool that extends the functionality of the traditional
grepcommand to web pages. It includes features like JavaScript de-obfuscation, OCR, and steganography checks in images (with additional helpers installed). WebGrep offers various options for customizing searches and can be used for tasks such as checking for mentions of Python on websites WebGrep. - fast-rustup: A utility that speeds up the process of setting up Rust by running necessary installations in parallel, reducing a process that might take around 20 seconds to less than 5 seconds. This tool is particularly useful for Rust developers building cross-platform binaries who wish to save time on setup (fast-rustup).
Puddy

If you’ve ever found yourself in a situation where you need to compare public DNS resolver results, then you may be interested in puddy (GH), a small web app or CLI Perl tool that lets us successively query public DNS servers and retrieve the results.
Just enter a name and record type to look up, and puddy takes care of the rest. It queries a bunch of public DNS resolvers via regular UDP port 53 DNS queries. If you choose DNS-over-HTTPS (DoH), several public DoH providers will be asked instead, plus you can choose the source region with this option..
Why do we need this? Well, sometimes it can be useful to check whether a given hostname or record resolves to the same value across different DNS resolvers. Manually querying multiple resolvers can be a tedious task, but puddy does the work for you. As the site says, it’s like having a “magic 8.8.8.8 ball” that can ask other resolvers elsewhere if they have different results.
You don’t need to have Perl installed or use your browser to make use of puddy. You’re one curl away from performing the checks from the command line:
curl -s "https://www.netmeister.org/puddy/index.cgi?name=thats.hrbrmstr.dev&type=AAAA&format=json&lookup=normal&country=default" | jq
{
"results": {
"216.146.35.35": {
"AAAA": {
"rrs": [
{
"ttl": 3600,
"value": "2a01:4f8:c010:ba04::1"
}
],
"status": "NOERROR"
},
"comment": "Dyn"
},
"2001:1608:10:25::1c04:b12f": {
"AAAA": {
"rrs": [
{
"ttl": 3555,
"value": "2a01:4f8:c010:ba04::1"
}
],
"status": "NOERROR"
},
"comment": "DNS.Watch"
},
"2620:0:ccd::2": {
"AAAA": {
"status": "NOERROR",
"rrs": [
{
"value": "2a01:4f8:c010:ba04::1",
"ttl": 3600
}
]
},
"comment": "OpenDNS"
},
"2001:470:20::2": {
"comment": "Hurricane Electric",
"AAAA": {
"status": "NOERROR",
"rrs": [
{
"ttl": 2620,
"value": "2a01:4f8:c010:ba04::1"
}
]
}
},
"2a02:6b8::feed:bad": {
"comment": "Yandex.DNS",
"AAAA": {
"status": "NOERROR",
"rrs": [
{
"value": "2a01:4f8:c010:ba04::1",
"ttl": 3171
}
]
}
},
"8.20.247.20": {
"comment": "Comodo Secure DNS",
"AAAA": {
"status": "NOERROR",
"rrs": [
{
"value": "2a01:4f8:c010:ba04::1",
"ttl": 3554
}
]
}
},
"2620:fe::fe": {
"comment": "Quad9",
"AAAA": {
"rrs": [
{
"ttl": 3600,
"value": "2a01:4f8:c010:ba04::1"
}
],
"status": "NOERROR"
}
},
"2a0f:fc80::": {
"comment": "dns0.eu",
"AAAA": {
"status": "NOERROR",
"rrs": [
{
"value": "2a01:4f8:c010:ba04::1",
"ttl": 2620
}
]
}
},
"2606:4700:4700::1111": {
"AAAA": {
"status": "NOERROR",
"rrs": [
{
"ttl": 3600,
"value": "2a01:4f8:c010:ba04::1"
}
]
},
"comment": "Cloudflare"
},
"209.244.0.4": {
"comment": "Level3",
"AAAA": {
"status": "NOERROR",
"rrs": [
{
"ttl": 3554,
"value": "2a01:4f8:c010:ba04::1"
}
]
}
},
"2001:4860:4860::8844": {
"comment": "Google Public DNS",
"AAAA": {
"rrs": [
{
"value": "2a01:4f8:c010:ba04::1",
"ttl": 3554
}
],
"status": "NOERROR"
}
}
},
"query": "thats.hrbrmstr.dev",
"type": [
"AAAA"
]
}
Of course, intrepid readers are encouraged to port the Perl code to Go, Rust, Swift, etc. Perhaps we’ll try that out on Friday!
WebGrep

WebGrep is a self-contained (Python) tool that relies on the well-known grep tool for, well, grepping web pages. It binds nearly every option of the original tool and also provides additional features like JavaScript de-obfuscation, OCR, and even checking images for steganography (provided you install the right helpers).
The tool provides various options to customize searches. For instance, we can choose to grep all resources, even non-same-origin ones, include HTTP headers in searches, or use a session cookie in the HTTP headers. Proxy settings can be manually set or disabled, and WebGrep also provides examples of usage to help you get started (which I’ll lean on to keep this section brief).
Here’s one example to see if anyone has ragged on Python lately over at lobste.rs:
$ webgrep -i "python" "https://lobste.rs/active"
<a class="u-url" href="https://josvisser.substack.com/p/why-python-is-terrible" rel="ugc noreferrer">Why Python is terrible</a>
<a class="tag tag_python" href="/t/python" title="Python programming">python</a>
<a href="https://web.archive.org/web/3/https%3A%2F%2Fjosvisser.substack.com%2Fp%2Fwhy-python-is-terrible">Archive.org</a>
<a href="https://archive.today/https%3A%2F%2Fjosvisser.substack.com%2Fp%2Fwhy-python-is-terrible">Archive.today</a>
<a href="https://ghostarchive.org/search?term=https%3A%2F%2Fjosvisser.substack.com%2Fp%2Fwhy-python-is-terrible">Ghostarchive</a>
<a aria-level="2" href="/s/u4fvjt/why_python_is_terrible" role="heading">
<a class="mobile_comments" href="/s/u4fvjt/why_python_is_terrible" style="display: none;">
<a class="u-url" href="https://lukeplant.me.uk/blog/posts/python-packaging-must-be-getting-better-a-datapoint/" rel="ugc noreferrer">Python packaging must be getting better: a datapoint</a>
<a class="tag tag_python" href="/t/python" title="Python programming">python</a>
<a href="https://web.archive.org/web/3/https%3A%2F%2Flukeplant.me.uk%2Fblog%2Fposts%2Fpython-packaging-must-be-getting-better-a-datapoint%2F">Archive.org</a>
<a href="https://archive.today/https%3A%2F%2Flukeplant.me.uk%2Fblog%2Fposts%2Fpython-packaging-must-be-getting-better-a-datapoint%2F">Archive.today</a>
<a href="https://ghostarchive.org/search?term=https%3A%2F%2Flukeplant.me.uk%2Fblog%2Fposts%2Fpython-packaging-must-be-getting-better-a-datapoint%2F">Ghostarchive</a>
<a aria-level="2" href="/s/slkn4g/python_packaging_must_be_getting_better" role="heading">
<a class="mobile_comments" href="/s/slkn4g/python_packaging_must_be_getting_better" style="display: none;">
Good to see folks realize that Python is most assuredly terrible, too.
fast-rustup

This is another quick one, both in terms of section length and how it performs! If you’ve ever worked with Rust you know the “rustup” setup can take a bit due to the sequential nature of the component installs. This becomes even more apparent if you try to build cross-platform binaries. fast-rustup does all the necessary things in parallel, which can shunt a ~20 second process (over a fast internet connection) down to <5 seconds. Yes, you weren’t exactly suffering before this too, but it’s nice to get even a few seconds back every now and again.
FIN
Remember, you can follow and interact with the full text of The Daily Drop’s free posts on Mastodon via @dailydrop.hrbrmstr.dev@dailydrop.hrbrmstr.dev ☮️
Leave a comment