2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-09 20:57:11 +00:00

93_DbRep: V6.0.0, FTP transfer dumpfile after dump (MySQL), delete old dumpfiles within Blockingcall, minor fixes

git-svn-id: https://svn.fhem.de/fhem/trunk@15446 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2017-11-18 19:18:56 +00:00
parent 21bfd25bae
commit b37e90ee21
2 changed files with 313 additions and 47 deletions

View File

@ -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

View File

@ -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;
<li> automatic rename of device names in datasets and other DbRep-definitions after FHEM "rename" command (see <a href="#DbRepAutoRename">DbRep-Agent</a>) </li>
<li> Execution of arbitrary user specific SQL-commands </li>
<li> creation of backups non-blocking (MySQL) </li>
<li> transfer dumpfiles to a FTP server after backup </li>
<li> restore of serverSide-backups non-blocking (MySQL) </li>
<li> optimize the connected database (optimizeTables, vacuum) </li>
<li> report of existing database processes (MySQL) </li>
@ -6319,7 +6475,9 @@ return;
Only the content of table "history" will be included if isn't other is explained. <br><br>
Overview which other Perl-modules DbRep is using: <br><br>
Net::FTP (only if FTP-Transfer after database dump is used) <br>
Net::FTPSSL (only if FTP-Transfer with encoding after database dump is used) <br>
POSIX <br>
Time::HiRes <br>
Time::Local <br>
@ -6426,7 +6584,8 @@ return;
tables inclusive possibly created views.
<br><br>
<b>Option clientSide</b> <br>
<ul>
<b><u>Option clientSide</u></b> <br>
The dump will be created by client (FHEM-Server) and will be saved in FHEM log-directory by
default.
The target directory can be set by <a href="#DbRepattr">attribute</a> "dumpDirLocal" and has to be
@ -6459,7 +6618,7 @@ return;
to restore the database from the dump. <br><br><br>
<b>Option serverSide</b> <br>
<b><u>Option serverSide</u></b> <br>
The dump will be created on the MySQL-Server and will be saved in its Home-directory
by default. <br>
The whole history-table (not the current-table) will be exported <b>CSV-formatted</b> without
@ -6485,7 +6644,9 @@ return;
If the internal version management of DbRep should be used and the size of the created dumpfile be
reported, you have to mount the remote MySQL-Server directory "dumpDirRemote" on the client
and publish it to the DbRep-device by fill out the <a href="#DbRepattr">attribute</a>
"dumpDirLocal". <br><br>
"dumpDirLocal". <br>
Same is necessary if ftp transfer after dump is to be used (attribute "ftpUse" respectively "ftpUseSSL").
<br><br>
<ul>
<b>Example: </b> <br>
@ -6512,7 +6673,32 @@ return;
set &lt;name&gt; &lt;restoreMySQL&gt; &lt;filename&gt;.csv <br><br>
</ul>
<br>
<br><br>
<b><u>FTP-Transfer after Dump</u></b> <br>
If those possibility is be used, the <a href="#DbRepattr">attribute</a> "ftpUse" or
"ftpUseSSL" has to be set. The latter if encoding for FTP is to be used. <br>
Further <a href="#DbRepattr">attributes</a> are: <br><br>
<ul>
<table>
<colgroup> <col width=5%> <col width=95%> </colgroup>
<tr><td> ftpUse </td><td>: FTP Transfer after dump will be switched on (without SSL encoding) </td></tr>
<tr><td> ftpUser </td><td>: User for FTP-server login, default: anonymous </td></tr>
<tr><td> ftpUseSSL </td><td>: FTP Transfer with SSL encoding after dump </td></tr>
<tr><td> ftpDebug </td><td>: debugging of FTP communication for diagnostics </td></tr>
<tr><td> ftpDir </td><td>: directory on FTP-server in which the file will be send into (default: "/") </td></tr>
<tr><td> ftpPassive </td><td>: set if passive FTP is to be used </td></tr>
<tr><td> ftpPort </td><td>: FTP-Port, default: 21 </td></tr>
<tr><td> ftpPwd </td><td>: password of FTP-User, not set by default </td></tr>
<tr><td> ftpServer </td><td>: name or IP-address of FTP-server. <b>absolutely essential !</b> </td></tr>
<tr><td> ftpTimeout </td><td>: timeout of FTP-connection in seconds (default: 30). </td></tr>
</table>
</ul>
<br>
<br>
</ul>
</li><br>
<li><b> exportToFile </b> - exports DB-entries to a file in CSV-format between period given by timestamp.
@ -6904,6 +7090,29 @@ sub bdump {
<li><b>expimpfile </b> - Path/filename for data export/import </li> <br>
<li><b>ftpUse </b> - 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").
</li> <br>
<li><b>ftpUseSSL </b> - FTP Transfer with SSL encoding after dump. The created database backup file will be transfered
non-blocking to the FTP-Server (Attribut "ftpServer"). </li> <br>
<li><b>ftpUser </b> - User for FTP-server login, default: "anonymous". </li> <br>
<li><b>ftpDebug </b> - debugging of FTP communication for diagnostics. </li> <br>
<li><b>ftpDir </b> - directory on FTP-server in which the file will be send into (default: "/"). </li> <br>
<li><b>ftpPassive </b> - set if passive FTP is to be used </li> <br>
<li><b>ftpPort </b> - FTP-Port, default: 21 </li> <br>
<li><b>ftpPwd </b> - password of FTP-User, is not set by default </li> <br>
<li><b>ftpServer </b> - name or IP-address of FTP-server. <b>absolutely essential !</b> </li> <br>
<li><b>ftpTimeout </b> - timeout of FTP-connection in seconds (default: 30). </li> <br>
<a name="DbRepattrlimit"></a>
<li><b>limit </b> - 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. </li> <br><br>
<ul>
To process the result, you may use a userExitFn in 99_myUtils for example: <br>
<pre>
sub resfromjson {
@ -7018,8 +7227,8 @@ sub bdump {
return;
}
</pre>
</ul> </ul>
</ul><br>
</ul>
<br>
<li><b>timestamp_begin </b> - begin of data selection (*) </li> <br>
@ -7120,9 +7329,8 @@ sub bdump {
</ul>
</li>
<br><br>
</ul></ul>
</ul>
</ul></ul></ul>
<a name="DbRepReadings"></a>
<b>Readings</b>
@ -7251,6 +7459,7 @@ sub bdump {
Befehl (siehe <a href="#DbRepAutoRename">DbRep-Agent</a>) </li>
<li> Ausführen von beliebigen Benutzer spezifischen SQL-Kommandos </li>
<li> Backups der FHEM-Datenbank erstellen (MySQL) </li>
<li> senden des Dumpfiles zu einem FTP-Server nach dem Backup </li>
<li> Restore von serverSide-Backups (MySQL) </li>
<li> Optimierung der angeschlossenen Datenbank (optimizeTables, vacuum) </li>
<li> Ausgabe der existierenden Datenbankprozesse (MySQL) </li>
@ -7279,6 +7488,8 @@ sub bdump {
Überblick welche anderen Perl-Module DbRep verwendet: <br><br>
Net::FTP (nur wenn FTP-Transfer nach Datenbank-Dump genutzt wird) <br>
Net::FTPSSL (nur wenn FTP-Transfer mit Verschlüsselung nach Datenbank-Dump genutzt wird) <br>
POSIX <br>
Time::HiRes <br>
Time::Local <br>
@ -7393,7 +7604,8 @@ sub bdump {
Tabellen inklusive eventuell angelegter Views.
<br><br>
<b>Option clientSide</b> <br>
<ul>
<b><u>Option clientSide</u></b> <br>
Der Dump wird durch den Client (FHEM-Rechner) erstellt und per default im log-Verzeichnis des Clients
gespeichert.
Das Zielverzeichnis kann mit dem <a href="#DbRepattr">Attribut</a> "dumpDirLocal" verändert werden und muß auf
@ -7425,7 +7637,7 @@ sub bdump {
auf dem MySQL-Server ausgeführt werden um die Datenbank aus dem Dump wiederherzustellen. <br><br>
<br>
<b>Option serverSide</b> <br>
<b><u>Option serverSide</u></b> <br>
Der Dump wird durch den MySQL-Server erstellt und per default im Home-Verzeichnis des MySQL-Servers
gespeichert. <br>
Es wird die gesamte history-Tabelle (nicht current-Tabelle) <b>im CSV-Format</b> ohne
@ -7449,7 +7661,9 @@ sub bdump {
<b>Hinweis:</b> <br>
Soll die interne Versionsverwaltung des Moduls genutzt und die Größe des erzeugten Dumpfiles
ausgegeben werden, ist das Verzeichnis "dumpDirRemote" des MySQL-Servers auf dem Client zu mounten
und im <a href="#DbRepattr">Attribut</a> "dumpDirLocal" dem DbRep-Device bekannt zu machen. <br><br>
und im <a href="#DbRepattr">Attribut</a> "dumpDirLocal" dem DbRep-Device bekannt zu machen. <br>
Gleiches gilt wenn der FTP-Transfer nach dem Dump genutzt werden soll (Attribut "ftpUse" bzw. "ftpUseSSL").
<br><br>
<ul>
<b>Beispiel: </b> <br>
@ -7475,8 +7689,33 @@ sub bdump {
set &lt;name&gt; &lt;restoreMySQL&gt; &lt;filename&gt;.csv <br><br>
</ul>
gestartet werden. <br><br>
gestartet werden. <br><br>
<b><u>FTP Transfer nach Dump</u></b> <br>
Wenn diese Möglichkeit genutzt werden soll, ist das <a href="#DbRepattr">Attribut</a> "ftpUse" oder
"ftpUseSSL" zu setzen. Letzteres gilt wenn Verschlüsselung genutzt werden soll. <br>
Weitere <a href="#DbRepattr">Attribute</a> sind: <br><br>
<ul>
<table>
<colgroup> <col width=5%> <col width=95%> </colgroup>
<tr><td> ftpUse </td><td>: FTP Transfer nach dem Dump wird eingeschaltet (ohne SSL Verschlüsselung) </td></tr>
<tr><td> ftpUser </td><td>: User zur Anmeldung am FTP-Server, default: anonymous </td></tr>
<tr><td> ftpUseSSL </td><td>: FTP Transfer mit SSL Verschlüsselung nach dem Dump wird eingeschaltet </td></tr>
<tr><td> ftpDebug </td><td>: Debugging des FTP Verkehrs zur Fehlersuche </td></tr>
<tr><td> ftpDir </td><td>: Verzeichnis auf dem FTP-Server in welches das File übertragen werden soll (default: "/") </td></tr>
<tr><td> ftpPassive </td><td>: setzen wenn passives FTP verwendet werden soll </td></tr>
<tr><td> ftpPort </td><td>: FTP-Port, default: 21 </td></tr>
<tr><td> ftpPwd </td><td>: Passwort des FTP-Users, default nicht gesetzt </td></tr>
<tr><td> ftpServer </td><td>: Name oder IP-Adresse des FTP-Servers. <b>notwendig !</b> </td></tr>
<tr><td> ftpTimeout </td><td>: Timeout für die FTP-Verbindung in Sekunden (default: 30). </td></tr>
</table>
</ul>
<br>
<br>
</ul>
</li><br>
<li><b> exportToFile </b> - 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. <br><br>
</li> <br>
<li><b> insert </b> - 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 <a href="#DbRepattr">Attributen </a> genommen. <br><br>
@ -7883,6 +8123,30 @@ sub bdump {
<li><b>expimpfile </b> - Pfad/Dateiname für Export/Import in/aus einem File. </li> <br>
<li><b>ftpUse </b> - 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. </li> <br>
<li><b>ftpUseSSL </b> - 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. </li> <br>
<li><b>ftpUser </b> - User zur Anmeldung am FTP-Server, default: "anonymous". </li> <br>
<li><b>ftpDebug </b> - Debugging der FTP Kommunikation zur Fehlersuche. </li> <br>
<li><b>ftpDir </b> - Verzeichnis des FTP-Servers in welches das File übertragen werden soll (default: "/"). </li> <br>
<li><b>ftpPassive </b> - setzen wenn passives FTP verwendet werden soll </li> <br>
<li><b>ftpPort </b> - FTP-Port, default: 21 </li> <br>
<li><b>ftpPwd </b> - Passwort des FTP-Users, default nicht gesetzt </li> <br>
<li><b>ftpServer </b> - Name oder IP-Adresse des FTP-Servers. <b>notwendig !</b> </li> <br>
<li><b>ftpTimeout </b> - Timeout für die FTP-Verbindung in Sekunden (default: 30). </li> <br>
<a name="DbRepattrlimit"></a>
<li><b>limit </b> - 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. </li><br><br>
<ul>
Die Weiterverarbeitung des Ergebnisses kann z.B. mit der folgenden userExitFn in 99_myUtils.pm erfolgen: <br>
<pre>
sub resfromjson {
@ -7994,7 +8258,7 @@ sub bdump {
return;
}
</pre>
</ul>
</ul><br>
<li><b>timestamp_begin </b> - der zeitliche Beginn für die Datenselektion (*) </li> <br>