diff --git a/fhem/CHANGED b/fhem/CHANGED index b91a04b34..b2214e2a1 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 93_DbRep: V6.0.0, FTP transfer dumpfile after dump (MySQL), delete + old dumpfiles within Blockingcall, minor fixes - feature: 57_Calendar: new field categories (nils_, Forum #79237) - change: 72_FB_CALLMONITOR: delete stored FRITZ!Box password in FHEM/uniqueID file upon deletion of a FB_CALLMONITOR definition diff --git a/fhem/FHEM/93_DbRep.pm b/fhem/FHEM/93_DbRep.pm index 562a953f6..09e98873b 100644 --- a/fhem/FHEM/93_DbRep.pm +++ b/fhem/FHEM/93_DbRep.pm @@ -37,7 +37,9 @@ ########################################################################################################################### # Versions History: # -# 5.8.6 30.10.2017 don't limit length of attr reading/device if attr contains a list +# 6.0.0 18.11.2017 FTP transfer dumpfile after dump, delete old dumpfiles within Blockingcall (avoid freezes) +# commandref revised, minor fixes +# 5.8.6 30.10.2017 don't limit attr reading, device if the attr contains a list # 5.8.5 19.10.2017 filter unwanted characters in "procinfo"-result # 5.8.4 17.10.2017 createSelectSql, createDeleteSql, currentfillup_Push switch to devspec # 5.8.3 16.10.2017 change to use createSelectSql: minValue,diffValue - createDeleteSql: delEntries @@ -245,7 +247,7 @@ use Encode qw(encode_utf8); sub DbRep_Main($$;$); -my $DbRepVersion = "5.8.6"; +my $DbRepVersion = "6.0.0"; my %dbrep_col = ("DEVICE" => 64, "TYPE" => 64, @@ -281,6 +283,16 @@ sub DbRep_Initialize($) { "executeBeforeDump ". "executeAfterDump ". "expimpfile ". + "ftpUse:1,0 ". + "ftpUser ". + "ftpUseSSL:1,0 ". + "ftpDebug:1,0 ". + "ftpDir ". + "ftpPassive:1,0 ". + "ftpPwd ". + "ftpPort ". + "ftpServer ". + "ftpTimeout ". "aggregation:hour,day,week,month,no ". "diffAccept ". "limit ". @@ -651,6 +663,16 @@ sub DbRep_Attr($$$$) { executeBeforeDump executeAfterDump expimpfile + ftpUse + ftpUser + ftpUseSSL + ftpDebug + ftpDir + ftpPassive + ftpPort + ftpPwd + ftpServer + ftpTimeout dumpMemlimit dumpComment dumpSpeed @@ -758,7 +780,7 @@ sub DbRep_Attr($$$$) { delete($attr{$name}{timeOlderThan}) if ($attr{$name}{timeOlderThan}); } - if ($aName eq "timeout" || $aName eq "diffAccept") { + if ($aName =~ /ftpTimeout|timeout|diffAccept/) { unless ($aVal =~ /^[0-9]+$/) { return " The Value of $aName is not valid. Use only figures 0-9 without decimal places !";} } @@ -791,6 +813,14 @@ sub DbRep_Attr($$$$) { delete($attr{$name}{timestamp_end}) if ($attr{$name}{timestamp_end}); delete($attr{$name}{timeDiffToNow}) if ($attr{$name}{timeDiffToNow}); } + + if ($aName eq "ftpUse") { + delete($attr{$name}{ftpUseSSL}); + } + + if ($aName eq "ftpUseSSL") { + delete($attr{$name}{ftpUse}); + } if ($aName eq "reading" || $aName eq "device") { if ($dbmodel && $dbmodel ne 'SQLITE') { @@ -4749,7 +4779,7 @@ sub DbRep_optimizeTables($) { if ($dbmodel =~ /POSTGRESQL/) { # Anfangsgröße ermitteln - $query = "SELECT pg_size_pretty(pg_database_size('fhemtest'))"; + $query = "SELECT pg_size_pretty(pg_database_size('$dbname'))"; Log3 ($name, 5, "DbRep $name - current query: $query "); eval { $sth = $dbh->prepare($query); $sth->execute; @@ -4787,7 +4817,7 @@ sub DbRep_optimizeTables($) { } # Endgröße ermitteln - $query = "SELECT pg_size_pretty(pg_database_size('fhemtest'))"; + $query = "SELECT pg_size_pretty(pg_database_size('$dbname'))"; Log3 ($name, 5, "DbRep $name - current query: $query "); eval { $sth = $dbh->prepare($query); $sth->execute; @@ -4928,7 +4958,7 @@ sub mysql_DoDumpClientSide($) { $err = encode_base64($@,""); Log3 ($name, 2, "DbRep $name - $@"); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } # SQL-Startzeit @@ -4943,7 +4973,7 @@ sub mysql_DoDumpClientSide($) { Log3 ($name, 2, "DbRep $name - $@"); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); $dbh->disconnect; - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } my @mysql_version = $sth->fetchrow; @@ -4997,7 +5027,7 @@ sub mysql_DoDumpClientSide($) { Log3 ($name, 2, "DbRep $name - Error executing: '".$query."' ! MySQL-Error: ".$@); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); $dbh->disconnect; - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } while ( $value = $sth->fetchrow_hashref()) { @@ -5062,7 +5092,7 @@ sub mysql_DoDumpClientSide($) { $err = encode_base64($@,""); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); $dbh->disconnect; - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } if($optimize_tables_beforedump) { @@ -5071,7 +5101,7 @@ sub mysql_DoDumpClientSide($) { ($err,$db_MB_start,$db_MB_end) = mysql_optimize_tables($hash,$dbh,@tablenames); if ($err) { $err = encode_base64($err,""); - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } } @@ -5100,7 +5130,7 @@ sub mysql_DoDumpClientSide($) { $err = encode_base64($@,""); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); $dbh->disconnect; - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } $db_tables{$tablename}{Rows} = $sth->fetchrow; $sth->finish; @@ -5142,7 +5172,7 @@ sub mysql_DoDumpClientSide($) { Log3 ($name, 2, "DbRep $name - $err"); $err = encode_base64($err,""); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } else { Log3 ($name, 5, "DbRep $name - New dumpfile $sql_file has been created."); } @@ -5178,7 +5208,7 @@ sub mysql_DoDumpClientSide($) { $err = encode_base64($@,""); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); $dbh->disconnect; - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } @ergebnis = $sth->fetchrow; @@ -5215,7 +5245,7 @@ sub mysql_DoDumpClientSide($) { $err = encode_base64($@,""); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); $dbh->disconnect; - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } while (@ar = $sth->fetchrow) { @@ -5251,7 +5281,7 @@ sub mysql_DoDumpClientSide($) { $err = encode_base64($@,""); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); $dbh->disconnect; - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } while ( @ar = $sth->fetchrow) { @@ -5304,6 +5334,15 @@ sub mysql_DoDumpClientSide($) { # SQL-Laufzeit ermitteln my $rt = tv_interval($st); + + # Dumpfile per FTP senden + my ($ftperr,$ftpmsg) = sendftp($hash,$sql_file); + my $ftp = $ftperr?encode_base64($ftperr,""):$ftpmsg?encode_base64($ftpmsg,""):0; + + # alte Dumpfiles löschen + my @fd = deldumpfiles($hash,$sql_file); + my $bfd = join(", ", @fd ); + $bfd = $bfd?encode_base64($bfd,""):0; # Background-Laufzeit ermitteln my $brt = tv_interval($bst); @@ -5313,7 +5352,7 @@ sub mysql_DoDumpClientSide($) { Log3 ($name, 3, "DbRep $name - Finished backup of database $dbname, total time used: ".sprintf("%.0f",$brt)." sec."); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); -return "$name|$rt|''|$sql_file|$drc|$drh|$filesize"; +return "$name|$rt|''|$sql_file|$drc|$drh|$filesize|$ftp|$bfd"; } #################################################################################################### @@ -5348,7 +5387,7 @@ sub mysql_DoDumpServerSide($) { $err = encode_base64($@,""); Log3 ($name, 2, "DbRep $name - $@"); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpServerSide finished"); - return "$name|''|$err|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } # Eigenschaften der vorhandenen Tabellen ermitteln (SHOW TABLE STATUS -> Rows sind nicht exakt !!) @@ -5367,7 +5406,7 @@ sub mysql_DoDumpServerSide($) { Log3 ($name, 2, "DbRep $name - Error executing: '".$query."' ! MySQL-Error: ".$@); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); $dbh->disconnect; - return "$name|''|$err|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } while ( $value = $sth->fetchrow_hashref()) { @@ -5396,7 +5435,7 @@ sub mysql_DoDumpServerSide($) { $err = encode_base64($@,""); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpClientSide finished"); $dbh->disconnect; - return "$name|''|$err|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } if($optimize_tables_beforedump) { @@ -5405,7 +5444,7 @@ sub mysql_DoDumpServerSide($) { ($err,$db_MB_start,$db_MB_end) = mysql_optimize_tables($hash,$dbh,@tablenames); if ($err) { $err = encode_base64($err,""); - return "$name|''|$err|''|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } } @@ -5436,7 +5475,7 @@ sub mysql_DoDumpServerSide($) { Log3 ($name, 2, "DbRep $name - $@"); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpServerSide finished"); $dbh->disconnect; - return "$name|''|$err|''|''|''"; + return "$name|''|$err|''|''|''|''|''|''"; } $sth->finish; @@ -5451,17 +5490,27 @@ sub mysql_DoDumpServerSide($) { $dump_path_loc = $dump_path_loc."/" unless($dump_path_loc =~ m/\/$/); my $filesize = (stat($dump_path_loc.$bfile))[7]?(stat($dump_path_loc.$bfile))[7]:"n.a."; + Log3 ($name, 3, "DbRep $name - Number of exported datasets: $drh"); + Log3 ($name, 3, "DbRep $name - Size of backupfile: ".byte_output($filesize)); + + # Dumpfile per FTP senden + my ($ftperr,$ftpmsg) = sendftp($hash,$bfile); + my $ftp = $ftperr?encode_base64($ftperr,""):$ftpmsg?encode_base64($ftpmsg,""):0; + + # alte Dumpfiles löschen + my @fd = deldumpfiles($hash,$bfile); + my $bfd = join(", ", @fd ); + $bfd = $bfd?encode_base64($bfd,""):0; + # Background-Laufzeit ermitteln my $brt = tv_interval($bst); $rt = $rt.",".$brt; Log3 ($name, 3, "DbRep $name - Finished backup of database $dbname - total time used: ".sprintf("%.0f",$brt)." seconds"); - Log3 ($name, 3, "DbRep $name - Number of exported datasets: $drh"); - Log3 ($name, 3, "DbRep $name - Size of backupfile: ".byte_output($filesize)); Log3 ($name, 4, "DbRep $name -> BlockingCall mysql_DoDumpServerSide finished"); -return "$name|$rt|''|$dump_path_rem$bfile|n.a.|$drh|$filesize"; +return "$name|$rt|''|$dump_path_rem$bfile|n.a.|$drh|$filesize|$ftp|$bfd"; } #################################################################################################### @@ -5478,6 +5527,8 @@ sub DumpDone($) { my $drc = $a[4]; my $drh = $a[5]; my $fs = $a[6]; + my $ftp = $a[7]?decode_base64($a[7]):undef; + my $bfd = $a[8]?decode_base64($a[8]):undef; my $name = $hash->{NAME}; my $erread; @@ -5496,16 +5547,13 @@ sub DumpDone($) { # only for this block because of warnings if details of readings are not set no warnings 'uninitialized'; - # alte Dumpfiles löschen - my @fd = deldumpfiles($hash,$bfile); - my $bfd = join(", ", @fd ); - readingsBeginUpdate($hash); ReadingsBulkUpdateValue($hash, "DumpFileCreated", $bfile); ReadingsBulkUpdateValue($hash, "DumpFileCreatedSize", $fs); ReadingsBulkUpdateValue($hash, "DumpFilesDeleted", $bfd); ReadingsBulkUpdateValue($hash, "DumpRowsCurrrent", $drc); ReadingsBulkUpdateValue($hash, "DumpRowsHistory", $drh); + ReadingsBulkUpdateValue($hash, "FTP_Message", $ftp) if($ftp); readingsEndUpdate($hash, 1); # Befehl nach Dump ausführen @@ -6122,13 +6170,120 @@ sub deldumpfiles ($$) { for(my $i = 0; $i < $max; $i++) { push(@fd, $files[$i]); - Log 3, "DbRep $name - Deleting old dumpfile '$files[$i]' "; + Log3($name, 3, "DbRep $name - Deleting old dumpfile '$files[$i]' "); unlink("$dump_path_loc/$files[$i]"); } return @fd; } +#################################################################################################### +# erzeugtes Dump-File aus dumpDirLocal zum FTP-Server übertragen +#################################################################################################### +sub sendftp ($$) { + my ($hash,$bfile) = @_; + my $name = $hash->{NAME}; + my $dbloghash = $hash->{dbloghash}; + my $dump_path_def = $attr{global}{modpath}."/log/"; + my $dump_path_loc = AttrVal($name,"dumpDirLocal", $dump_path_def); + my $file = (split /[\/]/, $bfile)[-1]; + my $ftpto = AttrVal($name,"ftpTimeout",30); + my $ftpUse = AttrVal($name,"ftpUse",0); + my $ftpuseSSL = AttrVal($name,"ftpUseSSL",0); + my $ftpDir = AttrVal($name,"ftpDir","/"); + my $ftpPort = AttrVal($name,"ftpPort",21); + my $ftpServer = AttrVal($name,"ftpServer",undef); + my $ftpUser = AttrVal($name,"ftpUser","anonymous"); + my $ftpPwd = AttrVal($name,"ftpPwd",undef); + my $ftpPassive = AttrVal($name,"ftpPassive",0); + my $ftpDebug = AttrVal($name,"ftpDebug",0); + my ($ftperr,$ftpmsg,$ftp); + + # kein FTP verwenden oder möglich + return ($ftperr,$ftpmsg) if((!$ftpUse && !$ftpuseSSL) || !$bfile); + + if(!$ftpServer) { + $ftperr = "FTP-Error: FTP-Server isn't set."; + Log3($name, 2, "DbRep $name - $ftperr"); + return ($ftperr,undef); + } + + if(!opendir(DH, $dump_path_loc)) { + $ftperr = "FTP-Error: Can't open path '$dump_path_loc'"; + Log3($name, 2, "DbRep $name - $ftperr"); + return ($ftperr,undef); + } + + my $mod_ftpssl = 0; + my $mod_ftp = 0; + my $mod; + + if ($ftpuseSSL) { + # FTP mit SSL soll genutzt werden + $mod = "Net::FTPSSL => e.g. with 'sudo cpan -i Net::FTPSSL' "; + eval { require Net::FTPSSL; }; + if(!$@){ + $mod_ftpssl = 1; + import Net::FTPSSL; + } + } else { + # nur FTP + $mod = "Net::FTP"; + eval { require Net::FTP; }; + if(!$@){ + $mod_ftp = 1; + import Net::FTP; + } + } + + if ($ftpuseSSL && $mod_ftpssl) { + # use ftp-ssl + my $enc = "E"; + eval { $ftp = Net::FTPSSL->new($ftpServer, Port => $ftpPort, Timeout => $ftpto, Debug => $ftpDebug, Encryption => $enc) } + or $ftperr = "FTP-SSL-ERROR: Can't connect - $@"; + } elsif (!$ftpuseSSL && $mod_ftp) { + # use plain ftp + eval { $ftp = Net::FTP->new($ftpServer, Port => $ftpPort, Timeout => $ftpto, Debug => $ftpDebug, Passive => $ftpPassive) } + or $ftperr = "FTP-Error: Can't connect - $@"; + } else { + $ftperr = "FTP-Error: required module couldn't be loaded. You have to install it first: $mod."; + } + if ($ftperr) { + Log3($name, 2, "DbRep $name - $ftperr"); + return ($ftperr,undef); + } + + my $pwdstr = $ftpPwd?$ftpPwd:" "; + $ftp->login($ftpUser, $ftpPwd) or $ftperr = "FTP-Error: Couldn't login with user '$ftpUser' and password '$pwdstr' "; + if ($ftperr) { + Log3($name, 2, "DbRep $name - $ftperr"); + return ($ftperr,undef); + } + + $ftp->binary(); + + # FTP Verzeichnis setzen + $ftp->cwd($ftpDir) or $ftperr = "FTP-Error: Couldn't change directory to '$ftpDir' "; + if ($ftperr) { + Log3($name, 2, "DbRep $name - $ftperr"); + return ($ftperr,undef); + } + + $dump_path_loc =~ s/(\/$|\\$)//; + Log3($name, 3, "DbRep $name - FTP: transferring ".$dump_path_loc."/".$file); + + $ftpmsg = $ftp->put($dump_path_loc."/".$file); + if (!$ftpmsg) { + $ftperr = "FTP-Error: Couldn't transfer ".$file." to ".$ftpServer." into dir ".$ftpDir; + Log3($name, 2, "DbRep $name - $ftperr"); + } else { + $ftpmsg = "FTP: ".$file." transferred successfully to ".$ftpServer." into dir ".$ftpDir; + Log3($name, 3, "DbRep $name - $ftpmsg"); + } + +return ($ftperr,$ftpmsg); +} + #################################################################################################### # Browser Refresh nach DB-Abfrage #################################################################################################### @@ -6292,6 +6447,7 @@ return;
  • automatic rename of device names in datasets and other DbRep-definitions after FHEM "rename" command (see DbRep-Agent)
  • Execution of arbitrary user specific SQL-commands
  • creation of backups non-blocking (MySQL)
  • +
  • transfer dumpfiles to a FTP server after backup
  • restore of serverSide-backups non-blocking (MySQL)
  • optimize the connected database (optimizeTables, vacuum)
  • report of existing database processes (MySQL)
  • @@ -6319,7 +6475,9 @@ return; Only the content of table "history" will be included if isn't other is explained.

    Overview which other Perl-modules DbRep is using:

    - + + Net::FTP (only if FTP-Transfer after database dump is used)
    + Net::FTPSSL (only if FTP-Transfer with encoding after database dump is used)
    POSIX
    Time::HiRes
    Time::Local
    @@ -6426,7 +6584,8 @@ return; tables inclusive possibly created views.

    - Option clientSide
    + +
  • exportToFile - exports DB-entries to a file in CSV-format between period given by timestamp. @@ -6904,6 +7090,29 @@ sub bdump {
  • expimpfile - Path/filename for data export/import

  • +
  • ftpUse - FTP Transfer after dump will be switched on (without SSL encoding). The created + database backup file will be transfered non-blocking to the FTP-Server (Attribut "ftpServer"). +

  • + +
  • ftpUseSSL - FTP Transfer with SSL encoding after dump. The created database backup file will be transfered + non-blocking to the FTP-Server (Attribut "ftpServer").

  • + +
  • ftpUser - User for FTP-server login, default: "anonymous".

  • + +
  • ftpDebug - debugging of FTP communication for diagnostics.

  • + +
  • ftpDir - directory on FTP-server in which the file will be send into (default: "/").

  • + +
  • ftpPassive - set if passive FTP is to be used

  • + +
  • ftpPort - FTP-Port, default: 21

  • + +
  • ftpPwd - password of FTP-User, is not set by default

  • + +
  • ftpServer - name or IP-address of FTP-server. absolutely essential !

  • + +
  • ftpTimeout - timeout of FTP-connection in seconds (default: 30).

  • +
  • limit - limits the number of selected datasets by the "fetchrows" command (default 1000). This limitation should prevent the browser session from overload and @@ -6993,7 +7202,7 @@ sub bdump { Every hash-element consists of the serial number of the dataset (key) and its value.


  • - -
    + +
  • timestamp_begin - begin of data selection (*)

  • @@ -7120,9 +7329,8 @@ sub bdump {

    - - - + + Readings @@ -7251,6 +7459,7 @@ sub bdump { Befehl (siehe DbRep-Agent)
  • Ausführen von beliebigen Benutzer spezifischen SQL-Kommandos
  • Backups der FHEM-Datenbank erstellen (MySQL)
  • +
  • senden des Dumpfiles zu einem FTP-Server nach dem Backup
  • Restore von serverSide-Backups (MySQL)
  • Optimierung der angeschlossenen Datenbank (optimizeTables, vacuum)
  • Ausgabe der existierenden Datenbankprozesse (MySQL)
  • @@ -7279,6 +7488,8 @@ sub bdump { Überblick welche anderen Perl-Module DbRep verwendet:

    + Net::FTP (nur wenn FTP-Transfer nach Datenbank-Dump genutzt wird)
    + Net::FTPSSL (nur wenn FTP-Transfer mit Verschlüsselung nach Datenbank-Dump genutzt wird)
    POSIX
    Time::HiRes
    Time::Local
    @@ -7393,7 +7604,8 @@ sub bdump { Tabellen inklusive eventuell angelegter Views.

    - Option clientSide
    +
  • exportToFile - exportiert DB-Einträge im CSV-Format in den gegebenen Zeitgrenzen. @@ -7495,6 +7734,7 @@ sub bdump { geändert werden falls eine Anpassung der Selektionsbedingungen nicht möglich oder gewünscht ist.


  • +
  • insert - Manuelles Einfügen eines Datensatzes in die Tabelle "history". Obligatorisch sind Eingabewerte für Datum, Zeit und Value. Die Werte für die DB-Felder Type bzw. Event werden mit "manual" gefüllt, sowie die Werte für Device, Reading aus den gesetzten Attributen genommen.

    @@ -7883,6 +8123,30 @@ sub bdump {
  • expimpfile - Pfad/Dateiname für Export/Import in/aus einem File.

  • +
  • ftpUse - FTP Transfer nach dem Dump wird eingeschaltet (ohne SSL Verschlüsselung). Das erzeugte + Datenbank Backupfile wird non-blocking zum angegebenen FTP-Server (Attribut "ftpServer") + übertragen.

  • + +
  • ftpUseSSL - FTP Transfer mit SSL Verschlüsselung nach dem Dump wird eingeschaltet. Das erzeugte + Datenbank Backupfile wird non-blocking zum angegebenen FTP-Server (Attribut "ftpServer") + übertragen.

  • + +
  • ftpUser - User zur Anmeldung am FTP-Server, default: "anonymous".

  • + +
  • ftpDebug - Debugging der FTP Kommunikation zur Fehlersuche.

  • + +
  • ftpDir - Verzeichnis des FTP-Servers in welches das File übertragen werden soll (default: "/").

  • + +
  • ftpPassive - setzen wenn passives FTP verwendet werden soll

  • + +
  • ftpPort - FTP-Port, default: 21

  • + +
  • ftpPwd - Passwort des FTP-Users, default nicht gesetzt

  • + +
  • ftpServer - Name oder IP-Adresse des FTP-Servers. notwendig !

  • + +
  • ftpTimeout - Timeout für die FTP-Verbindung in Sekunden (default: 30).

  • +
  • limit - begrenzt die Anzahl der resultierenden Datensätze im select-Statement von "fetchrows" (default 1000). Diese Limitierung soll eine Überlastung der Browsersession und ein @@ -7969,7 +8233,7 @@ sub bdump { JSON-kodierten Hash. Jedes Hash-Element (Ergebnissatz) setzt sich aus der laufenden Nummer des Datensatzes (Key) und dessen Wert zusammen.


  • - +
  • timestamp_begin - der zeitliche Beginn für die Datenselektion (*)