Compare commits

...

4 Commits

4 changed files with 36 additions and 31 deletions

View File

@ -9,8 +9,6 @@
</template> </template>
<script> <script>
import { watchEffect } from 'vue';
import Navbar from './Navbar.vue'; import Navbar from './Navbar.vue';
import Login from './Login.vue'; import Login from './Login.vue';
import RouteSchedule from './RouteSchedule.vue'; import RouteSchedule from './RouteSchedule.vue';
@ -47,10 +45,7 @@
].forEach(route => this.$root.$router.addRoute(route)); ].forEach(route => this.$root.$router.addRoute(route));
await this.$root.$router.replace(this.$route); await this.$root.$router.replace(this.$route);
} }
if(value) { if(value) this.heartbeat = await value.heartbeat();
this.heartbeat = await value.heartbeat();
var stop = watchEffect(() => { if(!value.connected.value) { stop(); this.client = this.server = this.user = null; } });
}
} }
} }
}; };

View File

@ -2,8 +2,9 @@
<div class="accordion mb-3 shadow"> <div class="accordion mb-3 shadow">
<div class="accordion-item"> <div class="accordion-item">
<h2 class="accordion-header"><button class="accordion-button" :class="{ testing: (x_server) && (x_server.production) && (x_server.production != '1') }" type="button" @click="() => show = !show"><template v-if="user">{{user[2]}}<template v-if="server"> @ {{server.domain}}</template></template><template v-else>Login</template></button></h2> <h2 class="accordion-header"><button class="accordion-button" :class="{ testing: (x_server) && (x_server.production) && (x_server.production != '1') }" type="button" @click="() => show = !show"><template v-if="user">{{user[2]}}<template v-if="server"> @ {{server.domain}}</template></template><template v-else>Login</template></button></h2>
<div class="accordion-collapse collapse" :class="{ show }"> <div class="accordion-collapse collapse" :class="{ show: (show) || (!x_client) }">
<div class="accordion-body"> <div class="accordion-body" v-if="!x_client"><button v-if="fail" class="btn btn-primary btn-lg" style="width: 100%;" @click="connect">Reconnect</button><button v-else class="btn btn-outline-primary btn-lg" style="width: 100%;" @click="connect">Connect</button></div>
<div class="accordion-body" v-else>
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<p class="card-text row"><code class="col" v-if="banner"><pre>{{banner.join('\n')}}</pre></code><code class="col" v-if="user"><pre>{{user.join('\n')}}</pre></code></p> <p class="card-text row"><code class="col" v-if="banner"><pre>{{banner.join('\n')}}</pre></code><code class="col" v-if="user"><pre>{{user.join('\n')}}</pre></code></p>
@ -44,6 +45,8 @@
</style> </style>
<script> <script>
import { watchEffect } from 'vue';
import vistax from './vistax.mjs'; import vistax from './vistax.mjs';
export default { export default {
@ -73,6 +76,7 @@
data() { data() {
return { return {
show: false, show: false,
fail: false,
x_client: this.client, x_client: this.client,
x_server: this.server, x_server: this.server,
x_user: this.user, x_user: this.user,
@ -98,7 +102,7 @@
}, immediate: true }, immediate: true
}, },
client(value) { this.x_client = value; }, client(value) { this.x_client = value; },
x_client(value) { this.$emit('update:client', value); if(!value) this.connect(); }, x_client(value) { this.$emit('update:client', value); },
server(value) { this.x_server = value; }, server(value) { this.x_server = value; },
x_server(value) { this.$emit('update:server', value); }, x_server(value) { this.$emit('update:server', value); },
user(value) { this.x_user = value; }, user(value) { this.x_user = value; },
@ -107,19 +111,21 @@
methods: { methods: {
async connect() { async connect() {
this.logout(); this.logout();
this.x_client = await (this.host ? vistax.Client.fromCookie(this.secret, this.host) : vistax.Client.fromCookie(this.secret)); if(this.x_client = await (this.host ? vistax.Client.fromCookie(this.secret, this.host) : vistax.Client.fromCookie(this.secret))) {
this.banner = await this.x_client.XUS_INTRO_MSG(); this.banner = await this.x_client.XUS_INTRO_MSG();
if((await this.x_client.userinfo()).result) try { if((await this.x_client.userinfo()).result) try {
var user = await this.x_client.XUS_GET_USER_INFO(); var user = await this.x_client.XUS_GET_USER_INFO();
this.x_user = user[0] ? user : null this.x_user = user[0] ? user : null
} catch(ex) { } catch(ex) {
this.x_user = null; this.x_user = null;
} }
this.$emit('update:user', this.x_user); this.$emit('update:user', this.x_user);
this.show = !this.x_user; this.show = !this.x_user;
this.$emit('update:server', this.x_server = (await this.x_client.serverinfo()).result); this.$emit('update:server', this.x_server = (await this.x_client.serverinfo()).result);
console.log('Backend secret', this.secret); console.log('Backend secret', this.secret);
console.log(this.banner); console.log(this.banner);
var stop = watchEffect(() => { if(!this.x_client.connected.value) { stop(); this.x_client = this.x_server = this.x_user = null; this.fail = true; } });
} else this.fail = true;
}, },
async login(evt) { async login(evt) {
if(this.x_client) { if(this.x_client) {

View File

@ -37,8 +37,8 @@
table.table-sticky tbody tr { table.table-sticky tbody tr {
border-top: 1px dashed #dee2e6; border-top: 1px dashed #dee2e6;
} }
table.table-sticky td:nth-of-type(odd) { td:nth-of-type(odd) {
background-color: rgba(0, 0, 0, 0.05); background-color: rgba(0, 0, 0, 0.05);
} }
table.table-sticky tbody th, table.table-sticky th.name { table.table-sticky tbody th, table.table-sticky th.name {
font-weight: bold; font-weight: bold;

18
main.py
View File

@ -53,14 +53,18 @@ def application():
@app.post('/v1/vista') @app.post('/v1/vista')
def cb_connect(): def cb_connect():
params = request.json['params'] params = request.json['params']
if params.get('secret') == secret: try:
cid = ''.join(secrets.choice(string.ascii_lowercase + string.digits) for i in range(64)) if params.get('secret') == secret:
while cid in clients:
cid = ''.join(secrets.choice(string.ascii_lowercase + string.digits) for i in range(64)) cid = ''.join(secrets.choice(string.ascii_lowercase + string.digits) for i in range(64))
clients[cid] = client = CacheProxyRPC(rpc.ClientSync(host=params.get('host', 'test.northport.med.va.gov'), port=int(params.get('port', 19009)))) while cid in clients:
return jsonify({ 'result': cid, 'error': None, 'id': request.json.get('id') }) cid = ''.join(secrets.choice(string.ascii_lowercase + string.digits) for i in range(64))
else: clients[cid] = client = CacheProxyRPC(rpc.ClientSync(host=params.get('host', 'test.northport.med.va.gov'), port=int(params.get('port', 19009))))
return jsonify({ 'result': None, 'error': { 'type': 'Unauthorized', 'args': [] }, 'id': request.json.get('id') }) return jsonify({ 'result': cid, 'error': None, 'id': request.json.get('id') })
else:
return jsonify({ 'result': None, 'error': { 'type': 'Unauthorized', 'args': [] }, 'id': request.json.get('id') })
except Exception as ex:
logger.exception(request.url)
return jsonify({ 'result': None, 'error': { 'type': ex.__class__.__name__, 'args': ex.args }, 'id': request.json.get('id') })
@app.post('/v1/vista/<cid>/close') @app.post('/v1/vista/<cid>/close')
def cb_close(cid): def cb_close(cid):