ソースを参照

Add backup route

sbkwgh 8 年 前
コミット
16173dfeab
3 ファイル変更46 行追加1 行削除
  1. 44 0
      routes/backup.js
  2. 1 1
      routes/category.js
  3. 1 0
      server.js

+ 44 - 0
routes/backup.js

@@ -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

+ 1 - 1
routes/category.js

@@ -136,7 +136,7 @@ router.get('/:category', async (req, res) => {
 })
 
 router.all('*', (req, res, next) => {
-	if(!req.session.loggedIn || !req.session.admin) {
+	if(!req.session.admin) {
 		res.status(401)
 		res.json({
 			errors: [Errors.requestNotAuthorized]

+ 1 - 0
server.js

@@ -42,6 +42,7 @@ app.use('/api/v1/ban', require('./routes/ban'))
 app.use('/api/v1/search', require('./routes/search'))
 app.use('/api/v1/log', require('./routes/log'))
 app.use('/api/v1/poll', require('./routes/poll'))
+app.use('/api/v1/backup', require('./routes/backup'))
 
 sequelize
 	.sync({ force: true })