87 lines
1.7 KiB
Go
87 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"os"
|
|
"sync"
|
|
)
|
|
|
|
func main() {
|
|
port := os.Args[1]
|
|
password := os.Args[2]
|
|
urls := os.Args[3:]
|
|
|
|
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
|
requestCount := len(urls)
|
|
var wg sync.WaitGroup
|
|
wg.Add(requestCount)
|
|
|
|
for i := 0; i < requestCount; i++ {
|
|
disablePihole(urls[i], password, &wg)
|
|
}
|
|
wg.Wait()
|
|
|
|
w.Write([]byte("OK"))
|
|
})
|
|
|
|
http.ListenAndServe("127.0.0.1:"+port, nil)
|
|
}
|
|
|
|
func disablePihole(url string, password string, wg *sync.WaitGroup) error {
|
|
defer wg.Done()
|
|
sid, err := callAuthenticate(url, password)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
requestBody, err := json.Marshal(PiholeDisableBlockingBody{
|
|
Sid: sid,
|
|
Blocking: false,
|
|
Timer: 60 * 5,
|
|
})
|
|
_, err = http.Post(url+"/api/dns/blocking", "application/json", bytes.NewReader(requestBody))
|
|
return err
|
|
}
|
|
|
|
func callAuthenticate(url string, password string) (string, error) {
|
|
requestBody, err := json.Marshal(PiholeAuthRequestBody{
|
|
Password: password,
|
|
})
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
resp, err := http.Post(url+"/api/auth", "application/json", bytes.NewReader(requestBody))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer resp.Body.Close()
|
|
responseBody, err := io.ReadAll(resp.Body)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
result := PiholeAuthResponseBody{}
|
|
err = json.Unmarshal(responseBody, &result)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return result.Session.Sid, nil
|
|
}
|
|
|
|
type PiholeAuthRequestBody struct {
|
|
Password string `json:"password"`
|
|
}
|
|
|
|
type PiholeAuthResponseBody struct {
|
|
Session struct {
|
|
Sid string `json:"sid"`
|
|
} `json:"session"`
|
|
}
|
|
|
|
type PiholeDisableBlockingBody struct {
|
|
Sid string `json:"sid"`
|
|
Blocking bool `json:"blocking"`
|
|
Timer int64 `json:"timer"`
|
|
}
|