diff --git a/scripts/restore.php b/scripts/restore.php new file mode 100644 index 0000000..e2415be --- /dev/null +++ b/scripts/restore.php @@ -0,0 +1,99 @@ + 0) ? $chunks : 1; + $pID = shell_exec("nohup $home/BirdNET-Pi/scripts/read_chunks.sh -n $read_chunks -f $pipe | sudo -u $user $home/BirdNET-Pi/scripts/backup_data.sh -a restore -f - > $log 2>&1 & echo $!"); + $_SESSION['pID'] = $pID; +} + +// Open pipe +if (!$out = @fopen("{$pipe}", "ab")) { + die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); +} + +if (!empty($_FILES)) { + if ($_FILES["file"]["error"] || !is_uploaded_file($_FILES["file"]["tmp_name"])) { + die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}'); + } + + // Read binary input stream and append it to temp file + if (!$in = @fopen($_FILES["file"]["tmp_name"], "rb")) { + die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); + } +} else { + if (!$in = @fopen("php://input", "rb")) { + die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}'); + } +} + +while ($buff = fread($in, 4096)) { + fwrite($out, $buff); +} + +@fclose($out); +@fclose($in); + +// Check if file has been uploaded +if (!$chunks || $chunk == $chunks - 1) { + $pID = $_SESSION['pID']; + exec("ps $pID", $ProcessState); + + $i = 0; + while ($i < 100 && count($ProcessState) >= 2) { + unset($ProcessState); + exec("ps $pID", $ProcessState); + $i++; + usleep(200000); + } + unlink($pipe); + unset($_SESSION['pID']); +} + +// Return Success JSON-RPC response +die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');