Files
dnshelper/README.md
T

189 lines
5.0 KiB
Markdown
Raw Normal View History

# dns-helper
A cross-platform CLI tool that resolves hostnames against a specified DNS server and writes the resulting IP-to-hostname mappings into the local hosts file. It manages a clearly delimited block within the hosts file so it can cleanly add and remove only its own entries.
Built as a single static binary with no runtime dependencies.
**Copyright (c) 2024 Emberkom LLC**
## Features
- Resolve one or more hostnames via a specified DNS server and add them to the system hosts file
- Remove individual hostnames or all managed entries from the hosts file
- Managed block markers ensure only dns-helper's entries are modified — the rest of the hosts file is never touched
- Automatic backup of the hosts file before every write (stored alongside the executable)
- File-based lock prevents concurrent modifications
- Cross-platform: Windows, macOS, and Linux
## Requirements
- **Go 1.20** toolchain (this project must not use Go 1.21+ features)
- Administrator / root privileges (required to modify the system hosts file)
## Installation
### Build from source
```powershell
# Clone the repository
git clone <repo-url>
cd dns-helper
# Build for the current platform
.\build.ps1
# Or build optimized release binaries for all platforms
.\build.ps1 -Release -CrossCompile
```
The default build output is `build\dns-helper.exe` (Windows). Cross-compiled binaries are named `build\dns-helper-<os>-<arch>[.exe]`.
### Release packages
```powershell
# Build release binaries and create distributable archives
.\build.ps1 -Release -CrossCompile -Package
```
Archives are written to `releases\dns-helper-<version>-<os>-<arch>.zip` (Windows) or `.tar.gz` (macOS/Linux).
## Usage
> **Note:** dns-helper must be run with elevated privileges (Run as Administrator on Windows, `sudo` on macOS/Linux) because it modifies the system hosts file.
### Add entries
Resolve hostnames via a DNS server and add the resulting IP mappings to the hosts file:
```sh
dns-helper add -host hostname.example.com -server dns.example.com
```
Add multiple hostnames at once (comma-separated):
```sh
dns-helper add -host "host1.example.com,host2.example.com" -server dns.example.com
```
Short alias:
```sh
dns-helper a -host hostname.example.com -server dns.example.com
```
### Delete entries
Remove a specific hostname:
```sh
dns-helper delete -host hostname.example.com
```
Remove multiple hostnames:
```sh
dns-helper delete -host "host1.example.com,host2.example.com"
```
Remove **all** managed entries:
```sh
dns-helper delete all
```
Short aliases: `d`, `del`
### Command reference
| Command | Flag | Required | Description |
|---------|------|----------|-------------|
| `add` | `-host` | Yes | Comma-separated hostnames to resolve and add |
| `add` | `-server` | Yes | DNS resolver to query (e.g. `dns.example.com`) |
| `delete` | `-host` | Yes (unless `all`) | Comma-separated hostnames to remove |
| `delete all` | — | — | Removes every entry dns-helper has written |
### Exit codes
| Code | Meaning |
|------|---------|
| 0 | Success |
| 1 | Error or partial failure (e.g. one hostname failed to resolve) |
## How it works
dns-helper wraps its entries between two marker lines in the hosts file:
```
# DNSHelper <<-> START CONFIG
192.0.2.1 hostname.example.com
# DNSHelper <->> END CONFIG
```
Only lines within this managed block are ever modified or removed. The rest of the hosts file is preserved exactly as-is.
Before every write, a backup of the hosts file is saved to the directory containing the dns-helper executable.
### Hosts file locations
| Platform | Path |
|----------|------|
| Windows | `%SystemRoot%\System32\drivers\etc\hosts` |
| macOS | `/etc/hosts` |
| Linux | `/etc/hosts` |
## Project structure
```
main.go CLI entry point (add / delete commands, flag parsing)
build.ps1 Build & packaging script
go.mod Module definition (Go 1.20, golang.org/x/net)
hostfile/
hostfile.go Hosts file parsing, DNSEntry type, add/remove helpers
managed.go Managed block read/write logic
filesystem.go FileSystem interface + OSFileSystem implementation
hostfile_test.go
managed_test.go
lockfile/
lockfile.go File-based mutex to prevent concurrent modifications
lockfile_test.go
platform/
platform.go Platform interface — GetHostsFilePath()
platform_windows.go Windows implementation
platform_darwin.go macOS implementation
platform_linux.go Linux implementation
platform_test.go
resolver/
resolver.go DNS resolution via golang.org/x/net/dns/dnsmessage
resolver_test.go
```
## Development
### Running tests
```sh
go1.20 test ./...
```
### Running tests with coverage
```sh
go1.20 test -cover ./...
```
### Vetting code
```sh
go1.20 vet ./...
```
## Dependencies
- [`golang.org/x/net`](https://pkg.go.dev/golang.org/x/net) — DNS message parsing (`golang.org/x/net/dns/dnsmessage`)
No other third-party dependencies. Standard library first.
## License
Copyright (c) 2024 Emberkom LLC. All rights reserved.