commit 7a6602d68e1088a532742ebe2b326c428da54fb0
Author: Moritz Bunkus <m.bunkus@linet.de>
Date:   Mon Jun 17 10:41:59 2013 +0200

    Admin-Funktionen zum Sichern/Wiederherstellen der Datenbanken entfernt
    
    Diese funktionieren seit der Umstellung von users/members auf
    Verwendung der Authentifizierungsdatenbank nicht mehr und sind seitdem
    auch auskommentiert. Eine Neuimplementation ist nicht geplant.

diff --git a/bin/mozilla/admin.pl b/bin/mozilla/admin.pl
index 5f3e0b19d..8d0e4426f 100755
--- a/bin/mozilla/admin.pl
+++ b/bin/mozilla/admin.pl
@@ -126,9 +126,6 @@ sub dbselect_source {
 
   $form->{title}     = "kivitendo / " . $locale->text('Database Administration');
 
-  # Intentionnaly disabled unless fixed to work with the authentication DB.
-  $form->{ALLOW_DBBACKUP} = 0; # "$pg_dump_exe" ne "DISABLED";
-
   $form->header();
   print $form->parse_html_template("admin/dbadmin");
 }
@@ -269,261 +266,4 @@ sub dbdelete {
   print $form->parse_html_template("admin/dbdelete");
 }
 
-sub backup_dataset {
-  my $form       = $main::form;
-  my $locale     = $main::locale;
-
-  $form->{title} = "kivitendo " . $locale->text('Database Administration') . " / " . $locale->text('Backup Dataset');
-
-  if ($::lx_office_conf{applications}->{pg_dump} eq "DISABLED") {
-    $form->error($locale->text('Database backups and restorations are disabled in the configuration.'));
-  }
-
-  my @dbsources         = sort User->dbsources($form);
-  $form->{DATABASES}    = [ map { { "dbname" => $_ } } @dbsources ];
-  $form->{NO_DATABASES} = !scalar @dbsources;
-
-  my $username  = getpwuid $UID || "unknown-user";
-  my $hostname  = hostname() || "unknown-host";
-  $form->{from} = "kivitendo Admin <${username}\@${hostname}>";
-
-  $form->header();
-  print $form->parse_html_template("admin/backup_dataset");
-}
-
-sub backup_dataset_start {
-  my $form       = $main::form;
-  my $locale     = $main::locale;
-
-  $form->{title} = "kivitendo " . $locale->text('Database Administration') . " / " . $locale->text('Backup Dataset');
-
-  my $pg_dump_exe = $::lx_office_conf{applications}->{pg_dump} || "pg_dump";
-
-  if ("$pg_dump_exe" eq "DISABLED") {
-    $form->error($locale->text('Database backups and restorations are disabled in the configuration.'));
-  }
-
-  $form->isblank("dbname", $locale->text('The dataset name is missing.'));
-  $form->isblank("to", $locale->text('The email address is missing.')) if $form->{destination} eq "email";
-
-  my $tmpdir = "/tmp/lx_office_backup_" . Common->unique_id();
-  mkdir $tmpdir, 0700 || $form->error($locale->text('A temporary directory could not be created:') . " $ERRNO");
-
-  my $pgpass = IO::File->new("${tmpdir}/.pgpass", O_WRONLY | O_CREAT, 0600);
-
-  if (!$pgpass) {
-    unlink $tmpdir;
-    $form->error($locale->text('A temporary file could not be created:') . " $ERRNO");
-  }
-
-  print $pgpass "$form->{dbhost}:$form->{dbport}:$form->{dbname}:$form->{dbuser}:$form->{dbpasswd}\n";
-  $pgpass->close();
-
-  $ENV{HOME} = $tmpdir;
-
-  my @args = ("-Ft", "-c", "-o", "-h", $form->{dbhost}, "-U", $form->{dbuser});
-  push @args, ("-p", $form->{dbport}) if ($form->{dbport});
-  push @args, $form->{dbname};
-
-  my $cmd  = "$pg_dump_exe " . join(" ", map { s/\\/\\\\/g; s/\"/\\\"/g; $_ } @args);
-  my $name = "dataset_backup_$form->{dbname}_" . strftime("%Y%m%d", localtime()) . ".tar";
-
-  if ($form->{destination} ne "email") {
-    my $in = IO::File->new("$cmd |");
-
-    if (!$in) {
-      unlink "${tmpdir}/.pgpass";
-      rmdir $tmpdir;
-
-      $form->error($locale->text('The pg_dump process could not be started.'));
-    }
-
-    print "content-type: application/x-tar\n";
-    print "content-disposition: attachment; filename=\"${name}\"\n\n";
-
-    while (my $line = <$in>) {
-      print $line;
-    }
-
-    $in->close();
-
-    unlink "${tmpdir}/.pgpass";
-    rmdir $tmpdir;
-
-  } else {
-    my $tmp = $tmpdir . "/dump_" . Common::unique_id();
-
-    if (system("$cmd > $tmp") != 0) {
-      unlink "${tmpdir}/.pgpass", $tmp;
-      rmdir $tmpdir;
-
-      $form->error($locale->text('The pg_dump process could not be started.'));
-    }
-
-    my $mail = new Mailer;
-
-    map { $mail->{$_} = $form->{$_} } qw(from to cc subject message);
-
-    $mail->{charset}     = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
-    $mail->{attachments} = [ { "filename" => $tmp, "name" => $name } ];
-    $mail->send();
-
-    unlink "${tmpdir}/.pgpass", $tmp;
-    rmdir $tmpdir;
-
-    $form->{title} = "kivitendo " . $locale->text('Database Administration') . " / " . $locale->text('Backup Dataset');
-
-    $form->header();
-    print $form->parse_html_template("admin/backup_dataset_email_done");
-  }
-}
-
-sub restore_dataset {
-  my $form       = $main::form;
-  my $locale     = $main::locale;
-
-  $form->{title} = "kivitendo " . $locale->text('Database Administration') . " / " . $locale->text('Restore Dataset');
-
-  if ($::lx_office_conf{applications}->{pg_restore} eq "DISABLED") {
-    $form->error($locale->text('Database backups and restorations are disabled in the configuration.'));
-  }
-
-  my $default_charset   = $::lx_office_conf{system}->{dbcharset};
-  $default_charset    ||= Common::DEFAULT_CHARSET;
-
-  $form->{DBENCODINGS}  = [];
-
-  foreach my $encoding (@Common::db_encodings) {
-    push @{ $form->{DBENCODINGS} }, { "dbencoding" => $encoding->{dbencoding},
-                                      "label"      => $encoding->{label},
-                                      "selected"   => $encoding->{charset} eq $default_charset };
-  }
-
-  $form->header();
-  print $form->parse_html_template("admin/restore_dataset");
-}
-
-sub restore_dataset_start {
-  my $form       = $main::form;
-  my $locale     = $main::locale;
-
-  $form->{title} = "kivitendo " . $locale->text('Database Administration') . " / " . $locale->text('Restore Dataset');
-
-  my $pg_restore_exe = $::lx_office_conf{applications}->{pg_restore} || "pg_restore";
-
-  if ("$pg_restore_exe" eq "DISABLED") {
-    $form->error($locale->text('Database backups and restorations are disabled in the configuration.'));
-  }
-
-  $form->isblank("new_dbname", $locale->text('The dataset name is missing.'));
-  $form->isblank("content", $locale->text('No backup file has been uploaded.'));
-
-  # Create temporary directories. Write the backup file contents to a temporary
-  # file. Create a .pgpass file with the username and password for the pg_restore
-  # utility.
-
-  my $tmpdir = "/tmp/lx_office_backup_" . Common->unique_id();
-  mkdir $tmpdir, 0700 || $form->error($locale->text('A temporary directory could not be created:') . " $ERRNO");
-
-  my $pgpass = IO::File->new("${tmpdir}/.pgpass", O_WRONLY | O_CREAT, 0600);
-
-  if (!$pgpass) {
-    unlink $tmpdir;
-    $form->error($locale->text('A temporary file could not be created:') . " $ERRNO");
-  }
-
-  print $pgpass "$form->{dbhost}:$form->{dbport}:$form->{new_dbname}:$form->{dbuser}:$form->{dbpasswd}\n";
-  $pgpass->close();
-
-  $ENV{HOME} = $tmpdir;
-
-  my $tmp = $tmpdir . "/dump_" . Common::unique_id();
-  my $tmpfile;
-
-  if (substr($form->{content}, 0, 2) eq "\037\213") {
-    $tmpfile = IO::File->new("| gzip -d > $tmp");
-    $tmpfile->binary();
-
-  } else {
-    $tmpfile = IO::File->new($tmp, O_WRONLY | O_CREAT | O_BINARY, 0600);
-  }
-
-  if (!$tmpfile) {
-    unlink "${tmpdir}/.pgpass";
-    rmdir $tmpdir;
-
-    $form->error($locale->text('A temporary file could not be created:') . " $ERRNO");
-  }
-
-  print $tmpfile $form->{content};
-  $tmpfile->close();
-
-  delete $form->{content};
-
-  # Try to connect to the database. Find out if a database with the same name exists.
-  # If yes, then drop the existing database. Create a new one with the name and encoding
-  # given by the user.
-
-  User::dbconnect_vars($form, "template1");
-
-  my %myconfig = map { $_ => $form->{$_} } grep /^db/, keys %{ $form };
-  my $dbh      = $form->dbconnect(\%myconfig) || $form->dberror();
-
-  my ($query, $sth);
-
-  $form->{new_dbname} =~ s|[^a-zA-Z0-9_\-]||g;
-
-  $query = qq|SELECT COUNT(*) FROM pg_database WHERE datname = ?|;
-  my ($count) = selectrow_query($form, $dbh, $query, $form->{new_dbname});
-  if ($count) {
-    do_query($form, $dbh, qq|DROP DATABASE $form->{new_dbname}|);
-  }
-
-  my $found = 0;
-  foreach my $item (@Common::db_encodings) {
-    if ($item->{dbencoding} eq $form->{dbencoding}) {
-      $found = 1;
-      last;
-    }
-  }
-  $form->{dbencoding} = "LATIN9" unless $form->{dbencoding};
-
-  do_query($form, $dbh, qq|CREATE DATABASE $form->{new_dbname} ENCODING ? TEMPLATE template0|, $form->{dbencoding});
-
-  $dbh->disconnect();
-
-  # Spawn pg_restore on the temporary file.
-
-  my @args = ("-h", $form->{dbhost}, "-U", $form->{dbuser}, "-d", $form->{new_dbname});
-  push @args, ("-p", $form->{dbport}) if ($form->{dbport});
-  push @args, $tmp;
-
-  my $cmd = "$pg_restore_exe " . join(" ", map { s/\\/\\\\/g; s/\"/\\\"/g; $_ } @args);
-
-  my $in = IO::File->new("$cmd 2>&1 |");
-
-  if (!$in) {
-    unlink "${tmpdir}/.pgpass", $tmp;
-    rmdir $tmpdir;
-
-    $form->error($locale->text('The pg_restore process could not be started.'));
-  }
-
-  $English::AUTOFLUSH = 1;
-
-  $form->header();
-  print $form->parse_html_template("admin/restore_dataset_start_header");
-
-  while (my $line = <$in>) {
-    print $line;
-  }
-  $in->close();
-
-  $form->{retval} = $CHILD_ERROR >> 8;
-  print $form->parse_html_template("admin/restore_dataset_start_footer");
-
-  unlink "${tmpdir}/.pgpass", $tmp;
-  rmdir $tmpdir;
-}
-
 1;
diff --git a/config/kivitendo.conf.default b/config/kivitendo.conf.default
index 0352b4371..3fb87cdf2 100644
--- a/config/kivitendo.conf.default
+++ b/config/kivitendo.conf.default
@@ -132,13 +132,6 @@ latex = pdflatex
 # into binaries located in different locations than the main Python
 # binary.
 python_uno = python
-# Location of the two executables "pg_dump" and "pg_restore" used for
-# database backup and restoration from the admin section.  If
-# "pg_dump" or "pg_restore" is set to "DISABLED" then the
-# corresponding option (backup/restoration) will be hidden from the
-# admin section.
-pg_dump = pg_dump
-pg_restore = pg_restore
 
 [environment]
 # Add the following paths to the PATH environment variable.
diff --git a/locale/de/all b/locale/de/all
index 56a1742d5..da933184e 100755
--- a/locale/de/all
+++ b/locale/de/all
@@ -46,8 +46,6 @@ $self->{texts} = {
   'A lot of the usability of kivitendo has been enhanced with javascript. Although it is currently possible to use every aspect of kivitendo without javascript, we strongly recommend it. In a future version this may change and javascript may be necessary to access advanced features.' => 'Die Bedienung von kivitendo wurde an vielen Stellen mit Javascript verbessert. Obwohl es derzeit möglich ist, jeden Aspekt von kivitendo auch ohne Javascript zu benutzen, empfehlen wir es. In einer zukünftigen Version wird Javascript eventuell notwendig sein um weitergehende Features zu benutzen.',
   'A lower-case character is required.' => 'Ein Kleinbuchstabe ist vorgeschrieben.',
   'A special character is required (valid characters: #1).' => 'Ein Sonderzeichen ist vorgeschrieben (gültige Zeichen: #1).',
-  'A temporary directory could not be created:' => 'Ein tempor&auml;res Verzeichnis konnte nicht erstellt werden:',
-  'A temporary file could not be created:' => 'Eine tempor&auml;re Datei konnte nicht erstellt werden:',
   'A unit with this name does already exist.' => 'Eine Einheit mit diesem Namen existiert bereits.',
   'A valid taxkey is missing!'  => 'Einen gültiger Steuerschlüssel fehlt!',
   'A variable marked as \'editable\' can be changed in each quotation, order, invoice etc.' => 'Eine als \'editierbar\' markierte Variable kann in jedem Angebot, Auftrag, jeder Rechnung etc für jede Position geändert werden.',
@@ -271,8 +269,6 @@ $self->{texts} = {
   'Background jobs'             => 'Hintergrund-Jobs',
   'Background jobs and task server' => 'Hintergrund-Jobs und Task-Server',
   'Backup Dataset'              => 'Datenbank sichern',
-  'Backup file'                 => 'Sicherungsdatei',
-  'Backup of dataset'           => 'Sicherung der Datenbank',
   'Balance'                     => 'Bilanz',
   'Balance Sheet'               => 'Bilanz',
   'Bank'                        => 'Bank',
@@ -607,7 +603,6 @@ $self->{texts} = {
   'Database Host'               => 'Datenbankcomputer',
   'Database ID'                 => 'Datenbank-ID',
   'Database User'               => 'Datenbankbenutzer',
-  'Database backups and restorations are disabled in the configuration.' => 'Datenbanksicherungen und -wiederherstellungen sind in der Konfiguration deaktiviert.',
   'Database host and port'      => 'Datenbankhost und -port',
   'Database name'               => 'Datenbankname',
   'Database settings'           => 'Datenbankeinstellungen',
@@ -615,7 +610,6 @@ $self->{texts} = {
   'Database update error:'      => 'Fehler beim Datenbankupgrade:',
   'Database user and password'  => 'Datebankbenutzer und -passwort',
   'Dataset missing!'            => 'Datenbank fehlt!',
-  'Dataset name'                => 'Datenbankname',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
   'Date'                        => 'Datum',
   'Date Format'                 => 'Datumsformat',
@@ -730,7 +724,6 @@ $self->{texts} = {
   'Double partnumbers'          => 'Doppelte Artikelnummern',
   'Download SEPA XML export file' => 'SEPA-XML-Exportdatei herunterladen',
   'Download sample file'        => 'Beispieldatei herunterladen',
-  'Download the backup'         => 'Die Sicherungsdatei herunterladen',
   'Draft saved.'                => 'Entwurf gespeichert.',
   'Drawing'                     => 'Zeichnung',
   'Driver'                      => 'Treiber',
@@ -931,7 +924,6 @@ $self->{texts} = {
   'Field'                       => 'Feld',
   'File'                        => 'Datei',
   'File name'                   => 'Dateiname',
-  'Files created by kivitendo\'s &quot;Backup Dataset&quot; function are such files.' => 'Dateien, die von kivitendo\'s Funktion &quot;Datenbank sichern&quot; erstellt wurden, erf&uuml;llen diese Kriterien.',
   'Filter'                      => 'Filter',
   'Filter date by'              => 'Datum filtern nach',
   'Filter for customer variables' => 'Filter für benutzerdefinierte Kundenvariablen',
@@ -1140,7 +1132,6 @@ $self->{texts} = {
   'It is possible to do this automatically for some Buchungsgruppen, but not for all.' => 'Es ist m&ouml;glich, dies f&uuml;r einige, aber nicht f&uuml;r alle Buchungsgruppen automatisch zu erledigen.',
   'It is possible to do this automatically for some units, but for others the user has to chose the new unit.' => 'Das ist f&uuml;r einige Einheiten automatisch m&ouml;glich, aber bei anderen muss der Benutzer die neue Einheit ausw&auml;hlen.',
   'It is possible to make a quick DATEV export everytime you post a record to ensure things work nicely with their data requirements. This will result in a slight overhead though you can enable this for each type of record independantly.' => 'Es ist möglich, bei jeder Buchung einen schnellen DATEV-Export durchzuführen, um sicherzustellen, dass die Datensätze den DATEV-Anforderungen genügen. Da dies einen kleinen Overhead bedeutet, lässt sich die Einstellung für jeden Buchungstyp getrennt einstellen.',
-  'It may optionally be compressed with &quot;gzip&quot;.' => 'Sie darf optional mit &quot;gzip&quot; komprimiert sein.',
   'It will simply set the taxkey to 0 (meaning "no taxes") which is the correct value for such inventory transactions.' => 'Es wird einfach die Steuerschlüssel auf  0 setzen, was "keine Steuer" bedeutet und für solche Warenbestandsbuchungen der richtige Wert ist.',
   'Item deleted!'               => 'Artikel gelöscht!',
   'Item mode'                   => 'Artikelmodus',
@@ -1333,7 +1324,6 @@ $self->{texts} = {
   'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden',
   'No action defined.'          => 'Keine Aktion definiert.',
   'No background job has been created yet.' => 'Es wurden noch keine Hintergrund-Jobs angelegt.',
-  'No backup file has been uploaded.' => 'Es wurde keine Sicherungsdatei hochgeladen.',
   'No bank information has been entered in this customer\'s master data entry. You cannot create bank collections unless you enter bank information.' => 'Für diesen Kunden wurden in seinen Stammdaten keine Kontodaten hinterlegt. Solange dies nicht geschehen ist, können Sie keine Überweisungen für den Lieferanten anlegen.',
   'No bank information has been entered in this vendor\'s master data entry. You cannot create bank transfers unless you enter bank information.' => 'Für diesen Lieferanten wurden in seinen Stammdaten keine Kontodaten hinterlegt. Solange dies nicht geschehen ist, können Sie keine Überweisungen für den Lieferanten anlegen.',
   'No bins have been added to this warehouse yet.' => 'Es wurden zu diesem Lager noch keine Lagerpl&auml;tze angelegt.',
@@ -1342,7 +1332,6 @@ $self->{texts} = {
   'No contact selected to delete' => 'Keine Ansprechperson zum Löschen ausgewählt',
   'No customer has been selected yet.' => 'Es wurde noch kein Kunde ausgewählt.',
   'No data was found.'          => 'Es wurden keine Daten gefunden.',
-  'No databases have been found on this server.' => 'Auf diesem Server wurden keine Datenbanken gefunden.',
   'No datasets have been selected.' => 'Es wurden keine Datenbanken ausgew&auml;hlt.',
   'No default currency'         => 'Keine Standardwährung',
   'No department has been created yet.' => 'Es wurde noch keine Abteilung erfasst.',
@@ -1525,7 +1514,6 @@ $self->{texts} = {
   'Please enter the name for the new client.' => 'Bitte geben Sie einen Namen für den neuen Mandanten ein.',
   'Please enter the name for the new group.' => 'Bitte geben Sie den Namen für die neue Gruppe ein.',
   'Please enter the name of the database that will be used as the template for the new database:' => 'Bitte geben Sie den Namen der Datenbank an, die als Vorlage f&uuml;r die neue Datenbank benutzt wird:',
-  'Please enter the name of the dataset you want to restore the backup in.' => 'Bitte geben Sie den Namen der Datenbank ein, in der Sie die Sicherung wiederherstellen wollen.',
   'Please enter the sales tax identification number.' => 'Bitte geben Sie die Umsatzsteueridentifikationsnummer an.',
   'Please enter the taxnumber in the client configuration.' => 'Bitte geben Sie in der Mandantenkonfiguration die Steuernummer an.',
   'Please enter values'         => 'Bitte Werte eingeben',
@@ -1540,7 +1528,6 @@ $self->{texts} = {
   'Please select a part from the list below.' => 'Bitte w&auml;hlen Sie einen Artikel aus der Liste aus.',
   'Please select a vendor from the list below.' => 'Bitte einen Händler aus der Liste auswählen',
   'Please select the chart of accounts this installation is using from the list below.' => 'Bitte w&auml;hlen Sie den Kontenrahmen aus, der bei dieser Installation verwendet wird.',
-  'Please select the database you want to backup' => 'Bitte w&auml;hlen Sie die zu sichernde Datenbank gefunden',
   'Please select the destination bank account for the collections:' => 'Bitte wählen Sie das Bankkonto als Ziel für die Einzüge aus:',
   'Please select the source bank account for the transfers:' => 'Bitte wählen Sie das Bankkonto als Quelle für die Überweisungen aus:',
   'Please select which client configurations you want to create.' => 'Bitte wählen Sie aus, welche Mandanten mit welchen Einstellungen angelegt werden sollen.',
@@ -1807,7 +1794,6 @@ $self->{texts} = {
   'Sellprice for price group \'#1\'' => 'Verkaufspreis für Preisgruppe \'#1\'',
   'Sellprice significant places' => 'Verkaufspreis: Nachkommastellen',
   'Semicolon'                   => 'Semikolon',
-  'Send the backup via Email'   => 'Die Sicherungsdatei per Email verschicken',
   'Sep'                         => 'Sep',
   'Separator'                   => 'Trennzeichen',
   'Separator chararacter'       => 'Feldtrennzeichen',
@@ -2026,7 +2012,6 @@ $self->{texts} = {
   'The background job has been deleted.' => 'Der Hintergrund-Job wurde gelöscht.',
   'The background job has been saved.' => 'Der Hintergrund-Job wurde gespeichert.',
   'The background job was executed successfully.' => 'Der Hintergrund-Job wurde erfolgreich ausgeführt.',
-  'The backup you upload here has to be a file created with &quot;pg_dump -o -Ft&quot;.' => 'Die von Ihnen hochzuladende Sicherungsdatei muss mit dem Programm und den Parametern &quot;pg_dump -o -Ft&quot; erstellt worden sein.',
   'The bank information must not be empty.' => 'Die Bankinformationen müssen vollständig ausgefüllt werden.',
   'The base unit does not exist or it is about to be deleted in row %d.' => 'Die Basiseinheit in Zeile %d existiert nicht oder soll gel&ouml;scht werden.',
   'The base unit does not exist.' => 'Die Basiseinheit existiert nicht.',
@@ -2065,9 +2050,6 @@ $self->{texts} = {
   'The database upgrade for the introduction of units is now complete.' => 'Das Datenbankupgrade zwecks Einf&uuml;hrung von Einheiten ist nun beendet.',
   'The database user is missing.' => 'Der Datenbankbenutzer fehlt.',
   'The dataset #1 has been successfully created.' => 'Die Datenbank #1 wurde erfolgreich angelegt.',
-  'The dataset backup has been sent via email to #1.' => 'Die Datenbanksicherung wurde per Email an #1 verschickt.',
-  'The dataset has to exist before a restoration can be started.' => 'Die Datenbank muss vor der Wiederherstellung bereits angelegt worden sein.',
-  'The dataset name is missing.' => 'Der Datenbankname fehlt.',
   'The deductible amount'       => 'Der abziehbare Skontobetrag',
   'The default value depends on the variable type:' => 'Die Bedeutung des Standardwertes h&auml;ngt vom Variablentypen ab:',
   'The delivery order has not been marked as delivered. The warehouse contents have not changed.' => 'Der Lieferschein wurde nicht als geliefert markiert. Der Lagerinhalt wurde nicht verändert.',
@@ -2084,7 +2066,6 @@ $self->{texts} = {
   'The discount must not be negative.' => 'Der Rabatt darf nicht negativ sein.',
   'The dunning process started' => 'Der Mahnprozess ist gestartet.',
   'The dunnings have been printed.' => 'Die Mahnung(en) wurden gedruckt.',
-  'The email address is missing.' => 'Die Emailadresse fehlt.',
   'The end date is the last day for which invoices will possibly be created.' => 'Das Enddatum ist das letztmögliche Datum, an dem eine Rechnung erzeugt wird.',
   'The execution schedule is invalid.' => 'Der Ausführungszeitplan ist ungültig.',
   'The execution type is invalid.' => 'Der Ausführungstyp ist ungültig.',
@@ -2138,8 +2119,6 @@ $self->{texts} = {
   'The payment term has been saved.' => 'Die Zahlungsbedingungen wurden gespeichert.',
   'The payment term is in use and cannot be deleted.' => 'Die Zahlungsbedingungen werden bereits benutzt und können nicht gelöscht werden.',
   'The payments have been posted.' => 'Die Zahlungen wurden gebucht.',
-  'The pg_dump process could not be started.' => 'Der pg_dump-Prozess konnte nicht gestartet werden.',
-  'The pg_restore process could not be started.' => 'Der pg_restore-Prozess konnte nicht gestartet werden.',
   'The preferred one is to install packages provided by your operating system distribution (e.g. Debian or RPM packages).' => 'Die bevorzugte Art, ein Perl-Modul zu installieren, ist durch Installation eines von Ihrem Betriebssystem zur Verf&uuml;gung gestellten Paketes (z.B. Debian-Pakete oder RPM).',
   'The printer could not be deleted.' => 'Der Drucker konnte nicht gelöscht werden.',
   'The printer has been created.' => 'Der Drucker wurde angelegt.',
@@ -2147,15 +2126,12 @@ $self->{texts} = {
   'The printer has been saved.' => 'Der Drucker wurde gespeichert.',
   'The profile \'#1\' has been deleted.' => 'Das Profil \'#1\' wurde gelöscht.',
   'The profile has been saved under the name \'#1\'.' => 'Das Profil wurde unter dem Namen \'#1\' gespeichert.',
-  'The program\'s exit code was #1 (&quot;0&quot; usually means that everything went OK).' => 'Der Exitcode des Programms war #1 (&quot;0&quot; bedeutet normalerweise, dass die Wiederherstellung erfolgreich war).',
   'The project has been created.' => 'Das Projekt wurde angelegt.',
   'The project has been deleted.' => 'Das Projekt wurde gelöscht.',
   'The project has been saved.' => 'Das Projekt wurde gespeichert.',
   'The project is in use and cannot be deleted.' => 'Das Projekt ist in Verwendung und kann nicht gelöscht werden.',
   'The project number is already in use.' => 'Die Projektnummer wird bereits verwendet.',
   'The project number is missing.' => 'Die Projektnummer fehlt.',
-  'The restoration process has started. Here\'s the output of the &quot;pg_restore&quot; command:' => 'Der Wiederherstellungsprozess wurde gestartet. Hier ist die Ausgabe des &quot;pg_restore&quot;-Programmes:',
-  'The restoration process is complete. Please review &quot;pg_restore&quot;\'s output to find out if the restoration was successful.' => 'Die Wiederherstellung ist abgeschlossen. Bitte sehen Sie sich die Ausgabe von &quot;pg_restore&quot; an, um festzustellen, ob die Wiederherstellung erfolgreich war.',
   'The second reason is that kivitendo allowed the user to enter the tax amount manually regardless of the taxkey used.' => 'Der zweite Grund war, dass kivitendo zuließ, dass die Benutzer beliebige, von den tatsächlichen Steuerschlüsseln unabhängige Steuerbeträge eintrugen.',
   'The second way is to use Perl\'s CPAN module and let it download and install the module for you.' => 'Die zweite Variante besteht darin, Perls CPAN-Modul zu benutzen und es das Modul f&uuml;r Sie installieren zu lassen.',
   'The selected  PostgreSQL installation uses UTF-8 as its encoding. Therefore you have to configure kivitendo to use UTF-8 as well.' => 'Die ausgewählte PostgreSQL-Installation benutzt UTF-8 als Zeichensatz. Deshalb müssen Sie kivitendo so konfigurieren, dass es ebenfalls UTF-8 als Zeichensatz benutzt.',
@@ -2455,7 +2431,6 @@ $self->{texts} = {
   'You can also delete this transaction and re-enter it manually.' => 'Alternativ können Sie die Buchung auch mit löschen lassen und sie anschließend neu eingeben.',
   'You can choose account categories for taxes. Depending on these categories taxes will be displayed for transfers in the general ledger or not.' => 'Sie können Kontoarten für Steuern auswählen. Abhängig von diesen Kontoarten werden dann Steuern bei Dialogbuchungen angezeigt oder nicht.',
   'You can correct this transaction by chosing the correct taxkeys from the drop down boxes and hitting the button "Fix transaction" afterwards.' => 'Sie haben die Möglichkeit, die Buchung zu korrigieren, indem Sie in den Drop-Down-Boxen die richtigen Steuerschlüssel auswählen und anschließend auf den Button "Buchung korrigieren" drücken.',
-  'You can create a missing dataset by going back and chosing &quot;Create Dataset&quot;.' => 'Sie k&ouml;nnen eine fehlende Datenbank erstellen, indem Sie jetzt zu&uuml;ck gehen und den Punkt &quot;Neue Datenbank anlegen&quot; w&auml;hlen.',
   'You can create warehouses and bins via the menu "System -> Warehouses".' => 'Sie k&ouml;nnen Lager und Lagerpl&auml;tze &uuml;ber das Men&uuml; "System -> Lager" anlegen.',
   'You can declare different translations for singular and plural for each unit (e.g. &quot;day&quot; and &quot;days).' => 'Bei den &Uuml;bersetzungen k&ouml;nnen Sie unterschiedliche Varianten f&uuml;r singular und plural angeben (z.B. &quot;day&quot; und &quot;days&quot;).',
   'You can either create a new database or chose an existing database.' => 'Sie können entweder eine neue Datenbank erstellen oder eine existierende auswählen.',
diff --git a/templates/webpages/admin/backup_dataset.html b/templates/webpages/admin/backup_dataset.html
deleted file mode 100644
index baa70e548..000000000
--- a/templates/webpages/admin/backup_dataset.html
+++ /dev/null
@@ -1,96 +0,0 @@
-[%- USE T8 %]
-[%- USE HTML %]
- <script type="text/javascript">
-  <!--
-      $(function(){
-        document.getElementsByName('to')[0].focus();
-        set_subject();
-      });
-
-      function set_subject () {
-        var subject_template = "[% 'Backup of dataset' | $T8 %]";
-        var subject = document.Form.subject.value;
-
-        if ((subject == "") || (subject.substr(0, subject_template.length) == subject_template)) {
-          document.Form.subject.value = subject_template + " " + document.Form.dbname.value;
-        }
-      }
-    -->
- </script>
-
- <h1>[% title %]</h1>
-
- [% IF NO_DATABSES %]
-  [% 'No databases have been found on this server.' | $T8 %]
-
-  [% ELSE %]
-
-  <form name="Form" method="post" action="admin.pl">
-
-   <input type="hidden" name="dbhost" value="[% HTML.escape(dbhost) %]">
-   <input type="hidden" name="dbport" value="[% HTML.escape(dbport) %]">
-   <input type="hidden" name="dbuser" value="[% HTML.escape(dbuser) %]">
-   <input type="hidden" name="dbpasswd" value="[% HTML.escape(dbpasswd) %]">
-
-   <p>
-    [% 'Please select the database you want to backup' | $T8 %]:
-    <select name="dbname" onchange="set_subject()">[% FOREACH row = DATABASES %]<option>[% HTML.escape(row.dbname) %]</option>[% END %]</select>
-   </p>
-
-   <table>
-    <tr>
-     <td valign="top"><input type="radio" name="destination" id="destination_download" value="download" checked></td>
-     <td valign="top"><label for="destination_download">[% 'Download the backup' | $T8 %]</label></td>
-    </tr>
-
-    <tr>
-     <td valign="top"><input type="radio" name="destination" id="destination_email" value="email"></td>
-     <td valign="top">
-      <label for="destination_email">[% 'Send the backup via Email' | $T8 %]</label><br>
-
-      <table>
-       <tr>
-        <td valign="top" align="right">[% 'From' | $T8 %]</td>
-        <td valign="top"><input name="from" size="40" value="[% HTML.escape(from) %]"></td>
-       </tr>
-
-       <tr>
-        <td valign="top" align="right">[% 'To' | $T8 %]</td>
-        <td valign="top"><input name="to" size="40"></td>
-       </tr>
-
-       <tr>
-        <td valign="top" align="right">[% 'Cc' | $T8 %]</td>
-        <td valign="top"><input name="cc" size="40"></td>
-       </tr>
-
-       <tr>
-        <td valign="top" align="right">[% 'Subject' | $T8 %]</td>
-        <td valign="top"><input name="subject" size="40"></td>
-       </tr>
-
-       <tr>
-        <td valign="top" align="right">[% 'Message' | $T8 %]</td>
-        <td valign="top"><textarea name="message" cols="40" rows="10"></textarea></td>
-       </tr>
-
-      </table>
-
-     </td>
-    </tr>
-
-   </table>
-
-   <input name="callback" type="hidden" value="controller.pl?action=Admin/show">
-   <input type="hidden" name="nextsub" value="backup_dataset_start">
-
-   <hr size="3" noshade>
-
-   <br>
-
-   <input type="submit" class="submit" name="action" value="[% 'Continue' | $T8 %]">
-   <a href="controller.pl?action=Admin/show">[% 'Back' | $T8 %]</a>
-
-  </form>
-
- [% END %]
diff --git a/templates/webpages/admin/backup_dataset_email_done.html b/templates/webpages/admin/backup_dataset_email_done.html
deleted file mode 100644
index e64b2a8d9..000000000
--- a/templates/webpages/admin/backup_dataset_email_done.html
+++ /dev/null
@@ -1,8 +0,0 @@
-[%- USE T8 %]
-[%- USE LxERP %]
-[%- USE HTML %][%- USE L -%]
- <h1>[% title %]</h1>
-
- <p>[% LxERP.t8('The dataset backup has been sent via email to #1.', to) | html %]</p>
-
- <p>[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]
diff --git a/templates/webpages/admin/restore_dataset.html b/templates/webpages/admin/restore_dataset.html
deleted file mode 100644
index bf23926a5..000000000
--- a/templates/webpages/admin/restore_dataset.html
+++ /dev/null
@@ -1,57 +0,0 @@
-[%- USE T8 %]
-[%- USE HTML %]
-  <script type='text/javascript'>
-    $(function(){ document.getElementsByName('dbname')[0].focus();});
-  </script>
-
- <h1>[% title %]</h1>
-
- <form name="Form" method="post" action="admin.pl" enctype="multipart/form-data">
-
-  <input type="hidden" name="dbhost" value="[% HTML.escape(dbhost) %]">
-  <input type="hidden" name="dbport" value="[% HTML.escape(dbport) %]">
-  <input type="hidden" name="dbuser" value="[% HTML.escape(dbuser) %]">
-  <input type="hidden" name="dbpasswd" value="[% HTML.escape(dbpasswd) %]">
-
-  <p>
-   [% 'Please enter the name of the dataset you want to restore the backup in.' | $T8 %]
-   [% 'The dataset has to exist before a restoration can be started.' | $T8 %]
-   [% 'You can create a missing dataset by going back and chosing &quot;Create Dataset&quot;.' | $T8 %]
-  </p>
-
-  <p>
-   [%- 'The backup you upload here has to be a file created with &quot;pg_dump -o -Ft&quot;.' | $T8 %]
-   [%- 'It may optionally be compressed with &quot;gzip&quot;.' | $T8 %]
-   [%- 'Files created by kivitendo\'s &quot;Backup Dataset&quot; function are such files.' | $T8 %]
-  </p>
-
-  <table>
-   <tr>
-    <td valign="top">[% 'Dataset name' | $T8 %]</td>
-    <td valign="top"><input name="new_dbname"></td>
-   </tr>
-
-   <tr>
-    <th valign="top">[% 'Multibyte Encoding' | $T8 %]</th>
-    <td>
-     <select name="dbencoding">
-      [% FOREACH row = DBENCODINGS %]<option value="[% HTML.escape(row.dbencoding) %]" [% IF row.selected %]selected[% END %]>[% HTML.escape(row.label) %]</option>[% END %]
-     </select>
-    </td>
-   </tr>
-
-   <tr>
-    <td valign="top">[% 'Backup file' | $T8 %]</td>
-    <td valign="top"><input type="file" accept="*" name="content"></td>
-   </tr>
-  </table>
-
-  <input type="hidden" name="nextsub" value="restore_dataset_start">
-
-  <hr size="3" noshade>
-
-  <br>
-
-  <input type="submit" class="submit" name="action" value="[% 'Continue' | $T8 %]">
-
- </form>
diff --git a/templates/webpages/admin/restore_dataset_start_footer.html b/templates/webpages/admin/restore_dataset_start_footer.html
deleted file mode 100644
index 86ca7aeb5..000000000
--- a/templates/webpages/admin/restore_dataset_start_footer.html
+++ /dev/null
@@ -1,14 +0,0 @@
-[%- USE T8 %]
-[%- USE LxERP %]
-[% USE HTML %][%- USE L -%] </pre>
-
- <hr>
-
- <p>
-  [%- 'The restoration process is complete. Please review &quot;pg_restore&quot;\'s output to find out if the restoration was successful.' | $T8 %]
-  [%- LxERP.t8('The program\'s exit code was #1 (&quot;0&quot; usually means that everything went OK).', retval) | html %]
- </p>
-
- <p>
-  [% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]
- </p>
diff --git a/templates/webpages/admin/restore_dataset_start_header.html b/templates/webpages/admin/restore_dataset_start_header.html
deleted file mode 100644
index dbc38c7cf..000000000
--- a/templates/webpages/admin/restore_dataset_start_header.html
+++ /dev/null
@@ -1,8 +0,0 @@
-[%- USE T8 %]
- <h1>[% title %]</h1>
-
- <p>[%- 'The restoration process has started. Here\'s the output of the &quot;pg_restore&quot; command:' | $T8 %]</p>
-
- <hr>
-
- <pre>
