Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 68d46d38

Von Moritz Bunkus vor mehr als 17 Jahren hinzugefügt

  • ID 68d46d3841e7306f2aeb4e3e19d88b7e8f712053
  • Vorgänger 68ca5cc3
  • Nachfolger 7b2faca4

Funktionen hinzugefügt, mit denen man ein Datenbankbackup mit Hilfe von "pg_restore" wieder einspielen kann. Dabei muss das Backup mit "pg_dump -Ft" erzegut worden sein, so wie es die eigene Backup-Funktion auch tut.

Unterschiede anzeigen:

bin/mozilla/admin.pl
48 48
use SL::Common;
49 49
use SL::Inifile;
50 50
use SL::DBUpgrade2;
51
use SL::DBUtils;
51 52

  
52 53
require "bin/mozilla/common.pl";
53 54

  
......
90 91

  
91 92
  # create memberfile
92 93
  if (!-f $memberfile) {
93
    open(FH, ">$memberfile") or $form->error("$memberfile : $!");
94
    open(FH, ">$memberfile") or $form->error("$memberfile : $ERRNO");
94 95
    print FH qq|# SQL-Ledger Accounting members
95 96

  
96 97
[root login]
......
125 126

  
126 127
  $form->error($locale->text('File locked!')) if (-f "${memberfile}.LCK");
127 128

  
128
  open(FH, "$memberfile") or $form->error("$memberfile : $!");
129
  open(FH, "$memberfile") or $form->error("$memberfile : $ERRNO");
129 130

  
130 131
  my %members;
131 132

  
......
220 221
    $form->error(sprintf($locale->text("The directory %s does not exist."), $templates));
221 222
  }
222 223

  
223
  opendir TEMPLATEDIR, "$templates/." or $form->error("$templates : $!");
224
  opendir TEMPLATEDIR, "$templates/." or $form->error("$templates : $ERRNO");
224 225
  my @all     = readdir(TEMPLATEDIR);
225 226
  my @alldir  = sort grep { -d "$templates/$_" && !/^\.\.?$/ } @all;
226 227
  my @allhtml = sort grep { -f "$templates/$_" && /\.html$/ } @all;
......
258 259
  my @acsorder = ();
259 260
  my %acs      = ();
260 261
  my %excl     = ();
261
  open(FH, $menufile) or $form->error("$menufile : $!");
262
  open(FH, $menufile) or $form->error("$menufile : $ERRNO");
262 263

  
263 264
  while ($item = <FH>) {
264 265
    next unless $item =~ /\[/;
......
393 394
          }
394 395
          close(HTACCESS);
395 396
        }
396
        open(HTACCESS, "> $file") or die "cannot open $file $!\n";
397
        open(HTACCESS, "> $file") or die "cannot open $file $ERRNO\n";
397 398
        $newfile .= $myconfig->{login} . ":" . $myconfig->{password} . "\n";
398 399
        print(HTACCESS $newfile);
399 400
        close(HTACCESS);
......
408 409
          }
409 410
          close(HTACCESS);
410 411
        }
411
        open(HTACCESS, "> $file") or die "cannot open $file $!\n";
412
        open(HTACCESS, "> $file") or die "cannot open $file $ERRNO\n";
412 413
        print(HTACCESS $newfile);
413 414
        close(HTACCESS);
414 415
      }
......
428 429
      umask(007);
429 430

  
430 431
      # copy templates to the directory
431
      opendir TEMPLATEDIR, "$templates/." or $form - error("$templates : $!");
432
      opendir TEMPLATEDIR, "$templates/." or $form - error("$templates : $ERRNO");
432 433
      @templates = grep /$form->{mastertemplates}.*?\.(html|tex|sty|xml|txb)$/,
433 434
        readdir TEMPLATEDIR;
434 435
      closedir TEMPLATEDIR;
435 436

  
436 437
      foreach $file (@templates) {
437 438
        open(TEMP, "$templates/$file")
438
          or $form->error("$templates/$file : $!");
439
          or $form->error("$templates/$file : $ERRNO");
439 440

  
440 441
        $file =~ s/$form->{mastertemplates}-//;
441 442
        open(NEW, ">$form->{templates}/$file")
442
          or $form->error("$form->{templates}/$file : $!");
443
          or $form->error("$form->{templates}/$file : $ERRNO");
443 444

  
444 445
        while ($line = <TEMP>) {
445 446
          print NEW $line;
......
448 449
        close(NEW);
449 450
      }
450 451
    } else {
451
      $form->error("$!: $form->{templates}");
452
      $form->error("$ERRNO: $form->{templates}");
452 453
    }
453 454
  }
454 455

  
......
458 459

  
459 460
sub delete {
460 461
  $form->error($locale->text('File locked!')) if (-f ${memberfile} . LCK);
461
  open(FH, ">${memberfile}.LCK") or $form->error("${memberfile}.LCK : $!");
462
  open(FH, ">${memberfile}.LCK") or $form->error("${memberfile}.LCK : $ERRNO");
462 463
  close(FH);
463 464

  
464 465
  my $members = Inifile->new($memberfile);
......
632 633

  
633 634
  $form->{CHARTS} = [];
634 635

  
635
  opendir SQLDIR, "sql/." or $form - error($!);
636
  opendir SQLDIR, "sql/." or $form - error($ERRNO);
636 637
  foreach $item (sort grep /-chart\.sql\z/, readdir SQLDIR) {
637 638
    next if ($item eq 'Default-chart.sql');
638 639
    $item =~ s/-chart\.sql//;
......
743 744
  $form->isblank("to", $locale->text('The email address is missing.')) if $form->{destination} eq "email";
744 745

  
745 746
  my $tmpdir = "/tmp/lx_office_backup_" . Common->unique_id();
746
  mkdir $tmpdir, 0700 || $form->error($locale->text('A temporary directory could not be created:') . " $!");
747
  mkdir $tmpdir, 0700 || $form->error($locale->text('A temporary directory could not be created:') . " $ERRNO");
747 748

  
748 749
  my $pgpass = IO::File->new("${tmpdir}/.pgpass", O_WRONLY | O_CREAT, 0600);
749 750

  
750 751
  if (!$pgpass) {
751 752
    unlink $tmpdir;
752
    $form->error($locale->text('A temporary file could not be created:') . " $!");
753
    $form->error($locale->text('A temporary file could not be created:') . " $ERRNO");
753 754
  }
754 755

  
755 756
  print $pgpass "$form->{dbhost}:$form->{dbport}:$form->{dbname}:$form->{dbuser}:$form->{dbpasswd}\n";
......
823 824
    . $locale->text('Database Administration') . " / "
824 825
    . $locale->text('Restore Dataset');
825 826

  
826
  if ("$pg_dump_exe" eq "DISABLED") {
827
  if ("$pg_restore_exe" eq "DISABLED") {
827 828
    $form->error($locale->text('Database backups and restorations are disabled in lx-erp.conf.'));
828 829
  }
830

  
831
  my $default_charset   = $dbcharset;
832
  $default_charset    ||= Common::DEFAULT_CHARSET;
833

  
834
  $form->{DBENCODINGS}  = [];
835

  
836
  foreach my $encoding (@Common::db_encodings) {
837
    push @{ $form->{DBENCODINGS} }, { "dbencoding" => $encoding->{dbencoding},
838
                                      "label"      => $encoding->{label},
839
                                      "selected"   => $encoding->{charset} eq $default_charset };
840
  }
841

  
842
  $form->header();
843
  print $form->parse_html_template("admin/restore_dataset");
844
}
845

  
846
sub restore_dataset_start {
847
  $form->{title} =
848
      "Lx-Office ERP "
849
    . $locale->text('Database Administration') . " / "
850
    . $locale->text('Restore Dataset');
851

  
852
  $pg_restore_exe ||= "pg_restore";
853

  
854
  if ("$pg_restore_exe" eq "DISABLED") {
855
    $form->error($locale->text('Database backups and restorations are disabled in lx-erp.conf.'));
856
  }
857

  
858
  $form->isblank("new_dbname", $locale->text('The dataset name is missing.'));
859
  $form->isblank("content", $locale->text('No backup file has been uploaded.'));
860

  
861
  # Create temporary directories. Write the backup file contents to a temporary
862
  # file. Create a .pgpass file with the username and password for the pg_restore
863
  # utility.
864

  
865
  my $tmpdir = "/tmp/lx_office_backup_" . Common->unique_id();
866
  mkdir $tmpdir, 0700 || $form->error($locale->text('A temporary directory could not be created:') . " $ERRNO");
867

  
868
  my $pgpass = IO::File->new("${tmpdir}/.pgpass", O_WRONLY | O_CREAT, 0600);
869

  
870
  if (!$pgpass) {
871
    unlink $tmpdir;
872
    $form->error($locale->text('A temporary file could not be created:') . " $ERRNO");
873
  }
874

  
875
  print $pgpass "$form->{dbhost}:$form->{dbport}:$form->{new_dbname}:$form->{dbuser}:$form->{dbpasswd}\n";
876
  $pgpass->close();
877

  
878
  $ENV{HOME} = $tmpdir;
879

  
880
  my $tmp = $tmpdir . "/dump_" . Common::unique_id();
881
  my $tmpfile;
882

  
883
  if (substr($form->{content}, 0, 2) eq "\037\213") {
884
    $tmpfile = IO::File->new("| gzip -d > $tmp");
885
    $tmpfile->binary();
886

  
887
  } else {
888
    $tmpfile = IO::File->new($tmp, O_WRONLY | O_CREAT | O_BINARY, 0600);
889
  }
890

  
891
  if (!$tmpfile) {
892
    unlink "${tmpdir}/.pgpass";
893
    rmdir $tmpdir;
894

  
895
    $form->error($locale->text('A temporary file could not be created:') . " $ERRNO");
896
  }
897

  
898
  print $tmpfile $form->{content};
899
  $tmpfile->close();
900

  
901
  delete $form->{content};
902

  
903
  # Try to connect to the database. Find out if a database with the same name exists.
904
  # If yes, then drop the existing database. Create a new one with the name and encoding
905
  # given by the user.
906

  
907
  User::dbconnect_vars($form, "template1");
908

  
909
  my %myconfig = map { $_ => $form->{$_} } grep /^db/, keys %{ $form };
910
  my $dbh      = $form->dbconnect(\%myconfig) || $form->dberror();
911

  
912
  my ($query, $sth);
913

  
914
  $form->{new_dbname} =~ s|[^a-zA-Z0-9_\-]||g;
915

  
916
  $query = qq|SELECT COUNT(*) FROM pg_database WHERE datname = ?|;
917
  my ($count) = selectrow_query($form, $dbh, $query, $form->{new_dbname});
918
  if ($count) {
919
    do_query($form, $dbh, qq|DROP DATABASE $form->{new_dbname}|);
920
  }
921

  
922
  my $found = 0;
923
  foreach my $item (@Common::db_encodings) {
924
    if ($item->{dbencoding} eq $form->{dbencoding}) {
925
      $found = 1;
926
      last;
927
    }
928
  }
929
  $form->{dbencoding} = "LATIN9" unless $form->{dbencoding};
930

  
931
  do_query($form, $dbh, qq|CREATE DATABASE $form->{new_dbname} ENCODING ? TEMPLATE template0|, $form->{dbencoding});
932

  
933
  $dbh->disconnect();
934

  
935
  # Spawn pg_restore on the temporary file.
936

  
937
  my @args = ("-h", $form->{dbhost}, "-U", $form->{dbuser}, "-d", $form->{new_dbname});
938
  push @args, ("-p", $form->{dbport}) if ($form->{dbport});
939
  push @args, $tmp;
940

  
941
  my $cmd = "${pg_restore_exe} " . join(" ", map { s/\\/\\\\/g; s/\"/\\\"/g; $_ } @args);
942

  
943
  my $in = IO::File->new("$cmd 2>&1 |");
944

  
945
  if (!$in) {
946
    unlink "${tmpdir}/.pgpass", $tmp;
947
    rmdir $tmpdir;
948

  
949
    $form->error($locale->text('The pg_restore process could not be started.'));
950
  }
951

  
952
  $AUTOFLUSH = 1;
953

  
954
  $form->header();
955
  print $form->parse_html_template("admin/restore_dataset_start_header");
956

  
957
  while (my $line = <$in>) {
958
    print $line;
959
  }
960
  $in->close();
961

  
962
  $form->{retval} = $CHILD_ERROR >> 8;
963
  print $form->parse_html_template("admin/restore_dataset_start_footer");
964

  
965
  unlink "${tmpdir}/.pgpass", $tmp;
966
  rmdir $tmpdir;
829 967
}
830 968

  
831 969
sub unlock_system {

Auch abrufbar als: Unified diff