k3s/vendor/github.com/flannel-io/flannel/pkg/routing/router_windows.go

84 lines
2.7 KiB
Go

// +build windows
// Copyright 2015 flannel authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package routing
import (
"fmt"
"github.com/flannel-io/flannel/pkg/powershell"
"net"
)
// Router manages network routes on Windows OS using MSFT_NetRoute
// See also https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/hh872448(v%3Dvs.85)
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
}