1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- package routing
- import (
- "fmt"
- "github.com/flannel-io/flannel/pkg/powershell"
- "net"
- )
- type RouterWindows struct{}
- func (r RouterWindows) GetAllRoutes() ([]Route, error) {
- return parseNetRoutes("@(Get-NetRoute | Select-Object -Property IfIndex,DestinationPrefix,NextHop)")
- }
- func (r RouterWindows) GetRoutesFromInterfaceToSubnet(interfaceIndex int, destinationSubnet *net.IPNet) ([]Route, error) {
- return parseNetRoutes(fmt.Sprintf("@(Get-NetRoute -InterfaceIndex %d -DestinationPrefix %s | Select-Object -Property IfIndex,DestinationPrefix,NextHop)", interfaceIndex, destinationSubnet.String()))
- }
- func (r RouterWindows) CreateRoute(interfaceIndex int, destinationSubnet *net.IPNet, gatewayAddress net.IP) error {
- _, err := powershell.RunCommandf("New-NetRoute -InterfaceIndex %d -DestinationPrefix %s -NextHop %s", interfaceIndex, destinationSubnet.String(), gatewayAddress.String())
- return err
- }
- func (r RouterWindows) DeleteRoute(interfaceIndex int, destinationSubnet *net.IPNet, gatewayAddress net.IP) error {
- _, err := powershell.RunCommandf("Remove-NetRoute -InterfaceIndex %d -DestinationPrefix %s -NextHop %s -Verbose -Confirm:$false", interfaceIndex, destinationSubnet.String(), gatewayAddress.String())
- return err
- }
- type winNetRoute struct {
- IfIndex int
- DestinationPrefix string
- NextHop string
- }
- func parseNetRoutes(cmd string) ([]Route, error) {
- powerShellJsonData := make([]winNetRoute, 0)
- err := powershell.RunCommandWithJsonResult(cmd, &powerShellJsonData)
- if err != nil {
- return nil, err
- }
- routes := make([]Route, 0)
- for _, r := range powerShellJsonData {
- route := Route{
- InterfaceIndex: r.IfIndex,
- }
- _, destinationSubnet, err := net.ParseCIDR(r.DestinationPrefix)
- if err != nil {
- continue
- }
- route.DestinationSubnet = destinationSubnet
- gatewayAddress := net.ParseIP(r.NextHop)
- if gatewayAddress == nil {
- continue
- }
- route.GatewayAddress = gatewayAddress
- routes = append(routes, route)
- }
- return routes, nil
- }
|