-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
120 lines (114 loc) · 3.69 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
'use strict'
const request = require('request')
const url = require('url')
const AWS = require('aws-sdk')
const path = require('path')
const stream = require('stream')
const moment = require('moment')
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0
// load dotenv file
require('dotenv').config({ path: path.resolve(__dirname, '.env') })
class Backup {
constructor () {
// configuration object
this.config = {
domain: process.env.CLUSTER_DOMAIN,
auth: process.env.CONTROLLER_AUTH_KEY,
s3: {
access: process.env.S3_ACCESS_KEY,
secret: process.env.S3_SECRET_KEY,
bucket: process.env.S3_BUCKET
}
}
// check required
if (!this.config.auth) throw new Error('Controller auth key is missing')
if (!this.config.domain) throw new Error('Cluster domain is missing')
if (!this.config.s3.access) throw new Error('S3 access key is missing')
if (!this.config.s3.secret) throw new Error('S3 secret key is missing')
if (!this.config.s3.bucket) throw new Error('S3 bucket is missing')
// initialize s3
this.s3 = new AWS.S3({
sslEnabled: true,
accessKeyId: this.config.s3.access,
secretAccessKey: this.config.s3.secret,
signatureVersion: 'v4',
params: {
Bucket: this.config.s3.bucket
}
})
}
start () {
let start = moment.utc()
return new Promise((resolve, reject) => {
let authStr = new Buffer(`:${this.config.auth}`).toString('base64')
let req = request({
url: url.format({
protocol: 'https',
hostname: 'controller.' + this.config.domain,
pathname: '/backup'
}),
headers: {
Authorization: `Basic ${authStr}`
}
})
req.on('response', (res) => {
// check status
if (res.statusCode !== 200) {
let err = new Error('Got a non 200 response')
err.status = res.statusCode
return reject(err)
}
// pipe response to file
console.info('Processing backup file')
res.pipe((() => {
let pass = new stream.PassThrough()
let timestamp = start.format('YYYY-MM-DD')
let domain = this.config.domain.replace(/\./g, '-')
let key = `flynn/${domain}-${timestamp}.tar`
this.s3.upload({
Key: key,
Body: pass,
ACL: 'private'
}, (err, data) => {
// error handler
if (err) {
console.error(err)
return reject(err)
} else {
// put object tagging
console.info('Backup uploaded successfully')
this.s3.putObjectTagging({
Key: key,
Tagging: {
TagSet: [{
Key: 'FIRST_OF_WEEK',
Value: start.format('E') === '1' ? 'TRUE' : 'FALSE'
}, {
Key: 'DAY_OF_WEEK',
Value: start.format('E')
}, {
Key: 'FIRST_OF_MONTH',
Value: start.format('D') === '1' ? 'TRUE' : 'FALSE'
}, {
Key: 'DAY_OF_MONTH',
Value: start.format('D')
}]
}
}, (err, data) => {
// error handler
if (err) return reject(err)
// move on
console.info('Backup object tags added successfully')
return resolve()
})
}
}).on('httpUploadProgress', (p) => {
console.log('Loaded %sMB', (p.loaded / 1000000).toFixed(2))
})
return pass
})())
})
})
}
}
module.exports = Backup