mirror of
https://github.com/fosrl/olm.git
synced 2026-02-08 05:56:41 +00:00
237 lines
5.7 KiB
Go
237 lines
5.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"net/netip"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/your-org/olm/dns/platform"
|
|
)
|
|
|
|
func main() {
|
|
// Example 1: Automatic detection and DNS override
|
|
exampleAutoDetection()
|
|
|
|
// Example 2: Manual platform selection
|
|
// exampleManualSelection()
|
|
|
|
// Example 3: Get current system DNS
|
|
// exampleGetCurrentDNS()
|
|
}
|
|
|
|
// exampleAutoDetection demonstrates automatic detection of the best DNS configurator
|
|
func exampleAutoDetection() {
|
|
fmt.Println("=== Example 1: Automatic Detection ===")
|
|
|
|
// On Linux/Unix, provide an interface name for better detection
|
|
// On macOS, the interface name is ignored
|
|
// On Windows, provide the interface GUID
|
|
ifaceName := "eth0" // Change this to your interface name
|
|
|
|
configurator, err := platform.DetectBestConfigurator(ifaceName)
|
|
if err != nil {
|
|
log.Fatalf("Failed to detect DNS configurator: %v", err)
|
|
}
|
|
|
|
fmt.Printf("Using DNS configurator: %s\n", configurator.Name())
|
|
|
|
// Get current DNS servers before changing
|
|
currentDNS, err := configurator.GetCurrentDNS()
|
|
if err != nil {
|
|
log.Printf("Warning: Could not get current DNS: %v", err)
|
|
} else {
|
|
fmt.Printf("Current DNS servers: %v\n", currentDNS)
|
|
}
|
|
|
|
// Set new DNS servers
|
|
newDNS := []netip.Addr{
|
|
netip.MustParseAddr("1.1.1.1"), // Cloudflare
|
|
netip.MustParseAddr("8.8.8.8"), // Google
|
|
}
|
|
|
|
fmt.Printf("Setting DNS servers to: %v\n", newDNS)
|
|
originalDNS, err := configurator.SetDNS(newDNS)
|
|
if err != nil {
|
|
log.Fatalf("Failed to set DNS: %v", err)
|
|
}
|
|
|
|
fmt.Printf("Original DNS servers (backed up): %v\n", originalDNS)
|
|
|
|
// Set up signal handling for graceful shutdown
|
|
sigChan := make(chan os.Signal, 1)
|
|
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
// Run for 30 seconds or until interrupted
|
|
fmt.Println("\nDNS override active. Press Ctrl+C to restore original DNS.")
|
|
fmt.Println("Waiting 30 seconds...")
|
|
|
|
select {
|
|
case <-time.After(30 * time.Second):
|
|
fmt.Println("\nTimeout reached.")
|
|
case sig := <-sigChan:
|
|
fmt.Printf("\nReceived signal: %v\n", sig)
|
|
}
|
|
|
|
// Restore original DNS
|
|
fmt.Println("Restoring original DNS servers...")
|
|
if err := configurator.RestoreDNS(); err != nil {
|
|
log.Fatalf("Failed to restore DNS: %v", err)
|
|
}
|
|
|
|
fmt.Println("DNS restored successfully!")
|
|
}
|
|
|
|
// exampleManualSelection demonstrates manual selection of DNS configurator
|
|
func exampleManualSelection() {
|
|
fmt.Println("=== Example 2: Manual Selection ===")
|
|
|
|
// Linux - systemd-resolved
|
|
configurator, err := platform.NewSystemdResolvedDNSConfigurator("eth0")
|
|
if err != nil {
|
|
log.Fatalf("Failed to create systemd-resolved configurator: %v", err)
|
|
}
|
|
|
|
fmt.Printf("Using: %s\n", configurator.Name())
|
|
|
|
newDNS := []netip.Addr{
|
|
netip.MustParseAddr("1.1.1.1"),
|
|
}
|
|
|
|
originalDNS, err := configurator.SetDNS(newDNS)
|
|
if err != nil {
|
|
log.Fatalf("Failed to set DNS: %v", err)
|
|
}
|
|
|
|
fmt.Printf("Changed from %v to %v\n", originalDNS, newDNS)
|
|
|
|
// Restore after 10 seconds
|
|
time.Sleep(10 * time.Second)
|
|
configurator.RestoreDNS()
|
|
}
|
|
|
|
// exampleGetCurrentDNS demonstrates getting current system DNS
|
|
func exampleGetCurrentDNS() {
|
|
fmt.Println("=== Example 3: Get Current DNS ===")
|
|
|
|
configurator, err := platform.DetectBestConfigurator("eth0")
|
|
if err != nil {
|
|
log.Fatalf("Failed to detect configurator: %v", err)
|
|
}
|
|
|
|
servers, err := configurator.GetCurrentDNS()
|
|
if err != nil {
|
|
log.Fatalf("Failed to get DNS: %v", err)
|
|
}
|
|
|
|
fmt.Printf("Current DNS servers (%s):\n", configurator.Name())
|
|
for i, server := range servers {
|
|
fmt.Printf(" %d. %s\n", i+1, server)
|
|
}
|
|
}
|
|
|
|
// Platform-specific examples
|
|
|
|
// exampleLinuxFile demonstrates direct file manipulation on Linux
|
|
func exampleLinuxFile() {
|
|
configurator, err := platform.NewFileDNSConfigurator()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
newDNS := []netip.Addr{
|
|
netip.MustParseAddr("8.8.8.8"),
|
|
}
|
|
|
|
originalDNS, err := configurator.SetDNS(newDNS)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
defer configurator.RestoreDNS()
|
|
|
|
fmt.Printf("Changed from %v to %v\n", originalDNS, newDNS)
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
|
|
// exampleLinuxNetworkManager demonstrates NetworkManager on Linux
|
|
func exampleLinuxNetworkManager() {
|
|
if !platform.IsNetworkManagerAvailable() {
|
|
fmt.Println("NetworkManager is not available")
|
|
return
|
|
}
|
|
|
|
configurator, err := platform.NewNetworkManagerDNSConfigurator("eth0")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
newDNS := []netip.Addr{
|
|
netip.MustParseAddr("1.1.1.1"),
|
|
}
|
|
|
|
originalDNS, err := configurator.SetDNS(newDNS)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
defer configurator.RestoreDNS()
|
|
|
|
fmt.Printf("Changed from %v to %v\n", originalDNS, newDNS)
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
|
|
// exampleMacOS demonstrates macOS DNS override
|
|
func exampleMacOS() {
|
|
configurator, err := platform.NewDarwinDNSConfigurator()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
newDNS := []netip.Addr{
|
|
netip.MustParseAddr("1.1.1.1"),
|
|
netip.MustParseAddr("1.0.0.1"),
|
|
}
|
|
|
|
originalDNS, err := configurator.SetDNS(newDNS)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
defer configurator.RestoreDNS()
|
|
|
|
fmt.Printf("Changed from %v to %v\n", originalDNS, newDNS)
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
|
|
// exampleWindows demonstrates Windows DNS override
|
|
func exampleWindows() {
|
|
// You need to get the interface GUID first
|
|
// This can be obtained from:
|
|
// - ipconfig /all (look for the interface's GUID)
|
|
// - registry: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
|
|
guid := "{YOUR-INTERFACE-GUID-HERE}"
|
|
|
|
configurator, err := platform.NewWindowsDNSConfigurator(guid)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
newDNS := []netip.Addr{
|
|
netip.MustParseAddr("1.1.1.1"),
|
|
}
|
|
|
|
originalDNS, err := configurator.SetDNS(newDNS)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
defer configurator.RestoreDNS()
|
|
|
|
fmt.Printf("Changed from %v to %v\n", originalDNS, newDNS)
|
|
time.Sleep(10 * time.Second)
|
|
}
|