Compare commits

...

28 Commits
1.3.2 ... main

Author SHA1 Message Date
Tamer
286d892703
Merge pull request #49 from fhservinga/main
make logo configurable with env vars
2025-01-13 10:31:21 +01:00
fhservinga
a5bd259466
Merge branch 'hybula:main' into main 2025-01-10 17:16:47 +01:00
Fabian Hufenreuter
c4bfe0624e
make logo configurable with env vars 2025-01-10 17:14:27 +01:00
Tamer
f87a19fa1e
Merge pull request #48 from fhservinga/main
Update Dockerfile for php-fpm and config.php
2025-01-10 13:39:39 +01:00
Fabian Hufenreuter
cbb1a95b64
change $_ENV to getenv 2025-01-10 13:24:08 +01:00
Fabian Hufenreuter
05ea20c332
add use of production php.ini 2025-01-10 13:23:29 +01:00
Fabian Hufenreuter
10c9e545d0
unloy use major.minor for php fpm 2025-01-10 13:22:30 +01:00
Tamer
b453e719f7
Update README.md 2025-01-04 22:13:13 +01:00
Tamer
4a95d3854f
Merge pull request #46 from clertes/main
Docker images vulnerable (CVE-2024-4577)
2024-12-20 09:31:21 +01:00
Christian
91b36725a3
Update Dockerfile
Upgraded PHP-FPM container image to PHP version 8.4.1
2024-12-19 17:48:24 +01:00
dqos
4db24c99d1
Update to Bootstrap 5.3.3 2024-08-24 20:40:23 +02:00
dqos
761c00740f
Fixes issue 44, caused by --- in PTRs. 2024-08-24 20:26:09 +02:00
Tamer
24445308dc
Merge pull request #41 from SalmonCloud/contrib
Docker Fixes, iPerf3 Feature Completion, Minor PHP Code Improvements
2024-04-27 18:47:51 +02:00
RealBrandon
fb6a7a83e9 Make iPerf3 Docker container optional. Relocate iPerf3 installation instructions in a separate section 2024-04-27 15:57:58 +01:00
RealBrandon
4906fd0227 Change default values of LG_LOCATIONS and LG_SPEEDTEST_FILES back 2024-04-27 15:19:45 +01:00
RealBrandon
531c39ab90 Change iPerf3 commands from using "LG_IPV4" back to "hostname" 2024-04-27 15:14:41 +01:00
RealBrandon
c7339f04cf Update Nginx Dockerfile copy path 2024-04-19 23:08:55 +01:00
RealBrandon
900c29f255 Add iPerf3-related instructions 2024-04-19 22:57:45 +01:00
RealBrandon
7759c1c1fb Adjust default values to benefit from auto hiding. Minor improvements 2024-04-19 20:46:52 +01:00
RealBrandon
4723633bcc Change network mode of containers to host. Add iproute2 package in php-fpm image 2024-04-19 20:26:09 +01:00
RealBrandon
87b343749d Add iPerf3 container. Add container name for easier management 2024-04-19 20:11:13 +01:00
Tamer
0443b4883d
Merge pull request #40 from level66network/main
Small improvements.
2024-04-06 18:58:50 +02:00
MrXermon
f6b91539c1
Lock site dropdown if no locations set.
Lock site dropdown if no locations set.
2024-04-05 22:28:30 +02:00
MrXermon
4d10ef75d3
Hide Test-Files if not defined.
Hide Test-Files if not defined.
2024-04-05 22:24:33 +02:00
Tamer
312b5b111e
Merge pull request #38 from abrenner/fix-ss-command-on-iproute2-v6.7.0
Fix ss command on newer versions of iproute2
2024-02-04 10:37:45 +01:00
Adam Brenner
c00e5d6e1d Fix ss command on newer versions of iproute2
The iproute2 package starting in version 6.7.0 changed the way the ss
command outputs internal TCP information via the -i/--info option which
LookingGlass uses to display latency information.

In prior versions the flags: -Hint would show internal TCP information.
However starting in version 6.7.0 an additional flag -p/--processes
needs to be passed in to get the same information.

The changes were commited upstream in
https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/misc/ss.c?id=87d804ca0854b09c07872e9fd6036bf5d3e0cc85
and effects all versions of iproute2 6.7.0 and later.

Old versions continue to work with and without the -p/--processes flag.
In my limited testing it appears adding extra flag is backwards
compatible and should not break anything.

Signed-off-by: Adam Brenner <adam@aeb.io>
2024-02-03 08:45:39 -08:00
dqos
2ae44ada4b
Merge remote-tracking branch 'origin/main' 2023-12-20 12:15:00 +01:00
dqos
7d8ce02597
License change 2023-12-20 12:14:53 +01:00
10 changed files with 101 additions and 400 deletions

View File

@ -1,373 +1,30 @@
Mozilla Public License Version 2.0 ## Licensing
==================================
1. Definitions Copyright Hybula B.V.
--------------
1.1. "Contributor" Licensed under the Apache License, Version 2.0 (the "License") and the Commons
means each individual or legal entity that creates, contributes to Clause Restriction; you may not use this file except in compliance with the
the creation of, or owns Covered Software. License. You may obtain a copy of the License at
1.2. "Contributor Version" http://www.apache.org/licenses/LICENSE-2.0
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution" Unless required by applicable law or agreed to in writing, software distributed
means Covered Software of a particular Contributor. under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.
1.4. "Covered Software" ### Commons Clause Restriction
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
1.5. "Incompatible With Secondary Licenses" The Software is provided to you by the Licensor under the License, as defined
means below, subject to the following condition. Without limiting other conditions in
the License, the grant of rights under the License will not include, and the
License does not grant to you, the right to Sell the Software. For purposes of
the foregoing, “Sell” means practicing any or all of the rights granted to you
under the License to provide to third parties, for a fee or other consideration,
a product or service that consists, entirely or substantially, of the Software
or the functionality of the Software. Any license notice or attribution required
by the License must also include this Commons Cause License Condition notice.
(a) that the initial Contributor has attached the notice described For purposes of the clause above, the “Licensor” is Hybula B.V., the
in Exhibit B to the Covered Software; or “License” is the Apache License, Version 2.0, and the Software is the Hybula
software provided with this notice.
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
1.10. "Modifications"
means any of the following:
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
2. License Grants and Conditions
--------------------------------
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.

View File

@ -348,7 +348,7 @@ class LookingGlass
if ($type === 'mtr') { if ($type === 'mtr') {
// correct output for mtr // correct output for mtr
$parser->update($str); $parser->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 // flush output buffering
@ob_flush(); @ob_flush();
@ -439,7 +439,7 @@ class LookingGlass
// RHEL based systems; // RHEL based systems;
$ssPath = '/usr/sbin/ss'; $ssPath = '/usr/sbin/ss';
} }
$lines = shell_exec("$ssPath -Hnti state established"); $lines = shell_exec("$ssPath -Hintp state established");
$ss = []; $ss = [];
$i = 0; $i = 0;
$j = 0; $j = 0;

View File

@ -17,7 +17,7 @@ made user-friendly for everyone to use. It allows you to execute network related
- Dark/light/auto mode theme. - Dark/light/auto mode theme.
### Requirements ### Requirements
- Any Linux distribution, this has been tested on RHEL 8 + 9. - Any Linux distribution, this has been tested on RHEL 8 + 9, for NetBSD users see [#47](https://github.com/hybula/lookingglass/issues/47).
- PHP 7.1 or higher, PHP 8 preferred. - PHP 7.1 or higher, PHP 8 preferred.
- IPv6 connectivity if you want to use the v6 equivalents. - IPv6 connectivity if you want to use the v6 equivalents.
- Root access. - Root access.
@ -29,7 +29,7 @@ Note: These steps also work with AlmaLinux 9, but it will install PHP 8 instead
1. Install the required network tools: `dnf install mtr traceroute -y`. 1. Install the required network tools: `dnf install mtr traceroute -y`.
2. Install the web server with PHP (by default it will install 7.2 on RHEL 8): `dnf install httpd mod_ssl php php-posix -y`. 2. Install the web server with PHP (by default it will install 7.2 on RHEL 8): `dnf install httpd mod_ssl php php-posix -y`.
3. Enable and start Apache/PHP-FPM: `systemctl enable httpd; systemctl enable php-fpm` and `systemctl start httpd; systemctl start php-fpm`. 3. Enable and start Apache/PHP-FPM: `systemctl enable --now httpd && systemctl enable --now php-fpm`.
4. Let's help MTR to work, execute the following command: `ln -s /usr/sbin/mtr /usr/bin/mtr` and also mtr helper called mtr-packet: `ln -s /usr/sbin/mtr-packet /usr/bin/mtr-packet`. 4. Let's help MTR to work, execute the following command: `ln -s /usr/sbin/mtr /usr/bin/mtr` and also mtr helper called mtr-packet: `ln -s /usr/sbin/mtr-packet /usr/bin/mtr-packet`.
5. You *must* configure SELinux before this all works, or you can disable SELinux using `setenforce 0` and possibly make it permanent: `nano /etc/selinux/config` change to `SELINUX=disabled`. 5. You *must* configure SELinux before this all works, or you can disable SELinux using `setenforce 0` and possibly make it permanent: `nano /etc/selinux/config` change to `SELINUX=disabled`.
6. Upload the contents of the ZIP to /var/www/html/. 6. Upload the contents of the ZIP to /var/www/html/.
@ -47,6 +47,24 @@ For installation using Docker, follow these steps and run the commands on the ta
6. Create and start the containers: `docker compose up -d`. 6. Create and start the containers: `docker compose up -d`.
7. Afterward, the Looking Glass should be reachable from your web browser at `http://$your_server_ip/`! 7. Afterward, the Looking Glass should be reachable from your web browser at `http://$your_server_ip/`!
### iPerf3 Installation (Optional)
> It is recommended to install iPerf3 on a different server from your looking glass to avoid network congestion.
#### Manual
Again, we will assume that we are working on AlmaLinux 8 or 9.
1. Install iPerf3: `dnf install iperf3 -y`
2. Launch iPerf3 as a daemon: `iperf3 -sD -p 5201`.
3. (Optional) You might want to add a systemd unit file for iPerf3, so it automatically starts when the system boots up.
4. Locate the two lines containing `LG_SPEEDTEST_CMD_INCOMING` and `LG_SPEEDTEST_CMD_OUTGOING` respectively in `config.php`.
5. Change `hostname` in these lines to the IPv4 address of your iPerf3 server.
#### Docker
1. Uncomment the section for `iperf3` in `docker-compose.yml` if you want iPerf3 and the looking glass to be on the same server.
Otherwise, please copy the `iperf3` section and save it as `docker-compose.yml` on another server with Docker and Docker Compose installed.
2. Start the iPerf3 container: `docker compose up -d`.
3. Locate the two lines containing `LG_SPEEDTEST_CMD_INCOMING` and `LG_SPEEDTEST_CMD_OUTGOING` respectively in `docker/php-fpm/src/config.php`.
5. Change `hostname` in these lines to the IPv4 address of your iPerf3 server.
### Upgrading ### Upgrading
Upgrading from a previous version is easy, simply overwrite your current installation with the new files. Then update your config.php accordingly, the script will automatically check for missing variables. Upgrading from a previous version is easy, simply overwrite your current installation with the new files. Then update your config.php accordingly, the script will automatically check for missing variables.
@ -66,5 +84,13 @@ We would love to receive code contributions in the form of a pull request. We pr
### Credits ### Credits
This project is inspired by the [LookingGlass project](https://github.com/telephone/LookingGlass) of @telephone and uses his procExecute() function, although slightly modified. This project is inspired by the [LookingGlass project](https://github.com/telephone/LookingGlass) of @telephone and uses his procExecute() function, although slightly modified.
### Sponsored
This project is developed and sponsored by [Hybula B.V.](https://www.hybula.com/)
<p>
<a href="https://www.hybula.com/">
<img src="https://www.hybula.com/assets/hybula/logo/logo-primary.svg" height="40px">
</a>
</p>
### License ### License
Mozilla Public License Version 2.0 ```Apache License, Version 2.0 and the Commons Clause Restriction```

View File

@ -15,7 +15,7 @@ const LG_LOGO_URL = 'https://github.com/hybula/lookingglass/';
const LG_THEME = 'auto'; const LG_THEME = 'auto';
// Enable the latency check feature; // Enable the latency check feature;
const LG_CHECK_LATENCY = false; const LG_CHECK_LATENCY = true;
// Define a custom CSS file which can be used to style the LG, set false to disable, else point to the CSS file; // 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; const LG_CSS_OVERRIDES = false;

View File

@ -1,20 +1,20 @@
version: "3.8"
services: services:
nginx: nginx:
image: hybula/lookingglass-nginx:1 image: hybula/lookingglass-nginx:1
container_name: lg-nginx
build: build:
context: docker/nginx context: .
dockerfile: Dockerfile dockerfile: docker/nginx/Dockerfile
ports: network_mode: host
- "80:80"
restart: unless-stopped restart: unless-stopped
php-fpm: php-fpm:
image: hybula/lookingglass-php:1 image: hybula/lookingglass-php:1
container_name: lg-php
build: build:
context: . context: .
dockerfile: docker/php-fpm/Dockerfile dockerfile: docker/php-fpm/Dockerfile
network_mode: host
restart: unless-stopped restart: unless-stopped
environment: environment:
# For a better reference as to what these variables do, check out 'config.dist.php' or 'docker/php-fpm/src/config.php'. # For a better reference as to what these variables do, check out 'config.dist.php' or 'docker/php-fpm/src/config.php'.
@ -22,6 +22,9 @@ services:
LOCATION: Location LOCATION: Location
FACILITY: Facility FACILITY: Facility
FACILITY_URL: http://localhost/ FACILITY_URL: http://localhost/
LOGO_URL: https://github.com/hybula/lookingglass/
LOGO: '<h2 style="color: #000000;">Company Looking Glass</h2>'
LOGO_DARK: '<h2 style="color: #ffffff;">Company Looking Glass</h2>'
IPV4_ADDRESS: 127.0.0.1 IPV4_ADDRESS: 127.0.0.1
IPV6_ADDRESS: ::1 IPV6_ADDRESS: ::1
MAPS_QUERY: Amsterdam MAPS_QUERY: Amsterdam
@ -33,3 +36,12 @@ services:
# ENABLE_CUSTOM_BLOCK: 'true' # ENABLE_CUSTOM_BLOCK: 'true'
# Uncomment if you require visitors to accept the Terms of Use; the value should be a link to the terms. # Uncomment if you require visitors to accept the Terms of Use; the value should be a link to the terms.
# LG_TERMS: http://localhost/ # LG_TERMS: http://localhost/
# iperf3:
# image: networkstatic/iperf3:latest
# container_name: lg-iperf3
# network_mode: host
# command: -s
# tty: true
# stdin_open: true
# restart: unless-stopped

View File

@ -1,3 +1,3 @@
FROM nginx:mainline-alpine FROM nginx:mainline-alpine
COPY nginx.conf /etc/nginx/nginx.conf COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf

View File

@ -41,7 +41,7 @@ http {
location ~ \.php$ { location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass php-fpm:9000; fastcgi_pass localhost:9000;
fastcgi_index index.php; fastcgi_index index.php;
include fastcgi.conf; include fastcgi.conf;
fastcgi_buffering on; fastcgi_buffering on;

View File

@ -1,9 +1,11 @@
FROM php:8.1-fpm-bullseye FROM php:8.4-fpm-bullseye
RUN apt-get update && \ RUN apt-get update && \
apt-get --no-install-recommends -y install iputils-ping mtr traceroute && \ apt-get --no-install-recommends -y install iputils-ping mtr traceroute iproute2 && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
WORKDIR /var/www/html WORKDIR /var/www/html
COPY --chown=www-data:www-data . . COPY --chown=www-data:www-data . .

View File

@ -5,17 +5,17 @@ use Hybula\LookingGlass;
const LG_TITLE = 'Looking Glass'; const LG_TITLE = 'Looking Glass';
// Define a logo, this can be HTML too, see the other example for an image; // Define a logo, this can be HTML too, see the other example for an image;
const LG_LOGO = '<h2 style="color: #000000;">Company Looking Glass</h2>'; define('LG_LOGO', getenv('LOGO'));
const LG_LOGO_DARK = '<h2 style="color: #ffffff;">Company Looking Glass</h2>'; define('LG_LOGO_DARK', getenv('LOGO_DARK'));
// Define the URL where the logo points to; // Define the URL where the logo points to;
const LG_LOGO_URL = 'https://github.com/hybula/lookingglass/'; define('LG_LOGO_URL', getenv('LOGO_URL'));
// Theme mode; // Theme mode;
const LG_THEME = 'auto'; const LG_THEME = 'auto';
// Enable the latency check feature; // Enable the latency check feature;
const LG_CHECK_LATENCY = false; const LG_CHECK_LATENCY = true;
// Define a custom CSS file which can be used to style the LG, set false to disable, else point to the CSS file; // 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; const LG_CSS_OVERRIDES = false;
@ -23,11 +23,11 @@ const LG_CSS_OVERRIDES = false;
const LG_CUSTOM_HEAD = false; const LG_CUSTOM_HEAD = false;
// Enable or disable blocks/parts of the LG, pass these environment variables with any value to disable them; // Enable or disable blocks/parts of the LG, pass these environment variables with any value to disable them;
define('LG_BLOCK_NETWORK', !isset($_ENV['DISABLE_BLOCK_NETWORK'])); define('LG_BLOCK_NETWORK', !getenv('DISABLE_BLOCK_NETWORK'));
define('LG_BLOCK_LOOKINGGLASS', !isset($_ENV['DISABLE_BLOCK_LOOKINGGLASS'])); define('LG_BLOCK_LOOKINGGLASS', !getenv('DISABLE_BLOCK_LOOKINGGLASS'));
define('LG_BLOCK_SPEEDTEST', !isset($_ENV['DISABLE_BLOCK_SPEEDTEST'])); define('LG_BLOCK_SPEEDTEST', !getenv('DISABLE_BLOCK_SPEEDTEST'));
// This enables the custom block, which you can use to add something custom to the LG; // This enables the custom block, which you can use to add something custom to the LG;
define('LG_BLOCK_CUSTOM', isset($_ENV['ENABLE_CUSTOM_BLOCK'])); define('LG_BLOCK_CUSTOM', getenv('ENABLE_CUSTOM_BLOCK'));
// Define a file here which will be used to display the custom block, can be PHP too which outputs HTML; // Define a file here which will be used to display the custom block, can be PHP too which outputs HTML;
const LG_CUSTOM_HTML = __DIR__.'/custom.html.php'; const LG_CUSTOM_HTML = __DIR__.'/custom.html.php';

View File

@ -107,7 +107,7 @@ $templateData['csrfToken'] = $_SESSION[LookingGlass::SESSION_CSRF] = bin2hex(ran
<meta content="" name="description"> <meta content="" name="description">
<meta content="Hybula" name="author"> <meta content="Hybula" name="author">
<title><?php echo $templateData['title'] ?></title> <title><?php echo $templateData['title'] ?></title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<?php if ($templateData['custom_css']) { echo '<link href="'.$templateData['custom_css'].'" rel="stylesheet">'; } ?> <?php if ($templateData['custom_css']) { echo '<link href="'.$templateData['custom_css'].'" rel="stylesheet">'; } ?>
<?php if ($templateData['custom_head']) { echo $templateData['custom_head']; } ?> <?php if ($templateData['custom_head']) { echo $templateData['custom_head']; } ?>
</head> </head>
@ -127,10 +127,12 @@ $templateData['csrfToken'] = $_SESSION[LookingGlass::SESSION_CSRF] = bin2hex(ran
</a> </a>
</div> </div>
<div class="col-4 float-end"> <div class="col-4 float-end">
<select class="form-select" onchange="window.location = this.options[this.selectedIndex].value"> <select class="form-select" onchange="window.location = this.options[this.selectedIndex].value" <?php if (count($templateData['locations']) == 0) echo 'disabled'; ?>>
<option selected><?php echo $templateData['current_location'] ?></option> <option selected><?php echo $templateData['current_location'] ?></option>
<?php foreach ($templateData['locations'] as $location => $link): ?> <?php foreach ($templateData['locations'] as $location => $link): ?>
<option value="<?php echo $link ?>"><?php echo $location ?></option> <?php if ($location !== $templateData['current_location']): ?>
<option value="<?php echo $link ?>"><?php echo $location ?></option>
<?php endif ?>
<?php endforeach ?> <?php endforeach ?>
</select> </select>
</div> </div>
@ -171,14 +173,14 @@ $templateData['csrfToken'] = $_SESSION[LookingGlass::SESSION_CSRF] = bin2hex(ran
<div class="row mb-3"> <div class="row mb-3">
<div class="col-md-3"> <div class="col-md-3">
<label class="mb-2 text-muted">Test IPv4</label> <label class="mb-2 text-muted">Looking Glass IPv4</label>
<div class="input-group"> <div class="input-group">
<input type="text" class="form-control" value="<?php echo $templateData['ipv4'] ?>" onfocus="this.select()" readonly=""> <input type="text" class="form-control" value="<?php echo $templateData['ipv4'] ?>" onfocus="this.select()" readonly="">
<button class="btn btn-outline-secondary" onclick="copyToClipboard('<?php echo $templateData['ipv4'] ?>', this)">Copy</button> <button class="btn btn-outline-secondary" onclick="copyToClipboard('<?php echo $templateData['ipv4'] ?>', this)">Copy</button>
</div> </div>
</div> </div>
<div class="col-md-5"> <div class="col-md-5">
<label class="mb-2 text-muted">Test IPv6</label> <label class="mb-2 text-muted">Looking Glass IPv6</label>
<div class="input-group"> <div class="input-group">
<input type="text" class="form-control" value="<?php echo $templateData['ipv6'] ?>" onfocus="this.select()" readonly=""> <input type="text" class="form-control" value="<?php echo $templateData['ipv6'] ?>" onfocus="this.select()" readonly="">
<button class="btn btn-outline-secondary" onclick="copyToClipboard('<?php echo $templateData['ipv6'] ?>', this)">Copy</button> <button class="btn btn-outline-secondary" onclick="copyToClipboard('<?php echo $templateData['ipv6'] ?>', this)">Copy</button>
@ -271,7 +273,8 @@ $templateData['csrfToken'] = $_SESSION[LookingGlass::SESSION_CSRF] = bin2hex(ran
</div> </div>
</div> </div>
<?php endif ?> <?php endif ?>
<?php if (count($templateData['speedtest_files'])): ?>
<div class="row"> <div class="row">
<label class="mb-2 text-muted">Test Files</label> <label class="mb-2 text-muted">Test Files</label>
<div class="btn-group input-group mb-3"> <div class="btn-group input-group mb-3">
@ -280,6 +283,7 @@ $templateData['csrfToken'] = $_SESSION[LookingGlass::SESSION_CSRF] = bin2hex(ran
<?php endforeach ?> <?php endforeach ?>
</div> </div>
</div> </div>
<?php endif ?>
</div> </div>
</div> </div>
@ -344,7 +348,7 @@ $templateData['csrfToken'] = $_SESSION[LookingGlass::SESSION_CSRF] = bin2hex(ran
for await (const chunk of readChunks(reader)) { for await (const chunk of readChunks(reader)) {
const text = decoder.decode(chunk) const text = decoder.decode(chunk)
<?php if(in_array($_SESSION[LookingGlass::SESSION_TARGET_METHOD], [LookingGlass::METHOD_MTR, LookingGlass::METHOD_MTR6])): ?> <?php if(in_array($_SESSION[LookingGlass::SESSION_TARGET_METHOD], [LookingGlass::METHOD_MTR, LookingGlass::METHOD_MTR6])): ?>
let splittedText = text.split('---') let splittedText = text.split('@@@')
if (!splittedText[1]) { if (!splittedText[1]) {
continue continue
} }
@ -389,7 +393,7 @@ $templateData['csrfToken'] = $_SESSION[LookingGlass::SESSION_CSRF] = bin2hex(ran
} }
</script> </script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body> </body>
</html> </html>