Revision 68d46d38
Von Moritz Bunkus vor mehr als 17 Jahren hinzugefügt
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
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.