Compare commits
	
		
			2 Commits
		
	
	
		
			e761e4b806
			...
			b017332f6b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b017332f6b | |||
| b33dffbbcf | 
@@ -7,8 +7,10 @@ import (
 | 
				
			|||||||
	"io"
 | 
						"io"
 | 
				
			||||||
	"log"
 | 
						"log"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"os/exec"
 | 
						"os/exec"
 | 
				
			||||||
 | 
						"path"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -21,8 +23,10 @@ type NetBoxResponse struct {
 | 
				
			|||||||
	Results []IPAddress `json:"results"`
 | 
						Results []IPAddress `json:"results"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func FetchNetboxIPAddresses(apiURL, token string) ([]IPAddress, error) {
 | 
					func FetchNetboxIPAddresses(apiBaseURL, token string) ([]IPAddress, error) {
 | 
				
			||||||
	req, err := http.NewRequest("GET", apiURL, nil)
 | 
						u, _ := url.Parse(apiBaseURL)
 | 
				
			||||||
 | 
						u.Path = path.Join(u.Path, "ipam/ip-addresses")
 | 
				
			||||||
 | 
						req, err := http.NewRequest("GET", u.String(), nil)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -57,7 +61,7 @@ func FetchNetboxIPAddresses(apiURL, token string) ([]IPAddress, error) {
 | 
				
			|||||||
	return filtered, nil
 | 
						return filtered, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func CreateDnsMasqConfig() {
 | 
					func CreateDnsMasqConfig(writeConfig bool) {
 | 
				
			||||||
	token := os.Getenv("NETBOX_TOKEN")
 | 
						token := os.Getenv("NETBOX_TOKEN")
 | 
				
			||||||
	if token == "" {
 | 
						if token == "" {
 | 
				
			||||||
		home := os.Getenv("HOME")
 | 
							home := os.Getenv("HOME")
 | 
				
			||||||
@@ -77,13 +81,13 @@ func CreateDnsMasqConfig() {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ips, err := FetchNetboxIPAddresses(apiURL, token)
 | 
						ips, err := FetchNetboxIPAddresses(apiBaseURL, token)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		log.Fatalf("Error fetching IP addresses: %v", err)
 | 
							log.Fatalf("Error fetching IP addresses: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dir := "/etc/dnsmasq.d"
 | 
						dir := "/etc/dnsmasq.d"
 | 
				
			||||||
	if stat, err := os.Stat(dir); err == nil && stat.IsDir() {
 | 
						if stat, err := os.Stat(dir); err == nil && stat.IsDir() && !writeConfig {
 | 
				
			||||||
		file, err := os.Create(dir + "/netbox.conf")
 | 
							file, err := os.Create(dir + "/netbox.conf")
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			log.Fatalf("Failed to create netbox.conf: %v", err)
 | 
								log.Fatalf("Failed to create netbox.conf: %v", err)
 | 
				
			||||||
@@ -99,20 +103,27 @@ func CreateDnsMasqConfig() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var apiURL string
 | 
					var apiBaseURL string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func main() {
 | 
					func main() {
 | 
				
			||||||
	listenAddr := flag.String("listen", ":8080", "address and port to listen on (e.g. :8080 or 127.0.0.1:8080)")
 | 
						listenAddr := flag.String("listen", ":8080", "address and port to listen on (e.g. :8080 or 127.0.0.1:8080)")
 | 
				
			||||||
	flag.StringVar(&apiURL, "api-url", "https://netbox.koszewscy.waw.pl/api/ipam/ip-addresses/", "NetBox API URL to fetch IP addresses")
 | 
						flag.StringVar(&apiBaseURL, "api-url", "https://netbox.koszewscy.waw.pl/api", "NetBox API URL to fetch IP addresses")
 | 
				
			||||||
 | 
						dryRun := flag.Bool("dry-run", false, "if set, do not write to dnsmasq config file, just print the output")
 | 
				
			||||||
	flag.Parse()
 | 
						flag.Parse()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if *dryRun {
 | 
				
			||||||
 | 
							log.Println("Dry run mode enabled, not writing to dnsmasq config file.")
 | 
				
			||||||
 | 
							CreateDnsMasqConfig(true)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	http.HandleFunc("/update-dnsmasq", func(w http.ResponseWriter, r *http.Request) {
 | 
						http.HandleFunc("/update-dnsmasq", func(w http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
		if r.Method != http.MethodGet {
 | 
							if r.Method != http.MethodGet {
 | 
				
			||||||
			w.WriteHeader(http.StatusMethodNotAllowed)
 | 
								w.WriteHeader(http.StatusMethodNotAllowed)
 | 
				
			||||||
			w.Write([]byte("Method not allowed"))
 | 
								w.Write([]byte("Method not allowed"))
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		CreateDnsMasqConfig()
 | 
							CreateDnsMasqConfig(false)
 | 
				
			||||||
		cmd := exec.Command("systemctl", "restart", "dnsmasq.service")
 | 
							cmd := exec.Command("systemctl", "restart", "dnsmasq.service")
 | 
				
			||||||
		if err := cmd.Run(); err != nil {
 | 
							if err := cmd.Run(); err != nil {
 | 
				
			||||||
			log.Printf("Failed to restart dnsmasq.service: %v", err)
 | 
								log.Printf("Failed to restart dnsmasq.service: %v", err)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user