restart.js
2.87 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
/**
* 分发部署
*
* @class Restart
* @author shenzm<zhimin.shen@yoho.cn>
* @date 2016/10/12
*/
import ssh from 'ssh2';
import path from 'path';
import ws from '../../lib/ws';
import {
RestartInfo,
DeployInfo,
Server
} from '../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);
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 = this.project.scripts.start;
return new Promise((resolve, reject) => {
self._state('restarting');
self._log(`>>>> ${startup}`);
conn.exec(`cd ${self.remoteRunningDir} && ${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);
}
}
export default Restart;