From mboxrd@z Thu Jan  1 00:00:00 1970
From: Michael Tremer <michael.tremer@ipfire.org>
To: development@lists.ipfire.org
Subject: Re: [PATCH] GUI: Periodically reload RRD graphs
Date: Tue, 16 Mar 2021 15:35:00 +0000
Message-ID: <C8CFCC37-CE80-43C8-A9CE-3CEA59523A53@ipfire.org>
In-Reply-To: <050e76a7-193d-e982-1869-fcbba6cd092f@ipfire.org>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="===============4658663251051353576=="
List-Id: <development.lists.ipfire.org>

--===============4658663251051353576==
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

So happy to see the teamwork here :)

> On 16 Mar 2021, at 08:37, Adolf Belka <adolf.belka(a)ipfire.org> wrote:
>=20
> Hi all,
>=20
> On 15/03/2021 22:47, Leo Hofmann wrote:
>> Hi,
>>=20
>> Am 14.03.2021 um 12:44 schrieb Jonatan Schlag:
>>> Hi,
>>>=20
>>>=20
>>>> Am 12.03.2021 um 14:41 schrieb Leo Hofmann <hofmann(a)leo-andres.de>:
>>>>=20
>>>> =EF=BB=BFHi,
>>>>=20
>>>>> Am 10.03.2021 um 14:49 schrieb Michael Tremer:
>>>>> Hello,
>>>>>=20
>>>>>>> On 10 Mar 2021, at 12:29, Jonatan Schlag <jonatan.schlag(a)ipfire.org=
> wrote:
>>>>>> Hi,
>>>>>>=20
>>>>>>> Am 08.03.2021 um 20:21 schrieb Leo-Andres Hofmann <hofmann(a)leo-andr=
es.de>:
>>>>>>>=20
>>>>>>> =EF=BB=BFThe RRD graphs are embedded in an iframe tag.
>>>>>> Do know why? Just wondering why we put an iFrame tag around the image.=
 Should it no be possible to reload the image without an iFrame?
>>>>> Very good question. I think this is because we needed a way to change o=
nly the image and JS wasn=E2=80=99t an option back then. The <a> tag allowed =
to specify a target which changed the content of the iframe.
>>>>>=20
>>>>> I would absolutely prefer to get rid of it and just use one or multiple=
 img tags. Those would also make styling easier.
>>>> I would also prefer the image tag. But as far as I know, there is no way=
 to change the image without javascript.
>>> The only way I came up with is to send the values of all graphs with the =
request and to change to content of the img tag at the server in the Perl scr=
ipt. But this solution has so many culprits and couple things in a way a woul=
d like to avoid.
>> I could not think of a better solution either. But I think this would be e=
ven worse than the existing iframes.
>>>>>>> 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.
>>>>>>>=20
>>>>>>> Signed-off-by: Leo-Andres Hofmann <hofmann(a)leo-andres.de>
>>>>>>> ---
>>>>>>>=20
>>>>>> =E2=AC=87=EF=B8=8F This part which is not really part of the commit me=
ssage, can be put before an patch using the =E2=80=94compose option :-).
>>>>> Yes this is brilliant :)
>>>> Thanks! This time I used -annotate to fit everything in one e-mail, I'll=
 try -compose next time.
>>>>>>> Hi,
>>>>>>>=20
>>>>>>> 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.
>>>>>> Would it not be sufficient to reload only the hourly graph? So all oth=
ers have a range where I would not assume somebody to monitor them =E2=80=9Cl=
ive=E2=80=9C.
>>>> I think the daily graph might be interesting as well. But for the other =
ranges I agree with you, they can be left out.
>>>>>>> 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.
>>>>>>>=20
>>>>>>> This patch adds a checkbox to the GUI settings (default: disabled), t=
ranslations, ...
>>>>>>> If you just want to try the javascript, you can simply paste it to th=
e html <head> in
>>>>>>> html/themes/ipfire/include/functions.pl. Be sure to escape the '$' th=
en.
>>>>>>>=20
>>>>>>> Best regards
>>>>>>> Leo
>>>>>>>=20
>>>>>>> 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
>>>>>>>=20
>>>>>>> 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 =
=3D Password not set.
>>>>>>> WARNING: untranslated string: password too short =3D Password is too =
short.
>>>>>>> WARNING: untranslated string: passwords do not match =3D Passwords do=
 not match.
>>>>>>> WARNING: untranslated string: percentage =3D Percentage
>>>>>>> +WARNING: untranslated string: periodically reload graphs =3D Periodi=
cally refresh RRD graphs
>>>>>>> WARNING: untranslated string: persistent =3D Persistent
>>>>>>> WARNING: untranslated string: pfs yes no =3D Perfect Forward Secrecy =
(PFS)
>>>>>>> WARNING: untranslated string: pkcs12 file password =3D PKCS12 File Pa=
ssword
>>>>>>> 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 =3D =
Repository
>>>>>>> WARNING: untranslated string: pakfire tree stable =3D Stable
>>>>>>> WARNING: untranslated string: pakfire tree testing =3D Testing
>>>>>>> WARNING: untranslated string: pakfire tree unstable =3D Unstable
>>>>>>> +WARNING: untranslated string: periodically reload graphs =3D Periodi=
cally refresh RRD graphs
>>>>>>> WARNING: untranslated string: please reboot to apply your changes =3D=
 Please reboot to apply your changes
>>>>>>> WARNING: untranslated string: pptp netconfig =3D My Net Config
>>>>>>> WARNING: untranslated string: pptp peer =3D 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 =3D unknown string
>>>>>>> WARNING: untranslated string: guardian no entries =3D unknown string
>>>>>>> WARNING: untranslated string: guardian service =3D unknown string
>>>>>>> WARNING: untranslated string: pakfire ago =3D ago.
>>>>>>> +WARNING: untranslated string: periodically reload graphs =3D Periodi=
cally refresh RRD graphs
>>>>>>> WARNING: untranslated string: route config changed =3D unknown string
>>>>>>> WARNING: untranslated string: routing config added =3D unknown string
>>>>>>> WARNING: untranslated string: routing config changed =3D unknown stri=
ng
>>>>>>> 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 =3D =
Repository
>>>>>>> WARNING: untranslated string: pakfire tree stable =3D Stable
>>>>>>> WARNING: untranslated string: pakfire tree testing =3D Testing
>>>>>>> WARNING: untranslated string: pakfire tree unstable =3D Unstable
>>>>>>> +WARNING: untranslated string: periodically reload graphs =3D Periodi=
cally refresh RRD graphs
>>>>>>> WARNING: untranslated string: please reboot to apply your changes =3D=
 Please reboot to apply your changes
>>>>>>> WARNING: untranslated string: pptp netconfig =3D My Net Config
>>>>>>> WARNING: untranslated string: pptp peer =3D 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 =3D =
Repository
>>>>>>> WARNING: untranslated string: pakfire tree stable =3D Stable
>>>>>>> WARNING: untranslated string: pakfire tree testing =3D Testing
>>>>>>> WARNING: untranslated string: pakfire tree unstable =3D Unstable
>>>>>>> +WARNING: untranslated string: periodically reload graphs =3D Periodi=
cally refresh RRD graphs
>>>>>>> WARNING: untranslated string: please reboot to apply your changes =3D=
 Please reboot to apply your changes
>>>>>>> WARNING: untranslated string: pptp netconfig =3D My Net Config
>>>>>>> WARNING: untranslated string: pptp peer =3D 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 =3D =
Repository
>>>>>>> WARNING: untranslated string: pakfire tree stable =3D Stable
>>>>>>> WARNING: untranslated string: pakfire tree testing =3D Testing
>>>>>>> WARNING: untranslated string: pakfire tree unstable =3D Unstable
>>>>>>> +WARNING: untranslated string: periodically reload graphs =3D Periodi=
cally refresh RRD graphs
>>>>>>> WARNING: untranslated string: please reboot to apply your changes =3D=
 Please reboot to apply your changes
>>>>>>> WARNING: untranslated string: pptp netconfig =3D My Net Config
>>>>>>> WARNING: untranslated string: pptp peer =3D 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 =3D =
Repository
>>>>>>> WARNING: untranslated string: pakfire tree stable =3D Stable
>>>>>>> WARNING: untranslated string: pakfire tree testing =3D Testing
>>>>>>> WARNING: untranslated string: pakfire tree unstable =3D Unstable
>>>>>>> +WARNING: untranslated string: periodically reload graphs =3D Periodi=
cally refresh RRD graphs
>>>>>>> WARNING: untranslated string: please reboot to apply your changes =3D=
 Please reboot to apply your changes
>>>>>>> WARNING: untranslated string: pptp netconfig =3D My Net Config
>>>>>>> WARNING: untranslated string: pptp peer =3D 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 =3D =
Repository
>>>>>>> WARNING: untranslated string: pakfire tree stable =3D Stable
>>>>>>> WARNING: untranslated string: pakfire tree testing =3D Testing
>>>>>>> WARNING: untranslated string: pakfire tree unstable =3D Unstable
>>>>>>> +WARNING: untranslated string: periodically reload graphs =3D Periodi=
cally refresh RRD graphs
>>>>>>> WARNING: untranslated string: please reboot to apply your changes =3D=
 Please reboot to apply your changes
>>>>>>> WARNING: untranslated string: processor vulnerability mitigations =3D=
 Processor Vulnerability Mitigations
>>>>>>> WARNING: untranslated string: ptr =3D 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=3D'';
>>>>>>>=20
>>>>>>>=20
>>>>>>> $cgiparams{'SPEED'} =3D 'off';
>>>>>>> +$cgiparams{'RELOADGRAPHS'} =3D 'off';
>>>>>>> $cgiparams{'WINDOWWITHHOSTNAME'} =3D 'off';
>>>>>>> $cgiparams{'REFRESHINDEX'} =3D 'off';
>>>>>>> $cgiparams{'ACTION'} =3D '';
>>>>>>> @@ -88,6 +89,7 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}")
>>>>>>>    $mainsettings{'WINDOWWITHHOSTNAME'} =3D $cgiparams{'WINDOWWITHHOST=
NAME'};
>>>>>>>    $mainsettings{'PPPUPDOWNBEEP'} =3D $cgiparams{'PPPUPDOWNBEEP'};
>>>>>>>    $mainsettings{'SPEED'} =3D $cgiparams{'SPEED'};
>>>>>>> +    $mainsettings{'RELOADGRAPHS'} =3D $cgiparams{'RELOADGRAPHS'};
>>>>>>>    $mainsettings{'THEME'} =3D $cgiparams{'theme'};
>>>>>>>    $mainsettings{'REFRESHINDEX'} =3D $cgiparams{'REFRESHINDEX'};
>>>>>>> &General::writehash("${General::swroot}/main/settings", \%mainsetting=
s);
>>>>>>> @@ -125,6 +127,11 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}")
>>>>>>>    # by manually setting the var to off
>>>>>>>        $cgiparams{'SPEED'} =3D 'on';
>>>>>>>    }
>>>>>>> +    if($mainsettings{'RELOADGRAPHS'}) {
>>>>>>> +        $cgiparams{'RELOADGRAPHS'} =3D $mainsettings{'RELOADGRAPHS'};
>>>>>>> +    } else {
>>>>>>> +        $cgiparams{'RELOADGRAPHS'} =3D 'off';
>>>>>>> +    }
>>>>>>> }
>>>>>>>=20
>>>>>>> # Default settings
>>>>>>> @@ -134,6 +141,7 @@ if ($cgiparams{'ACTION'} eq "$Lang::tr{'restore d=
efaults'}")
>>>>>>>    $cgiparams{'PPPUPDOWNBEEP'} =3D 'on';
>>>>>>>    $cgiparams{'REFRESHINDEX'} =3D 'off';
>>>>>>>    $cgiparams{'SPEED'} =3D 'on';
>>>>>>> +    $cgiparams{'RELOADGRAPHS'} =3D 'off';
>>>>>>>    $cgiparams{'THEME'} =3D 'ipfire';
>>>>>>> }
>>>>>>>=20
>>>>>>> @@ -153,6 +161,10 @@ $checked{'SPEED'}{'off'} =3D '';
>>>>>>> $checked{'SPEED'}{'on'} =3D '';
>>>>>>> $checked{'SPEED'}{$cgiparams{'SPEED'}} =3D "checked=3D'checked'";
>>>>>>>=20
>>>>>>> +$checked{'RELOADGRAPHS'}{'off'} =3D '';
>>>>>>> +$checked{'RELOADGRAPHS'}{'on'} =3D '';
>>>>>>> +$checked{'RELOADGRAPHS'}{$cgiparams{'RELOADGRAPHS'}} =3D "checked=3D=
'checked'";
>>>>>>> +
>>>>>>> &Header::openpage($Lang::tr{'gui settings'}, 1, '');
>>>>>>> &Header::openbigbox('100%', 'left', '', $errormessage);
>>>>>>>=20
>>>>>>> @@ -179,6 +191,10 @@ print <<END
>>>>>>>     <td><input type=3D'checkbox' name=3D'SPEED' $checked{'SPEED'}{'on=
'} /></td>
>>>>>>>     <td>$Lang::tr{'show ajax speedmeter in footer'}</td>
>>>>>>> </tr>
>>>>>>> +<tr>
>>>>>>> +    <td><input type=3D'checkbox' name=3D'RELOADGRAPHS' $checked{'REL=
OADGRAPHS'}{'on'} /></td>
>>>>>>> +    <td>$Lang::tr{'periodically reload graphs'}</td>
>>>>>>> +</tr>
>>>>>>> <tr>
>>>>>>>     <td>&nbsp;</td>
>>>>>>>     <td>$Lang::tr{'languagepurpose'}</td>
>>>>> Does this actually need configuration or can we not simply enable this =
for everyone?
>>>>>=20
>>>>> What is the downside? If the browser has JS disabled, simply nothing wo=
uld happen.
>>>> I don't see any disadvantages, I just thought that some users might not =
like it.
>>> Would a solution be to add a button to toogle instead? So a button next t=
o each graph to enable something like a live mode? This would not change any =
existing behaviour.
>> I added a button to the top row. I think that looks good :)
>>>>>>> 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
>>>>>>> ;
>>>>>>> }
>>>>>>>=20
>>>>>>> +if ($settings{'RELOADGRAPHS'} eq 'on') {
>>>>>>> +print <<END
>>>>>>> +    <script src=3D"/themes/ipfire/include/js/reloadGraphs.js"></scri=
pt>
>>>>>>> +END
>>>>>>> +;
>>>>>>> +}
>>>>>>> +
>>>>>>> print <<END
>>>>>>>    </head>
>>>>>>>    <body>
>>>>>>> diff --git a/html/html/themes/ipfire/include/js/reloadGraphs.js b/htm=
l/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 @@
>>>>>>> +/*##################################################################=
###########=20
>>>>>>> +# #
>>>>>>> +# IPFire.org - A linux based firewall                               =
          #
>>>>>>> +# Copyright (C) 2007-2021  IPFire Team <info(a)ipfire.org>          =
           #
>>>>>>> +# #
>>>>>>> +# This program is free software: you can redistribute it and/or modi=
fy        #
>>>>>>> +# 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 <http://www.gnu.org/licenses=
/>.       #
>>>>>>> +# #
>>>>>>> +####################################################################=
#########*/=20
>>>>>>> +
>>>>>>> +var graphs_reloadTimers =3D new Map();
>>>>>>> +
>>>>>>> +//graph onload event: graph is now loaded, start reload timer
>>>>>>> +function graphs_onloadEvent(graphObj, startTimer =3D true) {
>>>>>>> +    if(! graphObj) {
>>>>>>> +        return; //graph iframe object is missing
>>>>>>> +    }
>>>>>>> +
>>>>>>> +    //get graph parameters from iframe url: [url]?[graph name]?[time=
 range]
>>>>>>> +    let url =3D graphObj.contentWindow.location.href;
>>>>>>> +    if((! url) || (url =3D=3D=3D 'about:blank')) {
>>>>>>> +        url =3D graphObj.src;
>>>>>>> +    }
>>>>>>> +    url =3D url.split('?', 3);
>>>>>>> +    let graphRange =3D url.pop();
>>>>>>> +    let graphName =3D 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 =3D 60; //default: 60s
>>>>>>> +        if(graphRange =3D=3D=3D 'hour') {
>>>>>>> +            interval =3D 10;
>>>>>>> +        } else if(graphRange =3D=3D=3D 'month' || graphRange =3D=3D=
=3D 'year') {
>>>>>> Do not think that=E2=80=99s this makes any sense here. Should not chan=
ge a pixel in this graphs :-). Why is day not listed here ?
>>>> Daily graphs would use the default (60s). I made that up on a sunday eve=
ning, there is certainly room for improvement here :)
>>> No need to apologise here :-). Thanks for clarification.
>>>>>>> +            interval =3D 180;
>>>>>>> +        }
>>>>>>> +
>>>>>>> +        //start timeout and store timer id
>>>>>>> +        let timer =3D setTimeout(function(graphFrame, timerRef) {
>>>>>>> +            graphs_reloadTimers.delete(timerRef); //clear expired ti=
mer
>>>>>>> +
>>>>>>> +            //reload graph iframe, ignore cache
>>>>>>> + graphFrame.contentWindow.location.reload(true);
>>>>>>> +        }, interval * 1000, graphObj, graphName);
>>>>>>> +        graphs_reloadTimers.set(graphName, timer);
>>>>>>> +    }
>>>>>>> +}
>>>>>>> +
>>>>>> Would it no be easier to attach this directly to a graph so inside the=
 function which creates the graph, should be makegraphs() or something like t=
hat?
>>>> Yes, but I think this was the easiest way to do it without changing the =
existing iframe.
>>>> If we remove the iframe, I would do it as you suggested.
>>>>>>> +//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' =3D> 'PC hinzuf=C3=BCgen',
>>>>>>> 'pdc options' =3D> 'PDC Optionen',
>>>>>>> 'percentage' =3D> 'Prozent',
>>>>>>> +'periodically reload graphs' =3D> 'RRD Graphen periodisch neu laden',
>>>>>>> 'persistent' =3D> 'Dauerhaft',
>>>>>>> 'pfs yes no' =3D> 'Perfect Forward Secrecy (PFS)',
>>>>>>> 'phase1 group' =3D> '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' =3D> 'Add workstation',
>>>>>>> 'pdc options' =3D> 'PDC options',
>>>>>>> 'percentage' =3D> 'Percentage',
>>>>>>> +'periodically reload graphs' =3D> 'Periodically refresh RRD graphs',
>>>>>>> 'persistent' =3D> 'Persistent',
>>>>>>> 'pfs yes no' =3D> 'Perfect Forward Secrecy (PFS)',
>>>>>>> 'phase1 group' =3D> 'Phase1 Group',
>>>>>>> --=20
>>>>>>> 2.27.0.windows.1
>>>>>>>=20
>>>>>> Some generic thoughts. Would it not be better to remove the iFrame and=
 make the links for hour/day/month/year firing some JavaScripts which reloads=
/changes the graphs? And then when we click hour start this script to reload =
the graphs periodically?
>>>>> Agreed.
>>>>>=20
>>>>> I very much like the idea and I think this is an opportunity to clean u=
p a little bit more. I will let you two sort out the technical things and how=
 often is best to reload :)
>>>> As I mentioned above, I would also prefer to revise that. But I think us=
ers withouth JS enabled will then no longer be able to change the graph range.
>>>>=20
>>>> What is you attitude towards JS in general? I think for such "bonus" fea=
tures like interactive graphs we can require JS and break compatibility, woul=
d you agree?
>>>>=20
>>> So the actual content of this mail in one big block:
>>>=20
>>> First thanks for all input, things seem to be a little bit more complicat=
ed right now, but at least we can create a stable solution when we find a lot=
 of problems before =F0=9F=99=82.
>>>=20
>>> Regarding JavaScript in general, I first thought that this is a good ques=
tion which needs an answer but after some thinking I came up with the fact th=
at the web interface is already not working without JavaScript enabled. The z=
one configuration page needs JavaScript enabled, otherwise the change to VLAN=
 does not work, as we cannot enable the field without JavaScript (tested toda=
y )
>> As far as I know, however, this is the only page which requires javascript=
. So if we should vote against JS, not much work has been done yet.
>>>=20
>>> So I do not really have a problem here when we add JavaScript for Feature=
s, as this is somehow the only way to change the DOM. I  do not know If it is=
 a good idea to use JavaScript only for =E2=80=9Cbonus=E2=80=9D features, bec=
ause also validation of input fields is when it comes to more complex values,=
 only possible with JavaScript. I would not call this a =E2=80=9Cbonus=E2=80=
=9D feature. In the end we will maybe end up with two web interface which inc=
reases maintain work.
>>>=20
>>> But I would like to have a general decision here to avoid talking about t=
his over and over again. @all maybe something for the next telephone conferen=
ce? Or should we made a decision right here?
>> I agree!
>>>=20
>>> Another fact which came to my mind is that our jquery version is heavily =
outdated and I think it makes sense to update this lib before we add further =
JavaScript. Otherwise an update might break scripts and causes more trouble a=
s when we develop the scripts with a current version.
>> Would you be willing to do the update? I don't know how to do that, but of=
 course would like to use the new features.
>=20
> I am willing to pick up the update of jquery.
>=20
> That is the sort of thing that I can support well on and let you guys get o=
n with the stuff that I can't easily do.
>=20
> Regards,
>=20
> Adolf
>=20
>>>=20
>>>=20
>>> So I suggest the following plan:
>>>=20
>>> 1. Decision making concerning JavaScript (next steps only with positive d=
ecision)
>>> 2. Updating jquery
>>> 3. Removing the iFrame and using JS to change the images when somebody cl=
icks on hour, day, etc
>>> 4. Adding a button for live mode
>>=20
>> I'm not sure if I should ask, but I feel like I've already opened Pandora'=
s (graph) box here.
>> Is there a reason why every CGI also creates it's own graphs and has addit=
ional parameter handling for that?
>> Wouldn't it make more sense if the graphs were generated by an independent=
 script?
>> For instance: "getrrdimg.pl?category=3Dqos&graph=3Dred0&range=3Dhour"
>>=20
>>>=20
>>> I suggest an Update every 15 sec for =E2=80=9Chour=E2=80=9D graphs and ev=
ery 360 sec for daily.
>>> Could we add this as constants to make a change easy?  And another idea: =
would it not be useful to have a basic value so 15 sec update interval for on=
e hour and then just multiple this value when it comes to day, month etc? Wou=
ld make introducing other time frames easier.
>>>=20
>>> Thanks for your thoughts and for your time (especially Leo)
>>>=20
>>> Greetings Jonatan
>>>=20
>>>=20
>>>>>> Thanks for the nice patch. It is easy to review :-)
>>>>>>=20
>>>>>> Greetings Jonatan
>>>>> -Michael
>>>> Greetings,
>>>> Leo
>=20
> --=20
> Sent from my laptop


--===============4658663251051353576==--