From patchwork Mon Mar 8 19:21:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Leo-Andres Hofmann X-Patchwork-Id: 3936 Return-Path: Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384 client-signature ECDSA (P-384) client-digest SHA384) (Client CN "mail01.haj.ipfire.org", Issuer "R3" (verified OK)) by web04.haj.ipfire.org (Postfix) with ESMTPS id 4DvSrQ4CKNz3wwp for ; Mon, 8 Mar 2021 19:21:42 +0000 (UTC) Received: from mail02.haj.ipfire.org (mail02.haj.ipfire.org [172.28.1.201]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) client-signature ECDSA (P-384)) (Client CN "mail02.haj.ipfire.org", Issuer "R3" (verified OK)) by mail01.ipfire.org (Postfix) with ESMTPS id 4DvSrM701yz29l; Mon, 8 Mar 2021 19:21:39 +0000 (UTC) Received: from mail02.haj.ipfire.org (localhost [127.0.0.1]) by mail02.haj.ipfire.org (Postfix) with ESMTP id 4DvSrM5lTxz2xq9; Mon, 8 Mar 2021 19:21:39 +0000 (UTC) Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384 client-signature ECDSA (P-384) client-digest SHA384) (Client CN "mail01.haj.ipfire.org", Issuer "R3" (verified OK)) by mail02.haj.ipfire.org (Postfix) with ESMTPS id 4DvSrK67rHz2xfm for ; Mon, 8 Mar 2021 19:21:37 +0000 (UTC) Received: from arche.uberspace.de (arche.uberspace.de [185.26.156.147]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mail01.ipfire.org (Postfix) with ESMTPS id 4DvSrH6VkdzHv for ; Mon, 8 Mar 2021 19:21:35 +0000 (UTC) Received: (qmail 13650 invoked from network); 8 Mar 2021 19:21:34 -0000 Received: from localhost (HELO localhost) (127.0.0.1) by arche.uberspace.de with SMTP; 8 Mar 2021 19:21:34 -0000 From: Leo-Andres Hofmann To: development@lists.ipfire.org Subject: [PATCH] GUI: Periodically reload RRD graphs Date: Mon, 8 Mar 2021 20:21:25 +0100 Message-Id: <20210308192125.1114-1-hofmann@leo-andres.de> X-Mailer: git-send-email 2.27.0.windows.1 MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=lists.ipfire.org; s=202003rsa; t=1615231296; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=4MZRcijDSNXz3nGR7tiP2ihrrs9FcyKo2wmcgVKG6Ms=; b=ZF8NYxa8zNZOZvcAHtEttF/XBrJYrt+KiGzzbgrq7afH2Um3/a08IXT0cHPmedSk521jgN gLCN8Klc3VqhOf9J4oRNmJ9EFEqIiDMQZm1jOGHKurmoERpFoA+7FTrCHTHrw4vtd6sD9j Pbs+qJYZR5qbB8Kb7l2xIsPYVb5axgct12l2AFVovAQOQ2gCE7pUw0DEYzP+w7smCmBFhn Sgl7VYowa8fQagtPB/5jA6VkEQr4RQpYJ6Qu23ILjieshmsSWQfGCxAx9Crsz5ldGoIVZ/ +nSgXsGfCD4nMMwNBkgHq8Gl8GREWV7LMP+2AB7/ZKHDmFy09Y1shNYpXtBXyQ== ARC-Seal: i=1; s=202003rsa; d=lists.ipfire.org; t=1615231296; a=rsa-sha256; cv=none; b=SJ6P4EKGomO9bKjF0V3EbjZx2c5FNLgxhNX7rbP/Zgd//wjWCymF8JG+ckiu36zvksxT8w suwIwmrEQz/96hGm7wSE7O9LaUNeQwl46F5xpuczphtvdbH0paCMY1azaGnWUkNfLSjlAB Fs+YYj7Mu6CBT3ujOuNP3/sTHyZp1mZa7hrF2ZeS9htnu47rMT56sRAUu5FsNNfbb/Rbq7 ew3NdBvGv0LsLLHPlFSdjOPQuz0IN0wQJz2tkddE5bef7t87Qh0cOqCNKePIWuN6HxY/s+ +P3qkdyuHEOgQTmzPnSfBlgGYrWdqlPMqTm6BTgs+sFn9hzDeGnx1dq4hX1Qag== ARC-Authentication-Results: i=1; mail01.ipfire.org; dkim=none; spf=pass (mail01.ipfire.org: domain of hofmann@leo-andres.de designates 185.26.156.147 as permitted sender) smtp.mailfrom=hofmann@leo-andres.de X-Rspamd-Server: mail01.haj.ipfire.org X-Spamd-Result: default: False [-4.22 / 11.00]; RCVD_TLS_LAST(0.00)[]; ARC_NA(0.00)[]; FROM_HAS_DN(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; IP_REPUTATION_HAM(-1.92)[asn: 205766(-0.27), country: DE(-0.01), ip: 185.26.156.147(-0.68)]; MIME_GOOD(-0.10)[text/plain]; TO_DN_NONE(0.00)[]; ARC_SIGNED(0.00)[lists.ipfire.org:s=202003rsa:i=1]; RCPT_COUNT_ONE(0.00)[1]; DMARC_NA(0.00)[leo-andres.de]; R_SPF_ALLOW(-0.20)[+mx]; MID_CONTAINS_FROM(1.00)[]; FROM_EQ_ENVFROM(0.00)[]; R_DKIM_NA(0.00)[]; MIME_TRACE(0.00)[0:+]; ASN(0.00)[asn:205766, ipnet:185.26.156.0/24, country:DE]; RCVD_COUNT_TWO(0.00)[2]; BAYES_HAM(-3.00)[99.99%] X-Rspamd-Queue-Id: 4DvSrH6VkdzHv Authentication-Results: mail01.ipfire.org; dkim=none; dmarc=none; spf=pass (mail01.ipfire.org: domain of hofmann@leo-andres.de designates 185.26.156.147 as permitted sender) smtp.mailfrom=hofmann@leo-andres.de X-BeenThere: development@lists.ipfire.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: IPFire development talk List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: development-bounces@lists.ipfire.org Sender: "Development" The RRD graphs are embedded in an iframe tag. Therefore it is possible to refresh them periodically without reloading or changing the pages. This patch adds a graph reload javascript to the ipfire main theme. Signed-off-by: Leo-Andres Hofmann --- Hi, This is more of a nice-to-have, an idea I would like to present. As I was working on the QoS graphs, I noticed that all RRD graphs are embedded in an iframe. I wrote a little javascript that periodically reloads these graphs. The refresh interval is based on the graph's time range, i.e. hourly graphs are refreshed more often. Reloading should stop in case of a network error, but I haven't fully tested this yet. This patch adds a checkbox to the GUI settings (default: disabled), translations, ... If you just want to try the javascript, you can simply paste it to the html in html/themes/ipfire/include/functions.pl. Be sure to escape the '$' then. Best regards Leo doc/language_issues.en | 1 + doc/language_issues.es | 1 + doc/language_issues.fr | 1 + doc/language_issues.it | 1 + doc/language_issues.nl | 1 + doc/language_issues.pl | 1 + doc/language_issues.ru | 1 + doc/language_issues.tr | 1 + doc/language_missings | 7 ++ html/cgi-bin/gui.cgi | 16 ++++ html/html/themes/ipfire/include/functions.pl | 7 ++ .../themes/ipfire/include/js/reloadGraphs.js | 81 +++++++++++++++++++ langs/de/cgi-bin/de.pl | 1 + langs/en/cgi-bin/en.pl | 1 + 14 files changed, 121 insertions(+) create mode 100644 html/html/themes/ipfire/include/js/reloadGraphs.js diff --git a/doc/language_issues.en b/doc/language_issues.en index 7819541c2..9edc57d19 100644 --- a/doc/language_issues.en +++ b/doc/language_issues.en @@ -1446,6 +1446,7 @@ WARNING: untranslated string: password not set = Password not set. WARNING: untranslated string: password too short = Password is too short. WARNING: untranslated string: passwords do not match = Passwords do not match. WARNING: untranslated string: percentage = Percentage +WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs WARNING: untranslated string: persistent = Persistent WARNING: untranslated string: pfs yes no = Perfect Forward Secrecy (PFS) WARNING: untranslated string: pkcs12 file password = PKCS12 File Password diff --git a/doc/language_issues.es b/doc/language_issues.es index 952321fbe..3d623302c 100644 --- a/doc/language_issues.es +++ b/doc/language_issues.es @@ -1318,6 +1318,7 @@ WARNING: untranslated string: pakfire tree = Repository WARNING: untranslated string: pakfire tree stable = Stable WARNING: untranslated string: pakfire tree testing = Testing WARNING: untranslated string: pakfire tree unstable = Unstable +WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes WARNING: untranslated string: pptp netconfig = My Net Config WARNING: untranslated string: pptp peer = Peer diff --git a/doc/language_issues.fr b/doc/language_issues.fr index 9fe5ca21c..e3a38df4e 100644 --- a/doc/language_issues.fr +++ b/doc/language_issues.fr @@ -914,6 +914,7 @@ WARNING: untranslated string: guardian logtarget_syslog = unknown string WARNING: untranslated string: guardian no entries = unknown string WARNING: untranslated string: guardian service = unknown string WARNING: untranslated string: pakfire ago = ago. +WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs WARNING: untranslated string: route config changed = unknown string WARNING: untranslated string: routing config added = unknown string WARNING: untranslated string: routing config changed = unknown string diff --git a/doc/language_issues.it b/doc/language_issues.it index 29c9c7d58..a66c693b0 100644 --- a/doc/language_issues.it +++ b/doc/language_issues.it @@ -1108,6 +1108,7 @@ WARNING: untranslated string: pakfire tree = Repository WARNING: untranslated string: pakfire tree stable = Stable WARNING: untranslated string: pakfire tree testing = Testing WARNING: untranslated string: pakfire tree unstable = Unstable +WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes WARNING: untranslated string: pptp netconfig = My Net Config WARNING: untranslated string: pptp peer = Peer diff --git a/doc/language_issues.nl b/doc/language_issues.nl index d6cad0dee..a2b978ccc 100644 --- a/doc/language_issues.nl +++ b/doc/language_issues.nl @@ -1140,6 +1140,7 @@ WARNING: untranslated string: pakfire tree = Repository WARNING: untranslated string: pakfire tree stable = Stable WARNING: untranslated string: pakfire tree testing = Testing WARNING: untranslated string: pakfire tree unstable = Unstable +WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes WARNING: untranslated string: pptp netconfig = My Net Config WARNING: untranslated string: pptp peer = Peer diff --git a/doc/language_issues.pl b/doc/language_issues.pl index b8fba938f..7f2b72cc0 100644 --- a/doc/language_issues.pl +++ b/doc/language_issues.pl @@ -1327,6 +1327,7 @@ WARNING: untranslated string: pakfire tree = Repository WARNING: untranslated string: pakfire tree stable = Stable WARNING: untranslated string: pakfire tree testing = Testing WARNING: untranslated string: pakfire tree unstable = Unstable +WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes WARNING: untranslated string: pptp netconfig = My Net Config WARNING: untranslated string: pptp peer = Peer diff --git a/doc/language_issues.ru b/doc/language_issues.ru index d507911f1..f988580cf 100644 --- a/doc/language_issues.ru +++ b/doc/language_issues.ru @@ -1322,6 +1322,7 @@ WARNING: untranslated string: pakfire tree = Repository WARNING: untranslated string: pakfire tree stable = Stable WARNING: untranslated string: pakfire tree testing = Testing WARNING: untranslated string: pakfire tree unstable = Unstable +WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes WARNING: untranslated string: pptp netconfig = My Net Config WARNING: untranslated string: pptp peer = Peer diff --git a/doc/language_issues.tr b/doc/language_issues.tr index 04343d527..dc0fd98f0 100644 --- a/doc/language_issues.tr +++ b/doc/language_issues.tr @@ -1021,6 +1021,7 @@ WARNING: untranslated string: pakfire tree = Repository WARNING: untranslated string: pakfire tree stable = Stable WARNING: untranslated string: pakfire tree testing = Testing WARNING: untranslated string: pakfire tree unstable = Unstable +WARNING: untranslated string: periodically reload graphs = Periodically refresh RRD graphs WARNING: untranslated string: please reboot to apply your changes = Please reboot to apply your changes WARNING: untranslated string: processor vulnerability mitigations = Processor Vulnerability Mitigations WARNING: untranslated string: ptr = PTR diff --git a/doc/language_missings b/doc/language_missings index f10c4f242..89808f3b5 100644 --- a/doc/language_missings +++ b/doc/language_missings @@ -669,6 +669,7 @@ < pakfire tree stable < pakfire tree testing < pakfire tree unstable +< periodically reload graphs < please reboot to apply your changes < pptp netconfig < pptp peer @@ -922,6 +923,7 @@ < dhcp valid range required when deny known clients checked < g.dtm < g.lite +< periodically reload graphs < token < token not set < upload fcdsl.o @@ -1198,6 +1200,7 @@ < pakfire tree stable < pakfire tree testing < pakfire tree unstable +< periodically reload graphs < please reboot to apply your changes < pptp netconfig < pptp peer @@ -1632,6 +1635,7 @@ < pakfire tree stable < pakfire tree testing < pakfire tree unstable +< periodically reload graphs < please reboot to apply your changes < pptp netconfig < pptp peer @@ -2407,6 +2411,7 @@ < pakfire tree stable < pakfire tree testing < pakfire tree unstable +< periodically reload graphs < please reboot to apply your changes < pptp netconfig < pptp peer @@ -3297,6 +3302,7 @@ < pakfire tree stable < pakfire tree testing < pakfire tree unstable +< periodically reload graphs < please reboot to apply your changes < pptp netconfig < pptp peer @@ -3660,6 +3666,7 @@ < pakfire tree stable < pakfire tree testing < pakfire tree unstable +< periodically reload graphs < please reboot to apply your changes < processor vulnerability mitigations < ptr diff --git a/html/cgi-bin/gui.cgi b/html/cgi-bin/gui.cgi index f06b0f923..a5255dbce 100644 --- a/html/cgi-bin/gui.cgi +++ b/html/cgi-bin/gui.cgi @@ -37,6 +37,7 @@ my $errormessage=''; $cgiparams{'SPEED'} = 'off'; +$cgiparams{'RELOADGRAPHS'} = 'off'; $cgiparams{'WINDOWWITHHOSTNAME'} = 'off'; $cgiparams{'REFRESHINDEX'} = 'off'; $cgiparams{'ACTION'} = ''; @@ -88,6 +89,7 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}") $mainsettings{'WINDOWWITHHOSTNAME'} = $cgiparams{'WINDOWWITHHOSTNAME'}; $mainsettings{'PPPUPDOWNBEEP'} = $cgiparams{'PPPUPDOWNBEEP'}; $mainsettings{'SPEED'} = $cgiparams{'SPEED'}; + $mainsettings{'RELOADGRAPHS'} = $cgiparams{'RELOADGRAPHS'}; $mainsettings{'THEME'} = $cgiparams{'theme'}; $mainsettings{'REFRESHINDEX'} = $cgiparams{'REFRESHINDEX'}; &General::writehash("${General::swroot}/main/settings", \%mainsettings); @@ -125,6 +127,11 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}") # by manually setting the var to off $cgiparams{'SPEED'} = 'on'; } + if($mainsettings{'RELOADGRAPHS'}) { + $cgiparams{'RELOADGRAPHS'} = $mainsettings{'RELOADGRAPHS'}; + } else { + $cgiparams{'RELOADGRAPHS'} = 'off'; + } } # Default settings @@ -134,6 +141,7 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'restore defaults'}") $cgiparams{'PPPUPDOWNBEEP'} = 'on'; $cgiparams{'REFRESHINDEX'} = 'off'; $cgiparams{'SPEED'} = 'on'; + $cgiparams{'RELOADGRAPHS'} = 'off'; $cgiparams{'THEME'} = 'ipfire'; } @@ -153,6 +161,10 @@ $checked{'SPEED'}{'off'} = ''; $checked{'SPEED'}{'on'} = ''; $checked{'SPEED'}{$cgiparams{'SPEED'}} = "checked='checked'"; +$checked{'RELOADGRAPHS'}{'off'} = ''; +$checked{'RELOADGRAPHS'}{'on'} = ''; +$checked{'RELOADGRAPHS'}{$cgiparams{'RELOADGRAPHS'}} = "checked='checked'"; + &Header::openpage($Lang::tr{'gui settings'}, 1, ''); &Header::openbigbox('100%', 'left', '', $errormessage); @@ -179,6 +191,10 @@ print < $Lang::tr{'show ajax speedmeter in footer'} + + + $Lang::tr{'periodically reload graphs'} +   $Lang::tr{'languagepurpose'} diff --git a/html/html/themes/ipfire/include/functions.pl b/html/html/themes/ipfire/include/functions.pl index 9aec77497..7f3401119 100644 --- a/html/html/themes/ipfire/include/functions.pl +++ b/html/html/themes/ipfire/include/functions.pl @@ -147,6 +147,13 @@ END ; } +if ($settings{'RELOADGRAPHS'} eq 'on') { +print < +END +; +} + print < diff --git a/html/html/themes/ipfire/include/js/reloadGraphs.js b/html/html/themes/ipfire/include/js/reloadGraphs.js new file mode 100644 index 000000000..c0c8bec9e --- /dev/null +++ b/html/html/themes/ipfire/include/js/reloadGraphs.js @@ -0,0 +1,81 @@ +/*############################################################################# +# # +# IPFire.org - A linux based firewall # +# Copyright (C) 2007-2021 IPFire Team # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +#############################################################################*/ + +var graphs_reloadTimers = new Map(); + +//graph onload event: graph is now loaded, start reload timer +function graphs_onloadEvent(graphObj, startTimer = true) { + if(! graphObj) { + return; //graph iframe object is missing + } + + //get graph parameters from iframe url: [url]?[graph name]?[time range] + let url = graphObj.contentWindow.location.href; + if((! url) || (url === 'about:blank')) { + url = graphObj.src; + } + url = url.split('?', 3); + let graphRange = url.pop(); + let graphName = url.pop(); + + if((! graphName) || (! graphRange)) { + return; //url parameters are missing + } + + //clear pending reload timeout to prevent multiple timer starts + if(graphs_reloadTimers.has(graphName)) { + clearTimeout(graphs_reloadTimers.get(graphName)); + graphs_reloadTimers.delete(graphName); + } + + if(startTimer) { + //determine reload interval + let interval = 60; //default: 60s + if(graphRange === 'hour') { + interval = 10; + } else if(graphRange === 'month' || graphRange === 'year') { + interval = 180; + } + + //start timeout and store timer id + let timer = setTimeout(function(graphFrame, timerRef) { + graphs_reloadTimers.delete(timerRef); //clear expired timer + + //reload graph iframe, ignore cache + graphFrame.contentWindow.location.reload(true); + }, interval * 1000, graphObj, graphName); + graphs_reloadTimers.set(graphName, timer); + } +} + +//document.ready, must fire before iframes load +$(function() { + //attach onload event to graphs + $('iframe.graph').each(function() { + $(this).on({ + load: function() { + graphs_onloadEvent(this); + }, + error: function() { //stop reload on error + graphs_onloadEvent(this, false); + } + }); + }); +}); diff --git a/langs/de/cgi-bin/de.pl b/langs/de/cgi-bin/de.pl index b3c2a69da..00e6b9853 100644 --- a/langs/de/cgi-bin/de.pl +++ b/langs/de/cgi-bin/de.pl @@ -2007,6 +2007,7 @@ 'pc add' => 'PC hinzufügen', 'pdc options' => 'PDC Optionen', 'percentage' => 'Prozent', +'periodically reload graphs' => 'RRD Graphen periodisch neu laden', 'persistent' => 'Dauerhaft', 'pfs yes no' => 'Perfect Forward Secrecy (PFS)', 'phase1 group' => 'Phase1 Gruppe', diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl index 9767be178..ed9e4996a 100644 --- a/langs/en/cgi-bin/en.pl +++ b/langs/en/cgi-bin/en.pl @@ -2037,6 +2037,7 @@ 'pc add' => 'Add workstation', 'pdc options' => 'PDC options', 'percentage' => 'Percentage', +'periodically reload graphs' => 'Periodically refresh RRD graphs', 'persistent' => 'Persistent', 'pfs yes no' => 'Perfect Forward Secrecy (PFS)', 'phase1 group' => 'Phase1 Group',