2021-06-15 11:56:39 +00:00
|
|
|
|
function applyRole(role) {
|
|
|
|
|
global.wssocket.send("{\"action\":\"applyNodeRole\",\"role\":\"" + role
|
|
|
|
|
+ "\",\"pubKey\":\"" + global.sm2Key.publicKey + "\"}");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function WSHandler(event) {
|
|
|
|
|
// console.log("++++++++++" + event);
|
|
|
|
|
data = event.data;
|
|
|
|
|
// console.log(" -->" + data);
|
|
|
|
|
try {
|
|
|
|
|
var obj = JSON.parse(data);
|
|
|
|
|
// console.log(obj.action);
|
|
|
|
|
switch (obj.action) {
|
|
|
|
|
case 'onGetHashCount':
|
|
|
|
|
onGetHashCount(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStartSync':
|
|
|
|
|
onStartSync(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onGetSyncType':
|
|
|
|
|
onGetSyncType(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onChangeSyncType':
|
|
|
|
|
onChangeSyncType(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onRecoverBySync':
|
|
|
|
|
onRecoverBySync(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStopSync':
|
|
|
|
|
onStopSync(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onTransferTo':
|
|
|
|
|
onTransferTo(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onHashResult':
|
|
|
|
|
onHashResult(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onListMemoryFiles':
|
|
|
|
|
onListMemoryFiles(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onDumpContract':
|
|
|
|
|
onDumpContract(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onChangeDumpPeriod':
|
|
|
|
|
onChangeDumpPeriod(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onGetDumpPeriod':
|
|
|
|
|
onGetDumpPeriod(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStaticVerifyResult':
|
|
|
|
|
onStaticVerifyResult(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onListCompiledFiles':
|
|
|
|
|
onListCompiledFiles(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onListContractProcess":
|
|
|
|
|
onListContractProcess(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onDeleteFile":
|
|
|
|
|
onDeleteFile(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onCancelAuth":
|
|
|
|
|
onCancelAuth(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onDownloadContract":
|
|
|
|
|
onDownloadFile(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onChangePublic":
|
|
|
|
|
onChangePublic(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onListProjects":
|
|
|
|
|
onListProjects(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onListProject":
|
|
|
|
|
onListProject(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onCountNodeLogGroupByCategory":
|
|
|
|
|
onCountNodeLogGroupByCategory(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onQueryNodeLogByDate":
|
|
|
|
|
onListLocalNodeLog(obj);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
case "onListLocalNodeLog":
|
|
|
|
|
onListLocalNodeLog(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onListLocalNodeLogPie":
|
|
|
|
|
onListLocalNodeLogPie(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onListLocalNodeLogLine":
|
|
|
|
|
onListLocalNodeLogLine(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onQueryContractLogByDate":
|
|
|
|
|
onQueryContractLogByDate(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onCountContractLogGroupByAction":
|
|
|
|
|
onListLocalContractLogPie(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onListLocalContractLogPie":
|
|
|
|
|
onListLocalContractLogPie(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onCountContractLogGroupByCategory":
|
|
|
|
|
onListLocalContractLogLine(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onListLocalContractLogLine":
|
|
|
|
|
onListLocalContractLogLine(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onSessionID":
|
|
|
|
|
onGetNodeSessionID(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onLogin":
|
|
|
|
|
onNodeLogin(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onApplyRole":
|
|
|
|
|
onApplyRole(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onGetP2PNodes":
|
|
|
|
|
onGetP2PNodes(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onListAllAuthRole":
|
|
|
|
|
onListAllAuthRole(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onListUnAuthRole":
|
|
|
|
|
onListUnAuthRole(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onDeleteRole":
|
|
|
|
|
onDeleteRole(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onCountRole":
|
|
|
|
|
onCountRole(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onAuthNodeRole":
|
|
|
|
|
onAuthNodeRole(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onApplyNet":
|
|
|
|
|
onApplyNet(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onLoadNodeConfig":
|
|
|
|
|
onLoadNodeConfig(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onChangeNodeName":
|
|
|
|
|
onChangeNodeName(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onChangeYJSPath":
|
|
|
|
|
onChangeYJSPath(obj);
|
|
|
|
|
break;
|
|
|
|
|
case "onGetLicenceExpiredDate":
|
|
|
|
|
$("#expiredDate").html(convertDate(data.data));
|
|
|
|
|
break;
|
|
|
|
|
case "onGetPeerID":
|
|
|
|
|
global.peerID = obj.data;
|
|
|
|
|
// getNodeTrustUnits();//still connecting to centerportalws
|
|
|
|
|
break;
|
|
|
|
|
case "onViewContractInstance":
|
|
|
|
|
onViewContractInstance(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onExecuteResult':
|
|
|
|
|
onExecuteResult(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onUploadFile':
|
|
|
|
|
onUploadFile(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStartContract':
|
|
|
|
|
onStartContract(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStartContractConfig':
|
|
|
|
|
onStartContractConfig(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onKillContractProcess':
|
|
|
|
|
onStopContract(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onKillAllContract':
|
|
|
|
|
onKillAllContract(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onSetPermission':
|
|
|
|
|
onSetPermission(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onOutputStream':
|
|
|
|
|
displayOutput(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onChangeNodeCenter':
|
|
|
|
|
console.log("onChangeNodeCenter");
|
|
|
|
|
onChangeNodeCenter(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onException':
|
|
|
|
|
handleNoPermission(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStartContractTrustfullyResult':
|
|
|
|
|
onStartContractTrustfullyResult(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStartTrustfulContract':
|
|
|
|
|
onStartTrustfulContract(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onDistributeContract':
|
|
|
|
|
onDistributeContract(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onDistributeFinish':
|
|
|
|
|
onDistributeFinish(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onListLeakContractProcess':
|
|
|
|
|
onListLeakContractProcess(obj);
|
|
|
|
|
break;
|
2021-08-09 01:48:56 +00:00
|
|
|
|
case 'onGetMask':
|
|
|
|
|
onGetMask(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onGetMock':
|
|
|
|
|
onGetMock(obj);
|
|
|
|
|
break;
|
2021-06-15 11:56:39 +00:00
|
|
|
|
default:
|
|
|
|
|
displayOutput(obj);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.log(err);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleNoPermission(obj) {
|
|
|
|
|
if (!obj.data.startsWith("unauthorised action")) {
|
|
|
|
|
// console.log(obj);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
global.actionName = obj.data.split(" ")[2];
|
|
|
|
|
// console.log("_______" + global.actionName);
|
|
|
|
|
switch (global.actionName) {
|
|
|
|
|
case "startContract":
|
|
|
|
|
case "killContract":
|
|
|
|
|
case "killAllContract":
|
|
|
|
|
case "listContractProcess":
|
|
|
|
|
case "listProjects":
|
|
|
|
|
case "showNodeTrustUnits":
|
|
|
|
|
case "getDumpPeriod":
|
|
|
|
|
case "changeDumpPeriod":
|
|
|
|
|
case "dumpContract":
|
|
|
|
|
case "loadMemory":
|
|
|
|
|
case "listLocalContractLogPie":
|
|
|
|
|
case "listLocalContractLogLine":
|
|
|
|
|
case "listLocalContractLog":
|
|
|
|
|
case "listMemoryList":
|
|
|
|
|
case "listCompiledFiles":
|
|
|
|
|
alertNoPermission(`当前角色没有${global.actionName}权限,请申请成为ContractInstanceManager`);
|
|
|
|
|
break;
|
|
|
|
|
case "deleteFile":
|
|
|
|
|
case "downloadContract":
|
|
|
|
|
case "uploadFile":
|
|
|
|
|
case "staticVerifyContract":
|
|
|
|
|
alertNoPermission(`当前角色没有${global.actionName}权限,请申请成为ContractProvider`);
|
|
|
|
|
break;
|
|
|
|
|
case "executeContract":
|
|
|
|
|
case "ListContractLog":
|
|
|
|
|
case `queryRecent&count=${global.ledgerCount}`:
|
|
|
|
|
// console.log(`queryRecent&count=${global.ledgerCount}`);
|
|
|
|
|
alertNoPermission(`当前角色没有${global.actionName}权限,请申请成为ContractUser`);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
alertNoPermission(`当前角色没有${global.actionName}权限,请申请成为相关角色`);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function displayOutput(obj) {
|
|
|
|
|
console.log(obj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getControlWsUrl(host) {
|
|
|
|
|
let prefix = "ws://";
|
|
|
|
|
if (document.location.href.startsWith("https")) {
|
|
|
|
|
prefix = "wss://";
|
|
|
|
|
}
|
|
|
|
|
let path = document.location.pathname.lastIndexOf("/");
|
|
|
|
|
path = document.location.pathname.substr(0, path + 1);
|
|
|
|
|
if (path.indexOf("SCIDE") < 0) {
|
|
|
|
|
path += "SCIDE/";
|
|
|
|
|
}
|
|
|
|
|
path += "SCExecutor";
|
2021-06-16 15:54:23 +00:00
|
|
|
|
if (isBaaS) {
|
2021-10-26 03:22:45 +00:00
|
|
|
|
path = "/SCIDE/SCExecutor"
|
2021-06-16 15:54:23 +00:00
|
|
|
|
}
|
2021-06-15 11:56:39 +00:00
|
|
|
|
return prefix + host + path;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function initWSocket() {
|
|
|
|
|
const host = document.location.host;
|
|
|
|
|
const url = getControlWsUrl(host);
|
2021-08-09 13:19:43 +00:00
|
|
|
|
document.title = `数瑞智能合约节点管理中心(${host})`;
|
2021-06-15 11:56:39 +00:00
|
|
|
|
// console.log("connect ws:" + url);
|
|
|
|
|
global.wssocket = createWssocket(url, function () {
|
|
|
|
|
getSession();
|
|
|
|
|
// loadNodeConfig();// get center portal & create centerportalsocket in
|
|
|
|
|
// onLoadNodeConfig
|
|
|
|
|
}, WSHandler);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getSession() {
|
|
|
|
|
global.wssocket.send("{\"action\":\"getSessionID\"}");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function exportSMKeyPair() {
|
|
|
|
|
const dialogEl = $("#dialog");
|
|
|
|
|
dialogEl.html(`Save Your key:<br/>${JSON.stringify(global.sm2Key)}`)
|
|
|
|
|
dialogEl.dialog("open");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ====== wsHandler
|
|
|
|
|
function onGetNodeSessionID(data) {
|
|
|
|
|
console.log("onGetSessionID");
|
|
|
|
|
global.session = data.session;
|
|
|
|
|
global.wssocket.send(JSON.stringify({
|
|
|
|
|
pubKey: global.sm2Key.publicKey,
|
2021-06-21 09:23:41 +00:00
|
|
|
|
signature: sm2.doSignature(global.session, global.sm2Key.privateKey, {hash: true, der: true}),
|
2021-06-15 11:56:39 +00:00
|
|
|
|
action: "login"
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function onNodeLogin(data) {
|
|
|
|
|
console.log("onNodeLogin");
|
|
|
|
|
pubkeyDialogVue.myRole = data.data;
|
|
|
|
|
global.myRole = data.data;
|
|
|
|
|
loadNodeConfig();
|
2021-10-26 03:22:45 +00:00
|
|
|
|
loadUserMan();
|
2021-06-15 11:56:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function apply() {
|
|
|
|
|
const apply = $("#roleGroupSelect04")[0].value;
|
|
|
|
|
console.log(apply);
|
|
|
|
|
// console.log("onGetNodeRole" + global.myRole);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function onCountNodeLogGroupByCategory(data) {
|
|
|
|
|
const userManTab = $("#v-pills-userManager-tab")[0];
|
|
|
|
|
if (userManTab.getAttribute("aria-selected") === "true") {
|
|
|
|
|
drawUserActivityGraph(data);
|
|
|
|
|
} else {
|
|
|
|
|
drawLocalLogLine(data);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function onListLocalNodeLog(data) {
|
|
|
|
|
const userManTab = $("#v-pills-userManager-tab")[0];
|
|
|
|
|
if (userManTab.getAttribute("aria-selected") === "true") {
|
|
|
|
|
drawUserActivityGraph(data);
|
|
|
|
|
} else {
|
|
|
|
|
fillLocalNodeLogData(data.data);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function onListAllAuthRole(data) {
|
|
|
|
|
console.log("onListAllAuthRole");
|
|
|
|
|
fillAuthRoleData(data.data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function onListUnAuthRole(data) {
|
|
|
|
|
console.log("onListUnAuthRole");
|
|
|
|
|
fillUnAuthRoleData(data.data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// var onApplyNet = function(data) {
|
|
|
|
|
// console.log("onApplyNet");
|
|
|
|
|
// };
|
|
|
|
|
function onCountRole(data) {
|
|
|
|
|
console.log("onCountRole");
|
|
|
|
|
setUserTypeDistribution(data.data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function onAuthNodeRole(data) {
|
|
|
|
|
myToast("授权/忽略操作", data.data);
|
|
|
|
|
if (data.data === "success") {
|
|
|
|
|
global.wssocket.send(JSON.stringify({
|
|
|
|
|
action: "listAllAuthRole"
|
|
|
|
|
}));
|
|
|
|
|
global.wssocket.send(JSON.stringify({
|
|
|
|
|
action: "listUnAuthRole"
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function onApplyRole(data) {
|
|
|
|
|
// console.log(data.data);
|
|
|
|
|
myToast("申请操作", data.data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function onDeleteRole(data) {
|
|
|
|
|
myToast("删除操作", data.data);
|
|
|
|
|
var loginAllUser = {};
|
|
|
|
|
loginAllUser.action = "listAllAuthRole";
|
|
|
|
|
global.wssocket.send(JSON.stringify(loginAllUser));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ====== wsHandler done!
|
|
|
|
|
function myToast(title, msg) {
|
|
|
|
|
toastVue.toastTitle = title;
|
|
|
|
|
toastVue.toastMessage = msg;
|
|
|
|
|
$("#alertDiv").toast("show");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function countChar(str, c) {
|
|
|
|
|
let ret = 0;
|
|
|
|
|
for (const ch of str) {
|
|
|
|
|
if (ch === c) {
|
|
|
|
|
ret++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function generate() {
|
|
|
|
|
const key = sm2.generateKeyPairHex();
|
|
|
|
|
global.sm2Key = key;
|
|
|
|
|
localStorage.setItem("PrivKey", JSON.stringify(key));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function killAllContract() {
|
|
|
|
|
dialogBodyDiv.innerHTML = "请谨慎操作,是否停止全部实例?";
|
|
|
|
|
showDialog("提示", function () {
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
var request = {};
|
|
|
|
|
request.action = "killAllContract";
|
|
|
|
|
global.wssocket.send(JSON.stringify(request));
|
|
|
|
|
}, 500);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function init() {
|
|
|
|
|
initVue();
|
|
|
|
|
initGlobal();
|
|
|
|
|
initWSocket();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getRequestParameters() {
|
|
|
|
|
const arr = (location.search || "").replace(/^\?/, '').split("&");
|
|
|
|
|
const params = {};
|
|
|
|
|
for (const par of arr) {
|
|
|
|
|
const data = par.split("=");
|
|
|
|
|
if (data.length === 2) {
|
|
|
|
|
params[data[0]] = data[1];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return params;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function onCPLogin(data) {
|
|
|
|
|
if (data.data.indexOf("NodeManager") === -1) {
|
|
|
|
|
customAlert("请先前往准入控制中心,认证成为该网络中的NodeManager");
|
|
|
|
|
} else {
|
|
|
|
|
getNodeTrustUnits();
|
|
|
|
|
global.centerportalws.send(JSON.stringify({
|
|
|
|
|
action: "addNode",
|
|
|
|
|
nodePubKey: global.config.nodePubKey
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function onCPGetRole(data) {
|
|
|
|
|
// console.log(data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function centerportalWSHandler(event) {
|
|
|
|
|
// console.log(event);
|
|
|
|
|
data = event.data;
|
|
|
|
|
try {
|
|
|
|
|
const obj = JSON.parse(data);
|
|
|
|
|
switch (obj.action) {
|
|
|
|
|
case "onGetNodeTrustUnits":
|
|
|
|
|
onGetNodeTrustUnits(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onSessionID':
|
|
|
|
|
onSessionID(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onLogin':
|
|
|
|
|
onCPLogin(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStartContract':
|
|
|
|
|
onStartContract(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStartTrustfulContract':
|
|
|
|
|
onStartTrustfulContract(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onDistributeContract':
|
|
|
|
|
onDistributeContract(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onDistributeFinish':
|
|
|
|
|
onDistributeFinish(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStartContractTrustfullyResult':
|
|
|
|
|
onStartContractTrustfullyResult(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onException':
|
|
|
|
|
handleNoPermission(obj);
|
|
|
|
|
//logException(obj);
|
|
|
|
|
break;
|
|
|
|
|
case 'onStartTestADSP':
|
|
|
|
|
onStartTestADSP(obj);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
// console.log(obj);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.log(err);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function addNodeUnit(obj) {
|
|
|
|
|
if (!global.units) {
|
|
|
|
|
global.units = {};
|
|
|
|
|
}
|
2021-06-21 09:23:41 +00:00
|
|
|
|
var x = document.getElementById("selectUnits");
|
|
|
|
|
for (i = 0; i < x.length; ++i) {
|
|
|
|
|
if (x.options[i].value == obj.key) {
|
|
|
|
|
return;
|
2021-06-15 11:56:39 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-06-21 09:23:41 +00:00
|
|
|
|
var option = document.createElement("option");
|
2021-06-15 11:56:39 +00:00
|
|
|
|
var type = obj.type;
|
|
|
|
|
if (type == "TCP") {
|
|
|
|
|
var at_ = obj.key.indexOf("_");
|
2021-06-21 09:23:41 +00:00
|
|
|
|
var key = obj.key.substr(at_ + 1);
|
2021-06-15 11:56:39 +00:00
|
|
|
|
global.units[key] = obj.value;
|
|
|
|
|
option.text = obj.type + ":" + key;
|
|
|
|
|
} else {
|
|
|
|
|
global.units[obj.key] = obj.value;
|
2021-06-21 09:23:41 +00:00
|
|
|
|
option.text = obj.type + ":" + obj.key + ":" + obj.value.length + "nodes";
|
2021-06-15 11:56:39 +00:00
|
|
|
|
}
|
|
|
|
|
option.value = obj.key;
|
2021-06-21 09:23:41 +00:00
|
|
|
|
x.add(option, null);
|
2021-08-09 13:19:43 +00:00
|
|
|
|
}
|