mirror of
https://github.com/rancher/os.git
synced 2025-09-01 14:48:55 +00:00
Wait for default gateway before loading resource from network
This commit is contained in:
@@ -101,10 +101,13 @@ func LoadFromNetworkWithCache(location string) ([]byte, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func LoadFromNetwork(location string) ([]byte, error) {
|
func LoadFromNetwork(location string) ([]byte, error) {
|
||||||
SetProxyEnvironmentVariables()
|
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
if err = AllDefaultGWOK(DefaultRoutesCheckTimeout); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
SetProxyEnvironmentVariables()
|
||||||
|
|
||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
log.Debugf("LoadFromNetwork(%s)", location)
|
log.Debugf("LoadFromNetwork(%s)", location)
|
||||||
resp, err = http.Get(location)
|
resp, err = http.Get(location)
|
||||||
|
109
pkg/util/network/route.go
Normal file
109
pkg/util/network/route.go
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
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{
|
||||||
|
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
|
||||||
|
}
|
||||||
|
log.Info("Waiting for the default gateway ready")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Info("The default gateway is ready")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
Reference in New Issue
Block a user