|
@@ -0,0 +1,44 @@
|
|
|
+let express = require('express')
|
|
|
+let router = express.Router()
|
|
|
+
|
|
|
+let randomBytes = require('crypto').randomBytes
|
|
|
+let exec = require('child_process').exec
|
|
|
+let fs = require('fs')
|
|
|
+
|
|
|
+let { Sequelize, Backup } = require('../models')
|
|
|
+const Errors = require('../lib/errors')
|
|
|
+const Config = require('../config/config.json')
|
|
|
+
|
|
|
+function promiseFromChildProcess(child) {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ child.addListener('error', reject)
|
|
|
+ child.addListener('exit', resolve)
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+router.post('/', async (req, res) => {
|
|
|
+ try {
|
|
|
+ let dev = Config.development
|
|
|
+ let id = randomBytes(12).toString('base64')
|
|
|
+ let backupName = id + '-' + (new Date()).toISOString() + '.sql'
|
|
|
+
|
|
|
+ let sha256 = await promiseFromChildProcess(exec(`
|
|
|
+ mkdir ../backups -p
|
|
|
+ && mysqldump --lock-all-tables -u ${dev.username} -p${dev.password} ${dev.database} > ../backups/${backupName}
|
|
|
+ && openssl dgst -sha256 ../backups/${backupName}
|
|
|
+ `))
|
|
|
+ let size = fs.statsSync('../backups/' + backupName).size
|
|
|
+ let backup = await Backup.create({ sha256, size })
|
|
|
+
|
|
|
+ res.json(backup.toJSON())
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e)
|
|
|
+ res.status(500)
|
|
|
+ res.json({
|
|
|
+ errors: [Errors.unknown]
|
|
|
+ })
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+module.exports = router
|