UNPKG

iobroker.backitup

Version:

ioBroker.backitup allows you to backup and restore your ioBroker installation and other systems, such as databases, Zigbee, scripts and many more.

110 lines (98 loc) 4.28 kB
const fs = require('node:fs'); const path = require('node:path'); const tools = require('./tools'); const storages = {}; module.exports = function (restoreSource, config, log, callback) { const files = {}; let counter = 0; let creators = []; for (const type in config) { if (config.hasOwnProperty(type)) { if (typeof config[type] === 'object' && config[type].type === 'creator') { if (!creators.includes(type)) { creators.push(type); } } try { for (const attr in config[type]) { if (config[type].hasOwnProperty(attr) && typeof config[type][attr] === 'object' && config[type][attr].type === 'creator') { if (!creators.includes(attr)) { creators.push(attr); } } } } catch (e) { log.debug('Backup list cannot be read ...'); } } } const backupDir = path.join(tools.getIobDir(), 'backups').replace(/\\/g, '/'); if (fs.existsSync(backupDir) && (!restoreSource || restoreSource === 'local')) { let fff = fs.readdirSync(backupDir).sort().map(file => path.join(backupDir, file).replace(/\\/g, '/')); fff = fff .map(file => { const stat = fs.statSync(file); return { path: file, name: file.split('/').pop(), size: stat.size }; }) .filter(file => (file.name.match(/^\d\d\d\d_\d\d_\d\d-\d\d_\d\d_\d\d_backupiobroker\.tar\.gz$/) || creators.includes(file.name.split('_')[0]) || creators.includes(file.name.split('.')[0])) && file.name.split('.').pop() === 'gz'); files.local = {}; fff.forEach(file => { if (file.name.match(/^\d\d\d\d_\d\d_\d\d-\d\d_\d\d_\d\d_backupiobroker\.tar\.gz$/)) { files.local.iobroker = files.local.iobroker || []; files.local.iobroker.push(file); } else { const type = file.name.split('_')[0]; files.local[type] = files.local[type] || []; files.local[type].push(file); } }); } const done = []; for (const type in config) { if (config.hasOwnProperty(type)) { for (const attr in config[type]) { if (config[type].hasOwnProperty(attr) && typeof config[type][attr] === 'object' && config[type][attr].type === 'storage' ) { if (done.includes(attr)) { continue; } done.push(attr); try { storages[attr] = storages[attr] || require(`./list/${attr}`); } catch (e) { log.error(`Cannot load list module ${attr}: ${e}`); continue; } counter++; storages[attr].list(restoreSource, config[type][attr], creators, log, (err, result, type) => { err && log.error(err); if (result) { if (type === 'cifs') { for (const type in result) { if (result.hasOwnProperty(type)) { result[type] = result[type].filter(file => !files.local[type].find(f => f.path === file.path)); } } } files[type] = result; } setTimeout(() => !--counter && callback && callback({ error: err, data: files }), 2000); }); } } } } if (!counter) { callback && callback({ error: null, data: files }); } };