Commit d325c984 authored by antoor's avatar antoor

Optimizing the database operation code

优化数据库操作代码
parent 464c23d6
/** /**
* Shell数据库管理模块 * Shell数据库管理模块
* 更新:2016/04/28 * 更新:2016/06/28
* 作者:蚁逅 <https://github.com/antoor>
*/ */
'use strict'; 'use strict';
...@@ -10,13 +9,10 @@ const fs = require('fs'), ...@@ -10,13 +9,10 @@ const fs = require('fs'),
dns = require('dns'), dns = require('dns'),
path = require('path'), path = require('path'),
CONF = require('./config'), CONF = require('./config'),
// Logger = require('./logger'),
// logger = null,
// logger = require('log4js').getLogger('Database'),
Datastore = require('nedb'), Datastore = require('nedb'),
qqwry = require("geoips").info(); qqwry = require("geoips").info();
let logger; var logger;
class Database { class Database {
...@@ -80,6 +76,36 @@ class Database { ...@@ -80,6 +76,36 @@ class Database {
}); });
} }
/**
* 根据URL解析出IP&&地理位置
* @param {String} url URL地址
* @return {Promise} ip, addr
*/
_url2ip(url) {
return new Promise((res, rej) => {
// 解析domain
const urlArr = url.match(/(\w+):\/\/([\w\.\-]+)[:]?([\d]*)([\s\S]*)/i);
// 无效url
if (!urlArr || urlArr.length < 3) {
return rej('Unable to resolve domain name from URL');
}
// 获取IP
const domain = urlArr[2];
dns.lookup(domain, (err, ip) => {
if (err) {
return rej(err.toString());
}
// 获取地理位置
const _addr = qqwry.searchIP(ip);
return res({
ip: ip,
addr: `${_addr.Country} ${_addr.Area}`
});
})
})
}
/** /**
* 添加shell数据 * 添加shell数据
* @param {Object} event ipcMain对象 * @param {Object} event ipcMain对象
...@@ -87,31 +113,27 @@ class Database { ...@@ -87,31 +113,27 @@ class Database {
*/ */
addShell(event, opts) { addShell(event, opts) {
logger.info('addShell', opts); logger.info('addShell', opts);
// 获取目标IP以及地理位置
// 1. 获取域名 this._url2ip(opts['url'])
let parse = opts['url'].match(/(\w+):\/\/([\w\.\-]+)[:]?([\d]*)([\s\S]*)/i); .then((ret) => {
if (!parse || parse.length < 3) { return event.returnValue = 'Unable to resolve domain name from URL' };
// 2. 获取域名IP
dns.lookup(parse[2], (err, ip) => {
if (err) { return event.returnValue = err.toString() };
// 3. 查询IP对应物理位置
const addr = qqwry.searchIP(ip);
// 插入数据库
this.cursor.insert({ this.cursor.insert({
category: opts['category'] || 'default', category: opts['category'] || 'default',
url: opts['url'], url: opts['url'],
pwd: opts['pwd'], pwd: opts['pwd'],
type: opts['type'], type: opts['type'],
ip: ip, ip: ret['ip'],
addr: `${addr.Country} ${addr.Area}`, addr: ret['addr'],
encode: opts['encode'], encode: opts['encode'],
encoder: opts['encoder'], encoder: opts['encoder'],
ctime: +new Date, ctime: +new Date,
utime: +new Date utime: +new Date
}, (err, ret) => { }, (_err, _ret) => {
event.returnValue = err || ret; event.returnValue = _err || _ret;
});
}); });
})
.catch((_err) => {
event.returnValue = _err;
})
} }
/** /**
...@@ -122,22 +144,15 @@ class Database { ...@@ -122,22 +144,15 @@ class Database {
*/ */
editShell(event, opts) { editShell(event, opts) {
logger.warn('editShell', opts); logger.warn('editShell', opts);
// 获取目标IP以及地理位置
// 1. 获取域名 this._url2ip(opts['url'])
let parse = opts['url'].match(/(\w+):\/\/([\w\.\-]+)[:]?([\d]*)([\s\S]*)/i); .then((ret) => {
if (!parse || parse.length < 3) { return event.returnValue = 'Unable to resolve domain name from URL' };
// 2. 获取域名IP
dns.lookup(parse[2], (err, ip) => {
if (err) { return event.returnValue = err.toString() };
// 3. 查询IP对应物理位置
const addr = qqwry.searchIP(ip);
// 更新数据库
this.cursor.update({ this.cursor.update({
_id: opts['_id'] _id: opts['_id']
}, { }, {
$set: { $set: {
ip: ip, ip: ret['ip'],
addr: `${addr.Country} ${addr.Area}`, addr: ret['addr'],
url: opts['url'], url: opts['url'],
pwd: opts['pwd'], pwd: opts['pwd'],
type: opts['type'], type: opts['type'],
...@@ -145,9 +160,12 @@ class Database { ...@@ -145,9 +160,12 @@ class Database {
encoder: opts['encoder'], encoder: opts['encoder'],
utime: +new Date utime: +new Date
} }
}, (err, num) => { }, (_err, _ret) => {
event.returnValue = err || num; event.returnValue = _err || _ret;
})
}) })
.catch((_err) => {
event.returnValue = _err;
}); });
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment