From a9628275997b3a97e59df6fff9578d4f551b8721 Mon Sep 17 00:00:00 2001 From: Sebastien Clement Date: Sat, 28 Dec 2019 12:50:36 +0100 Subject: [PATCH] Add upload methods --- .../rootfs/opt/nextcloud_backup/routes/api.js | 14 ++-- .../nextcloud_backup/tools/hassioApiTools.js | 17 +++-- .../opt/nextcloud_backup/tools/webdavTools.js | 66 ++++++++++++++++--- .../opt/nextcloud_backup/views/index.ejs | 9 ++- .../opt/nextcloud_backup/views/localSnaps.ejs | 6 +- 5 files changed, 85 insertions(+), 27 deletions(-) diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js b/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js index e553b34..3a66c26 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/routes/api.js @@ -79,13 +79,15 @@ router.get('/nextcloud-settings', function(req, res, next) { router.post('/manual-backup', function(req, res, next) { let id = req.query.id; - hassioApiTools.downloadSnapshot(id) - .then(() => { + let name = req.query.name; + // hassioApiTools.downloadSnapshot(id) + // .then(() => { + webdav.uploadFile('8afb4728', '/Hassio Backup/Manual/' + '8afb4728' + '.tar'); res.send(200); - }) - .catch(() => { - res.send(500); - }) + // }) + // .catch(() => { + // res.send(500); + // }) }); diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/hassioApiTools.js b/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/hassioApiTools.js index c1bb568..a09f843 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/hassioApiTools.js +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/hassioApiTools.js @@ -38,6 +38,7 @@ function getSnapshots() { status.message = "Fail to fetch Hassio snapshot (" + error + ")"; status.error_code = 1; statusTools.setStatus(status); + console.error(status.message); reject(error); } }) @@ -47,8 +48,10 @@ function getSnapshots() { function downloadSnapshot(id) { return new Promise((resolve, reject) => { - - let stream = fs.createWriteStream('./' + id + '.tar'); + console.log('Downloading snapshot ' + id + '...') + if(!fs.existsSync('./temp/')) + fs.mkdirSync('./temp/'); + let stream = fs.createWriteStream('./temp/' + id + '.tar'); let token = process.env.HASSIO_TOKEN; if (token == null) { token = fallbackToken @@ -64,27 +67,31 @@ function downloadSnapshot(id) { } progress(request(option)) .on('progress', (state) => { + // TODO Don't write progress to disk, preseve disk IO time status.progress = state.percent; statusTools.setStatus(status); }) .on('error', (error) => { status.status = "error"; - status.message = "Fail to downloadw Hassio snapshot (" + error + ")"; + status.message = "Fail to download Hassio snapshot (" + error + ")"; status.error_code = 4; statusTools.setStatus(status); + console.error(status.message); reject(error); }) .on('end', () => { - console.log('end') + console.log('Download success !') status.progress = 1; statusTools.setStatus(status); + resolve(); }) .pipe(stream); }).catch(() => { status.status = "error"; - status.message = "Fail to downloadw Hassio snapshot"; + status.message = "Fail to download Hassio snapshot. Not found ?"; status.error_code = 4; statusTools.setStatus(status); + console.error(status.message); reject(); }); diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js b/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js index 39f70df..3c9a182 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js @@ -1,5 +1,6 @@ const { createClient } = require("webdav"); const fs = require("fs"); + const statusTools = require('./status'); const endpoint = "/remote.php/webdav" const configPath = "./webdav_conf.json" @@ -16,6 +17,7 @@ class WebdavTools { let url = (ssl ? "https" : "http") + "://" + host + endpoint; try { this.client = createClient(url, { username: username, password: password }); + this.client.getDirectoryContents("/").then(() => { if (status.error_code == 3) { status.status = "idle"; @@ -27,7 +29,7 @@ class WebdavTools { this.initFolder().then(() => { resolve(); }); - + }).catch((error) => { status.status = "error"; status.error_code = 3; @@ -50,17 +52,17 @@ class WebdavTools { }); } - initFolder(){ - return new Promise((resolve, reject) =>{ - this.client.createDirectory("/Hassio Backup").catch(()=>{}).then(()=>{ - this.client.createDirectory("/Hassio Backup/Auto").catch(()=>{}).then(()=>{ - this.client.createDirectory("/Hassio Backup/Manual").catch(()=>{}).then(()=>{ + initFolder() { + return new Promise((resolve, reject) => { + this.client.createDirectory("/Hassio Backup").catch(() => { }).then(() => { + this.client.createDirectory("/Hassio Backup/Auto").catch(() => { }).then(() => { + this.client.createDirectory("/Hassio Backup/Manual").catch(() => { }).then(() => { resolve(); }) }) }); }); - + } confIsValid() { @@ -87,6 +89,7 @@ class WebdavTools { status.error_code = 2; status.message = "Nextcloud config invalid !" statusTools.setStatus(status); + console.error(status.message); reject("Nextcloud config invalid !"); } } @@ -95,6 +98,7 @@ class WebdavTools { status.error_code = 2; status.message = "Nextcloud config not found !" statusTools.setStatus(status); + console.error(status.message); reject("Nextcloud config not found !"); } @@ -110,12 +114,54 @@ class WebdavTools { return null; } - setConf(conf){ + setConf(conf) { fs.writeFileSync(configPath, JSON.stringify(conf)); } - - + + uploadFile(id, path) { + return new Promise((resolve, reject) => { + if (this.client == null) { + this.confIsValid().then(() => { + this._startUpload(id, path); + }).catch((err) => { + reject(err); + }) + } + else + this._startUpload(id, path); + }); + } + + _startUpload(id, path) { + return new Promise((resolve, reject) => { + let status = statusTools.getStatus(); + status.status = "upload"; + status.progress = -1; + status.message = null; + status.error_code = null; + statusTools.setStatus(status); + console.log('Uploading snap...'); + //TODO Change this, try with request (buid the webdav request manualy) to track progress (https://stackoverflow.com/questions/12098713/upload-progress-request) + this.client.putFileContents(path, fs.readFileSync('./temp/' + id + '.tar'), { maxContentLength: 1024 ** 3 }).then((result) => { + console.log("...Upload finish !"); + status.status = "idle"; + status.message = null; + status.error_code = null; + statusTools.setStatus(status); + resolve(); + }).catch((err) => { + status.status = "error"; + status.error_code = 4; + status.message = "Fail to upload snapshot to nextcloud (" + err + ") !" + statusTools.setStatus(status); + console.error(status.message); + reject(status.message); + }); + }); + } + + } diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs b/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs index 735ce97..13dc5de 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs @@ -310,7 +310,8 @@ $('.manual-back-list').click(function(){ let id = this.getAttribute('data-id'); - manualBackup(id); + let name = this.getAttribute('data-name'); + manualBackup(id, name); }) }); @@ -329,6 +330,8 @@ break; case "download": printStatusWithBar('Downloading Snapshot', data.progress); + case "upload": + printStatusWithBar('Uploading Snapshot', data.progress); } } @@ -408,8 +411,8 @@ }) } - function manualBackup(id){ - $.post('./api/manual-backup?id=' + id); + function manualBackup(id, name){ + $.post('./api/manual-backup?id=' + id + '&name=' + name); } diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/views/localSnaps.ejs b/nextcloud_backup/rootfs/opt/nextcloud_backup/views/localSnaps.ejs index 9b4e8ec..7a473a9 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/views/localSnaps.ejs +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/views/localSnaps.ejs @@ -3,7 +3,7 @@ <% for(const index in snaps) { %> -
<%= snaps[index].name ? snaps[index].name : 'No name' %>