You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
8.1 KiB
253 lines
8.1 KiB
/*
|
|
* @Author: YeeChan
|
|
* @Date: 2021-06-02 11:27:38
|
|
* @Description:
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
let fs = require('fs');
|
|
let path = require('fire-path');
|
|
|
|
const { Client } = Editor.require("packages://sftp/node_modules/ssh2");
|
|
const archiver = Editor.require("packages://sftp/node_modules/archiver");
|
|
|
|
Editor.Panel.extend({
|
|
|
|
style: fs.readFileSync(Editor.url("packages://sftp/panel/index.css"), "utf-8"),
|
|
template: fs.readFileSync(Editor.url("packages://sftp/panel/index.html"), "utf-8"),
|
|
|
|
// method executed when template and styles are successfully loaded and initialized
|
|
ready() {
|
|
const app = new window.Vue({
|
|
el: this.shadowRoot,
|
|
created() {
|
|
this._panelCreated();
|
|
},
|
|
init() {
|
|
},
|
|
data: {
|
|
cfgPath: Editor.url('packages://sftp/configsftp.json'),
|
|
profile: null,
|
|
uploadProgress: 0,
|
|
remoteRoot: "/www/wwwroot/renyounew.5iape.com/",//远端的地址
|
|
remotePath: "/www/wwwroot/renyounew.5iape.com/remoteGame/",//远端的地址
|
|
clientConfig: {
|
|
host: '47.102.195.197',
|
|
port: 22,
|
|
username: 'test',
|
|
password: 'test'
|
|
}
|
|
},
|
|
methods: {
|
|
//保存配置
|
|
saveProfile() {
|
|
fs.writeFileSync(this.cfgPath, JSON.stringify(this.profile));
|
|
},
|
|
_panelCreated() {
|
|
if (!fs.existsSync(this.cfgPath)) {
|
|
let defaultData = {
|
|
'localPath': './build/web-desktop/',
|
|
'gameName': '',
|
|
'remote': false
|
|
}; // 你自己默认的数据
|
|
fs.writeFileSync(this.cfgPath, JSON.stringify(defaultData));
|
|
}
|
|
this.profile = JSON.parse(fs.readFileSync(this.cfgPath, 'utf-8'));
|
|
|
|
},
|
|
|
|
//保存配置
|
|
onBtnClickSave(event) {
|
|
Editor.log('onBtnClickSave');
|
|
this.saveProfile();
|
|
},
|
|
|
|
/**
|
|
* 描述:连接远程电脑
|
|
* 回调:then(conn) 连接远程的client对象
|
|
*/
|
|
Connect(then) {
|
|
let conn = new Client();
|
|
conn.on("ready", function () {
|
|
then(conn);
|
|
}).on('error', function (err) {
|
|
Editor.log("connect error!", err);
|
|
}).on('end', function () {
|
|
// console.log("connect end!");
|
|
}).on('close', function (had_error) {
|
|
//console.log("connect close");
|
|
}).connect({
|
|
host: '47.102.195.197',
|
|
port: 22,
|
|
username: 'root',
|
|
password: '#WHmiR6g27i!w5OF'
|
|
});
|
|
},
|
|
|
|
/**
|
|
* 执行命令
|
|
* @param {*} conn
|
|
* @param {*} cmd
|
|
* @param {*} then
|
|
*/
|
|
execCmd(conn, cmd, then) {
|
|
conn.exec(cmd, function (err, stream) {
|
|
if (err) {
|
|
Editor.error(err)
|
|
then(-1, err);
|
|
} else {
|
|
stream.on('close', function (code, signal) {
|
|
Editor.log("命令执行完毕:" + cmd)
|
|
then(0)
|
|
}).on('data', function (data) {
|
|
// Editor.log('STDOUT: ' + data);
|
|
then(1, data);
|
|
}).stderr.on('data', function (data) {
|
|
Editor.log('执行命令错误: ' + data);
|
|
});
|
|
}
|
|
});
|
|
},
|
|
|
|
//上传
|
|
onBtnClickUpload2(event) {
|
|
let me = this;
|
|
if (me.profile.gameName == "") {//默认无
|
|
Editor.log("请设置游戏的名字");
|
|
return;
|
|
}
|
|
if (me.profile.localPath == "") {//默认无
|
|
Editor.log("请设置本地的文件夹");
|
|
return;
|
|
}
|
|
let localPath = path.resolve(Editor.Project.path, me.profile.localPath);
|
|
//远程包
|
|
if (me.profile.remote) {
|
|
localPath = path.resolve(localPath, "remote");
|
|
Editor.log("远程包上传");
|
|
} else {
|
|
Editor.log("远程包上传");
|
|
}
|
|
Editor.log('上传本地路径:' + localPath);
|
|
if (!fs.existsSync(localPath)) {
|
|
Editor.log('本地路径不存在:请重新设置');
|
|
return
|
|
}
|
|
|
|
me.saveProfile();
|
|
me.uploadProgress = 0;
|
|
let remotePath = path.posix.join(me.remotePath, me.profile.gameName)
|
|
|
|
let zipname = 'upload.zip';
|
|
let zipFilePath = path.join(localPath, '../', zipname)
|
|
|
|
Editor.log('准备压缩...');
|
|
var output = fs.createWriteStream(zipFilePath);
|
|
var archive = archiver('zip', {
|
|
zlib: {
|
|
level: 9
|
|
}
|
|
});
|
|
output.on('close', function () {
|
|
Editor.log('压缩完成');
|
|
|
|
let remoteZipFilePath = path.join(remotePath, zipname)
|
|
let remoteZipFilePathPosix = path.posix.join(remotePath, zipname)
|
|
|
|
// Editor.log('zipFilePath ' + zipFilePath);
|
|
// Editor.log('remoteZipFilePath ' + remoteZipFilePath);
|
|
// Editor.log('remoteZipFilePathPosix ' + remoteZipFilePathPosix);
|
|
me.Connect(function (conn) {
|
|
// 判断文件夹的存在 删除并创建
|
|
let cmd = `cd ${me.remotePath} && rm -rf ${me.profile.gameName} && mkdir ${me.profile.gameName}`;
|
|
me.execCmd(conn, cmd, function (code, info) {
|
|
if (code == 0) {
|
|
me.sftp(zipFilePath, remoteZipFilePath, remoteZipFilePathPosix);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
archive.pipe(output);
|
|
if (me.profile.remote) {
|
|
archive.directory(localPath, "remote");
|
|
} else {
|
|
archive.directory(localPath, false);
|
|
}
|
|
archive.finalize();
|
|
},
|
|
|
|
//上传
|
|
sftp(zipFilePath, remoteZipFilePath, remoteZipFilePathPosix) {
|
|
Editor.log("准备上传...")
|
|
let me = this;
|
|
me.Connect(function (conn) {
|
|
conn.sftp((err, sftp) => {
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
sftp.fastPut(zipFilePath, remoteZipFilePathPosix, {
|
|
step: function (total, nb, fsize) {
|
|
let progess = Math.round(total / fsize * 100)
|
|
if (progess > 90) {
|
|
progess = 90;
|
|
}
|
|
me.uploadProgress = progess;
|
|
}
|
|
}, (err) => {
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
Editor.log('上传完成');
|
|
conn.end();
|
|
// 删掉本地的zip文件
|
|
if (fs.existsSync(zipFilePath)) {
|
|
Editor.log('删掉本地zip文件 ' + zipFilePath)
|
|
fs.unlinkSync(zipFilePath);
|
|
}
|
|
//解压
|
|
me.unzip(remoteZipFilePath);
|
|
});
|
|
});
|
|
})
|
|
},
|
|
// 解压文件到当先目录
|
|
unzip(zipfile) {
|
|
Editor.log('准备解压...');
|
|
let me = this;
|
|
let zipName = path.basename(zipfile);
|
|
let remotePath = path.posix.join(me.remotePath, me.profile.gameName)
|
|
let cmd = `cd ${remotePath} && unzip -o ${zipName}`;
|
|
me.Connect(function (conn) {
|
|
me.execCmd(conn, cmd, function (code, info) {
|
|
if (code == 0) {
|
|
Editor.log("解压完成");
|
|
me.uploadProgress = 95;
|
|
me.synShell()
|
|
}
|
|
});
|
|
});
|
|
},
|
|
//同步shell
|
|
synShell() {
|
|
let me = this;
|
|
let cmd2 = `cd ${me.remoteRoot} && ./mainscp.sh ${me.remotePath}${me.profile.gameName}`
|
|
Editor.log("同步命令:" + cmd2)
|
|
me.Connect(function (conn) {
|
|
me.execCmd(conn, cmd2, function (code, info) {
|
|
if (code == 0) {
|
|
me.uploadProgress = 100;
|
|
Editor.log("多服务器同步完成");
|
|
let url = "https://renyousome.5iape.com/remoteGame/" + me.profile.gameName + "/";
|
|
Editor.log("目标地址:" + url)
|
|
} else {
|
|
// Editor.log("同步中:" + info);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
}
|
|
})
|
|
},
|
|
}); |