Funktionen hinzugefügt, mit denen man ein Datenbankbackup mit Hilfe von "pg_restore...
authorMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 18 May 2007 15:25:08 +0000 (15:25 +0000)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 18 May 2007 15:25:08 +0000 (15:25 +0000)
12 files changed:
bin/mozilla/admin.pl
locale/de/admin
locale/de/all
lx-erp.conf
templates/webpages/admin/dbadmin_de.html
templates/webpages/admin/dbadmin_master.html
templates/webpages/admin/restore_dataset_de.html [new file with mode: 0644]
templates/webpages/admin/restore_dataset_master.html [new file with mode: 0644]
templates/webpages/admin/restore_dataset_start_footer_de.html [new file with mode: 0644]
templates/webpages/admin/restore_dataset_start_footer_master.html [new file with mode: 0644]
templates/webpages/admin/restore_dataset_start_header_de.html [new file with mode: 0644]
templates/webpages/admin/restore_dataset_start_header_master.html [new file with mode: 0644]

index 9805417..edbb35c 100644 (file)
@@ -48,6 +48,7 @@ use SL::User;
 use SL::Common;
 use SL::Inifile;
 use SL::DBUpgrade2;
+use SL::DBUtils;
 
 require "bin/mozilla/common.pl";
 
@@ -90,7 +91,7 @@ if ($form->{action}) {
 
   # create memberfile
   if (!-f $memberfile) {
-    open(FH, ">$memberfile") or $form->error("$memberfile : $!");
+    open(FH, ">$memberfile") or $form->error("$memberfile : $ERRNO");
     print FH qq|# SQL-Ledger Accounting members
 
 [root login]
@@ -125,7 +126,7 @@ sub list_users {
 
   $form->error($locale->text('File locked!')) if (-f "${memberfile}.LCK");
 
-  open(FH, "$memberfile") or $form->error("$memberfile : $!");
+  open(FH, "$memberfile") or $form->error("$memberfile : $ERRNO");
 
   my %members;
 
@@ -220,7 +221,7 @@ sub edit_user_form {
     $form->error(sprintf($locale->text("The directory %s does not exist."), $templates));
   }
 
-  opendir TEMPLATEDIR, "$templates/." or $form->error("$templates : $!");
+  opendir TEMPLATEDIR, "$templates/." or $form->error("$templates : $ERRNO");
   my @all     = readdir(TEMPLATEDIR);
   my @alldir  = sort grep { -d "$templates/$_" && !/^\.\.?$/ } @all;
   my @allhtml = sort grep { -f "$templates/$_" && /\.html$/ } @all;
@@ -258,7 +259,7 @@ sub edit_user_form {
   my @acsorder = ();
   my %acs      = ();
   my %excl     = ();
-  open(FH, $menufile) or $form->error("$menufile : $!");
+  open(FH, $menufile) or $form->error("$menufile : $ERRNO");
 
   while ($item = <FH>) {
     next unless $item =~ /\[/;
@@ -393,7 +394,7 @@ sub save {
           }
           close(HTACCESS);
         }
-        open(HTACCESS, "> $file") or die "cannot open $file $!\n";
+        open(HTACCESS, "> $file") or die "cannot open $file $ERRNO\n";
         $newfile .= $myconfig->{login} . ":" . $myconfig->{password} . "\n";
         print(HTACCESS $newfile);
         close(HTACCESS);
@@ -408,7 +409,7 @@ sub save {
           }
           close(HTACCESS);
         }
-        open(HTACCESS, "> $file") or die "cannot open $file $!\n";
+        open(HTACCESS, "> $file") or die "cannot open $file $ERRNO\n";
         print(HTACCESS $newfile);
         close(HTACCESS);
       }
@@ -428,18 +429,18 @@ sub save {
       umask(007);
 
       # copy templates to the directory
-      opendir TEMPLATEDIR, "$templates/." or $form - error("$templates : $!");
+      opendir TEMPLATEDIR, "$templates/." or $form - error("$templates : $ERRNO");
       @templates = grep /$form->{mastertemplates}.*?\.(html|tex|sty|xml|txb)$/,
         readdir TEMPLATEDIR;
       closedir TEMPLATEDIR;
 
       foreach $file (@templates) {
         open(TEMP, "$templates/$file")
-          or $form->error("$templates/$file : $!");
+          or $form->error("$templates/$file : $ERRNO");
 
         $file =~ s/$form->{mastertemplates}-//;
         open(NEW, ">$form->{templates}/$file")
-          or $form->error("$form->{templates}/$file : $!");
+          or $form->error("$form->{templates}/$file : $ERRNO");
 
         while ($line = <TEMP>) {
           print NEW $line;
@@ -448,7 +449,7 @@ sub save {
         close(NEW);
       }
     } else {
-      $form->error("$!: $form->{templates}");
+      $form->error("$ERRNO: $form->{templates}");
     }
   }
 
@@ -458,7 +459,7 @@ sub save {
 
 sub delete {
   $form->error($locale->text('File locked!')) if (-f ${memberfile} . LCK);
-  open(FH, ">${memberfile}.LCK") or $form->error("${memberfile}.LCK : $!");
+  open(FH, ">${memberfile}.LCK") or $form->error("${memberfile}.LCK : $ERRNO");
   close(FH);
 
   my $members = Inifile->new($memberfile);
@@ -632,7 +633,7 @@ sub create_dataset {
 
   $form->{CHARTS} = [];
 
-  opendir SQLDIR, "sql/." or $form - error($!);
+  opendir SQLDIR, "sql/." or $form - error($ERRNO);
   foreach $item (sort grep /-chart\.sql\z/, readdir SQLDIR) {
     next if ($item eq 'Default-chart.sql');
     $item =~ s/-chart\.sql//;
@@ -743,13 +744,13 @@ sub backup_dataset_start {
   $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:') . " $!");
+  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:') . " $!");
+    $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";
@@ -823,9 +824,146 @@ sub restore_dataset {
     . $locale->text('Database Administration') . " / "
     . $locale->text('Restore Dataset');
 
-  if ("$pg_dump_exe" eq "DISABLED") {
+  if ("$pg_restore_exe" eq "DISABLED") {
     $form->error($locale->text('Database backups and restorations are disabled in lx-erp.conf.'));
   }
+
+  my $default_charset   = $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 {
+  $form->{title} =
+      "Lx-Office ERP "
+    . $locale->text('Database Administration') . " / "
+    . $locale->text('Restore Dataset');
+
+  $pg_restore_exe ||= "pg_restore";
+
+  if ("$pg_restore_exe" eq "DISABLED") {
+    $form->error($locale->text('Database backups and restorations are disabled in lx-erp.conf.'));
+  }
+
+  $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.'));
+  }
+
+  $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;
 }
 
 sub unlock_system {
index c428864..81b8aac 100644 (file)
@@ -45,6 +45,7 @@ $self->{texts} = {
   'No Database Drivers available!' => 'Kein Datenbanktreiber verfügbar!',
   'No Dataset selected!'        => 'Keine Datenbank ausgewählt!',
   'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden',
+  'No backup file has been uploaded.' => 'Es wurde keine Sicherungsdatei hochgeladen.',
   'No customer has been selected yet.' => 'Es wurde noch kein Kunde ausgewählt.',
   'No employee was found matching the search parameters.' => 'Es wurde kein Angestellter gefunden, auf den die Suchparameter zutreffen.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
@@ -84,6 +85,7 @@ $self->{texts} = {
   'The login is missing.'       => 'Das Login fehlt.',
   'The passwords do not match.' => 'Die Passw&ouml;rter stimmen nicht &uuml;berein.',
   '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.',
   'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
   'Unit'                        => 'Einheit',
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
@@ -143,6 +145,7 @@ $self->{subs} = {
   'project_selection_internal'  => 'project_selection_internal',
   'reformat_numbers'            => 'reformat_numbers',
   'restore_dataset'             => 'restore_dataset',
+  'restore_dataset_start'       => 'restore_dataset_start',
   'restore_form'                => 'restore_form',
   'save'                        => 'save',
   'save_form'                   => 'save_form',
index 5b29a80..a8cc8e4 100644 (file)
@@ -169,6 +169,7 @@ aktualisieren wollen?',
   'BWA'                         => 'BWA',
   'Back'                        => 'Zur&uuml;ck',
   'Backup Dataset'              => 'Datenbank sichern',
+  'Backup file'                 => 'Sicherungsdatei',
   'Backup of dataset'           => 'Sicherung der Datenbank',
   'Balance'                     => 'Bilanz',
   'Balance Sheet'               => 'Bilanz',
@@ -329,6 +330,7 @@ aktualisieren wollen?',
   'Database update error:'      => 'Fehler beim Datenbankupgrade:',
   'Dataset'                     => 'Datenbank',
   'Dataset missing!'            => 'Datenbank fehlt!',
+  'Dataset name'                => 'Datenbankname',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
   'Date'                        => 'Datum',
   'Date Format'                 => 'Datumsformat',
@@ -489,6 +491,7 @@ gestartet',
   'February'                    => 'Februar',
   'Fee'                         => 'Gebühr',
   'File locked!'                => 'Datei gesperrt!',
+  'Files created by Lx-Office\'s &quot;Backup Dataset&quot; function are such files.' => 'Dateien, die von Lx-Office\' Funktion &quot;Datenbank sichern&quot; erstellt wurden, erf&uuml;llen diese Kriterien.',
   'Folgekonto'                  => 'Folgekonto',
   'For each unit there\'s either no or exactly one base unit. If you chose a base unit then you also have to chose a factor. That way the new unit will be defined as a multiple of the base unit. The base unit must be the &quot;smaller&quot; one. A factor may not be less than 1. Therefore you may define &quot;kg&quot; with the base unit &quot;g&quot; and a factor of &quot;1&quot;, but not the other way round.' => 'Einheiten haben entweder keine oder genau eine Basiseinheit, von der sie ein Vielfaches sind. Wenn Sie eine Basiseinheit ausw&auml;hlen, dann m&uuml;ssen Sie auch einen Faktor eingeben. Sie m&uuml;ssen Einheiten als ein Vielfaches einer kleineren Einheit eingeben. So ist die Definition von &quot;kg&quot; mit der Basiseinheit &quot;g&quot; und dem Faktor 1000 zul&auml;ssig, die Definition von &quot;g&quot; mit der Basiseinheit &quot;kg&quot; und dem Faktor &quot;0,001&quot; hingegen nicht.',
   'Foreign Exchange Gain'       => 'Wechselkurserträge',
@@ -581,6 +584,7 @@ gestartet',
   'Is this a summary account to record' => 'Buchungskonto in',
   '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 may optionally be compressed with &quot;gzip&quot;.' => 'Sie darf optional mit &quot;gzip&quot; komprimiert sein.',
   'Item deleted!'               => 'Artikel gelöscht!',
   'Item not on file!'           => 'Dieser Artikel ist nicht in der Datenbank!',
   'Jan'                         => 'Jan',
@@ -704,6 +708,7 @@ gestartet',
   'No Database Drivers available!' => 'Kein Datenbanktreiber verfügbar!',
   'No Dataset selected!'        => 'Keine Datenbank ausgewählt!',
   'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden',
+  'No backup file has been uploaded.' => 'Es wurde keine Sicherungsdatei hochgeladen.',
   'No customer has been selected yet.' => 'Es wurde noch kein Kunde ausgewählt.',
   '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.',
@@ -801,6 +806,7 @@ gestartet',
   'Pick List'                   => 'Sammelliste',
   'Please enter a license key.' => 'Bitte geben Sie einen Lizenzschlüssel an.',
   'Please enter a number of licenses.' => 'Bitte geben Sie die Anzahl Lizenzschlüssel an.',
+  '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 values'         => 'Bitte Werte eingeben',
   'Please insert object dimensions below.' => 'Bitte geben Sie die Abmessungen unten ein',
   'Please insert your language values below' => 'Bitte die Übersetzungen unten eintragen',
@@ -1041,6 +1047,7 @@ gestartet',
   'Templates'                   => 'Vorlagen',
   'Terms missing in row '       => '+Tage fehlen in Zeile ',
   'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  '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 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.',
   'The base unit relations must not contain loops (e.g. by saying that unit A\'s base unit is B, B\'s base unit is C and C\'s base unit is A) in row %d.' => 'Die Beziehungen der Einheiten d&uuml;rfen keine Schleifen beinhalten (z.B. wenn gesagt wird, dass Einheit As Basiseinheit B, Bs Basiseinheit C und Cs Basiseinheit A ist) in Zeile %d.',
@@ -1050,6 +1057,7 @@ gestartet',
   'The database upgrade for the introduction of units is now complete.' => 'Das Datenbankupgrade zwecks Einf&uuml;hrung von Einheiten ist nun beendet.',
   'The dataset <TMPL_VAR db ESCAPE=HTML> has been successfully created.' => 'Die Datenbank <TMPL_VAR db ESCAPE=HTML> wurde erfolgreich erstellt.',
   'The dataset backup has been sent via email to <TMPL_VAR to ESCAPE=HTML>.' => 'Die Datenbanksicherung wurde an <TMPL_VAR to ESCAPE=HTML> per Email 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 directory %s does not exist.' => 'Das Verzeichnis %s existiert nicht.',
   'The dunning process started' => 'Der Mahnprozess ist gestartet.',
@@ -1070,7 +1078,11 @@ gestartet',
   'The name is missing.'        => 'Der Name fehlt.',
   'The passwords do not match.' => 'Die Passw&ouml;rter stimmen nicht &uuml;berein.',
   '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 program\'s exit code was <TMPL_VAR retval ESCAPE=HTML> (&quot;0&quot; usually means that everything went OK).' => 'Der Exitcode des Programms war <TMPL_VAR retval ESCAPE=HTML> (&quot;0&quot; bedeutet normalerweise, dass die Wiederherstellung erfolgreich war).',
+  '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 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 third way is to download the module from the above mentioned URL and to install the module manually following the installations instructions contained in the source archive.' => 'Die dritte Variante besteht darin, das Paket von der oben genannten URL herunterzuladen und es manuell zu installieren. Beachten Sie dabei die im Paket enthaltenen Installationsanweisungen.',
   'The unit has been saved.'    => 'Die Einheit wurde gespeichert.',
@@ -1187,6 +1199,7 @@ gestartet',
   'Yes'                         => 'Ja',
   'You are logged out!'         => 'Auf Wiedersehen!',
   'You can also create new units now.' => 'Sie k&ouml;nnen jetzt auch neue Einheiten anlegen.',
+  '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;Datenbank anlegen&quot; w&auml;hlen.',
   'You can only delete datasets that are not in use.' => 'Sie k&ouml;nnen nur Datenbanken l&ouml;schen, die momentan nicht in Benutzung sind.',
   'You can use the following strings in the long description and all translations. They will be replaced by their actual values by Lx-Office before they\'re output.' => 'Sie k&ouml;nnen im Langtext und allen Übersetzungen die folgenden Variablen benutzen, die vor der Ausgabe von Lx-Office automatisch ersetzt werden:',
   'You cannot continue before all required modules are installed.' => 'Sie k&ouml;nnen nicht fortfahren, bevor alle ben&ouml;tigten Pakete installiert sind.',
index 190eea7..9b4413e 100644 (file)
@@ -1,5 +1,5 @@
 use Cwd;
-use vars qw($userspath $spool $memberfile $templates $sendmail $language $sid $latex $eur $webdav $lizenzen $pg_dump_exe $watch_form_variables);
+use vars qw($userspath $spool $memberfile $templates $sendmail $language $sid $latex $eur $webdav $lizenzen $pg_dump_exe $pg_restore_exe $watch_form_variables);
 
 # path to user configuration files
 $userspath = "users";
@@ -70,9 +70,11 @@ $dbcharset = "ISO-8859-15";
 # Datenbankbackups werden mit dem externen Programm "pg_dump" erledigt.
 # Wenn es nicht im aktuellen Pfad vorhanden ist, so muss hier der vollständige
 # Pfad eingetragen werden. Wenn die Variable auf "DISABLED" gesetzt wird,
-# so werden die Menüpunkte zum Backup und Wiederherstellen von Datenbanken
-# im Administrationsfrontend nicht angeboten.
-$pg_dump_exe = "pg_dump";
+# so wird der Menüpunkt zum Backup von Datenbanken im Administrationsfrontend
+# nicht angeboten.
+# Das gleiche gilt analog für das Wiederherstellen mittels "pg_restore".
+$pg_dump_exe    = "pg_dump";
+$pg_restore_exe = "pg_restore";
 
 # Globale Debug-Ausgaben (de-)aktivieren? Moegliche Werte sind
 # LXDebug::NONE   - keine Debugausgaben
index a2bf40a..615c74e 100644 (file)
@@ -57,7 +57,7 @@
       <input type="submit" class="submit" name="action" value="Datenbank löschen">
       <TMPL_IF ALLOW_DBBACKUP>
        <input type="submit" class="submit" name="action" value="Datenbank sichern">
-<!--        <input type="submit" class="submit" name="action" value="Datenbank wiederherstellen"> -->
+       <input type="submit" class="submit" name="action" value="Datenbank wiederherstellen">
       </TMPL_IF>
      </td>
     </tr>
index 2be64a5..2123f80 100644 (file)
@@ -57,7 +57,7 @@
       <input type="submit" class="submit" name="action" value="<translate>Delete Dataset</translate>">
       <TMPL_IF ALLOW_DBBACKUP>
        <input type="submit" class="submit" name="action" value="<translate>Backup Dataset</translate>">
-<!--        <input type="submit" class="submit" name="action" value="<translate>Restore Dataset</translate>"> -->
+       <input type="submit" class="submit" name="action" value="<translate>Restore Dataset</translate>">
       </TMPL_IF>
      </td>
     </tr>
diff --git a/templates/webpages/admin/restore_dataset_de.html b/templates/webpages/admin/restore_dataset_de.html
new file mode 100644 (file)
index 0000000..0575cab
--- /dev/null
@@ -0,0 +1,57 @@
+<body class="admin" onload="document.getElementsByName('dbname')[0].focus(); ">
+
+ <h2><TMPL_VAR title></h2>
+
+ <form name="Form" method="post" action="admin.pl" enctype="multipart/form-data">
+
+  <input type="hidden" name="dbdriver" value="Pg">
+  <input type="hidden" name="dbhost" value="<TMPL_VAR dbhost ESCAPE=HTML>">
+  <input type="hidden" name="dbport" value="<TMPL_VAR dbport ESCAPE=HTML>">
+  <input type="hidden" name="dbuser" value="<TMPL_VAR dbuser ESCAPE=HTML>">
+
+  <p>
+   Bitte geben Sie den Namen der Datenbank ein, in der Sie die Sicherung wiederherstellen wollen.
+   Die Datenbank muss vor der Wiederherstellung bereits angelegt worden sein.
+   Sie k&ouml;nnen eine fehlende Datenbank erstellen, indem Sie jetzt zu&uuml;ck gehen und den Punkt &quot;Datenbank anlegen&quot; w&auml;hlen.
+  </p>
+
+  <p>
+   Die von Ihnen hochzuladende Sicherungsdatei muss mit dem Programm und den Parametern &quot;pg_dump -o -Ft&quot; erstellt worden sein.
+   Sie darf optional mit &quot;gzip&quot; komprimiert sein.
+   Dateien, die von Lx-Office' Funktion &quot;Datenbank sichern&quot; erstellt wurden, erf&uuml;llen diese Kriterien.
+  </p>
+
+  <table>
+   <tr>
+    <td valign="top">Datenbankname</td>
+    <td valign="top"><input name="new_dbname"></td>
+   </tr>
+
+   <tr>
+    <th valign="top">Schriftsatz</th>
+    <td>
+     <select name="dbencoding">
+      <TMPL_LOOP DBENCODINGS><option value="<TMPL_VAR dbencoding ESCAPE=HTML>" <TMPL_IF selected>selected</TMPL_IF>><TMPL_VAR label ESCAPE=HTML></option></TMPL_LOOP>
+     </select>
+    </td>
+   </tr>
+
+   <tr>
+    <td valign="top">Sicherungsdatei</td>
+    <td valign="top"><input type="file" accept="*" name="content"></td>
+   </tr>
+  </table>
+
+  <input type="hidden" name="rpw" value="<TMPL_VAR rpw ESCAPE=HTML>">
+  <input type="hidden" name="nextsub" value="restore_dataset_start">
+
+  <hr size="3" noshade>
+
+  <br>
+
+  <input type="submit" class="submit" name="action" value="Weiter">
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/restore_dataset_master.html b/templates/webpages/admin/restore_dataset_master.html
new file mode 100644 (file)
index 0000000..c521fc9
--- /dev/null
@@ -0,0 +1,57 @@
+<body class="admin" onload="document.getElementsByName('dbname')[0].focus(); ">
+
+ <h2><TMPL_VAR title></h2>
+
+ <form name="Form" method="post" action="admin.pl" enctype="multipart/form-data">
+
+  <input type="hidden" name="dbdriver" value="Pg">
+  <input type="hidden" name="dbhost" value="<TMPL_VAR dbhost ESCAPE=HTML>">
+  <input type="hidden" name="dbport" value="<TMPL_VAR dbport ESCAPE=HTML>">
+  <input type="hidden" name="dbuser" value="<TMPL_VAR dbuser ESCAPE=HTML>">
+
+  <p>
+   <translate>Please enter the name of the dataset you want to restore the backup in.</translate>
+   <translate>The dataset has to exist before a restoration can be started.</translate>
+   <translate>You can create a missing dataset by going back and chosing &quot;Create Dataset&quot;.</translate>
+  </p>
+
+  <p>
+   <translate>The backup you upload here has to be a file created with &quot;pg_dump -o -Ft&quot;.</translate>
+   <translate>It may optionally be compressed with &quot;gzip&quot;.</translate>
+   <translate>Files created by Lx-Office's &quot;Backup Dataset&quot; function are such files.</translate>
+  </p>
+
+  <table>
+   <tr>
+    <td valign="top"><translate>Dataset name</translate></td>
+    <td valign="top"><input name="new_dbname"></td>
+   </tr>
+
+   <tr>
+    <th valign="top"><translate>Multibyte Encoding</translate></th>
+    <td>
+     <select name="dbencoding">
+      <TMPL_LOOP DBENCODINGS><option value="<TMPL_VAR dbencoding ESCAPE=HTML>" <TMPL_IF selected>selected</TMPL_IF>><TMPL_VAR label ESCAPE=HTML></option></TMPL_LOOP>
+     </select>
+    </td>
+   </tr>
+
+   <tr>
+    <td valign="top"><translate>Backup file</translate></td>
+    <td valign="top"><input type="file" accept="*" name="content"></td>
+   </tr>
+  </table>
+
+  <input type="hidden" name="rpw" value="<TMPL_VAR rpw ESCAPE=HTML>">
+  <input type="hidden" name="nextsub" value="restore_dataset_start">
+
+  <hr size="3" noshade>
+
+  <br>
+
+  <input type="submit" class="submit" name="action" value="<translate>Continue</translate>">
+
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/admin/restore_dataset_start_footer_de.html b/templates/webpages/admin/restore_dataset_start_footer_de.html
new file mode 100644 (file)
index 0000000..9266730
--- /dev/null
@@ -0,0 +1,15 @@
+ </pre>
+
+ <hr>
+
+ <p>
+  Die Wiederherstellung ist abgeschlossen. Bitte sehen Sie sich die Ausgabe von &quot;pg_restore&quot; an, um festzustellen, ob die Wiederherstellung erfolgreich war.
+  Der Exitcode des Programms war <TMPL_VAR retval ESCAPE=HTML> (&quot;0&quot; bedeutet normalerweise, dass die Wiederherstellung erfolgreich war).
+ </p>
+
+ <form method="post" action="admin.pl">
+  <input type="hidden" name="nextsub" value="list_users">
+  <input type="submit" name="action" value="Weiter">
+ </form>
+</body>
+</html>
diff --git a/templates/webpages/admin/restore_dataset_start_footer_master.html b/templates/webpages/admin/restore_dataset_start_footer_master.html
new file mode 100644 (file)
index 0000000..a105e21
--- /dev/null
@@ -0,0 +1,15 @@
+ </pre>
+
+ <hr>
+
+ <p>
+  <translate>The restoration process is complete. Please review &quot;pg_restore&quot;'s output to find out if the restoration was successful.</translate>
+  <translate>The program's exit code was <TMPL_VAR retval ESCAPE=HTML> (&quot;0&quot; usually means that everything went OK).</translate>
+ </p>
+
+ <form method="post" action="admin.pl">
+  <input type="hidden" name="nextsub" value="list_users">
+  <input type="submit" name="action" value="<translate>Continue</translate>">
+ </form>
+</body>
+</html>
diff --git a/templates/webpages/admin/restore_dataset_start_header_de.html b/templates/webpages/admin/restore_dataset_start_header_de.html
new file mode 100644 (file)
index 0000000..b575d12
--- /dev/null
@@ -0,0 +1,9 @@
+<body class="admin">
+
+ <h2><TMPL_VAR title></h2>
+
+ <p>Der Wiederherstellungsprozess wurde gestartet. Hier ist die Ausgabe des &quot;pg_restore&quot;-Programmes:</p>
+
+ <hr>
+
+ <pre>
diff --git a/templates/webpages/admin/restore_dataset_start_header_master.html b/templates/webpages/admin/restore_dataset_start_header_master.html
new file mode 100644 (file)
index 0000000..b047125
--- /dev/null
@@ -0,0 +1,9 @@
+<body class="admin">
+
+ <h2><TMPL_VAR title></h2>
+
+ <p><translate>The restoration process has started. Here's the output of the &quot;pg_restore&quot; command:</translate></p>
+
+ <hr>
+
+ <pre>