blob: e1580597925357b44efbca308f3f1529c5f76010 [file] [log] [blame]
<template>
<b-container fluid="xl">
<page-title />
<b-row class="mb-4">
<b-col md="12">
<page-section
:section-title="$t('pageVirtualMedia.virtualMediaSubTitleFirst')"
>
<b-row>
<b-col v-for="(dev, $index) in proxyDevices" :key="$index" md="6">
<b-form-group :label="dev.id" label-class="bold">
<form-file
v-if="!dev.isActive"
:id="concatId(dev.id)"
v-model="dev.file"
>
<template #invalid>
<b-form-invalid-feedback role="alert">
{{ $t('global.form.required') }}
</b-form-invalid-feedback>
</template>
</form-file>
</b-form-group>
<b-button
v-if="!dev.isActive"
variant="primary"
:disabled="!dev.file"
@click="startVM(dev)"
>
{{ $t('pageVirtualMedia.start') }}
</b-button>
<b-button
v-if="dev.isActive"
variant="primary"
:disabled="!dev.file"
@click="stopVM(dev)"
>
{{ $t('pageVirtualMedia.stop') }}
</b-button>
</b-col>
</b-row>
</page-section>
</b-col>
</b-row>
<b-row v-if="loadImageFromExternalServer" class="mb-4">
<b-col md="12">
<page-section
:section-title="$t('pageVirtualMedia.virtualMediaSubTitleSecond')"
>
<b-row>
<b-col
v-for="(device, $index) in legacyDevices"
:key="$index"
md="6"
>
<b-form-group
:label="device.id"
:label-for="device.id"
label-class="bold"
>
<b-button
variant="primary"
:disabled="device.isActive"
@click="configureConnection(device)"
>
{{ $t('pageVirtualMedia.configureConnection') }}
</b-button>
<b-button
v-if="!device.isActive"
variant="primary"
class="float-right"
:disabled="!device.serverUri"
@click="startLegacy(device)"
>
{{ $t('pageVirtualMedia.start') }}
</b-button>
<b-button
v-if="device.isActive"
variant="primary"
class="float-right"
@click="stopLegacy(device)"
>
{{ $t('pageVirtualMedia.stop') }}
</b-button>
</b-form-group>
</b-col>
</b-row>
</page-section>
</b-col>
</b-row>
<modal-configure-connection
:connection="modalConfigureConnection"
@ok="saveConnection"
/>
</b-container>
</template>
<script>
import PageTitle from '@/components/Global/PageTitle';
import PageSection from '@/components/Global/PageSection';
import BVToastMixin from '@/components/Mixins/BVToastMixin';
import LoadingBarMixin from '@/components/Mixins/LoadingBarMixin';
import ModalConfigureConnection from './ModalConfigureConnection';
import NbdServer from '@/utilities/NBDServer';
import FormFile from '@/components/Global/FormFile';
import { useI18n } from 'vue-i18n';
import i18n from '@/i18n';
export default {
name: 'VirtualMedia',
components: { PageTitle, PageSection, ModalConfigureConnection, FormFile },
mixins: [BVToastMixin, LoadingBarMixin],
data() {
return {
$t: useI18n().t,
modalConfigureConnection: null,
loadImageFromExternalServer:
process.env.VUE_APP_VIRTUAL_MEDIA_LIST_ENABLED === 'true'
? true
: false,
};
},
computed: {
proxyDevices() {
return this.$store.getters['virtualMedia/proxyDevices'];
},
legacyDevices() {
return this.$store.getters['virtualMedia/legacyDevices'];
},
},
created() {
this.$store.dispatch('global/getSystemInfo');
if (this.proxyDevices.length > 0 || this.legacyDevices.length > 0) return;
this.startLoader();
this.$store
.dispatch('virtualMedia/getData')
.finally(() => this.endLoader());
},
methods: {
startVM(device) {
const token = this.$store.getters['authentication/token'];
device.nbd = new NbdServer(
`wss://${window.location.host}${device.websocket}`,
device.file,
device.id,
token,
);
device.nbd.socketStarted = () =>
this.successToast(
i18n.global.t('pageVirtualMedia.toast.serverRunning'),
);
device.nbd.errorReadingFile = () =>
this.errorToast(
i18n.global.t('pageVirtualMedia.toast.errorReadingFile'),
);
device.nbd.socketClosed = (code) => {
if (code === 1000)
this.successToast(
i18n.global.t('pageVirtualMedia.toast.serverClosedSuccessfully'),
);
else
this.errorToast(
i18n.global.t('pageVirtualMedia.toast.serverClosedWithErrors'),
);
device.file = null;
device.isActive = false;
};
device.nbd.start();
device.isActive = true;
},
stopVM(device) {
device.nbd.stop();
},
startLegacy(connectionData) {
var data = {};
data.Image = connectionData.serverUri;
data.UserName = connectionData.username;
data.Password = connectionData.password;
data.WriteProtected = !connectionData.isRW;
this.startLoader();
this.$store
.dispatch('virtualMedia/mountImage', {
id: connectionData.id,
data: data,
})
.then(() => {
this.successToast(
i18n.global.t('pageVirtualMedia.toast.serverConnectionEstablished'),
);
connectionData.isActive = true;
})
.catch(() => {
this.errorToast(
i18n.global.t('pageVirtualMedia.toast.errorMounting'),
);
this.isActive = false;
})
.finally(() => this.endLoader());
},
stopLegacy(connectionData) {
this.$store
.dispatch('virtualMedia/unmountImage', connectionData.id)
.then(() => {
this.successToast(
i18n.global.t('pageVirtualMedia.toast.serverClosedSuccessfully'),
);
connectionData.isActive = false;
})
.catch(() =>
this.errorToast(
i18n.global.t('pageVirtualMedia.toast.errorUnmounting'),
),
)
.finally(() => this.endLoader());
},
saveConnection(connectionData) {
this.modalConfigureConnection.serverUri = connectionData.serverUri;
this.modalConfigureConnection.username = connectionData.username;
this.modalConfigureConnection.password = connectionData.password;
this.modalConfigureConnection.isRW = connectionData.isRW;
},
configureConnection(connectionData) {
this.modalConfigureConnection = connectionData;
this.$bvModal.show('configure-connection');
},
concatId(val) {
return val.split(' ').join('_').toLowerCase();
},
},
};
</script>