|
|
/**
|
|
|
*
|
|
|
* @author: chenfeng<feng.chen@yoho.cn>
|
|
|
* @date: 16/10/14
|
|
|
*/
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
import Model from './model';
|
|
|
import ssh from 'ssh2';
|
|
|
|
|
|
class PageCahe extends Model {
|
|
|
|
|
|
constructor() {
|
|
|
super('page_cache');
|
|
|
}
|
|
|
replaceUrl(uri) {
|
|
|
return uri.replace(/\./g, '\\.').replace(/\//g, '\\/');
|
|
|
}
|
|
|
async removeCache(keys, storeTableName) {
|
|
|
let self = this;
|
|
|
let servers = await self.findAll();
|
|
|
for (var i = 0; i < servers.length; i++) {
|
|
|
try {
|
|
|
await self._removeAllNginxCache(servers[i], keys, storeTableName);
|
|
|
} catch (err) {
|
|
|
console.log(err)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async removeAllCache(storeTableName) {
|
|
|
let self = this;
|
|
|
let servers = await self.findAll();
|
|
|
for (var i = 0; i < servers.length; i++) {
|
|
|
try {
|
|
|
let server = servers[i];
|
|
|
if (server.cachepath && storeTableName) {
|
|
|
await self._connStart(async (conn) => {
|
|
|
let scirpt = `rm -rf ${server.cachepath}/${storeTableName}`;
|
|
|
await self._evalScript(conn, scirpt);
|
|
|
}, server);
|
|
|
}
|
|
|
} catch (err) {
|
|
|
console.log(err)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
async _removeAllNginxCache(server, keys, storeTableName) {
|
|
|
let self = this;
|
|
|
let limit = 2;
|
|
|
let block = parseInt(keys.length / limit, 10) + (keys.length % limit ? 1 : 0);
|
|
|
let blockIndex = 0;
|
|
|
await self._connStart(async (conn) => {
|
|
|
for (var i = blockIndex; i < block; i++) {
|
|
|
blockIndex = i;
|
|
|
let items = keys.slice(i * limit, i * limit + 2);
|
|
|
let scirpt = self._joinRemoveScript(server, items, storeTableName);
|
|
|
self._evalScript(conn, scirpt);
|
|
|
}
|
|
|
}, server)
|
|
|
}
|
|
|
_checkDangerScirpt(scirpt) {
|
|
|
if (scirpt.test(/rm -rf \/($| )/)) {
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
_connStart(callback, server) {
|
|
|
//ssh掉线重连
|
|
|
return new Promise((resolve, reject) => {
|
|
|
let connStart = (err) => {
|
|
|
let conn = new ssh.Client();
|
|
|
conn.on('ready', async() => {
|
|
|
await callback(conn)
|
|
|
resolve();
|
|
|
}).on('error', () => {
|
|
|
console.log(`error ${server.host}, ${err}`);
|
|
|
if (err < 20) {
|
|
|
connStart(++err);
|
|
|
} else {
|
|
|
reject('limit error');
|
|
|
}
|
|
|
}).connect({
|
|
|
host: server.host,
|
|
|
username: server.username,
|
|
|
password: server.password,
|
|
|
port: server.port
|
|
|
});
|
|
|
|
|
|
}
|
|
|
connStart(0, 0);
|
|
|
});
|
|
|
}
|
|
|
_evalScript(conn, scirpt) {
|
|
|
let self = this;
|
|
|
return new Promise((resolve) => {
|
|
|
console.log(scirpt)
|
|
|
resolve();
|
|
|
// let result = conn.exec(scirpt, (err, stream) => {
|
|
|
// if (!err) {
|
|
|
// resolve();
|
|
|
// }
|
|
|
// });
|
|
|
})
|
|
|
|
|
|
|
|
|
}
|
|
|
_joinRemoveScript(server, keys, storeTableName) {
|
|
|
let script = 'rm';
|
|
|
keys.forEach((key) => {
|
|
|
let level1 = key.key.substr(key.key.length - 1, 1);
|
|
|
let level2 = key.key.substr(key.key.length - 3, 2);
|
|
|
script += ` ${server.cachepath}/${storeTableName}/${level1}/${level2}/${key.key}`;
|
|
|
});
|
|
|
return script;
|
|
|
}
|
|
|
async init() {
|
|
|
let count = await this.count({});
|
|
|
if (count === 0) {
|
|
|
await this.insert({
|
|
|
host: '127.0.0.1',
|
|
|
username: 'chenfeng',
|
|
|
password: '1',
|
|
|
port: 22,
|
|
|
tag: 'nginx1',
|
|
|
cachepath: '/usr/local/nginx'
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
export default PageCahe; |
...
|
...
|
|