github.com/futurehomeno/fimpgo@v1.14.0/edgeapp/system_check.go (about) 1 package edgeapp 2 3 import ( 4 "errors" 5 log "github.com/sirupsen/logrus" 6 "net" 7 "strings" 8 "time" 9 ) 10 11 12 type SystemCheck struct { 13 14 } 15 16 func NewSystemCheck() *SystemCheck { 17 return &SystemCheck{} 18 } 19 20 func (sc *SystemCheck) IsNetworkAvailable() bool { 21 netIntfs,err := net.Interfaces() 22 if err != nil { 23 log.Error("<sys-check> Interface check error:",err.Error()) 24 return false 25 } 26 27 for i := range netIntfs { 28 log.Tracef("Name %s , flags %s ",netIntfs[i].Name,netIntfs[i].Flags.String()) 29 if strings.Contains(netIntfs[i].Name,"tap0")|| strings.Contains(netIntfs[i].Name,"bridge") || 30 strings.Contains(netIntfs[i].Flags.String(),"loopback") { 31 // skipping zipgateway and local interfaces 32 continue 33 }else { 34 if strings.Contains(netIntfs[i].Flags.String(),"up") && strings.Contains(netIntfs[i].Flags.String(),"broadcast") { 35 addrs,err := netIntfs[i].Addrs() 36 if err != nil { 37 log.Trace("Address returned error :",err.Error()) 38 continue 39 } 40 for i2 := range addrs { 41 log.Trace("Checking address :",addrs[i2].String()) 42 if len(addrs[i2].String())>=4 { 43 return true 44 } 45 } 46 } 47 } 48 } 49 return false 50 } 51 52 func (sc *SystemCheck) IsInternetAvailable()bool { 53 if !sc.IsNetworkAvailable() { 54 return false 55 } 56 ips, err := net.LookupIP("google.com") 57 if err != nil { 58 return false 59 } 60 log.Trace("google.com resolved to ",ips) 61 return true 62 } 63 64 func (sc *SystemCheck) WaitForNetwork(timeout time.Duration) error { 65 var elapsedTime time.Duration 66 for { 67 startTime := time.Now() 68 if sc.IsNetworkAvailable() { 69 return nil 70 } 71 time.Sleep(time.Second*5) 72 if timeout == 0 { 73 continue 74 } 75 elapsedTime+= time.Since(startTime) 76 if elapsedTime>timeout { 77 return errors.New("timeout") 78 } 79 } 80 } 81 82 func (sc *SystemCheck) WaitForInternet(timeout time.Duration) error { 83 var elapsedTime time.Duration 84 for { 85 startTime := time.Now() 86 if sc.IsInternetAvailable() { 87 return nil 88 } 89 time.Sleep(time.Second*5) 90 if timeout == 0 { 91 continue 92 } 93 elapsedTime+= time.Since(startTime) 94 if elapsedTime>timeout { 95 return errors.New("timeout") 96 } 97 } 98 }