diff --git a/README.md b/README.md index e9ac395..d3fdc87 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,12 @@ In case routes clash or cant be added to Wireguard, Warnings will be logged. ### 1.2.1. Environment -Variable|Description|Default --|-|- -`INTERFACE`* | Wireguard-Interface Name | -`FILTER_PROTOCOL` | Protocol to react on | All -`FILTER_TABLE` | Table to react on | All +Variable|Description|Type|Default +-|-|-|- +`INTERFACE`* | Wireguard-Interface Name | String | +`FILTER_PROTOCOL` | Protocol to react on | Number / iproute2-name | All +`FILTER_TABLE` | Table to react on | Number / iproute2-name | All +`PERIODIC_SYNC` | Reguarly sync the routing-table
Useful when the wg-interface is changed/updated without us knowing | Seconds | -1 *\* Required* diff --git a/cmd/app/main.go b/cmd/app/main.go index 14c9eda..78798b0 100644 --- a/cmd/app/main.go +++ b/cmd/app/main.go @@ -3,6 +3,8 @@ package main import ( "net" "os" + "strconv" + "time" envChecks "git.ruekov.eu/ruakij/routingtabletowg/lib/environmentchecks" ip2Map "git.ruekov.eu/ruakij/routingtabletowg/lib/iproute2mapping" @@ -24,6 +26,8 @@ var envDefaults = map[string]string{ "FILTER_PROTOCOL": "-1", "FILTER_TABLE": "-1", + + "PERIODIC_SYNC": "-1", } func main() { @@ -55,6 +59,12 @@ func main() { logger.Error.Fatalf("Couldn't read FILTER_TABLE '%s': %s", filterTableStr, err) } + periodicSyncStr := os.Getenv("PERIODIC_SYNC") + periodicSync, err := strconv.Atoi(periodicSyncStr) + if err != nil { + logger.Error.Fatalf("Couldn't read PERIODIC_SYNC '%s': %s", periodicSyncStr, err) + } + // Create filter filterOptions := FilterOptions{ Table: filterTable, @@ -91,22 +101,47 @@ func main() { if err != nil { logger.Error.Fatalf("Couldn't get route-entries: %s", err) } - + logger.Info.Printf("Initially setting all current routes") + syncCurrentRoutesToHandler(routeSubChan, routeList) + + if(periodicSync > 0){ + go runPeriodicSync(periodicSync, link, routeSubChan) + } + + select {} +} + +func runPeriodicSync(seconds int, link netlink.Link, routeSubChan chan netlink.RouteUpdate){ + interval := time.Duration(seconds) * time.Second + for { + time.Sleep(interval) + + // Get routing-table entries from device + routeList, err := netlink.RouteList(link, netlink.FAMILY_ALL) + if err != nil { + logger.Error.Fatalf("Couldn't get route-entries: %s", err) + } + + logger.Info.Printf("Periodically syncing all routes") + syncCurrentRoutesToHandler(routeSubChan, routeList) + } +} + +func syncCurrentRoutesToHandler(routeSubChan chan netlink.RouteUpdate, routeList []netlink.Route){ + for _, route := range routeList { // Ignore routes with empty gateway if(route.Gw == nil){ continue } - + // Send current routes to handler routeSubChan <- netlink.RouteUpdate{ Type: unix.RTM_NEWROUTE, Route: route, } } - - select {} } var routeUpdateTypeMapFromId = map[uint16]string{