2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-13 23:36:37 +00:00

50_SSFile.pm: contrib Version 0.7.0

git-svn-id: https://svn.fhem.de/fhem/trunk@23079 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2020-11-02 23:35:01 +00:00
parent 3de0ac60e7
commit c935998ddb

View File

@ -122,7 +122,8 @@ BEGIN {
readingsEndUpdate
readingsSingleUpdate
setKeyValue
urlEncode
urlEncode
urlDecode
)
);
@ -142,6 +143,7 @@ BEGIN {
# Versions History intern
my %vNotesIntern = (
"0.7.0" => "02.11.2020 new set command deleteRemoteObj, fix download object with space in name ",
"0.6.0" => "30.10.2020 Upload files may contain wildcards *. ",
"0.5.0" => "26.10.2020 new Setter Upload and fillup upload queue asynchronously, some more improvements around Upload ",
"0.4.0" => "18.10.2020 add reqtype to addSendqueue, new Setter prepareDownload ",
@ -163,6 +165,7 @@ my %hset = ( # Ha
prepareUpload => { fn => \&_setUpload, needcred => 1 },
listUploadsDone => { fn => \&_setlistUploadsDone, needcred => 0 },
deleteUploadsDone => { fn => \&_setdeleteUploadsDone, needcred => 0 },
deleteRemoteObject => { fn => \&_setdeleteRemoteObject, needcred => 1 },
);
my %hget = ( # Hash für Get-Funktion (needcred => 1: Funktion benötigt gesetzte Credentials)
@ -183,6 +186,7 @@ my %hmodep = ( # Ha
remoteFileInfo => { fn => \&_parseFiFo, doevt => 1 },
download => { fn => \&_parseDownload, doevt => 1 },
upload => { fn => \&_parseUpload, doevt => 1 },
deleteRemoteObj => { fn => \&_parsedeleteRemoteObject, doevt => 1 },
);
# Versions History extern
@ -462,6 +466,7 @@ sub Set {
if($hash->{CREDENTIALS}) {
$setlist .= "credentials ".
"deleteUploadsDone:noArg ".
"deleteRemoteObject:textField-long ".
"Download:textField-long ".
"Upload:textField-long ".
"eraseReadings:noArg ".
@ -848,6 +853,57 @@ sub _setdeleteUploadsDone {
return;
}
######################################################################################
# Setter _setdeleteRemoteObject
######################################################################################
sub _setdeleteRemoteObject {
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $opt = $paref->{opt};
my $arg = $paref->{arg};
if(!$arg) {
return qq{The command "$opt" needs an argument !}
}
delReadings ($name, 0);
$arg = smUrlEncode ($arg);
my ($a,$h) = parseParams ($arg);
my $fp = $a->[0];
if(!$fp) {
return qq{No source file or directory specified for upload !}
}
my $recursive = $h->{recursive} // "true"; # true: Dateien rekursiv löschen innerhalb eines Ordners, false: Nur Datei/Ordner der ersten Ebene löschen
my @del = split ",", $fp;
for my $dl (@del) {
$dl =~ s/"//xg;
$dl = qq{"$dl"};
my $params = {
name => $name,
opmode => "deleteRemoteObj",
api => "DELETE",
method => "delete",
params => "&recursive=$recursive&path=$dl",
reqtype => "GET",
header => "Accept: application/json",
timeout => 600,
};
addSendqueue ($params);
}
getApiSites ($name); # Queue starten
return;
}
######################################################################################
# Getter
######################################################################################
@ -1246,7 +1302,7 @@ sub getApiSites {
readingsBeginUpdate ($hash);
readingsBulkUpdate ($hash, "state", "running");
readingsEndUpdate ($hash,1);
readingsEndUpdate ($hash, 1);
if ($hash->{OPMODE} eq "apiInfo") {
$data{$type}{$name}{fileapi}{PARSET} = 0; # erzwinge Abruf API
@ -1257,12 +1313,12 @@ sub getApiSites {
return checkSID($name);
}
my $timeout = AttrVal($name,"timeout",20);
my $timeout = AttrVal($name, "timeout", 20);
Log3($name, 5, "$name - HTTP-Call will be done with timeout: $timeout s");
# API initialisieren und abrufen
####################################
$data{$type}{$name}{fileapi} = apistatic ("file"); # API Template im HELPER instanziieren
$data{$type}{$name}{fileapi} = apistatic ("file"); # API Template im HELPER instanziieren
Log3 ($name, 4, "$name - API imported:\n".Dumper $data{$type}{$name}{fileapi});
@ -1415,14 +1471,14 @@ sub execOp {
my $reqtype = $data{$type}{$name}{sendqueue}{entries}{$idx}{reqtype};
my $header = $data{$type}{$name}{sendqueue}{entries}{$idx}{header};
my $postdata = $data{$type}{$name}{sendqueue}{entries}{$idx}{postdata};
my $toutdef = $data{$type}{$name}{sendqueue}{entries}{$idx}{timeout} // 20;
my $fileapi = $data{$type}{$name}{fileapi};
my ($url,$timeout,$param,$error,$errorcode);
Log3($name, 4, "$name - start SendQueue entry index \"$idx\" ($hash->{OPMODE}) for operation.");
$timeout = AttrVal($name, "timeout", 20);
my ($url,$param,$error,$errorcode);
my $timeout = AttrVal($name, "timeout", $toutdef);
Log3($name, 4, "$name - start SendQueue entry index \"$idx\" ($hash->{OPMODE}) for operation.");
Log3($name, 5, "$name - HTTP-Call will be done with timeout: $timeout s");
$param = {
@ -1800,24 +1856,30 @@ sub _parseDownload {
my $hash = $paref->{hash};
my $jdata = $paref->{jdata};
my $param = $paref->{param};
my $href = $paref->{href};
my $head = $param->{httpheader};
my $name = $hash->{NAME};
my $type = $hash->{TYPE};
my $idx = $hash->{OPIDX};
my $obj = (split "=", $data{$type}{$name}{sendqueue}{entries}{$idx}{params})[1];
my $obj = urlDecode ((split "=", $data{$type}{$name}{sendqueue}{entries}{$idx}{params})[1]);
Log3 ($name, 5, "$name - Header returned:\n".$head);
if($head =~ /404\sNot\sFound/xms) {
Log3 ($name, 2, qq{$name - Object $obj not found for download});
Log3 ($name, 2, qq{$name - ERROR - Object $obj not found for download});
return 9002; # return Errorcode
}
if($head =~ /400\sBad\sRequest/xms) {
Log3 ($name, 2, qq{$name - ERROR - Object $obj - Bad Request});
return 9003; # return Errorcode
}
my $err;
my $sp = q{};
my $dest = $data{$type}{$name}{sendqueue}{entries}{$idx}{dest};
my $dest = urlDecode ($data{$type}{$name}{sendqueue}{entries}{$idx}{dest});
open my $fh, '>', $dest or do { $err = qq{Can't open file "$dest": $!};
Log3($name, 2, "$name - $err");
@ -1830,7 +1892,9 @@ sub _parseDownload {
close $fh;
}
Log3 ($name, 3, qq{$name - Object downloaded to "$dest"});
$href->{LocalFile} = $dest;
Log3 ($name, 3, qq{$name - Object $obj downloaded to "$dest"});
return;
}
@ -1879,6 +1943,30 @@ sub _parseUpload {
return;
}
#############################################################################################
# delete Objekt parse Funktion
# $jdata: decodierte received JSON Data
# $href: Referenz zum Hash für erstellte Readings
#############################################################################################
sub _parsedeleteRemoteObject {
my $paref = shift;
my $hash = $paref->{hash};
my $jdata = $paref->{jdata};
my $href = $paref->{href};
my $name = $hash->{NAME};
my $type = $hash->{TYPE};
my $idx = $hash->{OPIDX};
my $obj = urlDecode ((split "path=", $data{$type}{$name}{sendqueue}{entries}{$idx}{params})[1]);
Log3 ($name, 3, qq{$name - remote Object $obj deleted});
$href->{deletedRemoteFile} = $obj;
return;
}
#############################################################################################
# check SID
#############################################################################################