| <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> |