From c15052fe84b092aabd08e65081560795dc628a8d Mon Sep 17 00:00:00 2001
From: Tamer <8611981+dqos@users.noreply.github.com>
Date: Wed, 1 Mar 2023 11:48:42 +0100
Subject: [PATCH 01/10] Update CHANGELOG.md
---
CHANGELOG.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ad1f8a1..290b44d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## 1.1.3 - 2023-03-01
+### Fixed
+- Issue #12 with https://github.com/hybula/lookingglass/pull/14 thanks to @MarcHagen
+- Issue #13 with https://github.com/hybula/lookingglass/pull/15 thanks to @MarcHagen
+
## 1.1.2 - 2023-01-05
### Fixed
- Added contact in config.php for Docker thanks to @deliciousbob.
From ff2d46080ba781bfc1f6a60f627a1a383f106c3d Mon Sep 17 00:00:00 2001
From: Tamer <8611981+dqos@users.noreply.github.com>
Date: Fri, 3 Mar 2023 19:10:01 +0100
Subject: [PATCH 02/10] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 0ca27ea..fb97d75 100644
--- a/README.md
+++ b/README.md
@@ -2,10 +2,10 @@
Modern, simple and fresh looking glass based on Bootstrap 5 and PHP 8 (also compatible with 7). A looking glass is a network utility which is
made user-friendly for everyone to use. It allows you to execute network related commands within a remote network, usually that of an ISP.
-
+[](https://lg-nl-ams.hybula.net/)
### Demo
-[See it in action here!](https://lg-nl-oum.hybula.net/)
+[See it in action here!](https://lg-nl-ams.hybula.net/)
### Features
- Bootstrap 5 UI.
From 41adb719f827f98c63b5acca434688b67ebc3451 Mon Sep 17 00:00:00 2001
From: dqos <8611981+dqos@users.noreply.github.com>
Date: Sat, 25 Mar 2023 15:35:05 +0100
Subject: [PATCH 03/10] Some experimenting
---
LookingGlass.php | 273 +++++++++++++++++++++++++++++++++--------------
config.dist.php | 3 +
index.php | 5 +
3 files changed, 201 insertions(+), 80 deletions(-)
diff --git a/LookingGlass.php b/LookingGlass.php
index 1c0ae45..56bb319 100644
--- a/LookingGlass.php
+++ b/LookingGlass.php
@@ -1,4 +1,5 @@
-update($str);
- echo '---' . PHP_EOL . $parser->__toString() . PHP_EOL . str_pad('', 4096) . PHP_EOL;
+ echo '---'.PHP_EOL.$parser->__toString().PHP_EOL.str_pad('', 4096).PHP_EOL;
// flush output buffering
@ob_flush();
flush();
continue;
- }
- // correct output for traceroute
+ } // correct output for traceroute
elseif ($type === 'traceroute') {
if ($match < 10 && preg_match('/^[0-9] /', $str, $string)) {
- $str = preg_replace('/^[0-9] /', ' ' . $string[0], $str);
+ $str = preg_replace('/^[0-9] /', ' '.$string[0], $str);
$match++;
}
// check for consecutive failed hops
@@ -304,9 +358,9 @@ private static function procExecute(string $cmd, string $host, int $failCount =
$fail++;
if ($lastFail !== 'start'
&& ($traceCount - 1) === $lastFail
- && $fail >= $failCount
+ && $fail >= $failCount
) {
- echo str_pad($str . '
-- Traceroute timed out --
', 4096, ' ', STR_PAD_RIGHT);
+ echo str_pad($str.'
-- Traceroute timed out --
', 4096, ' ', STR_PAD_RIGHT);
break;
}
$lastFail = $traceCount;
@@ -315,7 +369,7 @@ private static function procExecute(string $cmd, string $host, int $failCount =
}
// pad string for live output
- echo str_pad($str . '
', 4096, ' ', STR_PAD_RIGHT);
+ echo str_pad($str.'
', 4096, ' ', STR_PAD_RIGHT);
// flush output buffering
@ob_flush();
@@ -345,7 +399,7 @@ private static function procExecute(string $cmd, string $host, int $failCount =
// kill remaining processes
foreach ($pids as $pid) {
if (is_numeric($pid)) {
- posix_kill((int) $pid, 9);
+ posix_kill((int)$pid, 9);
}
}
}
@@ -353,6 +407,66 @@ private static function procExecute(string $cmd, string $host, int $failCount =
}
return true;
}
+
+ public static function getLatency(): float
+ {
+ $getLatency = self::getLatencyFromSs(self::detectIpAddress());
+ if (isset($getLatency[0])) {
+ return (float)round($getLatency[0]['latency'], 2);
+ } else {
+ return 0.00;
+ }
+ }
+
+ /**
+ * This uses the command 'ss' in order to find out latency.
+ * A clever way coded by @ayyylias, so please keep credits and do not just steal.
+ *
+ * @param string $ip The command to execute.
+ * @return array Returns an array with results.
+ */
+ private static function getLatencyFromSs(string $ip): array
+ {
+ $lines = shell_exec('/usr/sbin/ss -Hti state established');
+ $ss = [];
+ $i = 0;
+ $j = 0;
+ foreach (explode(PHP_EOL, $lines) as $line) {
+ if ($i > 1) {
+ $i = 0;
+ $j++;
+ }
+ if ($line !== '') {
+ @$ss[$j] .= $line;
+ $i++;
+ }
+ }
+ $output = [];
+ foreach ($ss as $socket) {
+ $socket = preg_replace('!\s+!', ' ', $socket);
+ $explodedsocket = explode(' ', $socket);
+ preg_match('/\d+\.\d+\.\d+\.\d+/', $explodedsocket[2], $temp);
+ if (!isset($temp[0])) {
+ continue;
+ } // when thsi cantt be filled just continue
+ $sock['local'] = $temp[0];
+ preg_match('/\d+\.\d+\.\d+\.\d+/', $explodedsocket[3], $temp);
+ $sock['remote'] = $temp[0];
+ preg_match('/segs_out:(\d+)/', $socket, $temp);
+ $sock['segs_out'] = $temp[1];
+ preg_match('/segs_in:(\d+)/', $socket, $temp);
+ $sock['segs_in'] = $temp[1];
+ preg_match_all('/rtt:(\d+\.\d+)\/(\d+\.\d+)/', $socket, $temp);
+ $sock['latency'] = $temp[1][0];
+ $sock['jitter'] = $temp[2][0];
+ preg_match_all('/retrans:\d+\/(\d+)/', $socket, $temp);
+ $sock['retransmissions'] = (isset($temp[1][0]) ? $temp[1][0] : 0);
+ if ($sock['remote'] == $ip) {
+ $output[] = $sock;
+ }
+ }
+ return $output;
+ }
}
class Hop
@@ -423,10 +537,10 @@ public function __toString(): string
$hop->recieved = count($hop->timings);
if (count($hop->timings)) {
- $hop->last = $hop->timings[count($hop->timings) - 1];
- $hop->best = $hop->timings[0];
+ $hop->last = $hop->timings[count($hop->timings) - 1];
+ $hop->best = $hop->timings[0];
$hop->worst = $hop->timings[0];
- $hop->avg = array_sum($hop->timings) / count($hop->timings);
+ $hop->avg = array_sum($hop->timings) / count($hop->timings);
}
if (count($hop->timings) > 1) {
@@ -434,7 +548,6 @@ public function __toString(): string
}
foreach ($hop->timings as $time) {
-
if ($hop->best > $time) {
$hop->best = $time;
}
@@ -483,10 +596,10 @@ public function update($rawMtrInput)
return;
}
- $rawHop = new RawHop();
+ $rawHop = new RawHop();
$rawHop->dataType = $things[0];
- $rawHop->idx = (int)$things[1];
- $rawHop->value = $things[2];
+ $rawHop->idx = (int)$things[1];
+ $rawHop->value = $things[2];
if ($this->hopCount < $rawHop->idx + 1) {
$this->hopCount = $rawHop->idx + 1;
@@ -496,12 +609,12 @@ public function update($rawMtrInput)
$this->hopsCollection[$rawHop->idx] = new Hop();
}
- $hop = $this->hopsCollection[$rawHop->idx];
+ $hop = $this->hopsCollection[$rawHop->idx];
$hop->idx = $rawHop->idx;
switch ($rawHop->dataType) {
case 'h':
- $hop->ips[] = $rawHop->value;
- $hop->hosts[] = gethostbyaddr($rawHop->value) ? : null;
+ $hop->ips[] = $rawHop->value;
+ $hop->hosts[] = gethostbyaddr($rawHop->value) ?: null;
break;
case 'd':
//Not entirely sure if multiple IPs. Better use -n in mtr and resolve later in summarize.
@@ -523,13 +636,13 @@ public function update($rawMtrInput)
private function filterLastDupeHop()
{
// filter dupe last hop
- $finalIdx = 0;
+ $finalIdx = 0;
$previousIp = '';
foreach ($this->hopsCollection as $key => $hop) {
if (count($hop->ips) && $hop->ips[0] !== $previousIp) {
$previousIp = $hop->ips[0];
- $finalIdx = $key + 1;
+ $finalIdx = $key + 1;
}
}
diff --git a/config.dist.php b/config.dist.php
index aaa9fd6..0215e72 100644
--- a/config.dist.php
+++ b/config.dist.php
@@ -9,6 +9,9 @@
// Define the URL where the logo points to;
const LG_LOGO_URL = 'https://github.com/hybula/lookingglass/';
+// Enable the latency check feature;
+const LG_CHECK_LATENCY = false;
+
// Define a custom CSS file which can be used to style the LG, set false to disable, else point to the CSS file;
const LG_CSS_OVERRIDES = false;
// Define