Skip to content

Instantly share code, notes, and snippets.

@ugjka
Last active November 2, 2025 18:32
Show Gist options
  • Select an option

  • Save ugjka/2d5e9688c75ca4dc68b845d920d75bc8 to your computer and use it in GitHub Desktop.

Select an option

Save ugjka/2d5e9688c75ca4dc68b845d920d75bc8 to your computer and use it in GitHub Desktop.
routerhosts.go
package main
import (
"bufio"
"bytes"
"fmt"
"io"
"net/http"
"os"
"os/exec"
)
const SOURCE = "https://raw.githubusercontent.com/StevenBlack/hosts/refs/heads/master/hosts"
const DIR = "/tmp/hosts/"
const ORIGINAL = DIR + "hosts.orig.txt"
const MODIFIED = DIR + "hosts.txt"
type on = bool
type off = bool
type rule = string
var add = map[rule]on{
// inbox.lv ads
"0.0.0.0 b.adbox.lv": true,
// delfi.lv anti-adblock
"0.0.0.0 experience-eu.piano.io": true,
"0.0.0.0 vx.delfi.lv": true,
}
var remove = map[rule]off{
// breaks google search
"0.0.0.0 www.googleadservices.com": true,
// unsure
"0.0.0.0 piano.io": false,
"0.0.0.0 k.clarity.ms": false,
"0.0.0.0 inmobi.com": false,
}
var scp = exec.Command("scp", MODIFIED, "router.lan:/usb1-part1/hosts/hosts.txt")
var reload = exec.Command("ssh", "router.lan", "/ip/dns/adlist reload")
var diff = exec.Command("colordiff", ORIGINAL, MODIFIED)
func main() {
os.Mkdir(DIR, 0755)
response, err := http.Get(SOURCE)
check(err)
if response.StatusCode != http.StatusOK {
check(fmt.Errorf("http status not OK: %d", response.StatusCode))
}
body, err := io.ReadAll(response.Body)
check(err)
response.Body.Close()
os.Remove(ORIGINAL)
err = os.WriteFile(ORIGINAL, body, 0644)
check(err)
output := bytes.NewBuffer(nil)
for rule, on := range add {
if on {
output.WriteString(rule + "\n")
}
}
scanner := bufio.NewScanner(bytes.NewBuffer(body))
for scanner.Scan() {
rule := scanner.Text()
if off, present := remove[rule]; present && off {
continue
}
output.WriteString(rule + "\n")
}
check(scanner.Err())
os.Remove(MODIFIED)
err = os.WriteFile(MODIFIED, output.Bytes(), 0644)
check(err)
err = run(scp)
check(err)
err = run(reload)
check(err)
run(diff)
}
func run(cmd *exec.Cmd) error {
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
return cmd.Run()
}
func check(err error) {
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment