From mboxrd@z Thu Jan  1 00:00:00 1970
From: Adolf Belka <adolf.belka@ipfire.org>
To: development@lists.ipfire.org
Subject: Re: [PATCH] backup.cgi: Table layout - onclick confirm
Date: Wed, 16 Jun 2021 15:20:37 +0200
Message-ID: <44812ff9-555e-0ef4-4488-d7bb2d711712@ipfire.org>
In-Reply-To: <ddf745b5-0373-2809-0201-cf4a45dcec6b@ipfire.org>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="===============0932733908070565237=="
List-Id: <development.lists.ipfire.org>

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

Hi everyone,

On 16/06/2021 15:16, Adolf Belka wrote:
> Hi Matthias,
>
> Sorry for slowness in coming back on the testing but I had to deal with som=
e other things.
>
>
> I had a go at testing out the patch.
>
> First I separated the patch into individual diffs and then applied them ind=
ividually on a Core Update 156 VM in my testbed. When I selected the backup m=
enu page then I got the Internal Server Error message and in /var/log/httpd/e=
rror_log I got the following message:-
>
> Can't use an undefined value as a symbol reference at /srv/web/ipfire/cgi-b=
in/backup.cgi line 85.
>
> I then tried the same thing with a Core Update 157 VM and got the same mess=
age.
>
> Line 85 in backup.cgi is not one of the lines modified by the diff and is t=
he line highlighted by ** at the start of the line in the following excerpt.
>
> --------------------------
>
> elsif ( $cgiparams{'ACTION'} eq "$Lang::tr{'restoreaddon'}" )
> {
> =C2=A0=C2=A0=C2=A0 chomp($cgiparams{'UPLOAD'});
> =C2=A0=C2=A0=C2=A0 # we need to fix cause IE7 gives the full path and FF on=
ly the filename
> =C2=A0=C2=A0=C2=A0 my @temp =3D split(/\\/,$cgiparams{'UPLOAD'});
> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 my $upload =3D $a->param("UPLOAD");
> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 open UPLOADFILE, ">/tmp/".$temp[$#temp];
> ** =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0 binmode $upload;
> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 while ( <$upload> ) {
> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 print UPLOADFILE;
> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 }
> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 close UPLOADFILE;
> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0 system("/usr/local/bin/backupctrl restoreaddon ".$temp[$#temp=
]." >/dev/null 2>>
> }
>
> --------------------------
>
> I then used the combined patch diff on a Core Update 157 build branch, did =
a clean build and then installed the generated iso into a VM. This time I was=
 able to get the backup page to show. Not sure what was wrong with trying it =
on a existing VM.
>
>
> I then created a backup and I got the following truncated page:-
>
I placed an image here but I have realised I can not include an image in mail=
s to the development list as it is text only. Where can I place an image so e=
veryone can see it?
>
> If I selected the backup page again I could see the whole page with tables =
and showing the created backup. I tried this several times, also with logs an=
d with iso and I got the same effect. There is no message in the error_log fi=
le with the above truncated page display.
>
> Looking at the titles for each table the use of capitals for the IPF and IS=
O seems a bit to "loud". How about changing it to lower case and making it .i=
pf and .iso - then referring to the file types being saved.
>
> I still have to have a go at the coding to change the tables into alternate=
 row colours. Will come back separately with how I get on with that.
>
> Regards,
>
> Adolf.
>
> On 28/05/2021 17:41, Matthias Fischer wrote:
>> Hi,
>>
>> On 26.05.2021 17:39, Matthias Fischer wrote:
>>> This is just a diff for testing people... ;-)
>> For clarification:
>> It looks as if I will not have very much time during the next days to
>> get a grip on rewriting this with alternate rows. And I agree to Michael
>> - rows would fit in with the rest of the layout. ;-)
>>
>> @Adolf and ALL:
>> If you have any hints, please feel free to participate. :-)
>>
>> Best,
>> Matthias
>>
>>> Changelog in short:
>>>
>>> - Added tables
>>>
>>> - Cleaned up the code a bit, some if-queries were unnessecary (if
>>> ($cgiparams{'ACTION'} eq...)
>>>
>>> - Deleted unused lang strings (downloadiso, downloadaddon, logs)
>>>
>>> - Separated the ISO files from the IPF files for better overview.
>>>
>>> - Added query for deleting a backup file (onclick=3D\"return confirm...)
>>>
>>> ToDo:
>>> Change table layout to alternating rows. If "someone" has some hints
>>> how to do this, I'll be grateful.
>>>
>>> Signed-off-by: Matthias Fischer <matthias.fischer(a)ipfire.org>
>>> ---
>>> =C2=A0 html/cgi-bin/backup.cgi | 218 +++++++++++++++++++++++++++++-------=
----
>>> =C2=A0 langs/de/cgi-bin/de.pl=C2=A0 |=C2=A0=C2=A0 8 +-
>>> =C2=A0 langs/en/cgi-bin/en.pl=C2=A0 |=C2=A0=C2=A0 8 +-
>>> =C2=A0 langs/es/cgi-bin/es.pl=C2=A0 |=C2=A0=C2=A0 1 -
>>> =C2=A0 langs/fr/cgi-bin/fr.pl=C2=A0 |=C2=A0=C2=A0 1 -
>>> =C2=A0 langs/it/cgi-bin/it.pl=C2=A0 |=C2=A0=C2=A0 1 -
>>> =C2=A0 langs/nl/cgi-bin/nl.pl=C2=A0 |=C2=A0=C2=A0 1 -
>>> =C2=A0 langs/pl/cgi-bin/pl.pl=C2=A0 |=C2=A0=C2=A0 1 -
>>> =C2=A0 langs/ru/cgi-bin/ru.pl=C2=A0 |=C2=A0=C2=A0 1 -
>>> =C2=A0 langs/tr/cgi-bin/tr.pl=C2=A0 |=C2=A0=C2=A0 1 -
>>> =C2=A0 10 files changed, 174 insertions(+), 67 deletions(-)
>>>
>>> diff --git a/html/cgi-bin/backup.cgi b/html/cgi-bin/backup.cgi
>>> index 683f8add4..04473428c 100644
>>> --- a/html/cgi-bin/backup.cgi
>>> +++ b/html/cgi-bin/backup.cgi
>>> @@ -32,7 +32,7 @@ require "${General::swroot}/header.pl";
>>> =C2=A0 =C2=A0 my %color =3D ();
>>> =C2=A0 my %mainsettings =3D ();
>>> -my %cgiparams=3D();
>>> +my %cgiparams =3D ();
>>> =C2=A0 my %checked =3D ();
>>> =C2=A0 my $message =3D "";
>>> =C2=A0 my $errormessage =3D "";
>>> @@ -59,25 +59,13 @@ system("/usr/local/bin/backupctrl makedirs >/dev/null=
 2>&1 ") unless ( -e '/var/
>>> #########################################################################=
###################################################
>>> =C2=A0 ############################################## System calls ohne H=
ttp Header ###############################################
>>> =C2=A0 -if ($cgiparams{'ACTION'} eq "download") {
>>> +if ($cgiparams{'ACTION'} eq "$Lang::tr{'download'}") {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 my $file =3D &sani=
tise_file($cgiparams{'FILE'});
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 exit(1) unless def=
ined($file);
>>> =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &deliver_fi=
le($file);
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 exit(0);
>>> -} elsif ($cgiparams{'ACTION'} eq "downloadiso") {
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 my $file =3D &sanitise_file($=
cgiparams{'FILE'});
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 exit(1) unless defined($file);
>>> -
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &deliver_file($file);
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 exit(0);
>>> -} elsif ($cgiparams{'ACTION'} eq "downloadaddon") {
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 my $file =3D &sanitise_file($=
cgiparams{'FILE'});
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 exit(1) unless defined($file);
>>> -
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 &deliver_file($file);
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 exit(0);
>>> -} elsif ( $cgiparams{'ACTION'} eq "restore") {
>>> +} elsif ( $cgiparams{'ACTION'} eq "$Lang::tr{'restore'}") {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 my $upload =3D $a-=
>param("UPLOAD");
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 open UPLOADFILE, "=
>/tmp/restore.ipf";
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 binmode $upload;
>>> @@ -87,7 +75,7 @@ if ($cgiparams{'ACTION'} eq "download") {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 close UPLOADFILE;
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 system("/usr/local=
/bin/backupctrl restore >/dev/null 2>&1");
>>> =C2=A0 }
>>> -elsif ( $cgiparams{'ACTION'} eq "restoreaddon" )
>>> +elsif ( $cgiparams{'ACTION'} eq "$Lang::tr{'restoreaddon'}" )
>>> =C2=A0 {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 chomp($cgiparams{'UPLOAD'});
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 # we need to fix cause IE7 gives the full =
path and FF only the filename
>>> @@ -112,7 +100,7 @@ sub refreshpage{&Header::openbox( 'Waiting', 1, "<met=
a http-equiv=3D'refresh' cont
>>> #########################################################################=
###################################################
>>> =C2=A0 ################################################### Default System=
 calls ###################################################
>>> =C2=A0 -if ( $cgiparams{'ACTION'} eq "backup" )
>>> +if ( $cgiparams{'ACTION'} eq "$Lang::tr{'backup'}" )
>>> =C2=A0 {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if ( $cgiparams{'BACKUPLOGS'} eq "include"=
 ) {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 system("/usr/local=
/bin/backupctrl include >/dev/null 2>&1");
>>> @@ -122,7 +110,7 @@ if ( $cgiparams{'ACTION'} eq "backup" )
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 system("/usr/local=
/bin/backupctrl iso >/dev/null 2>&1");
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }
>>> =C2=A0 }
>>> -if ( $cgiparams{'ACTION'} eq "addonbackup" )
>>> +if ( $cgiparams{'ACTION'} eq "$Lang::tr{'addonbackup'}" )
>>> =C2=A0 {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 # Exit if there is any dots or slashes in =
the addon name
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 exit(1) if ($cgiparams{'ADDON'} =3D~ /(\.|=
\/)/);
>>> @@ -132,7 +120,7 @@ if ( $cgiparams{'ACTION'} eq "addonbackup" )
>>> =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 system("/usr/local/bin/backupctrl a=
ddonbackup $cgiparams{'ADDON'} >/dev/null 2>&1");
>>> =C2=A0 }
>>> -elsif ( $cgiparams{'ACTION'} eq "delete" )
>>> +elsif ( $cgiparams{'ACTION'} eq "$Lang::tr{'delete'}" )
>>> =C2=A0 {
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 my $file =3D &sanitise_file($cgiparams{'FI=
LE'});
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 exit(1) unless defined($file);
>>> @@ -157,13 +145,13 @@ if ( -e "/var/tmp/backupiso/" ){
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 @backupisos =3D `cd /var/tmp/backupiso/ &&=
 ls *.iso 2>/dev/null`;
>>> =C2=A0 }
>>> =C2=A0 -&Header::openbox('100%', 'center', );
>>> +&Header::openbox('100%', 'center', $Lang::tr{'backup config'});
>>> =C2=A0 =C2=A0 print <<END
>>> =C2=A0 <form method=3D'post' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> =C2=A0 <table width=3D'95%' cellspacing=3D'0'>
>>> =C2=A0 <tr>
>>> -=C2=A0=C2=A0=C2=A0 <td align=3D'left' width=3D'40%'>$Lang::tr{'logs'}</t=
d>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center' width=3D'45%'></td>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <td align=3D'left'>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'rad=
io' name=3D'BACKUPLOGS' value=3D'include'/> $Lang::tr{'include logfiles'}<br/>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'rad=
io' name=3D'BACKUPLOGS' value=3D'exclude' checked=3D'checked'/> $Lang::tr{'ex=
clude logfiles'}<br/>
>>> @@ -177,8 +165,8 @@ print <<END
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </td>
>>> =C2=A0 </tr>
>>> =C2=A0 <tr><td align=3D'center' colspan=3D'2'>
>>> -=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'ACTION' value=3D'backu=
p' />
>>> -=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'$Lang::tr{'backup'}' tit=
le=3D'$Lang::tr{'backup'}' src=3D'/images/document-save.png' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'ACTION' value=3D'$Lang=
::tr{'backup'}' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'$Lang::tr{'backup'}' tit=
le=3D'$Lang::tr{'backup'}' src=3D'/images/floppy.gif' />
>>> =C2=A0 </td></tr>
>>> =C2=A0 </table>
>>> =C2=A0 </form>
>>> @@ -189,10 +177,17 @@ END
>>> #########################################################################=
###################################################
>>> =C2=A0 ############################################ Backups des Systems d=
ownloaden ################################################
>>> =C2=A0 -&Header::openbox('100%', 'center', $Lang::tr{'backups'});
>>> +&Header::openbox('100%', 'center', $Lang::tr{'backups data'});
>>> =C2=A0 =C2=A0 print <<END
>>> -<table width=3D'95%' cellspacing=3D'0'>
>>> +<table width=3D'95%' cellspacing=3D'0' border=3D'1'>
>>> +
>>> +<tr>
>>> +<th width=3D'40%'>$Lang::tr{'filename'}</th>
>>> +<th>$Lang::tr{'size'}</th>
>>> +<th colspan=3D'2'>$Lang::tr{'action'}</th>
>>> +</tr>
>>> +
>>> =C2=A0 END
>>> =C2=A0 ;
>>> =C2=A0 foreach (@backups){
>>> @@ -202,9 +197,44 @@ my $Datei =3D "/var/ipfire/backup/".$_;
>>> =C2=A0 my @Info =3D stat($Datei);
>>> =C2=A0 my $Size =3D $Info[7] / 1024 / 1024;
>>> =C2=A0 $Size =3D sprintf("%0.2f", $Size);
>>> -print "<tr><td align=3D'center'>$Lang::tr{'backup from'} $_ $Lang::tr{'s=
ize'} $Size MB</td><td width=3D'5'><form method=3D'post' action=3D'$ENV{'SCRI=
PT_NAME'}'><input type=3D'hidden' name=3D'ACTION' value=3D'download' /><input=
 type=3D'hidden' name=3D'FILE' value=3D'$_' /><input type=3D'image' alt=3D'$L=
ang::tr{'download'}' title=3D'$Lang::tr{'download'}' src=3D'/images/package-x=
-generic.png' /></form></td>";
>>> -print "<td width=3D'5'><form method=3D'post' action=3D'$ENV{'SCRIPT_NAME=
'}'><input type=3D'hidden' name=3D'ACTION' value=3D'delete' /><input type=3D'=
hidden' name=3D'FILE' value=3D'$_' /><input type=3D'image' alt=3D'$Lang::tr{'=
delete'}' title=3D'$Lang::tr{'delete'}' src=3D'/images/user-trash.png' /></fo=
rm></td></tr>";
>>> +
>>> +print "<tr>
>>> +<td align=3D'center'>$_</td>
>>> +<td align=3D'center'>$Size MB</td>
>>> +<td width=3D'5'><form method=3D'post' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'ACTION' value=3D'$Lang=
::tr{'download'}' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'FILE' value=3D'$_' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'$Lang::tr{'download'}' t=
itle=3D'$Lang::tr{'download'}' src=3D'/images/go-bottom.png' />
>>> +=C2=A0=C2=A0=C2=A0 </form></td>";
>>> +
>>> +print "<td width=3D'5'>
>>> +<form method=3D'post' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'ACTION' value=3D'$Lang=
::tr{'delete'}' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'FILE' value=3D'$_' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'$Lang::tr{'delete'}' tit=
le=3D'$Lang::tr{'delete'}' src=3D'/images/delete.gif' onclick=3D\"return conf=
irm('$Lang::tr{'delete file'}');\" />
>>> +=C2=A0=C2=A0=C2=A0 </form></td></tr>";
>>> =C2=A0 }
>>> +
>>> +print <<END
>>> +</table>
>>> +END
>>> +;
>>> +&Header::closebox();
>>> +
>>> +&Header::openbox('100%', 'center', $Lang::tr{'backups iso'});
>>> +
>>> +print <<END
>>> +<table width=3D'95%' cellspacing=3D'0' border=3D'1'>
>>> +
>>> +<tr>
>>> +<th width=3D'40%'>$Lang::tr{'filename'}</th>
>>> +<th>$Lang::tr{'size'}</th>
>>> +<th colspan=3D'2'>$Lang::tr{'action'}</th>
>>> +</tr>
>>> +
>>> +END
>>> +;
>>> +
>>> =C2=A0 foreach (@backupisos){
>>> =C2=A0 if ( $_ !~ /iso$/){next;}
>>> =C2=A0 chomp($_);
>>> @@ -212,8 +242,22 @@ my $Datei =3D "/var/tmp/backupiso/".$_;
>>> =C2=A0 my @Info =3D stat($Datei);
>>> =C2=A0 my $Size =3D $Info[7] / 1024 / 1024;
>>> =C2=A0 $Size =3D sprintf("%0.2f", $Size);
>>> -print "<tr><td align=3D'center'>$Lang::tr{'backup from'} $_ $Lang::tr{'s=
ize'} $Size MB</td><td width=3D'5'><form method=3D'post' action=3D'$ENV{'SCRI=
PT_NAME'}'><input type=3D'hidden' name=3D'ACTION' value=3D'downloadiso' /><in=
put type=3D'hidden' name=3D'FILE' value=3D'$_' /><input type=3D'image' alt=3D=
'$Lang::tr{'download'}' title=3D'$Lang::tr{'download'}' src=3D'/images/packag=
e-x-generic.png' /></form></td>";
>>> -print "<td width=3D'5'><form method=3D'post' action=3D'$ENV{'SCRIPT_NAME=
'}'><input type=3D'hidden' name=3D'ACTION' value=3D'delete' /><input type=3D'=
hidden' name=3D'FILE' value=3D'$_' /><input type=3D'image' alt=3D'$Lang::tr{'=
delete'}' title=3D'$Lang::tr{'delete'}' src=3D'/images/user-trash.png' /></fo=
rm></td></tr>";
>>> +
>>> +print "<tr>
>>> +<td align=3D'center' width=3D'40%'>$_</td>
>>> +<td align=3D'center'>$Size MB</td>
>>> +<td width=3D'5'><form method=3D'post' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'ACTION' value=3D'$Lang=
::tr{'download'}' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'FILE' value=3D'$_' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'$Lang::tr{'download'}' t=
itle=3D'$Lang::tr{'download'}' src=3D'/images/go-bottom.png' />
>>> +=C2=A0=C2=A0=C2=A0 </form></td>";
>>> +
>>> +print "<td width=3D'5'>
>>> +<form method=3D'post' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'ACTION' value=3D'$Lang=
::tr{'delete'}' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'FILE' value=3D'$_' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'$Lang::tr{'delete'}' tit=
le=3D'$Lang::tr{'delete'}' src=3D'/images/delete.gif' onclick=3D\"return conf=
irm('$Lang::tr{'delete file'}');\" />
>>> +=C2=A0=C2=A0=C2=A0 </form></td></tr>";
>>> =C2=A0 }
>>> =C2=A0 print <<END
>>> =C2=A0 </table>
>>> @@ -235,7 +279,19 @@ foreach (@addons){
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 $addons{$addon}=3D'';
>>> =C2=A0 }
>>> =C2=A0 -print "<table width=3D'95%' cellspacing=3D'0'>";
>>> +print <<END
>>> +
>>> +<table width=3D'95%' cellspacing=3D'0' border=3D'1'>
>>> +
>>> +<tr>
>>> +<th width=3D'20%'>$Lang::tr{'name'}</th>
>>> +<th width=3D'20%'>$Lang::tr{'date'}</th>
>>> +<th>$Lang::tr{'size'}</th>
>>> +<th align=3D'center' colspan=3D'3'>$Lang::tr{'action'}</th>
>>> +</tr>
>>> +END
>>> +;
>>> +
>>> =C2=A0 foreach (@addonincluds){
>>> =C2=A0 chomp($_);
>>> =C2=A0 delete $addons{$_};
>>> @@ -245,69 +301,93 @@ my $Size =3D $Info[7] / 1024;
>>> =C2=A0 =C2=A0 if ( -e $Datei ){
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if ($Size < 1) {
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 $Size=
 =3D sprintf("%.2f", $Size);
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 print=
 "<tr><td align=3D'center'>$Lang::tr{'backup from'} $_ $Lang::tr{'size'} $Siz=
e KB $Lang::tr{'date'} ".localtime($Info[9])."</td>";
>>> -=C2=A0=C2=A0=C2=A0 } else {
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 $Size=
 =3D sprintf("%2d", $Size);
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 print=
 "<tr><td align=3D'center'>$Lang::tr{'backup from'} $_ $Lang::tr{'size'} $Siz=
e KB $Lang::tr{'date'} ".localtime($Info[9])."</td>";
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 $Size =3D sprintf("%.2f", $Si=
ze);
>>> +print "<tr>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>$_</td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>".localtime($Info[9])."</td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>$Size KB</td>";
>>> +=C2=A0=C2=A0=C2=A0 </tr>
>>> =C2=A0 -=C2=A0=C2=A0=C2=A0 }
>>> +=C2=A0=C2=A0=C2=A0 } else {
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 $Size =3D sprintf("%2d", $Siz=
e);
>>> +print "<tr>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>$_</td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>".localtime($Info[9])."</td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>$Size KB</td>";
>>> +=C2=A0=C2=A0=C2=A0 </tr>
>>> +=C2=A0=C2=A0 }
>>> =C2=A0 =C2=A0 print <<END
>>> -=C2=A0=C2=A0=C2=A0 <td align=3D'right' width=3D'5'>
>>> +
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center' width=3D'5'>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <form method=3D'po=
st' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=
=3D'ACTION' value=3D'downloadaddon' />
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=
=3D'ACTION' value=3D'$Lang::tr{'download'}' />
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hid=
den' name=3D'FILE' value=3D'$_.ipf' />
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'=
$Lang::tr{'download'}' title=3D'$Lang::tr{'download'}' src=3D'/images/package=
-x-generic.png' />
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'=
$Lang::tr{'download'}' title=3D'$Lang::tr{'download'}' src=3D'/images/go-bott=
om.png' />
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </form>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </td>
>>> -=C2=A0=C2=A0=C2=A0 <td align=3D'right' width=3D'5'>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center' width=3D'5'>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <form method=3D'po=
st' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=
=3D'ACTION' value=3D'delete' />
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=
=3D'ACTION' value=3D'$Lang::tr{'delete'}' />
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hid=
den' name=3D'FILE' value=3D'$_.ipf' />
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'=
$Lang::tr{'delete'}' title=3D'$Lang::tr{'delete'}' src=3D'/images/user-trash.=
png' />
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'=
$Lang::tr{'delete'}' title=3D'$Lang::tr{'delete'}' src=3D'/images/delete.gif'=
 onclick=3D\"return confirm('$Lang::tr{'delete file'}');\" />
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </form>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </td>
>>> =C2=A0 END
>>> =C2=A0 ;
>>> =C2=A0 }
>>> -else{
>>> -=C2=A0 print "<tr><td align=3D'center'>$Lang::tr{'backup from'} $_ </td>=
<td width=3D'5' align=3D'right'></td><td width=3D'5' align=3D'right'></td>";
>>> +
>>> +else {
>>> +
>>> +=C2=A0=C2=A0=C2=A0 print "<tr>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>$_</td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'> - </td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center' width=3D'50%'> - </td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center' colspan=3D'2'> - </td>";
>>> =C2=A0 }
>>> +
>>> =C2=A0 print <<END
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <td align=3D'right' width=3D'5'>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <form method=3D'po=
st' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=
=3D'ACTION' value=3D'addonbackup' />
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=
=3D'ACTION' value=3D'$Lang::tr{'addonbackup'}' />
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hid=
den' name=3D'ADDON' value=3D'$_' />
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'=
$Lang::tr{'backup'}' title=3D'$Lang::tr{'backup'}' src=3D'/images/document-sa=
ve.png' />
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'=
$Lang::tr{'backup'}' title=3D'$Lang::tr{'backup'}' src=3D'/images/floppy.gif'=
 />
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </form>
>>> -=C2=A0=C2=A0=C2=A0 </td></tr>
>>> +=C2=A0=C2=A0=C2=A0 </td>
>>> +</tr>
>>> =C2=A0 END
>>> =C2=A0 ;
>>> +
>>> =C2=A0 }
>>> +
>>> =C2=A0 foreach (keys(%addons)){
>>> =C2=A0 chomp($_);
>>> =C2=A0 my $Datei =3D "/var/ipfire/backup/addons/backup/".$_.".ipf";
>>> =C2=A0 my @Info =3D stat($Datei);
>>> =C2=A0 my $Size =3D $Info[7] / 1024;
>>> =C2=A0 $Size =3D sprintf("%2d", $Size);
>>> -print "<tr><td align=3D'center'>$Lang::tr{'backup from'} $_ $Lang::tr{'s=
ize'} $Size KB $Lang::tr{'date'} ".localtime($Info[9])."</td>";
>>> +
>>> +print "<tr>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>$_</td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>".localtime($Info[9])."</td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>$Size KB</td>";
>>> +
>>> =C2=A0 print <<END
>>> -=C2=A0=C2=A0=C2=A0 <td align=3D'right' width=3D'5'>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center' width=3D'5'>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <form method=3D'po=
st' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=
=3D'ACTION' value=3D'downloadaddon' />
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=
=3D'ACTION' value=3D'$Lang::tr{'download'}' />
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hid=
den' name=3D'FILE' value=3D'$_.ipf' />
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'=
$Lang::tr{'download'}' title=3D'$Lang::tr{'download'}' src=3D'/images/package=
-x-generic.png' />
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'=
$Lang::tr{'download'}' title=3D'$Lang::tr{'download'}' src=3D'/images/go-bott=
om.png' />
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </form>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </td>
>>> -=C2=A0=C2=A0=C2=A0 <td align=3D'right' width=3D'5'>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center' width=3D'5'>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <form method=3D'po=
st' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=
=3D'ACTION' value=3D'delete' />
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=
=3D'ACTION' value=3D'$Lang::tr{'delete'}' />
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'hid=
den' name=3D'FILE' value=3D'$_.ipf' />
>>> -=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'=
$Lang::tr{'delete'}' title=3D'$Lang::tr{'delete'}' src=3D'/images/user-trash.=
png' />
>>> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'=
$Lang::tr{'delete'}' title=3D'$Lang::tr{'delete'}' src=3D'/images/delete.gif'=
 onclick=3D\"return confirm('$Lang::tr{'delete file'}');\" />
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </form>
>>> =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 </td>
>>> -=C2=A0=C2=A0=C2=A0 <td align=3D'right' width=3D'5'></td></tr>
>>> +=C2=A0=C2=A0=C2=A0 </tr>
>>> =C2=A0 END
>>> =C2=A0 ;
>>> =C2=A0 }
>>> @@ -322,9 +402,31 @@ print "</table>";
>>> =C2=A0 =C2=A0 print <<END
>>> =C2=A0 <table width=3D'95%' cellspacing=3D'0'>
>>> -<tr><td align=3D'center' colspan=3D'2'><font color=3D'red'><br />$Lang::=
tr{'backupwarning'}</font><br /><br /></td></tr>
>>> -<tr><td align=3D'left'>$Lang::tr{'backup'}</td><td align=3D'left'><form =
method=3D'post' enctype=3D'multipart/form-data' action=3D'$ENV{'SCRIPT_NAME'}=
'><input type=3D"file" size=3D'50' name=3D"UPLOAD" /><input type=3D'hidden' n=
ame=3D'ACTION' value=3D'restore' /><input type=3D'hidden' name=3D'FILE' /><in=
put type=3D'image' alt=3D'$Lang::tr{'restore'}' title=3D'$Lang::tr{'restore'}=
' src=3D'/images/media-floppy.png' /></form></td></tr>
>>> -<tr><td align=3D'left'>$Lang::tr{'backupaddon'}</td><td align=3D'left'><=
form method=3D'post' enctype=3D'multipart/form-data' action=3D'$ENV{'SCRIPT_N=
AME'}'><input type=3D"file" size=3D'50' name=3D"UPLOAD" /><input type=3D'hidd=
en' name=3D'ACTION' value=3D'restoreaddon' /><input type=3D'hidden' name=3D'F=
ILE' /><input type=3D'image' alt=3D'$Lang::tr{'restore'}' title=3D'$Lang::tr{=
'restore'}' src=3D'/images/media-floppy.png' /></form></td></tr>
>>> +<tr>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center' colspan=3D'2'><font color=3D'red=
'><br />$Lang::tr{'backupwarning'}</font><br /><br /></td>
>>> +</tr>
>>> +
>>> +<tr>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>$Lang::tr{'backup'}</td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'left'>
>>> +=C2=A0=C2=A0=C2=A0 <form method=3D'post' enctype=3D'multipart/form-data'=
 action=3D'$ENV{'SCRIPT_NAME'}'>
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D"file" size=3D'50' name=3D"UPLOAD" />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'ACTION' value=3D'$Lang=
::tr{'restore'}' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'FILE' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'$Lang::tr{'restore'}' ti=
tle=3D'$Lang::tr{'restore'}' src=3D'/images/go-top.png' />
>>> +=C2=A0=C2=A0=C2=A0 </form></td>
>>> +</tr>
>>> +
>>> +<tr>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'center'>$Lang::tr{'backupaddon'}</td>
>>> +=C2=A0=C2=A0=C2=A0 <td align=3D'left'><form method=3D'post' enctype=3D'm=
ultipart/form-data' action=3D'$ENV{'SCRIPT_NAME'}'>
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D"file" size=3D'50' name=3D"UPLOAD" />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'ACTION' value=3D'$Lang=
::tr{'restoreaddon'}' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'hidden' name=3D'FILE' />
>>> +=C2=A0=C2=A0=C2=A0 <input type=3D'image' alt=3D'$Lang::tr{'restoreaddon'=
}' title=3D'$Lang::tr{'restoreaddon'}' src=3D'/images/go-top.png' />
>>> +=C2=A0=C2=A0=C2=A0 </form></td>
>>> +</tr>
>>> +
>>> =C2=A0 </table>
>>> =C2=A0 END
>>> =C2=A0 ;
>>> diff --git a/langs/de/cgi-bin/de.pl b/langs/de/cgi-bin/de.pl
>>> index 95af3155b..37f0cab8a 100644
>>> --- a/langs/de/cgi-bin/de.pl
>>> +++ b/langs/de/cgi-bin/de.pl
>>> @@ -158,6 +158,7 @@
>>> =C2=A0 'add-route' =3D> 'Zus=C3=A4tzlich zu propagierende Route',
>>> =C2=A0 'added from dhcp lease list' =3D> 'hinzugef=C3=BCgt von der DHCP-Z=
uordnungsliste',
>>> =C2=A0 'addon' =3D> 'Add-Ons',
>>> +'addonbackup' =3D> 'Sichern',
>>> =C2=A0 'addons' =3D> 'Add-Ons',
>>> =C2=A0 'admin user password has been changed' =3D> 'Passwort f=C3=BCr Ben=
utzer admin wurde ge=C3=A4ndert.',
>>> =C2=A0 'admin users' =3D> 'Liste der Benutzer mit Super User Rechten',
>>> @@ -470,8 +471,11 @@
>>> =C2=A0 'backup sets' =3D> 'Datensicherungss=C3=A4tze',
>>> =C2=A0 'backup to floppy' =3D> 'Datensicherung auf Diskette',
>>> =C2=A0 'backupaddon' =3D> 'Add-On-Sicherung',
>>> +'backup config' =3D> 'Konfiguration',
>>> =C2=A0 'backupprofile' =3D> 'Falls die Wiederverbindung scheitert, auf di=
eses Profil umschalten',
>>> =C2=A0 'backups' =3D> 'Sicherungen',
>>> +'backups data' =3D> 'IPF-Dateien',
>>> +'backups iso' =3D> 'ISO-Dateien',
>>> =C2=A0 'backupwarning' =3D> 'Spielen Sie zuerst Ihre Hauptsicherung und a=
nschlie=C3=9Fend die Sicherung(en) der Addon-Konfiguration(en) ein.<br />Es w=
erden lediglich die gesicherten Konfigurationsdatei(en) der Addons, nicht die=
 installierten Addons wiederhergestellt!<br />Achten Sie au=C3=9Ferdem darauf=
, dass die Sicherungen ihre originalen Dateinamen behalten.',
>>> =C2=A0 'bad characters in' =3D> 'Ung=C3=BCltige Zeichen in ',
>>> =C2=A0 'bad characters in script field' =3D> 'Nicht erlaubte Zeichen im S=
kriptnamen',
>>> @@ -735,6 +739,8 @@
>>> =C2=A0 'defaultwarning' =3D> 'ACHTUNG - Ihre Einstellungen gehen hiermit =
verloren und werden durch die Standarteinstellungen ersetzt.',
>>> =C2=A0 'delete' =3D> 'L=C3=B6schen',
>>> =C2=A0 'delete cron' =3D> 'Cronjob l=C3=B6schen',
>>> +'delete file' =3D> 'M=C3=B6chten Sie diese Datei wirklich l=C3=B6schen?',
>>> +'delete item' =3D> 'M=C3=B6chten Sie diesen Eintrag wirklich l=C3=B6sche=
n?',
>>> =C2=A0 'delete pc' =3D> 'PC l=C3=B6schen',
>>> =C2=A0 'delete share' =3D> 'Freigabe l=C3=B6schen',
>>> =C2=A0 'delete user' =3D> 'Benutzer l=C3=B6schen',
>>> @@ -1600,7 +1606,6 @@
>>> =C2=A0 'logging' =3D> 'Protokollierung',
>>> =C2=A0 'logging server' =3D> 'Protokollierungsserver',
>>> =C2=A0 'loginlogout' =3D> 'Login/Logout',
>>> -'logs' =3D> 'Protokolldateien',
>>> =C2=A0 'loosedirectorychecking' =3D> 'Loose directorychecking',
>>> =C2=A0 'low' =3D> 'Niedrig',
>>> =C2=A0 'ls_dhcpd' =3D> 'DHCP-Server:',
>>> @@ -2136,6 +2141,7 @@
>>> =C2=A0 'restart' =3D> 'Neustart',
>>> =C2=A0 'restart ovpn server' =3D> 'OpenVPN-Server neu starten',
>>> =C2=A0 'restore' =3D> 'Wiederherstellen',
>>> +'restoreaddon' =3D> 'Wiederherstellen (Addon)',
>>> =C2=A0 'restore defaults' =3D> 'Voreinstellungen wiederherstellen',
>>> =C2=A0 'restore hardware settings' =3D> 'Hardwareeinstellungen wiederhers=
tellen',
>>> =C2=A0 'restore settings' =3D> 'Einstellungen wiederherstellen',
>>> diff --git a/langs/en/cgi-bin/en.pl b/langs/en/cgi-bin/en.pl
>>> index d86705772..a126b11ef 100644
>>> --- a/langs/en/cgi-bin/en.pl
>>> +++ b/langs/en/cgi-bin/en.pl
>>> @@ -155,6 +155,7 @@
>>> =C2=A0 'add xtaccess' =3D> 'Add External Access',
>>> =C2=A0 'add-route' =3D> 'Additional push route',
>>> =C2=A0 'added from dhcp lease list' =3D> 'Added from DHCP lease list',
>>> +'addonbackup' =3D> 'Backup',
>>> =C2=A0 'addons' =3D> 'Addons',
>>> =C2=A0 'admin user password has been changed' =3D> 'Admin user password h=
as been changed.',
>>> =C2=A0 'admin users' =3D> 'User with superuser rights',
>>> @@ -459,6 +460,7 @@
>>> =C2=A0 'backup' =3D> 'Backup',
>>> =C2=A0 'backup archive' =3D> 'Backup File (.dat)',
>>> =C2=A0 'backup clear archive' =3D> 'Clear Backup File (.gz)',
>>> +'backup config' =3D> 'Configuration',
>>> =C2=A0 'backup config floppy' =3D> 'Backup Configuration - Floppy Disk',
>>> =C2=A0 'backup configuration' =3D> 'Backup Configuration:',
>>> =C2=A0 'backup erase key' =3D> 'Erase key',
>>> @@ -486,6 +488,8 @@
>>> =C2=A0 'backupaddon' =3D> 'Addon Backup',
>>> =C2=A0 'backupprofile' =3D> 'In case reconnection fails, switch to profil=
e',
>>> =C2=A0 'backups' =3D> 'backups',
>>> +'backups data' =3D> 'IPF-Files',
>>> +'backups iso' =3D> 'ISO-Files',
>>> =C2=A0 'backupwarning' =3D> 'Import your main backup first and then the b=
ackup(s) of the addon configuration(s).<br />Only the backed up addon configu=
ration file(s) will be restored, not the installed addons!<br />Also make sur=
e that the backups keep their original file names.',
>>> =C2=A0 'bad characters in' =3D> 'Bad characters in ',
>>> =C2=A0 'bad characters in script field' =3D> 'Bad characters in script fi=
eld',
>>> @@ -755,6 +759,8 @@
>>> =C2=A0 'delete pc' =3D> 'Delete workstation',
>>> =C2=A0 'delete share' =3D> 'Delete share',
>>> =C2=A0 'delete user' =3D> 'Delete user',
>>> +'delete file' =3D> 'Do you really want to delete this file?',
>>> +'delete item' =3D> 'Do you really want to delete this item?',
>>> =C2=A0 'demon login script' =3D> 'Demon login script',
>>> =C2=A0 'deprecated fs warn' =3D> 'Deprecated filesystem! Newer kernel dro=
p the support. Backup and reformat!',
>>> =C2=A0 'description' =3D> 'Description',
>>> @@ -1632,7 +1638,6 @@
>>> =C2=A0 'logging' =3D> 'Logging',
>>> =C2=A0 'logging server' =3D> 'Logging Server',
>>> =C2=A0 'loginlogout' =3D> 'Login/Logout',
>>> -'logs' =3D> 'logs',
>>> =C2=A0 'loosedirectorychecking' =3D> 'Loosedirectorychecking',
>>> =C2=A0 'low' =3D> 'Low',
>>> =C2=A0 'ls_dhcpd' =3D> 'DHCP Server:',
>>> @@ -2172,6 +2177,7 @@
>>> =C2=A0 'restart' =3D> 'Restart',
>>> =C2=A0 'restart ovpn server' =3D> 'Restart OpenVPN server',
>>> =C2=A0 'restore' =3D> 'Restore',
>>> +'restoreaddon' =3D> 'Restore (Addon)',
>>> =C2=A0 'restore defaults' =3D> 'Restore defaults',
>>> =C2=A0 'restore hardware settings' =3D> 'Restore hardware settings',
>>> =C2=A0 'restore settings' =3D> 'Reset Settings',
>>> diff --git a/langs/es/cgi-bin/es.pl b/langs/es/cgi-bin/es.pl
>>> index c9a7496bc..fa346233f 100644
>>> --- a/langs/es/cgi-bin/es.pl
>>> +++ b/langs/es/cgi-bin/es.pl
>>> @@ -1149,7 +1149,6 @@
>>> =C2=A0 'logging' =3D> 'Conectando',
>>> =C2=A0 'logging server' =3D> 'Servidor de conexi=C3=B3n',
>>> =C2=A0 'loginlogout' =3D> 'Login/Logout',
>>> -'logs' =3D> 'registros',
>>> =C2=A0 'loosedirectorychecking' =3D> 'Chequeo de loosedirectory',
>>> =C2=A0 'low' =3D> 'Bajo',
>>> =C2=A0 'ls_dhcpd' =3D> 'Servidor DHCP:',
>>> diff --git a/langs/fr/cgi-bin/fr.pl b/langs/fr/cgi-bin/fr.pl
>>> index 301109477..ea5985315 100644
>>> --- a/langs/fr/cgi-bin/fr.pl
>>> +++ b/langs/fr/cgi-bin/fr.pl
>>> @@ -1633,7 +1633,6 @@
>>> =C2=A0 'logging' =3D> 'Connexion',
>>> =C2=A0 'logging server' =3D> 'Serveur de connexion',
>>> =C2=A0 'loginlogout' =3D> 'Connexion/Quitter',
>>> -'logs' =3D> 'Journaux',
>>> =C2=A0 'loosedirectorychecking' =3D> 'Echec de la v=C3=A9rification du r=
=C3=A9pertoire',
>>> =C2=A0 'low' =3D> 'Bas',
>>> =C2=A0 'ls_dhcpd' =3D> 'Serveur DHCP :',
>>> diff --git a/langs/it/cgi-bin/it.pl b/langs/it/cgi-bin/it.pl
>>> index e82ecfd35..711b4bd4a 100644
>>> --- a/langs/it/cgi-bin/it.pl
>>> +++ b/langs/it/cgi-bin/it.pl
>>> @@ -1408,7 +1408,6 @@
>>> =C2=A0 'logging' =3D> 'Logging',
>>> =C2=A0 'logging server' =3D> 'Logging Server',
>>> =C2=A0 'loginlogout' =3D> 'Login/Logout',
>>> -'logs' =3D> 'Gestione Log',
>>> =C2=A0 'loosedirectorychecking' =3D> 'Loosedirectorychecking',
>>> =C2=A0 'low' =3D> 'Basso',
>>> =C2=A0 'ls_dhcpd' =3D> 'DHCP Server:',
>>> diff --git a/langs/nl/cgi-bin/nl.pl b/langs/nl/cgi-bin/nl.pl
>>> index 55927839e..aea5e81b5 100644
>>> --- a/langs/nl/cgi-bin/nl.pl
>>> +++ b/langs/nl/cgi-bin/nl.pl
>>> @@ -1390,7 +1390,6 @@
>>> =C2=A0 'logging' =3D> 'Logging',
>>> =C2=A0 'logging server' =3D> 'Loggingserver',
>>> =C2=A0 'loginlogout' =3D> 'Login/Logout',
>>> -'logs' =3D> 'logs',
>>> =C2=A0 'loosedirectorychecking' =3D> 'Loosedirectorychecking',
>>> =C2=A0 'low' =3D> 'Laag',
>>> =C2=A0 'ls_dhcpd' =3D> 'DHCP Server:',
>>> diff --git a/langs/pl/cgi-bin/pl.pl b/langs/pl/cgi-bin/pl.pl
>>> index 147db051c..604a834a7 100644
>>> --- a/langs/pl/cgi-bin/pl.pl
>>> +++ b/langs/pl/cgi-bin/pl.pl
>>> @@ -1094,7 +1094,6 @@
>>> =C2=A0 'logging' =3D> 'Logowanie',
>>> =C2=A0 'logging server' =3D> 'Serwer logowania',
>>> =C2=A0 'loginlogout' =3D> 'Zalogowanie/wylogowanie',
>>> -'logs' =3D> 'logi',
>>> =C2=A0 'loosedirectorychecking' =3D> 'Loosedirectorychecking',
>>> =C2=A0 'low' =3D> 'Niski',
>>> =C2=A0 'ls_dhcpd' =3D> 'Serwer DHCP:',
>>> diff --git a/langs/ru/cgi-bin/ru.pl b/langs/ru/cgi-bin/ru.pl
>>> index 0d986135d..26ad6c338 100644
>>> --- a/langs/ru/cgi-bin/ru.pl
>>> +++ b/langs/ru/cgi-bin/ru.pl
>>> @@ -1087,7 +1087,6 @@
>>> =C2=A0 'logging' =3D> 'Logging',
>>> =C2=A0 'logging server' =3D> '=D0=A1=D0=B5=D1=80=D0=B2=D0=B5=D1=80 =D0=9B=
=D0=BE=D0=B3=D0=BE=D0=B2',
>>> =C2=A0 'loginlogout' =3D> 'Login/Logout',
>>> -'logs' =3D> '=D0=9B=D0=BE=D0=B3=D0=B8',
>>> =C2=A0 'loosedirectorychecking' =3D> 'Loosedirectorychecking',
>>> =C2=A0 'low' =3D> 'Low',
>>> =C2=A0 'ls_dhcpd' =3D> 'DHCP =D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80:',
>>> diff --git a/langs/tr/cgi-bin/tr.pl b/langs/tr/cgi-bin/tr.pl
>>> index 36c4782d6..233de0995 100644
>>> --- a/langs/tr/cgi-bin/tr.pl
>>> +++ b/langs/tr/cgi-bin/tr.pl
>>> @@ -1538,7 +1538,6 @@
>>> =C2=A0 'logging' =3D> 'G=C3=BCnl=C3=BCk',
>>> =C2=A0 'logging server' =3D> 'G=C3=BCnl=C3=BCk Sunucusu',
>>> =C2=A0 'loginlogout' =3D> 'Giri=C5=9F/=C3=87=C4=B1k=C4=B1=C5=9F',
>>> -'logs' =3D> 'G=C3=BCnl=C3=BCkler',
>>> =C2=A0 'loosedirectorychecking' =3D> 'Serbest Dizin Denetimi',
>>> =C2=A0 'low' =3D> 'D=C3=BC=C5=9F=C3=BCk',
>>> =C2=A0 'ls_dhcpd' =3D> 'DHCP Sunucusu:',
>>>

--===============0932733908070565237==--