1
0
mirror of https://github.com/rancher/os.git synced 2025-07-19 17:39:04 +00:00
os/pkg/util/network/route.go

112 lines
1.9 KiB
Go
Raw Normal View History

package network
import (
"bufio"
"fmt"
"io"
"os"
"strings"
"github.com/rancher/os/pkg/log"
"github.com/rancher/os/pkg/util"
)
const (
DefaultRoutesCheckTimeout = 20000 // 20 second
ipv4RouteFile = "/proc/net/route"
ipv6RouteFile = "/proc/net/ipv6_route"
ipv4DefaultGWFlags = "0003"
ipv6DefaultGWFlags = "00450003"
)
func checkIPv4GW() bool {
if _, err := os.Stat(ipv4RouteFile); os.IsNotExist(err) {
return false
}
file, err := os.Open(ipv4RouteFile)
if err != nil {
return false
}
defer file.Close()
scanner := bufio.NewReader(file)
for {
line, err := scanner.ReadString('\n')
if err == io.EOF {
break
}
//ignore the headers in the route info
if strings.HasPrefix(line, "Iface") {
continue
}
fields := strings.Fields(line)
// Interested in fields:
// 3 - flags
if fields[3] == ipv4DefaultGWFlags {
return true
}
}
return false
}
func checkIPv6GW() bool {
if _, err := os.Stat(ipv6RouteFile); os.IsNotExist(err) {
return false
}
file, err := os.Open(ipv6RouteFile)
if err != nil {
return false
}
defer file.Close()
scanner := bufio.NewReader(file)
for {
line, err := scanner.ReadString('\n')
if err == io.EOF {
break
}
fields := strings.Fields(line)
// Interested in fields:
// 3 - flags
if fields[3] == ipv6DefaultGWFlags {
return true
}
}
return false
}
func checkAllDefaultGW() bool {
return checkIPv4GW() || checkIPv6GW()
}
func AllDefaultGWOK(timeout int) error {
backoff := util.Backoff{
StartMillis: 100,
MaxIntervalMillis: 2000,
MaxMillis: timeout,
}
defer backoff.Close()
var err error
for ok := range backoff.Start() {
if !ok {
err = fmt.Errorf("Timeout waiting for the default gateway ready")
break
}
if checkAllDefaultGW() {
break
}
2019-07-01 08:46:29 +00:00
log.Debug("Waiting for the default gateway ready")
}
if err != nil {
return err
}
2019-07-01 08:46:29 +00:00
log.Debug("The default gateway is ready")
return nil
}