Compare commits
6 Commits
master
...
play_groun
Author | SHA1 | Date | |
---|---|---|---|
eb63fb3576 | |||
9a032dc541 | |||
6e88a76bac | |||
c12e8b2e77 | |||
b74c4333ec | |||
e04904a329 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
|
.idea
|
||||||
node_modules
|
node_modules
|
||||||
|
31
dist/main.js
vendored
31
dist/main.js
vendored
File diff suppressed because one or more lines are too long
1339
package-lock.json
generated
1339
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -25,6 +25,10 @@
|
|||||||
"webpack": "^4.41.2",
|
"webpack": "^4.41.2",
|
||||||
"webpack-cli": "^3.3.10",
|
"webpack-cli": "^3.3.10",
|
||||||
"webpack-dev-server": "^3.9.0",
|
"webpack-dev-server": "^3.9.0",
|
||||||
"vue-spinners-css": "^1.1.3"
|
"bootstrap": "^4.4.1",
|
||||||
|
"bootstrap-vue": "^2.1.0",
|
||||||
|
"node-sass": "^4.13.0",
|
||||||
|
"sass-loader": "^8.0.0",
|
||||||
|
"style-loader": "^1.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="statusBox">
|
<div id="statusBox">
|
||||||
<div class="row">
|
<div>
|
||||||
<div class="col-4">
|
<div>
|
||||||
<select :ref="'serverSelectBox' + 1" v-if="pending === false" v-model="selectedServerData" id="serverSelectList">
|
<select :ref="'serverSelectBox' + 1" v-if="pending === false" v-model="selectedServerData" id="serverSelectList">
|
||||||
<option v-for="(serverItem, index) in serverlist"
|
<option v-for="(serverItem, index) in serverlist"
|
||||||
v-bind:value="serverItem"
|
v-bind:value="serverItem"
|
||||||
@ -11,15 +11,14 @@
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
<input v-model="target" placeholder="Enter Ip or Domain">
|
<input v-model="target" placeholder="Enter Ip or Domain">
|
||||||
<button v-on:click="handleClick()">
|
<b-button v-on:click="handleClick()" size="sm">
|
||||||
⛟
|
⛟ <b-spinner v-if="isLoading" small></b-spinner>
|
||||||
</button>
|
</b-button>
|
||||||
<RingLoader :size="10" :loading="isLoading" color="black"></RingLoader>
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<span class="small">{{infoString}}</span>
|
<span class="small">{{infoString}}</span>
|
||||||
<div>
|
<div>
|
||||||
<table :id="'tableId_'+boxNumber" class="table table-striped">
|
<table :id="'tableId_'+boxNumber" class="xtr-table xtr-table-striped">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<td>IP</td>
|
<td>IP</td>
|
||||||
@ -52,11 +51,9 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import XtrServer from './ModelObjects/XtrServer.js';
|
import XtrServer from './ModelObjects/XtrServer.js';
|
||||||
import XtrData from './ModelObjects/XtrData.js';
|
import XtrData from './ModelObjects/XtrData.js';
|
||||||
import { RingLoader } from 'vue-spinners-css';
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
RingLoader
|
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
serverlist: Array,
|
serverlist: Array,
|
||||||
@ -287,65 +284,4 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
input[type=range] {
|
|
||||||
width: 90%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: stretch;
|
|
||||||
}
|
|
||||||
|
|
||||||
span.small {
|
|
||||||
font-size: 75%;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.active {
|
|
||||||
border: 3px solid #9ac5e3;
|
|
||||||
}
|
|
||||||
|
|
||||||
table {
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 90%;
|
|
||||||
}
|
|
||||||
|
|
||||||
td {
|
|
||||||
border:1px solid grey;
|
|
||||||
font-size: 9pt;
|
|
||||||
}
|
|
||||||
|
|
||||||
.traceroutes {
|
|
||||||
text-decoration: none;
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
|
|
||||||
.traceroutes:visited {
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.traceroutes:hover {
|
|
||||||
color: #880000;
|
|
||||||
transform: rotate(-30deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
.traceroutes:active {
|
|
||||||
color: #bb0000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.traceroutes_rotating {
|
|
||||||
display: inline-block;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #bb0000;
|
|
||||||
animation: spin 2s linear infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
.odd {
|
|
||||||
background-color: #EEE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes spin {
|
|
||||||
0% { transform: rotate(-30deg); }
|
|
||||||
25% { transform: rotate(0deg); }
|
|
||||||
50% { transform: rotate(30deg); }
|
|
||||||
75% { transform: rotate(0deg); }
|
|
||||||
100% { transform: rotate(-30deg); }
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
@ -1,43 +1,58 @@
|
|||||||
<template>
|
<template>
|
||||||
<div id="statusBoxContainer">
|
<div id="statusBoxContainer">
|
||||||
<div>
|
<div>
|
||||||
<button v-on:click="resetSession()">Reset whole session</button>
|
<b-navbar type="light" variant="secondary">
|
||||||
<button v-on:click="refreshServerlist()">Refresh Serverlist</button>
|
<b-navbar-nav>
|
||||||
<button v-on:click="addTraceBox()">Add new TraceBox</button>
|
<b-nav-item v-on:click="executeSpecificBoxes(checkedBoxes)">Run selected ┉</b-nav-item>
|
||||||
|
<b-nav-item-dropdown text="Session-Settings" left>
|
||||||
|
<b-dropdown-item v-on:click="resetSession()">↯ Reset whole session</b-dropdown-item>
|
||||||
|
<b-dropdown-item v-on:click="refreshServerlist()">↺ Refresh Serverlist</b-dropdown-item>
|
||||||
|
</b-nav-item-dropdown>
|
||||||
|
<b-nav-item v-on:click="executeAllBoxes()">Request for all boxes⏎</b-nav-item>
|
||||||
|
<b-nav-item v-on:click="addTraceBox()">Add new TraceBox ➕</b-nav-item>
|
||||||
|
|
||||||
</div>
|
<!-- <b-nav-item-dropdown text="Session Reports" left>
|
||||||
<!-- Hover icon section -->
|
<b-dropdown-item>Requests</b-dropdown-item>
|
||||||
<div id="info" class="info" title="test">
|
<b-dropdown-item>Times etc.</b-dropdown-item>
|
||||||
ⓘ
|
</b-nav-item-dropdown> -->
|
||||||
<div id="info_box" class="info_box">
|
</b-navbar-nav>
|
||||||
|
<div>
|
||||||
|
<b-button v-b-modal.modal-tall>ⓘ</b-button>
|
||||||
|
<b-modal id="modal-tall" title="XTR - Info">
|
||||||
|
<p class="my-4">
|
||||||
This service is free for use by accepting the <a href="aup.txt">Acceptable Use Policy</a>.<br>
|
This service is free for use by accepting the <a href="aup.txt">Acceptable Use Policy</a>.<br>
|
||||||
<br>
|
<br>
|
||||||
This is just an interface to to give a more GUI-ish
|
This is just an interface to to give a more GUI-ish
|
||||||
access to the self-registered XTR clients. No traceroute requests will be saved on this server. All request to the XTR clients
|
access to the self-registered XTR clients. No traceroute requests will be saved on this server. All request to the XTR clients
|
||||||
are handled by your browser.<br>
|
are handled by your browser.<br>
|
||||||
<br>
|
<br>
|
||||||
Want to add your server? <a href="xtr.pl">Download XTR client</a> now. Readme included in source code!<br>
|
Want to add your server? <a href="https://git.xicon.eu/xicon/xtr">Download XTR client</a> now. Readme also included in source code!<br>
|
||||||
Want to run your own master server? <a href="xtrd.pl">Download XTRd</a>. Readme included in source code!<br>
|
Want to run your own master server? <a href="https://git.xicon.eu/xicon/xtrd">Download XTRd</a>. Readme also included in source code!<br>
|
||||||
<br>
|
<br>
|
||||||
Questions?/Impress? -> <a href="mailto:rest@xicon.de">Friedrich Schrader</a>
|
Questions?/Impress? -> <a href="mailto:rest@xicon.de">Friedrich Schrader</a>
|
||||||
|
<br>
|
||||||
|
Interested in the new and improved frontend? -> <a href="beta/">still in beta</a>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
This product includes GeoLite2 ASN data created by MaxMind, available from <a href="http://www.maxmind.com">http://www.maxmind.com</a>.
|
||||||
|
</p>
|
||||||
|
</b-modal>
|
||||||
</div>
|
</div>
|
||||||
|
</b-navbar>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
<div id="selectionDiv">
|
||||||
<button v-on:click="executeSpecificBoxes(checkedBoxes)">Run selected</button>
|
|
||||||
<div style="display: inline-block;">
|
|
||||||
<input
|
<input
|
||||||
|
@click="setActive(index)"
|
||||||
:id="index"
|
:id="index"
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
v-for="(traceBox, index) in traceBoxes"
|
v-for="(traceBox, index) in traceBoxes"
|
||||||
v-model="checkedBoxes"
|
v-model="checkedBoxes"
|
||||||
:value="index"
|
:value="index"
|
||||||
@click="setActive(index)"
|
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
|
||||||
<button v-on:click="executeAllBoxes()">Request for all boxes</button>
|
|
||||||
|
|
||||||
<div class="grid-container">
|
<div class="grid-container">
|
||||||
<template v-for="(traceBox, index) in traceBoxes">
|
<template v-for="(traceBox, index) in traceBoxes">
|
||||||
@ -144,24 +159,24 @@ export default {
|
|||||||
this.resetData();
|
this.resetData();
|
||||||
sessionStorage.clear();
|
sessionStorage.clear();
|
||||||
document.querySelectorAll('[id^=tableId_]').forEach(element => {
|
document.querySelectorAll('[id^=tableId_]').forEach(element => {
|
||||||
element.className = 'table table-striped';
|
element.className = 'xtr-table xtr-table-striped';
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
setActive: function setActive(tableId) {
|
setActive: function setActive(tableId) {
|
||||||
this.$nextTick(() => {
|
|
||||||
var settedClasses = document.getElementById("tableId_"+tableId).className;
|
var settedClasses = document.getElementById("tableId_"+tableId).className;
|
||||||
if (settedClasses == 'table table-striped') {
|
if (settedClasses == 'xtr-table xtr-table-striped') {
|
||||||
document.getElementById("tableId_"+tableId).className = 'table table-striped active';
|
document.getElementById("tableId_"+tableId).className = 'xtr-table xtr-table-striped active';
|
||||||
} else {
|
} else {
|
||||||
document.getElementById("tableId_"+tableId).className = 'table table-striped';
|
document.getElementById("tableId_"+tableId).className = 'xtr-table xtr-table-striped';
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
},
|
},
|
||||||
setActiveFromSession: function setActiveFromSession(tableIds) {
|
setActiveFromSession: function setActiveFromSession(tableIds) {
|
||||||
|
console.log(tableIds)
|
||||||
|
this.$nextTick(() => {
|
||||||
tableIds.forEach(tableId => {
|
tableIds.forEach(tableId => {
|
||||||
this.setActive(tableId);
|
this.setActive(tableId);
|
||||||
});
|
}); });
|
||||||
|
|
||||||
},
|
},
|
||||||
executeAllBoxes: function () {
|
executeAllBoxes: function () {
|
||||||
var boxesRefs = this.$refs.boxref;
|
var boxesRefs = this.$refs.boxref;
|
||||||
@ -213,34 +228,10 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
h4 {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.grid-container {
|
.grid-container {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
|
grid-template-columns: repeat(auto-fill, minmax(400px, 1fr));
|
||||||
grid-gap: 5px;
|
grid-gap: 5px;
|
||||||
padding: 5px;
|
margin: 0 10 0 10;
|
||||||
}
|
|
||||||
|
|
||||||
.info {
|
|
||||||
display: block; position: absolute; right: 10px; top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info:hover .info_box {
|
|
||||||
visibility: visible;
|
|
||||||
z-index: 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info .info_box {
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
right: 0px;
|
|
||||||
top: 0px;
|
|
||||||
visibility: hidden;
|
|
||||||
width: 502px;
|
|
||||||
border: solid 1px;
|
|
||||||
background-color: #999999;
|
|
||||||
font-size: 10pt;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
92
src/assets/styles/main.scss
Normal file
92
src/assets/styles/main.scss
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
@import '~bootstrap';
|
||||||
|
@import '~bootstrap-vue';
|
||||||
|
|
||||||
|
:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#selectionDiv {
|
||||||
|
margin: 10 10 5 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 0.0rem 0rem;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=range] {
|
||||||
|
width: 90%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=checkbox] {
|
||||||
|
font-size: xx-large;
|
||||||
|
margin: 2
|
||||||
|
}
|
||||||
|
|
||||||
|
select, input {
|
||||||
|
font-size: small;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.small {
|
||||||
|
font-size: 75%;
|
||||||
|
line-height: 1.2;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.active {
|
||||||
|
border: 3px solid #9ac5e3;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
border:1px solid grey;
|
||||||
|
font-size: 9pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
.traceroutes {
|
||||||
|
text-decoration: none;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.traceroutes:visited {
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.traceroutes:hover {
|
||||||
|
color: #880000;
|
||||||
|
transform: rotate(-30deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.traceroutes:active {
|
||||||
|
color: #bb0000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.traceroutes_rotating {
|
||||||
|
display: inline-block;
|
||||||
|
text-decoration: none;
|
||||||
|
color: #bb0000;
|
||||||
|
animation: spin 2s linear infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
.odd {
|
||||||
|
background-color: #EEE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
0% { transform: rotate(-30deg); }
|
||||||
|
25% { transform: rotate(0deg); }
|
||||||
|
50% { transform: rotate(30deg); }
|
||||||
|
75% { transform: rotate(0deg); }
|
||||||
|
100% { transform: rotate(-30deg); }
|
||||||
|
}
|
13
src/main.js
13
src/main.js
@ -1,5 +1,18 @@
|
|||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import StatusBoxContainer from './StatusBoxContainer.vue';
|
import StatusBoxContainer from './StatusBoxContainer.vue';
|
||||||
|
import BootstrapVue, { BButton, BModal, VBModal} from 'bootstrap-vue';
|
||||||
|
import { NavbarPlugin } from 'bootstrap-vue';
|
||||||
|
import { SpinnerPlugin } from 'bootstrap-vue';
|
||||||
|
|
||||||
|
import './assets/styles/main.scss';
|
||||||
|
|
||||||
|
Vue.component('b-button', BButton);
|
||||||
|
Vue.component('b-modal', BModal);
|
||||||
|
|
||||||
|
Vue.directive('b-modal', VBModal);
|
||||||
|
|
||||||
|
Vue.use(NavbarPlugin);
|
||||||
|
Vue.use(SpinnerPlugin);
|
||||||
|
|
||||||
new Vue({
|
new Vue({
|
||||||
el: '#statusBoxContainer',
|
el: '#statusBoxContainer',
|
||||||
|
@ -8,6 +8,7 @@ module.exports = {
|
|||||||
{ test: /\.js$/, use: 'babel-loader' },
|
{ test: /\.js$/, use: 'babel-loader' },
|
||||||
{ test: /\.vue$/, use: 'vue-loader' },
|
{ test: /\.vue$/, use: 'vue-loader' },
|
||||||
{ test: /\.css$/, use: ['vue-style-loader', 'css-loader'] },
|
{ test: /\.css$/, use: ['vue-style-loader', 'css-loader'] },
|
||||||
|
{ test: /\.s[ac]ss$/i, use: ['style-loader', 'css-loader', 'sass-loader'] }
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
|
Loading…
Reference in New Issue
Block a user