Commit e228d302 authored by ruanshudong's avatar ruanshudong
Browse files

Merge branch 'master' into release/2.4

parents ba1e32bb e2384dbf
Showing with 734 additions and 655 deletions
+734 -655
## 20211008(2.4.18)
## 202101018(2.4.19)
- Fix the but that the node page does not display
- Improve the support of call chain, open tab, and framework >= 3.0.1.
## 20210909(2.4.18)
- Adjust the directory structure to support k8s. It is not opened by default
- The interface of call chain is added (it needs to be upgraded with the framework, and the call chain service is added), but it is not opened
- The lossless release function is added, which needs to be combined with the (framework>=v2.4.15)
......
## 20211008(2.4.18)
## 202101018(2.4.19)
- 修复节点页面不显示的问题
- 完善调用链的支持, 打开tab, 需要framework >= 3.0.1
## 20210909(2.4.18)
- 调整目录结构, 支持k8s, 默认没打开
- 增加了调用链的界面(需要配合framework升级, 增加调用链服务), 未打开
- 增加了无损发布接口
......
/**
* Tencent is pleased to support the open source community by making Tars available.
*
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
const _ = require('lodash');
const logger = require('../../../logger');
const rp = require('request-promise');
const {topologyPrx} = require('../../../rpc/index');
const {topologyStruct} = require('../../../rpc/struct');
CallChainController = {};
CallChainController.getAverage = async (ctx) => {
let date = ctx.paramsObj.nowDate;
let server = ctx.paramsObj.label;
try {
let rsp = await topologyPrx.graphServer(date, server, 10, 10);
let rows = [];
for (const graph of rsp.graph) {
let es = graph.es;
let vs = graph.vs;
let esObj = [];
for (const edge of es) {
edge.edge = `${edge.fromVertex}-${edge.toVertex}`;
esObj.push(edge);
}
let row = [];
row.push(JSON.stringify(esObj));
row.push(server);
row.push(server);
row.push(server);
//let listTrace = await topologyPrx.listTrace(date, server);
// row.push(_.join(listTrace.ts));
row.push("");
row.push(JSON.stringify(vs));
rows.push(row);
}
ctx.makeResObj(200, '', {
columns: [{"name": "edges", "type": "text"}, {
"name": "funcIds",
"type": "text"
}, {"name": "id", "type": "text"}, {"name": "label", "type": "text"}, {
"name": "traceIds",
"type": "text"
}, {"name": "vertexes", "type": "text"}], rows: rows
});
} catch (err) {
logger.error('[getAverage]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
CallChainController.getAverageByFuncName = async (ctx) => {
let date = ctx.paramsObj.nowDate;
let server = ctx.paramsObj.label;
try {
let rsp = await topologyPrx.graphFunction(date, server, 10, 10);
let rows = [];
for (const graph of rsp.graph) {
let es = graph.es;
let vs = graph.vs;
let esObj = [];
for (const edge of es) {
edge.edge = `${edge.fromVertex}-${edge.toVertex}`;
esObj.push(edge);
}
let row = [];
row.push(JSON.stringify(esObj));
row.push(server);
row.push(server);
row.push(server);
//let listTrace = await topologyPrx.listTrace(date, server);
row.push("");
row.push(JSON.stringify(vs));
rows.push(row);
}
ctx.makeResObj(200, '', {
columns: [{"name": "edges", "type": "text"}, {
"name": "funcIds",
"type": "text"
}, {"name": "id", "type": "text"}, {"name": "label", "type": "text"}, {
"name": "traceIds",
"type": "text"
}, {"name": "vertexes", "type": "text"}], rows: rows
});
} catch (err) {
logger.error('[getAverage]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
CallChainController.detailByTraceId = async (ctx) => {
let date = ctx.paramsObj.nowDate;
let traceId = ctx.paramsObj.id;
try {
let rsp = await topologyPrx.graphTrace(date, traceId);
let es = rsp.graph.es;
let vs = rsp.graph.vs;
let esObj = [];
for (const edge of es) {
edge.edge = `${edge.fromVertex}-${edge.toVertex}`;
esObj.push(edge);
}
let rows = [];
rows.push(JSON.stringify(esObj));
rows.push(traceId);
rows.push(new Date().getTime());
rows.push(JSON.stringify(vs));
rows.push("detailId");
ctx.makeResObj(200, '',
{
"columns": [
{
"name": "edges",
"type": "text"
},
{
"name": "id",
"type": "text"
},
{
"name": "timeStamp",
"type": "text"
},
{
"name": "vertexes",
"type": "text"
},
{
"name": "vertexesName",
"type": "text"
}
], rows: [rows]
});
} catch (err) {
logger.error('[func]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
CallChainController.detailByStartEndTime = async (ctx) => {
let reg = new RegExp("-", "g")
let date = ctx.paramsObj.nowDate.replace(reg, "");
let beginTime = _.toInteger(ctx.paramsObj.stime);
let endTime =_.toInteger(ctx.paramsObj.etime);
let serverName = ctx.paramsObj.label;
try {
let rsp = await topologyPrx.listTraceSummary(date, beginTime, endTime, serverName);
ctx.makeResObj(200, '', rsp.ts);
/* ctx.makeResObj(200, '', [{
name:'0-0044bdefb8454e75906b6baa4044a41f',
startTime :1633638720098,
endTime :1633638720098
}]);*/
} catch (err) {
logger.error('[detail1]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
CallChainController.func = async (ctx) => {
let date = ctx.paramsObj.nowDate;
let funcName = ctx.paramsObj.id;
try {
let rsp = await topologyPrx.graphFunction(date, funcName, 10, 10);
let es = rsp.graph.es;
let vs = rsp.graph.vs;
let esObj = [];
for (const edge of es) {
edge.edge = `${edge.fromVertex}-${edge.toVertex}`;
esObj.push(edge);
}
let rows = [];
rows.push(JSON.stringify(esObj));
rows.push('');
rows.push(funcName);
//let listTrace = await topologyPrx.listTrace(date, funcName);
//rows.push(_.join(listTrace.ts));
rows.push('');
rows.push(JSON.stringify(vs));
ctx.makeResObj(200, '',
{
columns: [
{
"name": "edges",
"type": "text"
},
{
"name": "funcNames",
"type": "text"
},
{
"name": "id",
"type": "text"
},
{
"name": "traceIds",
"type": "text"
},
{
"name": "vertexes",
"type": "text"
}
], rows: [rows,rows]
});
} catch (err) {
logger.error('[func]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
CallChainController.funcList = async (ctx) => {
let date = ctx.paramsObj.nowDate;
let server = ctx.paramsObj.id;
try {
let rsp = await topologyPrx.listFunction(date, server);
let funcList = rsp.fs;
ctx.makeResObj(200, '', {funcList});
} catch (err) {
logger.error('[func]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
module.exports = CallChainController;
/**
* Tencent is pleased to support the open source community by making Tars available.
*
* Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
const logger = require('../../../logger');
const https = require("https");
const request = require("request");
const { log } = require('winston/lib/winston/common');
const rp = require('request-promise');
const callChain = {};
const EndpointManager = require("../../../rpc/proxy/getservant/lib/getEndpoint")
let configs = require("../../../rpc/index")
let locator = configs.client._property.locator;
let endpointM = new EndpointManager(locator);
callChain.getlabel = async (ctx) => {
let activeList = await endpointM.getActiveEndpointFromLocator("Base.TarsCallChain.WebServerObj");
let ip = activeList[0].match(/-h (\S*) -p/);
let port = activeList[0].match(/-p (\S*)/)
let servant = `http://${ip[1]}:${port[1]}`
let nowDate = ctx.paramsObj.nowDate
var options = {
'method': 'POST',
'url': `${servant}/getlabel?nowDate=${nowDate}`,
'headers': {
}
};
try {
let rpbody = await rp(options);
rpbody = JSON.parse(rpbody)
ctx.makeResObj(200, '', rpbody);
} catch (err) {
logger.error('[getlabel]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
callChain.getAverage = async (ctx) => {
let activeList = await endpointM.getActiveEndpointFromLocator("Base.TarsCallChain.WebServerObj");
let ip = activeList[0].match(/-h (\S*) -p/);
let port = activeList[0].match(/-p (\S*)/)
let servant = `http://${ip[1]}:${port[1]}`
var options = {
'method': 'POST',
'url': `${servant}/tars_call_serve2?nowDate=${ctx.paramsObj.nowDate}&label=${ctx.paramsObj.label}`,
'headers': {
}
};
try {
let rpbody = await rp(options);
rpbody = JSON.parse(rpbody)
console.log("rpbody",rpbody);
ctx.makeResObj(200, '', rpbody);
} catch (err) {
logger.error('[getAverage]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
callChain.detail = async (ctx) => {
let activeList = await endpointM.getActiveEndpointFromLocator("Base.TarsCallChain.WebServerObj");
let ip = activeList[0].match(/-h (\S*) -p/);
let port = activeList[0].match(/-p (\S*)/)
let servant = `http://${ip[1]}:${port[1]}`
let nowDate = ctx.paramsObj.nowDate
let id = ctx.paramsObj.id
var options = {
'method': 'POST',
'url': `${servant}/detail?nowDate=${nowDate}&id=${id}`,
'headers': {
}
};
try {
let rpbody = await rp(options);
rpbody = JSON.parse(rpbody)
ctx.makeResObj(200, '', rpbody);
} catch (err) {
logger.error('[detail]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
callChain.detail1 = async (ctx) => {
let activeList = await endpointM.getActiveEndpointFromLocator("Base.TarsCallChain.WebServerObj");
let ip = activeList[0].match(/-h (\S*) -p/);
let port = activeList[0].match(/-p (\S*)/)
let servant = `http://${ip[1]}:${port[1]}`
let reg = new RegExp("-", "g")
var options = {
"method": "POST",
"url":`${servant}/detail1?nowDate=${ctx.paramsObj.nowDate.replace(reg, "")}&stime=${ctx.paramsObj.stime}&etime=${ctx.paramsObj.etime}&label=${ctx.paramsObj.label}`,
"headers": {
}
};
try {
let rpbody = await rp(options);
rpbody = JSON.parse(rpbody)
ctx.makeResObj(200, '', rpbody);
} catch (err) {
logger.error('[detail1]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
callChain.func = async (ctx) => {
let activeList = await endpointM.getActiveEndpointFromLocator("Base.TarsCallChain.WebServerObj");
let ip = activeList[0].match(/-h (\S*) -p/);
let port = activeList[0].match(/-p (\S*)/)
let servant = `http://${ip[1]}:${port[1]}`
let nowDate = ctx.paramsObj.nowDate
let id = ctx.paramsObj.id
var options = {
'method': 'POST',
'url': `${servant}/func?nowDate=${nowDate}&id=${id}`,
'headers': {
}
};
try {
let rpbody = await rp(options);
rpbody = JSON.parse(rpbody)
ctx.makeResObj(200, '', rpbody);
} catch (err) {
logger.error('[func]', err, ctx);
ctx.makeErrResObj(500, err.message);
}
};
module.exports = callChain;
This diff is collapsed.
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Set Admin Pass</title><link href=/static/css/adminPass.f2fb101e.css rel=preload as=style><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/js/adminPass.86699105.js rel=preload as=script><link href=/static/js/chunk-common.ab1cfbd5.js rel=preload as=script><link href=/static/js/chunk-vendors.38bb0d05.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/adminPass.f2fb101e.css rel=stylesheet></head><body><div id=admin-pass-app></div><script src=/static/js/chunk-vendors.38bb0d05.js></script><script src=/static/js/chunk-common.ab1cfbd5.js></script><script src=/static/js/adminPass.86699105.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Set Admin Pass</title><link href=/static/css/adminPass.f2fb101e.css rel=preload as=style><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/js/adminPass.e9c46ce1.js rel=preload as=script><link href=/static/js/chunk-common.d5f13254.js rel=preload as=script><link href=/static/js/chunk-vendors.d79ad2d9.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/adminPass.f2fb101e.css rel=stylesheet></head><body><div id=admin-pass-app></div><script src=/static/js/chunk-vendors.d79ad2d9.js></script><script src=/static/js/chunk-common.d5f13254.js></script><script src=/static/js/adminPass.e9c46ce1.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>User Center</title><link href=/static/css/auth.917f69ac.css rel=preload as=style><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/js/auth.6173fce3.js rel=preload as=script><link href=/static/js/chunk-common.ab1cfbd5.js rel=preload as=script><link href=/static/js/chunk-vendors.38bb0d05.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/auth.917f69ac.css rel=stylesheet></head><body><div id=auth-app></div><script src=/static/js/chunk-vendors.38bb0d05.js></script><script src=/static/js/chunk-common.ab1cfbd5.js></script><script src=/static/js/auth.6173fce3.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>User Center</title><link href=/static/css/auth.917f69ac.css rel=preload as=style><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/js/auth.09cf76ab.js rel=preload as=script><link href=/static/js/chunk-common.d5f13254.js rel=preload as=script><link href=/static/js/chunk-vendors.d79ad2d9.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/auth.917f69ac.css rel=stylesheet></head><body><div id=auth-app></div><script src=/static/js/chunk-vendors.d79ad2d9.js></script><script src=/static/js/chunk-common.d5f13254.js></script><script src=/static/js/auth.09cf76ab.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/static/favicon.ico><title>DCache</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/dcache.e31da409.css rel=preload as=style><link href=/static/js/chunk-common.ab1cfbd5.js rel=preload as=script><link href=/static/js/chunk-vendors.38bb0d05.js rel=preload as=script><link href=/static/js/dcache.ca0c5b9a.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/dcache.e31da409.css rel=stylesheet></head><body><noscript><strong>We're sorry but DCache doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.38bb0d05.js></script><script src=/static/js/chunk-common.ab1cfbd5.js></script><script src=/static/js/dcache.ca0c5b9a.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/static/favicon.ico><title>DCache</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/dcache.e31da409.css rel=preload as=style><link href=/static/js/chunk-common.d5f13254.js rel=preload as=script><link href=/static/js/chunk-vendors.d79ad2d9.js rel=preload as=script><link href=/static/js/dcache.7ee44d43.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/dcache.e31da409.css rel=stylesheet></head><body><noscript><strong>We're sorry but DCache doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.d79ad2d9.js></script><script src=/static/js/chunk-common.d5f13254.js></script><script src=/static/js/dcache.7ee44d43.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/static/favicon.ico><title>Tars</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/index.e271b78d.css rel=preload as=style><link href=/static/js/chunk-common.ab1cfbd5.js rel=preload as=script><link href=/static/js/chunk-vendors.38bb0d05.js rel=preload as=script><link href=/static/js/index.480a4a0c.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/index.e271b78d.css rel=stylesheet></head><body><noscript><strong>We're sorry but Tars doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.38bb0d05.js></script><script src=/static/js/chunk-common.ab1cfbd5.js></script><script src=/static/js/index.480a4a0c.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/static/favicon.ico><title>Tars</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/index.d71914fb.css rel=preload as=style><link href=/static/js/chunk-common.d5f13254.js rel=preload as=script><link href=/static/js/chunk-vendors.d79ad2d9.js rel=preload as=script><link href=/static/js/index.a0bbe75e.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/index.d71914fb.css rel=stylesheet></head><body><noscript><strong>We're sorry but Tars doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.d79ad2d9.js></script><script src=/static/js/chunk-common.d5f13254.js></script><script src=/static/js/index.a0bbe75e.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/static/favicon.ico><title>TarsK8s</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/k8s.4321cbb0.css rel=preload as=style><link href=/static/js/chunk-common.ab1cfbd5.js rel=preload as=script><link href=/static/js/chunk-vendors.38bb0d05.js rel=preload as=script><link href=/static/js/k8s.23fafc67.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/k8s.4321cbb0.css rel=stylesheet></head><body><noscript><strong>We're sorry but TarsK8s doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.38bb0d05.js></script><script src=/static/js/chunk-common.ab1cfbd5.js></script><script src=/static/js/k8s.23fafc67.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/static/favicon.ico><title>TarsK8s</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/k8s.4321cbb0.css rel=preload as=style><link href=/static/js/chunk-common.d5f13254.js rel=preload as=script><link href=/static/js/chunk-vendors.d79ad2d9.js rel=preload as=script><link href=/static/js/k8s.8ed81461.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/k8s.4321cbb0.css rel=stylesheet></head><body><noscript><strong>We're sorry but TarsK8s doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.d79ad2d9.js></script><script src=/static/js/chunk-common.d5f13254.js></script><script src=/static/js/k8s.8ed81461.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Sign in</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/login.c9c6c482.css rel=preload as=style><link href=/static/js/chunk-common.ab1cfbd5.js rel=preload as=script><link href=/static/js/chunk-vendors.38bb0d05.js rel=preload as=script><link href=/static/js/login.8ff26912.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/login.c9c6c482.css rel=stylesheet></head><body><div id=login-app></div><script src=/static/js/chunk-vendors.38bb0d05.js></script><script src=/static/js/chunk-common.ab1cfbd5.js></script><script src=/static/js/login.8ff26912.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Sign in</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/login.b4a38b68.css rel=preload as=style><link href=/static/js/chunk-common.d5f13254.js rel=preload as=script><link href=/static/js/chunk-vendors.d79ad2d9.js rel=preload as=script><link href=/static/js/login.8a0da3a5.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/login.b4a38b68.css rel=stylesheet></head><body><div id=login-app></div><script src=/static/js/chunk-vendors.d79ad2d9.js></script><script src=/static/js/chunk-common.d5f13254.js></script><script src=/static/js/login.8a0da3a5.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/static/favicon.ico><title>logView</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/logView.f585414f.css rel=preload as=style><link href=/static/js/chunk-common.ab1cfbd5.js rel=preload as=script><link href=/static/js/chunk-vendors.38bb0d05.js rel=preload as=script><link href=/static/js/logView.215d5f9d.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/logView.f585414f.css rel=stylesheet></head><body><noscript><strong>We're sorry but logView doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.38bb0d05.js></script><script src=/static/js/chunk-common.ab1cfbd5.js></script><script src=/static/js/logView.215d5f9d.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/static/favicon.ico><title>logView</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/logView.f585414f.css rel=preload as=style><link href=/static/js/chunk-common.d5f13254.js rel=preload as=script><link href=/static/js/chunk-vendors.d79ad2d9.js rel=preload as=script><link href=/static/js/logView.1ce2d1a2.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/logView.f585414f.css rel=stylesheet></head><body><noscript><strong>We're sorry but logView doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.d79ad2d9.js></script><script src=/static/js/chunk-common.d5f13254.js></script><script src=/static/js/logView.1ce2d1a2.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Modify Pass</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/pass.aa0ebcdb.css rel=preload as=style><link href=/static/js/chunk-common.ab1cfbd5.js rel=preload as=script><link href=/static/js/chunk-vendors.38bb0d05.js rel=preload as=script><link href=/static/js/pass.9204ac83.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/pass.aa0ebcdb.css rel=stylesheet></head><body><div id=pass-app></div><script src=/static/js/chunk-vendors.38bb0d05.js></script><script src=/static/js/chunk-common.ab1cfbd5.js></script><script src=/static/js/pass.9204ac83.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Modify Pass</title><link href=/static/css/chunk-common.c72fc57e.css rel=preload as=style><link href=/static/css/chunk-vendors.ff034728.css rel=preload as=style><link href=/static/css/pass.aa0ebcdb.css rel=preload as=style><link href=/static/js/chunk-common.d5f13254.js rel=preload as=script><link href=/static/js/chunk-vendors.d79ad2d9.js rel=preload as=script><link href=/static/js/pass.313a4bea.js rel=preload as=script><link href=/static/css/chunk-vendors.ff034728.css rel=stylesheet><link href=/static/css/chunk-common.c72fc57e.css rel=stylesheet><link href=/static/css/pass.aa0ebcdb.css rel=stylesheet></head><body><div id=pass-app></div><script src=/static/js/chunk-vendors.d79ad2d9.js></script><script src=/static/js/chunk-common.d5f13254.js></script><script src=/static/js/pass.313a4bea.js></script></body></html>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
Supports Markdown
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