restart.js
3.39 KB
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
121
122
123
124
125
126
/**
* 分发部署
*
* @class Restart
* @author shenzm<zhimin.shen@yoho.cn>
* @date 2016/10/12
*/
'use strict';
const ssh = require('ssh2');
const path = require('path');
const fs = require('fs');
const ws = require('../../lib/ws');
const {
RestartInfo,
DeployInfo,
Server
} = require('../models');
class Restart {
constructor(project) {
this.project = project;
}
async restart(info) {
let server = await Server.findByHost(info.host);
this.server = server;
this.info = info;
this.id = await DeployInfo.insertOrUpdate(this.info);
if (this.project.type === 'php') {
this.sshRestart({
host: server.host,
username: server.username,
password: server.password,
port: server.port
});
} else {
this.sshRestart({
host: server.host,
username: server.username,
password: server.password,
port: server.port
});
}
}
sshRestart(serverInfo) {
console.log('ssh connecting', serverInfo);
let conn = new ssh.Client();
let self = this;
conn.on('ready', async() => {
console.log(`connected ${serverInfo.host}`);
try {
await self._restart(conn);
conn.end();
} catch (e) {
self._state('fail');
self._log(e);
}
}).on('error', (err) => {
self._state('fail');
self._log(err);
}).connect(serverInfo);
}
_restart(conn) {
let self = this;
let startup;
if (this.project.type === 'php') {
startup = 'sudo /Data/local/apache-2.4.12/bin/apachectl restart';
} else {
startup = `cd ${self.remoteRunningDir} && ${this.project.scripts.start}`;
}
return new Promise((resolve, reject) => {
self._state('restarting');
self._log(`>>>> ${startup}`);
conn.exec(startup, (err, stream) => {
if (err) {
reject(err);
} else {
stream.stdout.on('data', (data) => {
self._log(data.toString());
});
stream.stderr.on('data', (data) => {
self._log(data.toString());
});
stream.on('exit', (code) => {
if (code === 0) {
self._state('running');
resolve();
} else {
reject('restart fail');
}
});
}
});
});
}
async _state(state) {
ws.broadcast(`/restart/${this.project._id}`, {
host: this.info.host,
state: state
});
await RestartInfo.updateState(this.info._id, state);
await DeployInfo.updateState(this.id, state);
}
_log(msg) {
console.log(msg);
ws.broadcast(`/restart/${this.project._id}/log`, {
host: this.info.host,
msg: msg
});
}
get remoteRunningDir() {
return path.join(this.server.deployDir, this.project.name, 'current', this.project.name);
}
}
module.exports = Restart;