Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 7a6602d6

Von Moritz Bunkus vor mehr als 11 Jahren hinzugefügt

  • ID 7a6602d68e1088a532742ebe2b326c428da54fb0
  • Vorgänger 5f83d21f
  • Nachfolger f87f36c6

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.

Unterschiede anzeigen:

bin/mozilla/admin.pl
126 126

  
127 127
  $form->{title}     = "kivitendo / " . $locale->text('Database Administration');
128 128

  
129
  # Intentionnaly disabled unless fixed to work with the authentication DB.
130
  $form->{ALLOW_DBBACKUP} = 0; # "$pg_dump_exe" ne "DISABLED";
131

  
132 129
  $form->header();
133 130
  print $form->parse_html_template("admin/dbadmin");
134 131
}
......
269 266
  print $form->parse_html_template("admin/dbdelete");
270 267
}
271 268

  
272
sub backup_dataset {
273
  my $form       = $main::form;
274
  my $locale     = $main::locale;
275

  
276
  $form->{title} = "kivitendo " . $locale->text('Database Administration') . " / " . $locale->text('Backup Dataset');
277

  
278
  if ($::lx_office_conf{applications}->{pg_dump} eq "DISABLED") {
279
    $form->error($locale->text('Database backups and restorations are disabled in the configuration.'));
280
  }
281

  
282
  my @dbsources         = sort User->dbsources($form);
283
  $form->{DATABASES}    = [ map { { "dbname" => $_ } } @dbsources ];
284
  $form->{NO_DATABASES} = !scalar @dbsources;
285

  
286
  my $username  = getpwuid $UID || "unknown-user";
287
  my $hostname  = hostname() || "unknown-host";
288
  $form->{from} = "kivitendo Admin <${username}\@${hostname}>";
289

  
290
  $form->header();
291
  print $form->parse_html_template("admin/backup_dataset");
292
}
293

  
294
sub backup_dataset_start {
295
  my $form       = $main::form;
296
  my $locale     = $main::locale;
297

  
298
  $form->{title} = "kivitendo " . $locale->text('Database Administration') . " / " . $locale->text('Backup Dataset');
299

  
300
  my $pg_dump_exe = $::lx_office_conf{applications}->{pg_dump} || "pg_dump";
301

  
302
  if ("$pg_dump_exe" eq "DISABLED") {
303
    $form->error($locale->text('Database backups and restorations are disabled in the configuration.'));
304
  }
305

  
306
  $form->isblank("dbname", $locale->text('The dataset name is missing.'));
307
  $form->isblank("to", $locale->text('The email address is missing.')) if $form->{destination} eq "email";
308

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

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

  
314
  if (!$pgpass) {
315
    unlink $tmpdir;
316
    $form->error($locale->text('A temporary file could not be created:') . " $ERRNO");
317
  }
318

  
319
  print $pgpass "$form->{dbhost}:$form->{dbport}:$form->{dbname}:$form->{dbuser}:$form->{dbpasswd}\n";
320
  $pgpass->close();
321

  
322
  $ENV{HOME} = $tmpdir;
323

  
324
  my @args = ("-Ft", "-c", "-o", "-h", $form->{dbhost}, "-U", $form->{dbuser});
325
  push @args, ("-p", $form->{dbport}) if ($form->{dbport});
326
  push @args, $form->{dbname};
327

  
328
  my $cmd  = "$pg_dump_exe " . join(" ", map { s/\\/\\\\/g; s/\"/\\\"/g; $_ } @args);
329
  my $name = "dataset_backup_$form->{dbname}_" . strftime("%Y%m%d", localtime()) . ".tar";
330

  
331
  if ($form->{destination} ne "email") {
332
    my $in = IO::File->new("$cmd |");
333

  
334
    if (!$in) {
335
      unlink "${tmpdir}/.pgpass";
336
      rmdir $tmpdir;
337

  
338
      $form->error($locale->text('The pg_dump process could not be started.'));
339
    }
340

  
341
    print "content-type: application/x-tar\n";
342
    print "content-disposition: attachment; filename=\"${name}\"\n\n";
343

  
344
    while (my $line = <$in>) {
345
      print $line;
346
    }
347

  
348
    $in->close();
349

  
350
    unlink "${tmpdir}/.pgpass";
351
    rmdir $tmpdir;
352

  
353
  } else {
354
    my $tmp = $tmpdir . "/dump_" . Common::unique_id();
355

  
356
    if (system("$cmd > $tmp") != 0) {
357
      unlink "${tmpdir}/.pgpass", $tmp;
358
      rmdir $tmpdir;
359

  
360
      $form->error($locale->text('The pg_dump process could not be started.'));
361
    }
362

  
363
    my $mail = new Mailer;
364

  
365
    map { $mail->{$_} = $form->{$_} } qw(from to cc subject message);
366

  
367
    $mail->{charset}     = $::lx_office_conf{system}->{dbcharset} || Common::DEFAULT_CHARSET;
368
    $mail->{attachments} = [ { "filename" => $tmp, "name" => $name } ];
369
    $mail->send();
370

  
371
    unlink "${tmpdir}/.pgpass", $tmp;
372
    rmdir $tmpdir;
373

  
374
    $form->{title} = "kivitendo " . $locale->text('Database Administration') . " / " . $locale->text('Backup Dataset');
375

  
376
    $form->header();
377
    print $form->parse_html_template("admin/backup_dataset_email_done");
378
  }
379
}
380

  
381
sub restore_dataset {
382
  my $form       = $main::form;
383
  my $locale     = $main::locale;
384

  
385
  $form->{title} = "kivitendo " . $locale->text('Database Administration') . " / " . $locale->text('Restore Dataset');
386

  
387
  if ($::lx_office_conf{applications}->{pg_restore} eq "DISABLED") {
388
    $form->error($locale->text('Database backups and restorations are disabled in the configuration.'));
389
  }
390

  
391
  my $default_charset   = $::lx_office_conf{system}->{dbcharset};
392
  $default_charset    ||= Common::DEFAULT_CHARSET;
393

  
394
  $form->{DBENCODINGS}  = [];
395

  
396
  foreach my $encoding (@Common::db_encodings) {
397
    push @{ $form->{DBENCODINGS} }, { "dbencoding" => $encoding->{dbencoding},
398
                                      "label"      => $encoding->{label},
399
                                      "selected"   => $encoding->{charset} eq $default_charset };
400
  }
401

  
402
  $form->header();
403
  print $form->parse_html_template("admin/restore_dataset");
404
}
405

  
406
sub restore_dataset_start {
407
  my $form       = $main::form;
408
  my $locale     = $main::locale;
409

  
410
  $form->{title} = "kivitendo " . $locale->text('Database Administration') . " / " . $locale->text('Restore Dataset');
411

  
412
  my $pg_restore_exe = $::lx_office_conf{applications}->{pg_restore} || "pg_restore";
413

  
414
  if ("$pg_restore_exe" eq "DISABLED") {
415
    $form->error($locale->text('Database backups and restorations are disabled in the configuration.'));
416
  }
417

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

  
421
  # Create temporary directories. Write the backup file contents to a temporary
422
  # file. Create a .pgpass file with the username and password for the pg_restore
423
  # utility.
424

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

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

  
430
  if (!$pgpass) {
431
    unlink $tmpdir;
432
    $form->error($locale->text('A temporary file could not be created:') . " $ERRNO");
433
  }
434

  
435
  print $pgpass "$form->{dbhost}:$form->{dbport}:$form->{new_dbname}:$form->{dbuser}:$form->{dbpasswd}\n";
436
  $pgpass->close();
437

  
438
  $ENV{HOME} = $tmpdir;
439

  
440
  my $tmp = $tmpdir . "/dump_" . Common::unique_id();
441
  my $tmpfile;
442

  
443
  if (substr($form->{content}, 0, 2) eq "\037\213") {
444
    $tmpfile = IO::File->new("| gzip -d > $tmp");
445
    $tmpfile->binary();
446

  
447
  } else {
448
    $tmpfile = IO::File->new($tmp, O_WRONLY | O_CREAT | O_BINARY, 0600);
449
  }
450

  
451
  if (!$tmpfile) {
452
    unlink "${tmpdir}/.pgpass";
453
    rmdir $tmpdir;
454

  
455
    $form->error($locale->text('A temporary file could not be created:') . " $ERRNO");
456
  }
457

  
458
  print $tmpfile $form->{content};
459
  $tmpfile->close();
460

  
461
  delete $form->{content};
462

  
463
  # Try to connect to the database. Find out if a database with the same name exists.
464
  # If yes, then drop the existing database. Create a new one with the name and encoding
465
  # given by the user.
466

  
467
  User::dbconnect_vars($form, "template1");
468

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

  
472
  my ($query, $sth);
473

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

  
476
  $query = qq|SELECT COUNT(*) FROM pg_database WHERE datname = ?|;
477
  my ($count) = selectrow_query($form, $dbh, $query, $form->{new_dbname});
478
  if ($count) {
479
    do_query($form, $dbh, qq|DROP DATABASE $form->{new_dbname}|);
480
  }
481

  
482
  my $found = 0;
483
  foreach my $item (@Common::db_encodings) {
484
    if ($item->{dbencoding} eq $form->{dbencoding}) {
485
      $found = 1;
486
      last;
487
    }
488
  }
489
  $form->{dbencoding} = "LATIN9" unless $form->{dbencoding};
490

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

  
493
  $dbh->disconnect();
494

  
495
  # Spawn pg_restore on the temporary file.
496

  
497
  my @args = ("-h", $form->{dbhost}, "-U", $form->{dbuser}, "-d", $form->{new_dbname});
498
  push @args, ("-p", $form->{dbport}) if ($form->{dbport});
499
  push @args, $tmp;
500

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

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

  
505
  if (!$in) {
506
    unlink "${tmpdir}/.pgpass", $tmp;
507
    rmdir $tmpdir;
508

  
509
    $form->error($locale->text('The pg_restore process could not be started.'));
510
  }
511

  
512
  $English::AUTOFLUSH = 1;
513

  
514
  $form->header();
515
  print $form->parse_html_template("admin/restore_dataset_start_header");
516

  
517
  while (my $line = <$in>) {
518
    print $line;
519
  }
520
  $in->close();
521

  
522
  $form->{retval} = $CHILD_ERROR >> 8;
523
  print $form->parse_html_template("admin/restore_dataset_start_footer");
524

  
525
  unlink "${tmpdir}/.pgpass", $tmp;
526
  rmdir $tmpdir;
527
}
528

  
529 269
1;
config/kivitendo.conf.default
132 132
# into binaries located in different locations than the main Python
133 133
# binary.
134 134
python_uno = python
135
# Location of the two executables "pg_dump" and "pg_restore" used for
136
# database backup and restoration from the admin section.  If
137
# "pg_dump" or "pg_restore" is set to "DISABLED" then the
138
# corresponding option (backup/restoration) will be hidden from the
139
# admin section.
140
pg_dump = pg_dump
141
pg_restore = pg_restore
142 135

  
143 136
[environment]
144 137
# Add the following paths to the PATH environment variable.
locale/de/all
46 46
  '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.',
47 47
  'A lower-case character is required.' => 'Ein Kleinbuchstabe ist vorgeschrieben.',
48 48
  'A special character is required (valid characters: #1).' => 'Ein Sonderzeichen ist vorgeschrieben (gültige Zeichen: #1).',
49
  'A temporary directory could not be created:' => 'Ein tempor&auml;res Verzeichnis konnte nicht erstellt werden:',
50
  'A temporary file could not be created:' => 'Eine tempor&auml;re Datei konnte nicht erstellt werden:',
51 49
  'A unit with this name does already exist.' => 'Eine Einheit mit diesem Namen existiert bereits.',
52 50
  'A valid taxkey is missing!'  => 'Einen gültiger Steuerschlüssel fehlt!',
53 51
  '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 269
  'Background jobs'             => 'Hintergrund-Jobs',
272 270
  'Background jobs and task server' => 'Hintergrund-Jobs und Task-Server',
273 271
  'Backup Dataset'              => 'Datenbank sichern',
274
  'Backup file'                 => 'Sicherungsdatei',
275
  'Backup of dataset'           => 'Sicherung der Datenbank',
276 272
  'Balance'                     => 'Bilanz',
277 273
  'Balance Sheet'               => 'Bilanz',
278 274
  'Bank'                        => 'Bank',
......
607 603
  'Database Host'               => 'Datenbankcomputer',
608 604
  'Database ID'                 => 'Datenbank-ID',
609 605
  'Database User'               => 'Datenbankbenutzer',
610
  'Database backups and restorations are disabled in the configuration.' => 'Datenbanksicherungen und -wiederherstellungen sind in der Konfiguration deaktiviert.',
611 606
  'Database host and port'      => 'Datenbankhost und -port',
612 607
  'Database name'               => 'Datenbankname',
613 608
  'Database settings'           => 'Datenbankeinstellungen',
......
615 610
  'Database update error:'      => 'Fehler beim Datenbankupgrade:',
616 611
  'Database user and password'  => 'Datebankbenutzer und -passwort',
617 612
  'Dataset missing!'            => 'Datenbank fehlt!',
618
  'Dataset name'                => 'Datenbankname',
619 613
  'Dataset upgrade'             => 'Datenbankaktualisierung',
620 614
  'Date'                        => 'Datum',
621 615
  'Date Format'                 => 'Datumsformat',
......
730 724
  'Double partnumbers'          => 'Doppelte Artikelnummern',
731 725
  'Download SEPA XML export file' => 'SEPA-XML-Exportdatei herunterladen',
732 726
  'Download sample file'        => 'Beispieldatei herunterladen',
733
  'Download the backup'         => 'Die Sicherungsdatei herunterladen',
734 727
  'Draft saved.'                => 'Entwurf gespeichert.',
735 728
  'Drawing'                     => 'Zeichnung',
736 729
  'Driver'                      => 'Treiber',
......
931 924
  'Field'                       => 'Feld',
932 925
  'File'                        => 'Datei',
933 926
  'File name'                   => 'Dateiname',
934
  '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.',
935 927
  'Filter'                      => 'Filter',
936 928
  'Filter date by'              => 'Datum filtern nach',
937 929
  'Filter for customer variables' => 'Filter für benutzerdefinierte Kundenvariablen',
......
1140 1132
  '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.',
1141 1133
  '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.',
1142 1134
  '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.',
1143
  'It may optionally be compressed with &quot;gzip&quot;.' => 'Sie darf optional mit &quot;gzip&quot; komprimiert sein.',
1144 1135
  '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.',
1145 1136
  'Item deleted!'               => 'Artikel gelöscht!',
1146 1137
  'Item mode'                   => 'Artikelmodus',
......
1333 1324
  'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden',
1334 1325
  'No action defined.'          => 'Keine Aktion definiert.',
1335 1326
  'No background job has been created yet.' => 'Es wurden noch keine Hintergrund-Jobs angelegt.',
1336
  'No backup file has been uploaded.' => 'Es wurde keine Sicherungsdatei hochgeladen.',
1337 1327
  '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.',
1338 1328
  '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.',
1339 1329
  'No bins have been added to this warehouse yet.' => 'Es wurden zu diesem Lager noch keine Lagerpl&auml;tze angelegt.',
......
1342 1332
  'No contact selected to delete' => 'Keine Ansprechperson zum Löschen ausgewählt',
1343 1333
  'No customer has been selected yet.' => 'Es wurde noch kein Kunde ausgewählt.',
1344 1334
  'No data was found.'          => 'Es wurden keine Daten gefunden.',
1345
  'No databases have been found on this server.' => 'Auf diesem Server wurden keine Datenbanken gefunden.',
1346 1335
  'No datasets have been selected.' => 'Es wurden keine Datenbanken ausgew&auml;hlt.',
1347 1336
  'No default currency'         => 'Keine Standardwährung',
1348 1337
  'No department has been created yet.' => 'Es wurde noch keine Abteilung erfasst.',
......
1525 1514
  'Please enter the name for the new client.' => 'Bitte geben Sie einen Namen für den neuen Mandanten ein.',
1526 1515
  'Please enter the name for the new group.' => 'Bitte geben Sie den Namen für die neue Gruppe ein.',
1527 1516
  '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:',
1528
  '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.',
1529 1517
  'Please enter the sales tax identification number.' => 'Bitte geben Sie die Umsatzsteueridentifikationsnummer an.',
1530 1518
  'Please enter the taxnumber in the client configuration.' => 'Bitte geben Sie in der Mandantenkonfiguration die Steuernummer an.',
1531 1519
  'Please enter values'         => 'Bitte Werte eingeben',
......
1540 1528
  'Please select a part from the list below.' => 'Bitte w&auml;hlen Sie einen Artikel aus der Liste aus.',
1541 1529
  'Please select a vendor from the list below.' => 'Bitte einen Händler aus der Liste auswählen',
1542 1530
  '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.',
1543
  'Please select the database you want to backup' => 'Bitte w&auml;hlen Sie die zu sichernde Datenbank gefunden',
1544 1531
  'Please select the destination bank account for the collections:' => 'Bitte wählen Sie das Bankkonto als Ziel für die Einzüge aus:',
1545 1532
  'Please select the source bank account for the transfers:' => 'Bitte wählen Sie das Bankkonto als Quelle für die Überweisungen aus:',
1546 1533
  'Please select which client configurations you want to create.' => 'Bitte wählen Sie aus, welche Mandanten mit welchen Einstellungen angelegt werden sollen.',
......
1807 1794
  'Sellprice for price group \'#1\'' => 'Verkaufspreis für Preisgruppe \'#1\'',
1808 1795
  'Sellprice significant places' => 'Verkaufspreis: Nachkommastellen',
1809 1796
  'Semicolon'                   => 'Semikolon',
1810
  'Send the backup via Email'   => 'Die Sicherungsdatei per Email verschicken',
1811 1797
  'Sep'                         => 'Sep',
1812 1798
  'Separator'                   => 'Trennzeichen',
1813 1799
  'Separator chararacter'       => 'Feldtrennzeichen',
......
2026 2012
  'The background job has been deleted.' => 'Der Hintergrund-Job wurde gelöscht.',
2027 2013
  'The background job has been saved.' => 'Der Hintergrund-Job wurde gespeichert.',
2028 2014
  'The background job was executed successfully.' => 'Der Hintergrund-Job wurde erfolgreich ausgeführt.',
2029
  '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.',
2030 2015
  'The bank information must not be empty.' => 'Die Bankinformationen müssen vollständig ausgefüllt werden.',
2031 2016
  '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.',
2032 2017
  'The base unit does not exist.' => 'Die Basiseinheit existiert nicht.',
......
2065 2050
  'The database upgrade for the introduction of units is now complete.' => 'Das Datenbankupgrade zwecks Einf&uuml;hrung von Einheiten ist nun beendet.',
2066 2051
  'The database user is missing.' => 'Der Datenbankbenutzer fehlt.',
2067 2052
  'The dataset #1 has been successfully created.' => 'Die Datenbank #1 wurde erfolgreich angelegt.',
2068
  'The dataset backup has been sent via email to #1.' => 'Die Datenbanksicherung wurde per Email an #1 verschickt.',
2069
  'The dataset has to exist before a restoration can be started.' => 'Die Datenbank muss vor der Wiederherstellung bereits angelegt worden sein.',
2070
  'The dataset name is missing.' => 'Der Datenbankname fehlt.',
2071 2053
  'The deductible amount'       => 'Der abziehbare Skontobetrag',
2072 2054
  'The default value depends on the variable type:' => 'Die Bedeutung des Standardwertes h&auml;ngt vom Variablentypen ab:',
2073 2055
  '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 2066
  'The discount must not be negative.' => 'Der Rabatt darf nicht negativ sein.',
2085 2067
  'The dunning process started' => 'Der Mahnprozess ist gestartet.',
2086 2068
  'The dunnings have been printed.' => 'Die Mahnung(en) wurden gedruckt.',
2087
  'The email address is missing.' => 'Die Emailadresse fehlt.',
2088 2069
  '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.',
2089 2070
  'The execution schedule is invalid.' => 'Der Ausführungszeitplan ist ungültig.',
2090 2071
  'The execution type is invalid.' => 'Der Ausführungstyp ist ungültig.',
......
2138 2119
  'The payment term has been saved.' => 'Die Zahlungsbedingungen wurden gespeichert.',
2139 2120
  'The payment term is in use and cannot be deleted.' => 'Die Zahlungsbedingungen werden bereits benutzt und können nicht gelöscht werden.',
2140 2121
  'The payments have been posted.' => 'Die Zahlungen wurden gebucht.',
2141
  'The pg_dump process could not be started.' => 'Der pg_dump-Prozess konnte nicht gestartet werden.',
2142
  'The pg_restore process could not be started.' => 'Der pg_restore-Prozess konnte nicht gestartet werden.',
2143 2122
  '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).',
2144 2123
  'The printer could not be deleted.' => 'Der Drucker konnte nicht gelöscht werden.',
2145 2124
  'The printer has been created.' => 'Der Drucker wurde angelegt.',
......
2147 2126
  'The printer has been saved.' => 'Der Drucker wurde gespeichert.',
2148 2127
  'The profile \'#1\' has been deleted.' => 'Das Profil \'#1\' wurde gelöscht.',
2149 2128
  'The profile has been saved under the name \'#1\'.' => 'Das Profil wurde unter dem Namen \'#1\' gespeichert.',
2150
  '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).',
2151 2129
  'The project has been created.' => 'Das Projekt wurde angelegt.',
2152 2130
  'The project has been deleted.' => 'Das Projekt wurde gelöscht.',
2153 2131
  'The project has been saved.' => 'Das Projekt wurde gespeichert.',
2154 2132
  'The project is in use and cannot be deleted.' => 'Das Projekt ist in Verwendung und kann nicht gelöscht werden.',
2155 2133
  'The project number is already in use.' => 'Die Projektnummer wird bereits verwendet.',
2156 2134
  'The project number is missing.' => 'Die Projektnummer fehlt.',
2157
  '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:',
2158
  '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.',
2159 2135
  '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.',
2160 2136
  '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.',
2161 2137
  '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 2431
  '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.',
2456 2432
  '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.',
2457 2433
  '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.',
2458
  '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.',
2459 2434
  '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.',
2460 2435
  '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;).',
2461 2436
  '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.',
templates/webpages/admin/backup_dataset.html
1
[%- USE T8 %]
2
[%- USE HTML %]
3
 <script type="text/javascript">
4
  <!--
5
      $(function(){
6
        document.getElementsByName('to')[0].focus();
7
        set_subject();
8
      });
9

  
10
      function set_subject () {
11
        var subject_template = "[% 'Backup of dataset' | $T8 %]";
12
        var subject = document.Form.subject.value;
13

  
14
        if ((subject == "") || (subject.substr(0, subject_template.length) == subject_template)) {
15
          document.Form.subject.value = subject_template + " " + document.Form.dbname.value;
16
        }
17
      }
18
    -->
19
 </script>
20

  
21
 <h1>[% title %]</h1>
22

  
23
 [% IF NO_DATABSES %]
24
  [% 'No databases have been found on this server.' | $T8 %]
25

  
26
  [% ELSE %]
27

  
28
  <form name="Form" method="post" action="admin.pl">
29

  
30
   <input type="hidden" name="dbhost" value="[% HTML.escape(dbhost) %]">
31
   <input type="hidden" name="dbport" value="[% HTML.escape(dbport) %]">
32
   <input type="hidden" name="dbuser" value="[% HTML.escape(dbuser) %]">
33
   <input type="hidden" name="dbpasswd" value="[% HTML.escape(dbpasswd) %]">
34

  
35
   <p>
36
    [% 'Please select the database you want to backup' | $T8 %]:
37
    <select name="dbname" onchange="set_subject()">[% FOREACH row = DATABASES %]<option>[% HTML.escape(row.dbname) %]</option>[% END %]</select>
38
   </p>
39

  
40
   <table>
41
    <tr>
42
     <td valign="top"><input type="radio" name="destination" id="destination_download" value="download" checked></td>
43
     <td valign="top"><label for="destination_download">[% 'Download the backup' | $T8 %]</label></td>
44
    </tr>
45

  
46
    <tr>
47
     <td valign="top"><input type="radio" name="destination" id="destination_email" value="email"></td>
48
     <td valign="top">
49
      <label for="destination_email">[% 'Send the backup via Email' | $T8 %]</label><br>
50

  
51
      <table>
52
       <tr>
53
        <td valign="top" align="right">[% 'From' | $T8 %]</td>
54
        <td valign="top"><input name="from" size="40" value="[% HTML.escape(from) %]"></td>
55
       </tr>
56

  
57
       <tr>
58
        <td valign="top" align="right">[% 'To' | $T8 %]</td>
59
        <td valign="top"><input name="to" size="40"></td>
60
       </tr>
61

  
62
       <tr>
63
        <td valign="top" align="right">[% 'Cc' | $T8 %]</td>
64
        <td valign="top"><input name="cc" size="40"></td>
65
       </tr>
66

  
67
       <tr>
68
        <td valign="top" align="right">[% 'Subject' | $T8 %]</td>
69
        <td valign="top"><input name="subject" size="40"></td>
70
       </tr>
71

  
72
       <tr>
73
        <td valign="top" align="right">[% 'Message' | $T8 %]</td>
74
        <td valign="top"><textarea name="message" cols="40" rows="10"></textarea></td>
75
       </tr>
76

  
77
      </table>
78

  
79
     </td>
80
    </tr>
81

  
82
   </table>
83

  
84
   <input name="callback" type="hidden" value="controller.pl?action=Admin/show">
85
   <input type="hidden" name="nextsub" value="backup_dataset_start">
86

  
87
   <hr size="3" noshade>
88

  
89
   <br>
90

  
91
   <input type="submit" class="submit" name="action" value="[% 'Continue' | $T8 %]">
92
   <a href="controller.pl?action=Admin/show">[% 'Back' | $T8 %]</a>
93

  
94
  </form>
95

  
96
 [% END %]
templates/webpages/admin/backup_dataset_email_done.html
1
[%- USE T8 %]
2
[%- USE LxERP %]
3
[%- USE HTML %][%- USE L -%]
4
 <h1>[% title %]</h1>
5

  
6
 <p>[% LxERP.t8('The dataset backup has been sent via email to #1.', to) | html %]</p>
7

  
8
 <p>[% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]
templates/webpages/admin/restore_dataset.html
1
[%- USE T8 %]
2
[%- USE HTML %]
3
  <script type='text/javascript'>
4
    $(function(){ document.getElementsByName('dbname')[0].focus();});
5
  </script>
6

  
7
 <h1>[% title %]</h1>
8

  
9
 <form name="Form" method="post" action="admin.pl" enctype="multipart/form-data">
10

  
11
  <input type="hidden" name="dbhost" value="[% HTML.escape(dbhost) %]">
12
  <input type="hidden" name="dbport" value="[% HTML.escape(dbport) %]">
13
  <input type="hidden" name="dbuser" value="[% HTML.escape(dbuser) %]">
14
  <input type="hidden" name="dbpasswd" value="[% HTML.escape(dbpasswd) %]">
15

  
16
  <p>
17
   [% 'Please enter the name of the dataset you want to restore the backup in.' | $T8 %]
18
   [% 'The dataset has to exist before a restoration can be started.' | $T8 %]
19
   [% 'You can create a missing dataset by going back and chosing &quot;Create Dataset&quot;.' | $T8 %]
20
  </p>
21

  
22
  <p>
23
   [%- 'The backup you upload here has to be a file created with &quot;pg_dump -o -Ft&quot;.' | $T8 %]
24
   [%- 'It may optionally be compressed with &quot;gzip&quot;.' | $T8 %]
25
   [%- 'Files created by kivitendo\'s &quot;Backup Dataset&quot; function are such files.' | $T8 %]
26
  </p>
27

  
28
  <table>
29
   <tr>
30
    <td valign="top">[% 'Dataset name' | $T8 %]</td>
31
    <td valign="top"><input name="new_dbname"></td>
32
   </tr>
33

  
34
   <tr>
35
    <th valign="top">[% 'Multibyte Encoding' | $T8 %]</th>
36
    <td>
37
     <select name="dbencoding">
38
      [% FOREACH row = DBENCODINGS %]<option value="[% HTML.escape(row.dbencoding) %]" [% IF row.selected %]selected[% END %]>[% HTML.escape(row.label) %]</option>[% END %]
39
     </select>
40
    </td>
41
   </tr>
42

  
43
   <tr>
44
    <td valign="top">[% 'Backup file' | $T8 %]</td>
45
    <td valign="top"><input type="file" accept="*" name="content"></td>
46
   </tr>
47
  </table>
48

  
49
  <input type="hidden" name="nextsub" value="restore_dataset_start">
50

  
51
  <hr size="3" noshade>
52

  
53
  <br>
54

  
55
  <input type="submit" class="submit" name="action" value="[% 'Continue' | $T8 %]">
56

  
57
 </form>
templates/webpages/admin/restore_dataset_start_footer.html
1
[%- USE T8 %]
2
[%- USE LxERP %]
3
[% USE HTML %][%- USE L -%] </pre>
4

  
5
 <hr>
6

  
7
 <p>
8
  [%- 'The restoration process is complete. Please review &quot;pg_restore&quot;\'s output to find out if the restoration was successful.' | $T8 %]
9
  [%- LxERP.t8('The program\'s exit code was #1 (&quot;0&quot; usually means that everything went OK).', retval) | html %]
10
 </p>
11

  
12
 <p>
13
  [% L.link("controller.pl?action=Admin/show", LxERP.t8("Continue")) %]
14
 </p>
templates/webpages/admin/restore_dataset_start_header.html
1
[%- USE T8 %]
2
 <h1>[% title %]</h1>
3

  
4
 <p>[%- 'The restoration process has started. Here\'s the output of the &quot;pg_restore&quot; command:' | $T8 %]</p>
5

  
6
 <hr>
7

  
8
 <pre>

Auch abrufbar als: Unified diff