Merge branch 'feat_periodicSync' into dev

release-0.2
Ruakij 2 years ago
commit 36e8aa9b87

@ -38,11 +38,12 @@ In case routes clash or cant be added to Wireguard, Warnings will be logged.
### 1.2.1. Environment ### 1.2.1. Environment
Variable|Description|Default Variable|Description|Type|Default
-|-|- -|-|-|-
`INTERFACE`* | Wireguard-Interface Name | `INTERFACE`* | Wireguard-Interface Name | String |
`FILTER_PROTOCOL` | Protocol to react on | All `FILTER_PROTOCOL` | Protocol to react on | Number / iproute2-name | All
`FILTER_TABLE` | Table to react on | All `FILTER_TABLE` | Table to react on | Number / iproute2-name | All
`PERIODIC_SYNC` | Reguarly sync the routing-table <br> Useful when the wg-interface is changed/updated without us knowing | Seconds | -1
*\* Required* *\* Required*

@ -3,6 +3,8 @@ package main
import ( import (
"net" "net"
"os" "os"
"strconv"
"time"
envChecks "git.ruekov.eu/ruakij/routingtabletowg/lib/environmentchecks" envChecks "git.ruekov.eu/ruakij/routingtabletowg/lib/environmentchecks"
ip2Map "git.ruekov.eu/ruakij/routingtabletowg/lib/iproute2mapping" ip2Map "git.ruekov.eu/ruakij/routingtabletowg/lib/iproute2mapping"
@ -24,6 +26,8 @@ var envDefaults = map[string]string{
"FILTER_PROTOCOL": "-1", "FILTER_PROTOCOL": "-1",
"FILTER_TABLE": "-1", "FILTER_TABLE": "-1",
"PERIODIC_SYNC": "-1",
} }
func main() { func main() {
@ -55,6 +59,12 @@ func main() {
logger.Error.Fatalf("Couldn't read FILTER_TABLE '%s': %s", filterTableStr, err) 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 // Create filter
filterOptions := FilterOptions{ filterOptions := FilterOptions{
Table: filterTable, Table: filterTable,
@ -91,22 +101,47 @@ func main() {
if err != nil { if err != nil {
logger.Error.Fatalf("Couldn't get route-entries: %s", err) logger.Error.Fatalf("Couldn't get route-entries: %s", err)
} }
logger.Info.Printf("Initially setting all current routes") 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 { for _, route := range routeList {
// Ignore routes with empty gateway // Ignore routes with empty gateway
if(route.Gw == nil){ if(route.Gw == nil){
continue continue
} }
// Send current routes to handler // Send current routes to handler
routeSubChan <- netlink.RouteUpdate{ routeSubChan <- netlink.RouteUpdate{
Type: unix.RTM_NEWROUTE, Type: unix.RTM_NEWROUTE,
Route: route, Route: route,
} }
} }
select {}
} }
var routeUpdateTypeMapFromId = map[uint16]string{ var routeUpdateTypeMapFromId = map[uint16]string{

Loading…
Cancel
Save