diff options
author | PiBa-NL <pba_2k3@yahoo.com> | 2017-06-24 20:09:21 +0200 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2017-09-11 17:02:41 -0300 |
commit | ec5a3865cce995808fa8f4b079890d2b382439f1 (patch) | |
tree | 66794a10cb289822547ae3cb31745f88d0880cb1 /src | |
parent | 4cf6048b774dd96ec099329939fd2397fb57c2bb (diff) | |
download | pfsense-ec5a3865cce995808fa8f4b079890d2b382439f1.zip pfsense-ec5a3865cce995808fa8f4b079890d2b382439f1.tar.gz |
gateway monitoring, give apinger some time to properly 'initialize' before using its results
(cherry picked from commit 29fa6f0f46ba039a67a93c00a08bcaecc3935b78)
Diffstat (limited to 'src')
-rw-r--r-- | src/etc/inc/gwlb.inc | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/src/etc/inc/gwlb.inc b/src/etc/inc/gwlb.inc index 97347ad..9f8ca94 100644 --- a/src/etc/inc/gwlb.inc +++ b/src/etc/inc/gwlb.inc @@ -327,26 +327,44 @@ function get_dpinger_status($gwname, $detailed = false) { log_error("dpinger: status socket {$proc['socket']} not found"); return false; } - - $fp = stream_socket_client("unix://{$proc['socket']}", $errno, $errstr, 10); - if (!$fp) { - log_error(sprintf(gettext('dpinger: cannot connect to status socket %1$s - %2$s (%3$s)'), $proc['socket'], $errstr, $errno)); - return false; - } - - $status = ''; - while (!feof($fp)) { - $status .= fgets($fp, 1024); + $timeoutcounter = 0; + while (true) { + $fp = stream_socket_client("unix://{$proc['socket']}", $errno, $errstr, 10); + if (!$fp) { + log_error(sprintf(gettext('dpinger: cannot connect to status socket %1$s - %2$s (%3$s)'), $proc['socket'], $errstr, $errno)); + return false; + } + + $status = ''; + while (!feof($fp)) { + $status .= fgets($fp, 1024); + } + fclose($fp); + + $r = array(); + list( + $r['gwname'], + $r['latency_avg'], + $r['latency_stddev'], + $r['loss'] + ) = explode(' ', preg_replace('/\n/', '', $status)); + + // dpinger returns '<gwname> 0 0 0' when queried directly after it starts. + // while a latency of 0 and a loss of 0 would be perfect, in a real world it doesnt happen. + // or does it, anyone? if so we must 'detect' the initialization period differently.. + $ready = $r['latency_stddev'] != '0' || $r['loss'] != '0'; + + if ($ready) { + break; + } else { + $timeoutcounter++; + if ($timeoutcounter > 300) { + log_error(sprintf(gettext('dpinger: timeout while retrieving status for gateway %s'), $gwname)); + return false; + } + usleep(10000); + } } - fclose($fp); - - $r = array(); - list( - $r['gwname'], - $r['latency_avg'], - $r['latency_stddev'], - $r['loss'] - ) = explode(' ', preg_replace('/\n/', '', $status)); $r['srcip'] = $proc['srcip']; $r['targetip'] = $proc['targetip']; |