...
|
...
|
@@ -2,197 +2,206 @@ |
|
|
|
|
|
const Router = require('koa-router');
|
|
|
|
|
|
const {
|
|
|
MemcachedHost
|
|
|
} = require('../../models');
|
|
|
const Operation = require('../../logger/operation');
|
|
|
const {
|
|
|
Server
|
|
|
} = require('../../models');
|
|
|
|
|
|
const r = new Router;
|
|
|
|
|
|
const {DegradeServer} = require('../../models');
|
|
|
const zookeeper = require('node-zookeeper-client');
|
|
|
const tester = require('../../zookeeper/tester');
|
|
|
const getter = require('../../zookeeper/getter');
|
|
|
const Model = require('../../models/model');
|
|
|
const _ = require('lodash');
|
|
|
const ApiCache = require('../../ci/api_cache');
|
|
|
|
|
|
const envs = {
|
|
|
production: '线上环境',
|
|
|
p1oduction: '线上环境',
|
|
|
preview: '灰度环境',
|
|
|
test: '测试环境'
|
|
|
};
|
|
|
|
|
|
const servers = {
|
|
|
ua:async(ctx, next)=>{
|
|
|
let ua_lists=await servers.getLists('/crawler/ua_blacklists');console.log(typeof ua_lists,ua_lists.length);
|
|
|
try{
|
|
|
ua_lists=JSON.parse(ua_lists);
|
|
|
}catch(e){
|
|
|
ua_lists='';
|
|
|
}
|
|
|
await ctx.render('action/crawler', {
|
|
|
blacklists: (ua_lists?ua_lists.map((item)=>{return {name:item}}):''),
|
|
|
main_name:'UA'
|
|
|
});
|
|
|
},
|
|
|
ip:async(ctx, next)=>{
|
|
|
let ip_lists=await servers.getLists('/crawler/ip_blacklists');
|
|
|
try{
|
|
|
ip_lists=JSON.parse(ip_lists);
|
|
|
}catch(e){
|
|
|
ip_lists='';
|
|
|
}
|
|
|
await ctx.render('action/crawler', {
|
|
|
blacklists: (ip_lists?ip_lists.map((item)=>{return {name:item}}):''),
|
|
|
main_name:'IP'
|
|
|
});
|
|
|
},
|
|
|
change_ua:async(ctx, next)=>{
|
|
|
let result=await servers.setLists(ctx,'qcloud');
|
|
|
result=await servers.setLists(ctx,'aws')||result;
|
|
|
if (result) {
|
|
|
ctx.body = {
|
|
|
code: 200,
|
|
|
message: 'update success'
|
|
|
class Store extends Model {
|
|
|
constructor() {
|
|
|
super('abuse_protection');
|
|
|
}
|
|
|
}
|
|
|
const store = new Store();
|
|
|
const makeServer = ((ipKey, uaKey, listName, black) => {
|
|
|
const r = new Router;
|
|
|
|
|
|
const servers = {
|
|
|
ua: async(ctx, next) => {
|
|
|
let list = await servers.getLists(uaKey);
|
|
|
|
|
|
await ctx.render('action/crawler', {
|
|
|
listName: listName,
|
|
|
list: (list ? list.map((item) => {
|
|
|
return {name: item}
|
|
|
}) : ''),
|
|
|
main_name: 'UA'
|
|
|
});
|
|
|
},
|
|
|
ip: async(ctx, next) => {
|
|
|
let list = await servers.getLists(ipKey);
|
|
|
|
|
|
await ctx.render('action/crawler', {
|
|
|
listName: listName,
|
|
|
list: (list ? list.map((item) => {
|
|
|
return {name: item}
|
|
|
}) : ''),
|
|
|
main_name: 'IP'
|
|
|
});
|
|
|
},
|
|
|
change_ua: async(ctx, next) => {
|
|
|
const doUpdate = async(ua) => {
|
|
|
console.log('include ua:' + ua);
|
|
|
|
|
|
let hosts = await MemcachedHost.findAll();
|
|
|
await Promise.all(_.map(hosts, (h) => {
|
|
|
const key = `pc:limiter:ua:${black ? 'black' : 'white'}`,
|
|
|
value = JSON.parse(ua || '[]');
|
|
|
|
|
|
return (new ApiCache(h.host)).setKey(key, value, 0);
|
|
|
}));
|
|
|
};
|
|
|
} else {
|
|
|
ctx.body = {
|
|
|
code: 500,
|
|
|
message: 'update fail,Please retry'
|
|
|
|
|
|
let result = await servers.setLists(ctx);
|
|
|
await doUpdate(ctx.query.val);
|
|
|
|
|
|
if (result) {
|
|
|
ctx.body = {
|
|
|
listName: listName,
|
|
|
code: 200,
|
|
|
message: 'update success'
|
|
|
};
|
|
|
} else {
|
|
|
ctx.body = {
|
|
|
listName: listName,
|
|
|
code: 500,
|
|
|
message: 'update fail,Please retry'
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
change_ip:async(ctx, next)=>{
|
|
|
let result=await servers.setLists(ctx,'qcloud');
|
|
|
result=await servers.setLists(ctx,'aws')||result;
|
|
|
if (result) {
|
|
|
ctx.body = {
|
|
|
code: 200,
|
|
|
message: 'update success'
|
|
|
},
|
|
|
change_ip: async(ctx, next) => {
|
|
|
let oldList = await servers.getLists(ipKey);
|
|
|
|
|
|
const newList = JSON.parse(ctx.query.val || '[]');
|
|
|
|
|
|
const exclude = async(ip) => {
|
|
|
console.log('exclude:' + ip);
|
|
|
|
|
|
let hosts = await MemcachedHost.findAll();
|
|
|
await Promise.all(_.map(hosts, (h) => {
|
|
|
const key = `pc:limiter:${ip}`,
|
|
|
value = -1,
|
|
|
ttl = 0;
|
|
|
|
|
|
return (new ApiCache(h.host)).setKey(key, value, ttl);
|
|
|
}));
|
|
|
};
|
|
|
} else {
|
|
|
ctx.body = {
|
|
|
code: 500,
|
|
|
message: 'update fail,Please retry'
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
getLists:async(path)=>{
|
|
|
let degrades=[];
|
|
|
|
|
|
let qcloudServer = await DegradeServer.findOne({
|
|
|
type: 'qcloud'
|
|
|
});
|
|
|
const lock = async(ip) => {
|
|
|
console.log('lock:' + ip);
|
|
|
|
|
|
if (qcloudServer) {
|
|
|
degrades=degrades.concat(await servers.connect(qcloudServer.ip,qcloudServer.port,path));
|
|
|
}
|
|
|
let hosts = await MemcachedHost.findAll();
|
|
|
await Promise.all(_.map(hosts, (h) => {
|
|
|
const key = `pc:limiter:${ip}`,
|
|
|
value = 9999,
|
|
|
ttl = 60 * 60 * 8; // 封停8小时
|
|
|
|
|
|
let awsServer = await DegradeServer.findOne({
|
|
|
type: 'aws'
|
|
|
});
|
|
|
return (new ApiCache(h.host)).setKey(key, value, ttl);
|
|
|
}));
|
|
|
};
|
|
|
|
|
|
if (awsServer) {
|
|
|
degrades=degrades.concat(await servers.connect(qcloudServer.ip,qcloudServer.port,path));
|
|
|
}
|
|
|
const unlock = async(ip) => {
|
|
|
console.log('unlock:' + ip);
|
|
|
|
|
|
let hosts = await MemcachedHost.findAll();
|
|
|
await Promise.all(_.map(hosts, (h) => {
|
|
|
const key = `pc:limiter:${ip}`;
|
|
|
|
|
|
return degrades[0];
|
|
|
},
|
|
|
async connect(ip,port,path) {
|
|
|
let server = `${ip}:${port}`;
|
|
|
return (new ApiCache(h.host)).delKey(key);
|
|
|
}));
|
|
|
};
|
|
|
|
|
|
let connected = await tester(server);
|
|
|
const unlockList = [];
|
|
|
|
|
|
if (!connected) {
|
|
|
console.log('连接失败');
|
|
|
return;
|
|
|
}
|
|
|
_.each(oldList, (item) => {
|
|
|
if (_.indexOf(newList, item) < 0) {
|
|
|
unlockList.push(item);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
const client = zookeeper.createClient(server);
|
|
|
return new Promise((resolve,reject)=>{
|
|
|
client.once('connected', function (err) {
|
|
|
if(err){
|
|
|
reject(err);
|
|
|
}else{
|
|
|
client.getData(
|
|
|
path,
|
|
|
function (event) {
|
|
|
console.log('Got event: %s.', event);
|
|
|
},
|
|
|
function (error, data, stat) {
|
|
|
if (error) {
|
|
|
console.log(error.stack);
|
|
|
reject(error);
|
|
|
return;
|
|
|
}
|
|
|
resolve(data.toString('utf8'));
|
|
|
}
|
|
|
);
|
|
|
_.each(newList, (ip) => {
|
|
|
if (black) {
|
|
|
lock(ip);
|
|
|
} else {
|
|
|
exclude(ip);
|
|
|
}
|
|
|
});
|
|
|
client.connect();
|
|
|
|
|
|
}).then(data=>data).catch(()=>'');
|
|
|
},
|
|
|
async setLists(ctx,type) {
|
|
|
let {path, val} = ctx.query;
|
|
|
|
|
|
let server = await DegradeServer.findOne({
|
|
|
type: type
|
|
|
});
|
|
|
|
|
|
const client = zookeeper.createClient(`${server.ip}:${server.port}`);
|
|
|
|
|
|
const mkdirp=()=>{
|
|
|
return new Promise((resolve,reject)=>{
|
|
|
client.mkdirp(path, new Buffer('false'), (err, path) => {
|
|
|
if (err) {
|
|
|
reject(err);
|
|
|
} else {
|
|
|
resolve();
|
|
|
}
|
|
|
});
|
|
|
|
|
|
_.each(unlockList, (ip) => {
|
|
|
unlock(ip);
|
|
|
});
|
|
|
};
|
|
|
const setData=()=>{
|
|
|
return new Promise((resolve,reject)=>{
|
|
|
client.setData(path, new Buffer(val.toString()), function(err, data, stat) {
|
|
|
if (err) {
|
|
|
reject(err);
|
|
|
} else {
|
|
|
resolve(true);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
let result = await servers.setLists(ctx);
|
|
|
|
|
|
|
|
|
if (result) {
|
|
|
ctx.body = {
|
|
|
listName: listName,
|
|
|
code: 200,
|
|
|
message: 'update success'
|
|
|
};
|
|
|
} else {
|
|
|
ctx.body = {
|
|
|
code: 500,
|
|
|
message: 'update fail,Please retry'
|
|
|
}
|
|
|
}
|
|
|
|
|
|
},
|
|
|
getLists: async(path) => {
|
|
|
const result = await store.findOne({
|
|
|
path: path
|
|
|
});
|
|
|
}
|
|
|
|
|
|
return result && result.val ? JSON.parse(result.val) : [];
|
|
|
},
|
|
|
|
|
|
let result= new Promise((resolve,reject)=>{
|
|
|
client.once('connected', function (err) {
|
|
|
if(err)reject(err);
|
|
|
else resolve();
|
|
|
async setLists(ctx, type) {
|
|
|
let {path, val} = ctx.query;
|
|
|
|
|
|
const rec = await store.findOne({
|
|
|
path: path
|
|
|
});
|
|
|
})
|
|
|
.then(mkdirp)
|
|
|
.then(setData)
|
|
|
.then((ok)=>{
|
|
|
client.close();
|
|
|
if(ok)return true;
|
|
|
})
|
|
|
.catch(function(err){
|
|
|
console.log(err);
|
|
|
client.close();
|
|
|
return false;
|
|
|
});
|
|
|
|
|
|
client.connect();
|
|
|
return result;
|
|
|
}
|
|
|
};
|
|
|
|
|
|
r.get('/ua', servers.ua);
|
|
|
r.get('/ip', servers.ip);
|
|
|
r.get('/change_ua', servers.change_ua);
|
|
|
r.get('/change_ip', servers.change_ip);
|
|
|
if (rec) {
|
|
|
store.update({
|
|
|
path: path
|
|
|
}, {
|
|
|
$set: {
|
|
|
val: val
|
|
|
}
|
|
|
})
|
|
|
} else {
|
|
|
store.insert({
|
|
|
path: path,
|
|
|
val: val
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
|
|
|
r.get('/ua', servers.ua);
|
|
|
r.get('/ip', servers.ip);
|
|
|
r.get('/change_ua', servers.change_ua);
|
|
|
r.get('/change_ip', servers.change_ip);
|
|
|
return r;
|
|
|
});
|
|
|
|
|
|
module.exports = r; |
|
|
\ No newline at end of file |
|
|
module.exports = makeServer; |
|
|
\ No newline at end of file |
...
|
...
|
|