1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- // +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
- }
|