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  }