PenetrationTestingScripts/antSword/modules/update.js

156 lines
4.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 中国蚁剑::更新程序
* 开写: 2016/05/31
* 更新: 2016/06/19
* 说明: 从2.0.0起取消在线更新程序的方式改为程序启动一分钟后检测github->release最新的版本更新信息然后提示手动更新
*/
const config = require('./config');
const superagent = require('superagent');
const fs = require("fs");
const path = require('path');
const through = require("through");
const tar = require('tar');
class Update {
constructor(electron) {
this.logger = new electron.Logger('Update');
electron.ipcMain
.on('check-update', this.checkUpdate.bind(this))
.on('update-download', this.onDownlaod.bind(this));
}
/**
* 检查更新
* 如果有更新,则以通知的方式提示用户手动更新,用户点击跳转到更新页面
* @return {[type]} [description]
*/
checkUpdate(event) {
this.logger.debug('checkUpdate..');
superagent
.get('https://api.github.com/repos/antoor/antSword/releases/latest')
.end((err, ret) => {
try {
let lastInfo = JSON.parse(ret.text);
let newVersion = lastInfo['tag_name'];
let curVersion = config['package'].version;
// 比对版本
if (this.CompVersion(curVersion, newVersion)) {
this.logger.info('Found a new version', newVersion);
event.sender.send('notification-update', {
ver: newVersion,
url: lastInfo['html_url']
});
} else {
this.logger.warn('No new version.', newVersion, curVersion);
}
} catch(e) {
this.logger.fatal('ERR', e);
}
});
}
/**
* 版本比对
* @param {String} curVer 当前版本
* @param {String} newVer 新的版本
* @return {Boolean}
*/
CompVersion(curVer, newVer) {
// 如果版本相同
if (curVer === newVer) { return false }
let currVerArr = curVer.split(".");
let promoteVerArr = newVer.split(".");
let len = Math.max(currVerArr.length, promoteVerArr.length);
for (let i = 0; i < len; i++) {
let proVal = ~~promoteVerArr[i],
curVal = ~~currVerArr[i];
if (proVal < curVal) {
return false;
} else if (proVal > curVal) {
return true;
}
}
return false;
}
/**
* 监听下载请求
* @param {Object} event ipcMain事件对象
* @param {Object} opts 下载配置
* @return {[type]} [description]
*/
onDownlaod(event, opt) {
const hash = opt['hash'];
if (!hash) {
return
}
let that = this;
let savePath = path.join(config.tmpPath, "antsword.tar.gz");
let tempData = [];
let totalsize = 0;
let downsize = 0;
let url="https://github.com/AntSwordProject/AntSword/archive/master.tar.gz";
superagent.head(url)
.set('User-Agent', "antSword/v2.0")
.redirects(5)
.timeout(30000)
.end((err, res)=>{
if(err){
event.sender.send(`update-error-${hash}`, err);
}else{
totalsize = parseInt(res.header['content-length']);
superagent
.get(url)
.set('User-Agent', "antSword/v2.0")
.redirects(5)
// .proxy(APROXY_CONF['uri'])
// 设置超时会导致文件过大时写入出错
// .timeout(timeout)
.pipe(through(
(chunk) => {
downsize += chunk.length;
var progress = parseInt(downsize/totalsize*100);
tempData.push(chunk);
event.sender.send(`update-dlprogress-${hash}`, progress);
},
() => {
that.logger.debug("Download end.");
let tempDataBuffer = Buffer.concat(tempData);
if (downsize != totalsize) {
event.sender.send(`update-error-${hash}`, "Download Error.");
return
}
event.sender.send(`update-dlend-${hash}`, tempDataBuffer.length);
// 同步写入文件
fs.writeFileSync(savePath, tempDataBuffer);
// 删除内存数据
tempDataBuffer = tempData = null;
// TODO: 需不需要备份?
// TODO: 删除原来的 node_modules 目录
// 解压数据
tar.x({
file: savePath,
strip: 1,
C: process.env.AS_WORKDIR,
}).then(_=>{
that.logger.info("update success.");
event.sender.send(`update-success`);
fs.unlink(savePath);
}, err=>{
event.sender.send(`update-error-${hash}`, err);
fs.unlink(savePath);
});
}
));
}
});
}
}
module.exports = Update;