diff --git a/nextcloud_backup/config.json b/nextcloud_backup/config.json index 3eee939..6519023 100644 --- a/nextcloud_backup/config.json +++ b/nextcloud_backup/config.json @@ -1,6 +1,6 @@ { "name": "Nextcloud Backup", - "version": "0.7.5", + "version": "0.7.6", "slug": "nextcloud_backup", "description": "Hass.io snapshot backup to Nextcloud", "url": "https://github.com/Sebclem/hassio-nextcloud-backup", diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js b/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js index bed581f..09f8735 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/tools/webdavTools.js @@ -20,17 +20,17 @@ class WebdavTools { this.username = null; this.password = null; } - + init(ssl, host, username, password) { return new Promise((resolve, reject) => { let status = statusTools.getStatus(); logger.info("Initilizing and checking webdav client..."); - this.baseUrl = (ssl ? "https" : "http") + "://" + host + endpoint; + this.baseUrl = (ssl == true ? "https" : "http") + "://" + host + endpoint; this.username = username; this.password = password; try { this.client = createClient(this.baseUrl, { username: username, password: password }); - + this.client.getDirectoryContents("/").then(() => { if (status.error_code == 3) { status.status = "idle"; @@ -42,7 +42,7 @@ class WebdavTools { this.initFolder().then(() => { resolve(); }); - + }).catch((error) => { status.status = "error"; status.error_code = 3; @@ -61,10 +61,10 @@ class WebdavTools { logger.error("Can't connect to Nextcloud (" + err + ") !"); reject("Can't connect to Nextcloud (" + err + ") !"); } - + }); } - + initFolder() { return new Promise((resolve, reject) => { this.client.createDirectory(pathTools.root).catch(() => { }).then(() => { @@ -75,9 +75,9 @@ class WebdavTools { }) }); }); - + } - + confIsValid() { return new Promise((resolve, reject) => { let status = statusTools.getStatus(); @@ -95,7 +95,7 @@ class WebdavTools { }).catch((err) => { reject(err); }); - + } else { status.status = "error"; @@ -114,24 +114,24 @@ class WebdavTools { logger.error(status.message); reject("Nextcloud config not found !"); } - + }); } - + getConf() { if (fs.existsSync(configPath)) { let content = JSON.parse(fs.readFileSync(configPath)); return content; } else - return null; + return null; } - + setConf(conf) { fs.writeFileSync(configPath, JSON.stringify(conf)); } - - + + uploadFile(id, path) { return new Promise((resolve, reject) => { if (this.client == null) { @@ -142,10 +142,10 @@ class WebdavTools { }) } else - this._startUpload(id, path); + this._startUpload(id, path); }); } - + _startUpload(id, path) { return new Promise((resolve, reject) => { let status = statusTools.getStatus(); @@ -163,61 +163,61 @@ class WebdavTools { pass: this.password }, body: fs.createReadStream('./temp/' + id + '.tar') - + } let lastPercent = 0; let req = request.put(option) - .on('drain', () => { - let percent = Math.floor((req.req.connection.bytesWritten / fileSize) * 100); - if (lastPercent != percent) { - lastPercent = percent; - status.progress = percent / 100; - statusTools.setStatus(status); - } - - }).on('error', function(err) { - fs.unlinkSync('./temp/' + id + '.tar'); + .on('drain', () => { + let percent = Math.floor((req.req.connection.bytesWritten / fileSize) * 100); + if (lastPercent != percent) { + lastPercent = percent; + status.progress = percent / 100; + statusTools.setStatus(status); + } + + }).on('error', function(err) { + fs.unlinkSync('./temp/' + id + '.tar'); + status.status = "error"; + status.error_code = 4; + status.message = "Fail to upload snapshot to nextcloud (" + err + ") !" + statusTools.setStatus(status); + logger.error(status.message); + reject(status.message); + + }).on('response', (res) => { + if (res.statusCode != 201 && res.statusCode != 204) { status.status = "error"; status.error_code = 4; - status.message = "Fail to upload snapshot to nextcloud (" + err + ") !" + status.message = "Fail to upload snapshot to nextcloud (Status code: " + res.statusCode + ") !" statusTools.setStatus(status); logger.error(status.message); + fs.unlinkSync('./temp/' + id + '.tar') reject(status.message); - - }).on('response', (res) => { - if (res.statusCode != 201 && res.statusCode != 204) { - status.status = "error"; - status.error_code = 4; - status.message = "Fail to upload snapshot to nextcloud (Status code: " + res.statusCode + ") !" - statusTools.setStatus(status); - logger.error(status.message); - fs.unlinkSync('./temp/' + id + '.tar') - reject(status.message); + } + else { + logger.info("...Upload finish ! (status: " + res.statusCode + ")"); + status.status = "idle"; + status.progress = -1; + status.message = null; + status.error_code = null; + status.last_backup = moment().format('MMM D, YYYY HH:mm') + + statusTools.setStatus(status); + cleanTempFolder(); + let autoCleanCloud = settingsTools.getSettings().auto_clean_backup; + if (autoCleanCloud != null && autoCleanCloud == "true") { + this.clean().catch(); } - else { - logger.info("...Upload finish ! (status: " + res.statusCode + ")"); - status.status = "idle"; - status.progress = -1; - status.message = null; - status.error_code = null; - status.last_backup = moment().format('MMM D, YYYY HH:mm') - - statusTools.setStatus(status); - cleanTempFolder(); - let autoCleanCloud = settingsTools.getSettings().auto_clean_backup; - if (autoCleanCloud != null && autoCleanCloud == "true") { - this.clean().catch(); - } - let autoCleanlocal = settingsTools.getSettings().auto_clean_local; - if (autoCleanlocal != null && autoCleanlocal == "true") { - hassioApiTools.clean(); - } - resolve(); + let autoCleanlocal = settingsTools.getSettings().auto_clean_local; + if (autoCleanlocal != null && autoCleanlocal == "true") { + hassioApiTools.clean(); } - }) + resolve(); + } + }) }); } - + getFolderContent(path) { return new Promise((resolve, reject) => { if(this.client == null){ @@ -225,18 +225,18 @@ class WebdavTools { return; } this.client.getDirectoryContents(path) - .then((contents) => { - resolve(contents); - }).catch((error) => { - reject(error); - }) + .then((contents) => { + resolve(contents); + }).catch((error) => { + reject(error); + }) }); } - + clean() { let limit = settingsTools.getSettings().auto_clean_local_keep; if (limit == null) - limit = 5; + limit = 5; return new Promise((resolve, reject) => { this.getFolderContent(pathTools.auto).then(async (contents) => { if (contents.length < limit) { @@ -245,18 +245,18 @@ class WebdavTools { } contents.sort((a, b) => { if (moment(a.lastmod).isBefore(moment(b.lastmod))) - return 1; + return 1; else - return -1; + return -1; }); - + let toDel = contents.slice(limit); for (let i in toDel) { await this.client.deleteFile(toDel[i].filename); } logger.info('Cloud clean done.') resolve(); - + }).catch((error) => { status.status = "error"; status.error_code = 6; @@ -266,18 +266,18 @@ class WebdavTools { reject(status.message); }); }) - + } - - - - + + + + } function cleanTempFolder() { fs.readdir("./temp/", (err, files) => { if (err) throw err; - + for (const file of files) { fs.unlink(path.join("./temp/", file), err => { if (err) throw err; @@ -293,7 +293,7 @@ class Singleton { Singleton.instance = new WebdavTools(); } } - + getInstance() { return Singleton.instance; } diff --git a/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs b/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs index 26fd172..0baecd2 100644 --- a/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs +++ b/nextcloud_backup/rootfs/opt/nextcloud_backup/views/index.ejs @@ -666,7 +666,7 @@ function getNextcloudSettings() { loadingModal.open(); $.get('./api/nextcloud-settings', (data) => { - $('#ssl').prop('checked', ssl); + $('#ssl').prop("checked", data.ssl == "true"); $('#hostname').val(data.host); $('#hostname + label').removeClass("active"); $('#hostname + label').addClass("active");