]> git.ipfire.org Git - people/ummeegge/ipfire-2.x.git/commitdiff
connections.cgi: Modernize connection WUI with refresh interval, zone filtering and... connections-realtime
authorummeegge <ummeegge@ipfire.org>
Sun, 25 May 2025 14:28:58 +0000 (16:28 +0200)
committerummeegge <ummeegge@ipfire.org>
Sun, 25 May 2025 14:28:58 +0000 (16:28 +0200)
- Implement AJAX-based dynamic table updates
- Add configurable auto-refresh (2-60 seconds or disabled)
- Introduce toggleable search/filter panel for:
  * IP addresses (source/destination)
  * Port numbers
  * Protocol types
- Add zone-based filtering (GREEN/BLUE/ORANGE/VPN etc.)
- Display active filters and connection count
- Maintain existing network zone coloring system
- Improve error handling and user feedback
- Use jQuery for AJAX requests and DOM manipulation

get_table.cgi: Add JSON API for connection data

- New backend providing filtered connection data
- Supports all filtering from connections.cgi:
  * Network zones
  * IP addresses
  * Port numbers
  * Protocols
- Returns structured data including:
  * Colored IPs by zone
  * Port numbers
  * Connection states
  * TTL values
  * Traffic counters
  * Country flags
- Uses JSON::PP for efficient encoding
- Handles conntrack data processing

Langs needs to be updated with an update-lang-cache.

Fixes:

10.05.2025
- Removed deprecated `Switch` module
- Add more code comments
- Optimize code structure by adjusting indentation
- Cleared code which was not used
- Fix typo in toggle selector

25.05.2025
- Added source and destination NAT again into table
- Updated also language files for new Core version 195

Signed-off-by: ummeegge <ummeegge@ipfire.org>
html/cgi-bin/connections.cgi [changed mode: 0644->0755]
html/cgi-bin/get_table.cgi [changed mode: 0644->0755]
langs/de/cgi-bin/de.pl
langs/en/cgi-bin/en.pl

old mode 100644 (file)
new mode 100755 (executable)
index 42bc01e..aa722c3
@@ -270,16 +270,36 @@ if ($search_protocol) {
 
                                        \$("#error_msg").hide();
                                        \$.each(data, function(i, item) {
+                                               // Handle NAT information
+                                               const src_extra = (item.src_ret && item.src_ip !== item.src_ret) ?
+                                                       '<span style="color:#FFFFFF;"> ></span>  ' +
+                                                       '<a href="/cgi-bin/ipinfo.cgi?ip=' + encodeURIComponent(item.src_ret || '') + '">' +
+                                                       '<span style="color:#FFFFFF;">' + (item.src_ret || '') + '</span></a>' : '';
+                                               const dst_extra = (item.dst_ret && item.dst_ip !== item.dst_ret) ?
+                                                       '<span style="color:#FFFFFF;"> ></span>  ' +
+                                                       '<a href="/cgi-bin/ipinfo.cgi?ip=' + encodeURIComponent(item.dst_ret || '') + '">' +
+                                                       '<span style="color:#FFFFFF;">' + (item.dst_ret || '') + '</span></a>' : '';
+                                               const sport_extra = (item.src_ret_port && item.src_port !== item.src_ret_port) ?
+                                                       '<span style="color:#FFFFFF;"> ></span>  ' +
+                                                       '<a href="https://isc.sans.edu/port.html?port=' + encodeURIComponent(item.src_ret_port || '') + '" target="_blank" title="' + (item.src_ret_service || '') + '">' +
+                                                       '<span style="color:#FFFFFF;">' + (item.src_ret_port || '') + '</span></a>' : '';
+                                               const dport_extra = (item.dst_ret_port && item.dst_port !== item.dst_ret_port) ?
+                                                       '<span style="color:#FFFFFF;">></span>  ' +
+                                                       '<a href="https://isc.sans.edu/port.html?port=' + encodeURIComponent(item.dst_ret_port || '') + '" target="_blank" title="' + (item.dst_ret_service || '') + '">' +
+                                                       '<span style="color:#FFFFFF;">' + (item.dst_ret_port || '') + '</span></a>' : '';
+
                                                const html = [
                                                        '<tr>',
                                                        '<td style="text-align:center">' + (item.protocol || '') + '</td>',
                                                        '<td style="text-align:center; background-color:' + (item.src_colour || '#FFFFFF') + '">',
                                                        '<a href="/cgi-bin/ipinfo.cgi?ip=' + encodeURIComponent(item.src_ip || '') + '"><span style="color:#FFFFFF;">' + (item.src_ip || '') + '</span></a>',
+                                                       src_extra,
                                                        '</td>',
                                                        '<td style="text-align:center; background-color:' + (item.src_colour || '#FFFFFF') + '">',
                                                        '<a href="https://isc.sans.edu/port.html?port=' + encodeURIComponent(item.src_port || '') + '" target="_blank" title="' + (item.src_service || '') + '">',
                                                        '<span style="color:#FFFFFF;">' + (item.src_port || '') + '</span>',
                                                        '</a>',
+                                                       sport_extra,
                                                        '</td>',
                                                        '<td style="text-align:center; background-color:' + (item.src_colour || '#FFFFFF') + '">',
                                                        '<a href="country.cgi#' + encodeURIComponent(item.src_country || '') + '">',
@@ -288,11 +308,13 @@ if ($search_protocol) {
                                                        '</td>',
                                                        '<td style="text-align:center; background-color:' + (item.dst_colour || '#FFFFFF') + '">',
                                                        '<a href="/cgi-bin/ipinfo.cgi?ip=' + encodeURIComponent(item.dst_ip || '') + '"><span style="color:#FFFFFF;">' + (item.dst_ip || '') + '</span></a>',
+                                                       dst_extra,
                                                        '</td>',
                                                        '<td style="text-align:center; background-color:' + (item.dst_colour || '#FFFFFF') + '">',
                                                        '<a href="https://isc.sans.edu/port.html?port=' + encodeURIComponent(item.dst_port || '') + '" target="_blank" title="' + (item.dst_service || '') + '">',
                                                        '<span style="color:#FFFFFF;">' + (item.dst_port || '') + '</span>',
                                                        '</a>',
+                                                       dport_extra,
                                                        '</td>',
                                                        '<td style="text-align:center; background-color:' + (item.dst_colour || '#FFFFFF') + '">',
                                                        '<a href="country.cgi#' + encodeURIComponent(item.dst_country || '') + '">',
old mode 100644 (file)
new mode 100755 (executable)
index 3603aeb..9cd665a
@@ -17,6 +17,9 @@
 # You should have received a copy of the GNU General Public License           #
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.       #
 #                                                                             #
+# Provides JSON data for the connections table, filtered by zone, IP, port,   #
+# and protocol, including NAT information.                                    #
+#                                                                             #
 ###############################################################################
 
 use strict;
@@ -298,7 +301,8 @@ foreach my $line (@sorted_conntrack) {
        }
 
        my $sip_colour = ipcolour($sip);
-       my $dip_colour = ipcolour($dip);
+       # Use destination network color for DNAT
+       my $dip_colour = $dip_ret && $dip ne $dip_ret ? ipcolour($dip_ret) : ipcolour($dip);
 
        # Filter by selected zones
        my $matches_zone = !@selected_zones;
@@ -354,14 +358,22 @@ foreach my $line (@sorted_conntrack) {
        if ($dport && $dport < 1024) {
                $dserv = uc(getservbyport($dport, lc($l4proto))) || '';
        }
+       my $sserv_ret = '';
+       if ($sport_ret && $sport_ret < 1024) {
+               $sserv_ret = uc(getservbyport($sport_ret, lc($l4proto))) || '';
+       }
+       my $dserv_ret = '';
+       if ($dport_ret && $dport_ret < 1024) {
+               $dserv_ret = uc(getservbyport($dport_ret, lc($l4proto))) || '';
+       }
 
        # Resolve country codes and flag icons
-       my $srcccode = &Location::Functions::lookup_country_code($sip_ret) || '';
+       my $srcccode = &Location::Functions::lookup_country_code($sip_ret || $sip) || '';
        my $src_flag_icon = &Location::Functions::get_flag_icon($srcccode) || '/images/flags/unknown.png';
        if ($src_flag_icon && $src_flag_icon !~ m!^/images/flags/!) {
                $src_flag_icon = "/images/flags/" . lc($srcccode) . ".png" if $srcccode;
        }
-       my $dstccode = &Location::Functions::lookup_country_code($dip_ret) || '';
+       my $dstccode = &Location::Functions::lookup_country_code($dip_ret || $dip) || '';
        my $dst_flag_icon = &Location::Functions::get_flag_icon($dstccode) || '/images/flags/unknown.png';
        if ($dst_flag_icon && $dst_flag_icon !~ m!^/images/flags/!) {
                $dst_flag_icon = "/images/flags/" . lc($dstccode) . ".png" if $dstccode;
@@ -371,15 +383,21 @@ foreach my $line (@sorted_conntrack) {
        push @table_data, {
                protocol => $l4proto,
                src_ip => $sip,
+               src_ret => $sip_ret,
+               dst_ip => $dip,
+               dst_ret => $dip_ret,
                src_port => $sport,
+               src_ret_port => $sport_ret,
+               dst_port => $dport,
+               dst_ret_port => $dport_ret,
                src_service => $sserv,
+               src_ret_service => $sserv_ret,
+               dst_service => $dserv,
+               dst_ret_service => $dserv_ret,
                src_colour => $sip_colour,
+               dst_colour => $dip_colour,
                src_country => $srcccode,
                src_flag_icon => $src_flag_icon,
-               dst_ip => $dip,
-               dst_port => $dport,
-               dst_service => $dserv,
-               dst_colour => $dip_colour,
                dst_country => $dstccode,
                dst_flag_icon => $dst_flag_icon,
                bytes_in => &General::formatBytes($bytes[0]),
index 510a96d7ab490c271d7e7068f545087e9e773157..c5e8e0bd8795cadd5d4ecba1c3d469318a18edf4 100644 (file)
 'compression' => 'Kompression:',
 'computer to modem rate' => 'Übertragungsrate zwischen Computer und Modem:',
 'concentrator name' => 'Name des Konzentrators:',
+'configuration file' => 'Konfigurationsdatei',
 'confirmation' => 'Bestätigung',
 'connect' => 'OpenVPN Start / Verbinden',
 'connect the modem' => 'Das Modem anschließen',
 'donation' => 'Spenden',
 'donation-link' => 'https://www.paypal.com/de_DE/DE/i/btn/btn_donateCC_LG.gif',
 'donation-text' => '<strong>IPFire</strong> wird von Freiwilligen in ihrer Freizeit betreut und weiterentwickelt. Um dieses Projekt am Leben zu erhalten, entstehen uns natürlich auch Kosten. Wenn Sie uns unterstützen wollen, würden wir uns über eine kleine Spende sehr freuen.',
+'done' => 'Fertig',
 'dos charset' => 'DOS-Zeichensatz',
 'down and up speed' => 'Geben Sie bitte hier ihre Download- bzw. Upload-Geschwindigkeit ein <br /> und klicken Sie danach auf <i>Speichern</i>.',
 'downfall gather data sampling' => 'Downfall/Gather Data Sampling',
 'encrypted' => 'Verschlüsselt',
 'encryption' => 'Verschlüsselung:',
 'end address' => 'Endadresse:',
+'endpoint' => 'Endpoint',
+'endpoint address' => 'Endpoint-Adresse',
+'endpoint port' => 'Endpoint-Port',
 'enter ack class' => 'Legen Sie hier die ACK-Klasse fest <br /> und klicken Sie danach auf <i>Speichern</i>.',
 'enter data' => 'Geben Sie die Daten ein <br /> und klicken Sie danach auf <i>Speichern</i>.',
 'entropy' => 'Entropie',
 'ike lifetime should be between 1 and 24 hours' => 'IKE Lebensdauer sollte zwischen 1 und 24 Stunden betragen.',
 'imei' => 'IMEI',
 'import' => 'Import',
+'import connection' => 'Eine Verbindung importieren',
 'importkey' => 'PSK importieren',
 'imsi' => 'IMSI',
 'in' => 'Ein',
 'invalid domain name' => 'Ungültiger Domainname.',
 'invalid downlink speed' => 'Ungültige Downlink-Gerschwindigkeit.',
 'invalid end address' => 'Ungültige Endadresse.',
+'invalid endpoint' => 'Ungültige Gegenstelle',
+'invalid endpoint address' => 'Ungültige Endpoint-Adresse',
 'invalid fixed ip address' => 'Ungültige feste IP-Adresse',
 'invalid fixed mac address' => 'Ungültige feste MAC-Adresse',
 'invalid hostname' => 'Ungültiger Hostname.',
 'invalid input for state or province' => 'Ungültige Eingabe für Bundesstaat oder Provinz.',
 'invalid input for valid till days' => 'Ungültige Eingabe für Gültig bis (Tage).',
 'invalid ip' => 'Ungültige IP-Adresse',
+'invalid ip address' => 'Ungültige IP-Adresse',
 'invalid ip or hostname' => 'Ungültige IP-Addresse oder Hostname',
 'invalid keep time' => 'Die Aufbewahrungszeit muss eine gültige Zahl sein',
+'invalid keepalive interval' => 'Ungültiges Keepalive-Interval',
 'invalid key' => 'Ungültiger Schlüssel.',
 'invalid loaded file' => 'Ungültige geladene Datei',
 'invalid local-remote id' => 'Local-Id und Remote-Id dürfen nicht gleich sein, und müssen einem "@"-Zeichen beginnen (in der strongSwan-Terminologie handelt es sich dabei um leftid und rightid).',
 'invalid minimum object size' => 'Ungültige min. Objektgröße.',
 'invalid mtu input' => 'Ungültige MTU',
 'invalid netmask' => 'Ungültige Netzwerkmaske',
+'invalid network' => 'Ungültiges Netzwerk',
 'invalid port' => 'Ungültiger Port. Bitte gültige Portnummer eingeben.',
 'invalid port list' => 'Portlisten-Syntax lautet: port[,port]... wobei port in /etc/services enthalten ist, alternativ Portnummer',
 'invalid primary dns' => 'Ungültiger primärer DNS.',
 'local ip address' => 'Lokale IP-Adresse',
 'local master' => 'Local Master',
 'local ntp server specified but not enabled' => 'Lokaler NTP-Server angegeben aber nicht aktiviert',
+'local port' => 'Lokaler Port',
 'local subnet' => 'Lokales Subnetz:',
 'local subnet is invalid' => 'Lokales Subnetz ist ungültig.',
+'local subnets' => 'Lokale Subnetze',
 'local vpn hostname/ip' => 'Lokaler VPN Hostname/IP',
 'localkey' => 'Localkey',
 'localkeyfile' => 'Localkeyfile',
 'mailmethod' => 'Mail Methode',
 'mailprogramm' => 'Mail Programm',
 'main page' => 'Startseite',
+'malformed preshared key' => 'Ungültiger Pre-Shared Key',
+'malformed private key' => 'Ungültiger privater Schlüssel',
+'malformed public key' => 'Ungültiger öffentlicher Schlüssel',
 'manage ovpn' => '5. Tunnel Management',
 'manage printers' => 'Drucker verwalten',
 'manage shares' => 'Freigaben verwalten',
 'pakfire ago' => 'her.',
 'pakfire already busy' => 'Pakfire führt bereits eine Aufgabe aus. Bitte versuchen Sie es später erneut.',
 'pakfire available addons' => 'Verfügbare Add-ons:',
+'pakfire check deps' => 'Überprüfung der Abhängigkeiten...',
 'pakfire configuration' => 'Pakfire Konfiguration',
 'pakfire confirm upgrades' => 'Möchten Sie alle Upgrades installieren?',
 'pakfire core update auto' => 'Core- und Add-on-Updates automatisch installieren:',
 'pakfire health check' => 'Mirrors auf Erreichbarkeit prüfen (Ping):',
 'pakfire install' => 'Installieren',
 'pakfire install description' => 'Bitte wählen Sie ein oder mehrere Add-Ons zur Installation aus.',
-'pakfire install package' => 'Sie möchten folgende Pakete installieren: ',
+'pakfire install package' => 'Zu installierende Pakete:',
 'pakfire installed addons' => 'Installierte Add-ons:',
 'pakfire invalid tree' => '',
 'pakfire last core list update' => 'Letztes Corelisten Update ist',
 'psk' => 'PSK',
 'ptr' => 'PTR',
 'ptr lookup failed' => 'Reverse Lookup gescheitert',
+'public key' => 'Öffentlicher Schlüssel',
 'pulse' => 'Puls',
 'pulse dial' => 'Pulswahl:',
 'qos add subclass' => 'Unterklasse hinzufügen',
 'qos enter bandwidths' => 'Bitte geben Sie ihre Downstream- und Upstream-Bandbreite an!',
 'qos graphs' => 'Qos Diagramme',
 'qos warning' => 'Die Regel <strong>muss</strong> wieder gespeichert werden, ansonsten wird sie verworfen!',
+'qr code' => 'QR-Code',
 'quick playlist' => 'Quick Playlist',
 'ram' => 'RAM-Speicher',
 'rdns' => 'rDNS',
 'remote logging' => 'Entfernte Protokollierung',
 'remote subnet' => 'Entferntes Subnetz:',
 'remote subnet is invalid' => 'Entferntes Subnetz ist ungültig.',
+'remote subnets' => 'Entfernte Subnetze',
 'removable device advice' => 'Stecken Sie ein Gerät an, aktualisieren Sie und binden Sie es vor der Benutzung ein. Melden Sie das Gerät vorm Entfernen ab.',
 'remove' => 'Löschen',
 'remove ca certificate' => 'CA-Zertifikat entfernen',
 'week-graph' => 'Woche',
 'weekly firewallhits' => 'wöchentliche Firewalltreffer',
 'weeks' => 'Wochen',
+'wg client pool' => 'Client-Pool',
+'wg create host-to-net peer' => 'Einen neuen Host-zu-Netz-Peer erstellen',
+'wg create net-to-net peer' => 'Einen neuen Netz-zu-Netz-Peer erstellen',
+'wg dns' => 'DNS',
+'wg download configuration' => 'Konfiguration herunterladen',
+'wg download configuration file' => 'Konfigurationsdatei herunterladen',
+'wg edit host-to-net peer' => 'Host-zu-Netz-Peer bearbeiten',
+'wg edit net-to-net peer' => 'Netz-zu-Netz-Peer bearbeiten',
+'wg host to net client settings' => 'Host-zu-Netz-Client-Einstellungen',
+'wg import peer' => 'Peer importieren',
+'wg invalid client dns' => 'Ungültige Client-DNS-Adresse',
+'wg invalid client pool' => 'Ungültiger Client-Pool',
+'wg invalid endpoint address' => 'Ungültige Endpoint-Adresse',
+'wg invalid endpoint port' => 'Ungültiger Endpoint-Port',
+'wg invalid keepalive interval' => 'Ungültiger Keepalive-Intervall (Muss zwischen 0 und 65535 sein)',
+'wg invalid local subnet' => 'Ungültiges lokales Subnetz',
+'wg invalid name' => 'Ungültiger Name (Nur Buchstaben, Zahlen, Leerzeichen und Bindestrich erlaubt)',
+'wg invalid psk' => 'Ungültiger Pre-Shared-Key',
+'wg invalid public key' => 'Ungültiger öffentlicher Schlüssel',
+'wg invalid remote subnet' => 'Ungültiges entferntes Subnetz',
+'wg keepalive interval' => 'Keepalive-Intervall',
+'wg leave empty to automatically select' => 'Leer lassen für automatische Wahl',
+'wg missing allowed ips' => 'AllowedIPs fehlt',
+'wg missing endpoint address' => 'Fehlende Endpoint-Adresse',
+'wg missing endpoint port' => 'Fehlerder Endpoint-Port',
+'wg missing port' => 'Fehlender Port',
+'wg missing private key' => 'Fehlender privater Schlüssel',
+'wg missing public key' => 'Fehlender öffentlicher Schlüssel',
+'wg name is already used' => 'Dieser Name ist bereits in Verwendung',
+'wg no local subnets' => 'Keine lokalen Subnetze angegeben',
+'wg no more free addresses in pool' => 'Keine freien Adressen mehr im Pool',
+'wg no remote subnets' => 'Keine entfernten Subnetze angegeben',
+'wg peer configuration' => 'Peer-Konfiguration',
+'wg peer does not exist' => 'Peer existiert nicht',
+'wg rw peers' => 'WireGuard-Roadwarrior-Peers',
+'wg scan the qr code' => 'Scannen Sie den QR-Code, um die WireGuard-Konfiguration in ein mobiles Endgerät zu importieren.',
+'wg show configuration qrcode' => 'Konfigurations-QR-Code anzeigen',
+'wg warning configuration only shown once' => 'Achtung: Diese WireGuard-Konfigurationsdatei wird nur dieses eine Mal angezeigt, da sie privates Schlüsselmaterial enthält, was nicht in IPFire gespeichert wird.',
 'whitelisted' => 'Ausgenommen',
 'whois results from' => 'WHOIS-Ergebnisse von',
 'wildcards' => 'Wildcards',
index d4854049d9d674eb4dd9b19681646f463614889e..6c3e0c277fb4e7d4dde22f682741982b09f0bb0b 100644 (file)
 'all services' => 'All Services',
 'all updates installed' => 'All updates installed',
 'allmsg' => 'show all',
+'allowed subnets' => 'Allowed Subnets',
 'alt dialup' => 'Dialup',
 'alt home' => 'Home',
 'alt information' => 'Information',
 'compression' => 'Compression:',
 'computer to modem rate' => 'Computer to modem rate:',
 'concentrator name' => 'Concentrator name:',
+'configuration file' => 'Configuration File',
 'confirmation' => 'confirmation',
 'connect' => 'OVPN Start / Connect',
 'connect the modem' => 'Connect the modem',
 'donation-link' => 'https://www.paypal.com/en_US/GB/i/btn/btn_donateCC_LG.gif',
 'donation-text' => '<strong>IPFire</strong> is driven and maintained by volunteers in their free time. To keep this project running costs incurred, if you like to support us we would be pleased by a small donation.',
 'done' => 'Do it',
+'done' => 'Done',
 'dos charset' => 'DOS Charset',
 'down and up speed' => 'Enter your Down- and Uplink-Speed <br /> and then press <i>Save</i>.',
 'downfall gather data sampling' => 'Downfall/Gather Data Sampling',
 'encrypted' => 'Encrypted',
 'encryption' => 'Encryption:',
 'end address' => 'End address:',
+'endpoint' => 'Endpoint',
+'endpoint address' => 'Endpoint Address',
+'endpoint port' => 'Endpoint Port',
 'enter ack class' => 'Enter the ACK- Class <br /> and then press <i>Save</i>.',
 'enter data' => 'Enter your settings <br /> and then press <i>Save</i>.',
 'entropy' => 'Entropy',
 'fwhost type' => 'Type',
 'fwhost used' => 'Used',
 'fwhost welcome' => 'Over here, you can group single hosts, networks and services together, which will creating new rules more easy and faster.',
+'fwhost wg peers' => 'WireGuard Peers',
 'fwhost wo subnet' => '(without subnet)',
 'g.dtm' => 'TO BE REMOVED',
 'g.lite' => 'TO BE REMOVED',
 'ike lifetime should be between 1 and 24 hours' => 'IKE lifetime should be between 1 and 24 hours.',
 'imei' => 'IMEI',
 'import' => 'Import',
+'import connection' => 'Import a Connection',
 'importkey' => 'Import PSK',
 'imsi' => 'IMSI',
 'in' => 'In',
 'invalid domain name' => 'Invalid domain name.',
 'invalid downlink speed' => 'Invalid downlink speed.',
 'invalid end address' => 'Invalid end address.',
+'invalid endpoint' => 'Invalid Endpoint',
+'invalid endpoint address' => 'Invalid Endpoint Address',
 'invalid fixed ip address' => 'Invalid fixed IP address',
 'invalid fixed mac address' => 'Invalid fixed MAC address',
 'invalid hostname' => 'Invalid hostname.',
 'invalid input for subscription code' => 'Invalid input for subscription code',
 'invalid input for valid till days' => 'Invalid input for Valid till (days).',
 'invalid ip' => 'Invalid IP Address',
+'invalid ip address' => 'Invalid IP Address',
 'invalid ip or hostname' => 'Invalid IP Address or Hostname',
 'invalid keep time' => 'Keep time must be a valid number',
+'invalid keepalive interval' => 'Invalid Keepalive Interval',
 'invalid key' => 'Invalid key.',
 'invalid loaded file' => 'Invalid loaded file',
 'invalid local-remote id' => 'local & remote id must not be equal and begin with a "@" sign. These are leftid and rightid in strongswan terminology.',
 'invalid minimum object size' => 'Invalid minimum object size.',
 'invalid mtu input' => 'Invalid MTU',
 'invalid netmask' => 'Invalid netmask',
+'invalid network' => 'Invalid Network',
 'invalid port' => 'Invalid port. Must be a valid port number.',
 'invalid port list' => 'Port list syntax is: port[,port]... where port is in /etc/services or number',
 'invalid primary dns' => 'Invalid primary DNS.',
 'local ip address' => 'Local IP Address',
 'local master' => 'Local Master',
 'local ntp server specified but not enabled' => 'Local NTP server specified but not enabled',
+'local port' => 'Local Port',
 'local subnet' => 'Local subnet:',
 'local subnet is invalid' => 'Local subnet is invalid.',
+'local subnets' => 'Local Subnets',
 'local vpn hostname/ip' => 'Local VPN Hostname/IP',
 'localkey' => 'Localkey',
 'localkeyfile' => 'Localkeyfile',
 'mailmethod' => 'Mailmethod',
 'mailprogramm' => 'Mailprogramm',
 'main page' => 'Main page',
+'malformed preshared key' => 'Malformed Pre-Shared Key',
+'malformed private key' => 'Malformed Private Key',
+'malformed public key' => 'Malformed Public Key',
 'manage ovpn' => '5. Tunnel Management:',
 'manage printers' => 'manage printers',
 'manage shares' => 'Manage Shares',
 'pakfire ago' => 'ago.',
 'pakfire already busy' => 'Pakfire is already performing a task. Please try again later.',
 'pakfire available addons' => 'Available Add-ons:',
+'pakfire check deps' => 'Checking dependencies...',
 'pakfire configuration' => 'Pakfire Configuration',
 'pakfire confirm upgrades' => 'Do you want to install all upgrades?',
 'pakfire core update auto' => 'Install core and add-on updates automatically:',
 'psk' => 'PSK',
 'ptr' => 'PTR',
 'ptr lookup failed' => 'Reverse lookup failed',
+'public key' => 'Public Key',
 'pulse' => 'Pulse',
 'pulse dial' => 'Pulse dial:',
 'qos add subclass' => 'Add subclass',
 'qos enter bandwidths' => 'You will need to enter your downstream and upstream bandwidth!',
 'qos graphs' => 'Qos Graphs',
 'qos warning' => 'The rule <strong>must</strong> be saved, otherwise it will be discarded!',
+'qr code' => 'QR Code',
 'quick control' => 'Quick Control',
 'quick playlist' => 'Quick Playlist',
 'ram' => 'RAM',
 'reload' => 'reload',
 'remark' => 'Remark',
 'remark title' => 'Remark:',
+'remarks' => 'Remarks',
 'remote access' => 'Remote access',
 'remote announce' => 'Remote Announce',
 'remote browse sync' => 'Remote Browse Sync',
 'remote logging' => 'Remote logging',
 'remote subnet' => 'Remote subnet:',
 'remote subnet is invalid' => 'Remote subnet is invalid.',
+'remote subnets' => 'Remote Subnets',
 'removable device advice' => 'Plug in a device, refresh, select and mount before usage. Umount before removal.',
 'remove' => 'Remove',
 'remove ca certificate' => 'Remove CA certificate',
 'root user password' => 'Root password',
 'route subnet is invalid' => 'Additional push route subnet is invalid',
 'router ip' => 'Router IP address:',
+'routing' => 'Routing',
 'routing table entries' => 'Routing Table Entries',
 'rsvd dst port overlap' => 'Destination Port Range overlaps a port reserved for IPFire:',
 'rsvd src port overlap' => 'Source Port Range overlaps a port reserved for IPFire:',
 'weekly firewallhits' => 'weekly firewallhits',
 'weeks' => 'Weeks',
 'wg' => 'WireGuard',
+'wg client configuration file' => 'WireGuard Client Configuration File',
+'wg client pool' => 'Client Pool',
+'wg create host-to-net peer' => 'Create A New Host-To-Net Peer',
+'wg create net-to-net peer' => 'Create A New Net-To-Net Peer',
+'wg create peer' => 'Create A New Peer',
+'wg dns' => 'DNS',
+'wg download configuration' => 'Download Configuration',
+'wg download configuration file' => 'Download the configuration file',
+'wg edit host-to-net peer' => 'Edit Host-To-Net Peer',
+'wg edit net-to-net peer' => 'Edit Net-To-Net Peer',
+'wg edit peer' => 'Edit Peer',
+'wg host to net client settings' => 'Host-To-Net Client Settings',
+'wg import peer' => 'Import Peer',
+'wg invalid client dns' => 'Invalid client DNS address',
+'wg invalid client pool' => 'Invalid client pool',
+'wg invalid endpoint address' => 'Invalid endpoint address',
+'wg invalid endpoint port' => 'Invalid endpoint port',
+'wg invalid keepalive interval' => 'Invalid Keepalive Interval (Must be between 0 and 65535)',
+'wg invalid local subnet' => 'Invalid local subnet',
+'wg invalid name' => 'Invalid name (Only letters, numbers, space and hyphen are allowed)',
+'wg invalid psk' => 'Invalid pre-shared key',
+'wg invalid public key' => 'Invalid public key',
+'wg invalid remote subnet' => 'Invalid remote subnet',
+'wg keepalive interval' => 'Keepalive Interval',
+'wg leave empty to automatically select' => 'Leave empty to automatically select',
+'wg missing allowed ips' => 'Missing AllowedIPs',
+'wg missing endpoint address' => 'Missing Endpoint Address',
+'wg missing endpoint port' => 'Missing Endpoint Port',
+'wg missing port' => 'Missing Port',
+'wg missing private key' => 'Missing Private Key',
+'wg missing public key' => 'Missing Public Key',
+'wg name is already used' => 'The name is already in use',
+'wg no local subnets' => 'No local subnets given',
+'wg no more free addresses in pool' => 'No more free addresses in pool',
+'wg no remote subnets' => 'No remote subnets given',
+'wg peer configuration' => 'Peer Configuration',
+'wg peer does not exist' => 'Peer does not exist',
+'wg pre-shared key (optional)' => 'Pre-Shared Key (optional)',
+'wg rw peers' => 'WireGuard Roadwarrior Peers',
+'wg scan the qr code' => 'Scan the QR code to import the WireGuard configuration into a mobile client.',
+'wg show configuration qrcode' => 'Show Configuration QR Code',
+'wg warning configuration only shown once' => 'Attention: This WireGuard configuration file will only be shown this one time as it contains private key material that is not being stored on IPFire.',
 'whitelisted' => 'Whitelisted',
 'whois results from' => 'WHOIS results from',
 'wildcards' => 'Wildcards',