diff options
author | Maksim Zakharov <m.zakharov@IBS.RU> | 2022-09-20 12:01:00 +0300 |
---|---|---|
committer | Maksim Zakharov <m.zakharov@IBS.RU> | 2022-09-20 12:01:00 +0300 |
commit | 4ff2ff241ae80589749269114ccdea99bc31ff5e (patch) | |
tree | a58743d86cd1ae35c626832f0101749588e8fd7d /src | |
parent | a72c39d39f2c2fa127139c9e161bacaecbcb5a07 (diff) | |
download | webui-vue-4ff2ff241ae80589749269114ccdea99bc31ff5e.tar.xz |
add ipmi, ssh policies
Diffstat (limited to 'src')
-rw-r--r-- | src/assets/styles/bmc/_sila/_modal.scss | 2 | ||||
-rw-r--r-- | src/env/components/AppNavigation/sila.js | 4 | ||||
-rw-r--r-- | src/locales/en-US.json | 7 | ||||
-rw-r--r-- | src/locales/ru-RU.json | 7 | ||||
-rw-r--r-- | src/store/modules/SecurityAndAccess/PoliciesStore.js | 44 | ||||
-rw-r--r-- | src/views/_sila/SecurityAndAccess/Policies/ModalIpmi.vue | 106 | ||||
-rw-r--r-- | src/views/_sila/SecurityAndAccess/Policies/ModalSsh.vue | 106 | ||||
-rw-r--r-- | src/views/_sila/SecurityAndAccess/Policies/Policies.vue | 59 |
8 files changed, 328 insertions, 7 deletions
diff --git a/src/assets/styles/bmc/_sila/_modal.scss b/src/assets/styles/bmc/_sila/_modal.scss index c4428cdc..79f8313b 100644 --- a/src/assets/styles/bmc/_sila/_modal.scss +++ b/src/assets/styles/bmc/_sila/_modal.scss @@ -65,6 +65,8 @@ } } +#modal-ssh, +#modal-ipmi, #modal-dns, #modal-hostname, #modal-mac-address, diff --git a/src/env/components/AppNavigation/sila.js b/src/env/components/AppNavigation/sila.js index 328c1b50..b7b1ca5a 100644 --- a/src/env/components/AppNavigation/sila.js +++ b/src/env/components/AppNavigation/sila.js @@ -202,11 +202,11 @@ const AppNavigationMixin = { label: this.$t('appNavigation.userManagement'), route: '/security-and-access/user-management', }, - /*{ + { id: 'policies', label: this.$t('appNavigation.policies'), route: '/security-and-access/policies', - },*/ + }, { id: 'certificates', label: this.$t('appNavigation.certificates'), diff --git a/src/locales/en-US.json b/src/locales/en-US.json index d8338e16..fc6d7bd3 100644 --- a/src/locales/en-US.json +++ b/src/locales/en-US.json @@ -824,7 +824,10 @@ "rtadDescription": "This option enables or disables the Remote Trusted Attestation Daemon for host firmware", "ssh": "BMC shell (via SSH)", "sshDescription": "Allow access to shell sessions via SSH, through port 22 on the BMC.", + "port": "Port", "modal": { + "editSshPort": "Change port SSH", + "editIpmiPort": "Change port IPMI", "disableMessage": { "ipmi": "Are you sure you want to disable @:pagePolicies.ipmi?", "ssh": "Are you sure you want to disable @:pagePolicies.ssh?" @@ -837,18 +840,22 @@ "toast": { "errorIpmiDisabled": "Error disabling IPMI security setting.", "errorIpmiEnabled": "Error enabling IPMI security setting.", + "errorIpmiPort": "Error saving port IPMI.", "errorRtadDisabled": "Error disabling RTAD security setting.", "errorRtadEnabled": "Error enabling RTAD security setting.", "errorSshDisabled": "Error disabling SSH security setting.", "errorSshEnabled": "Error enabling SSH security setting.", + "errorSshPort": "Error saving port SSH.", "errorVtpmDisabled": "Error disabling VirtualTPM security setting.", "errorVtpmEnabled": "Error enabling VirtualTPM security setting.", "successIpmiDisabled": "Successfully disabled IPMI security setting.", "successIpmiEnabled": "Successfully enabled IPMI security setting.", + "successIpmiPort": "Successfully saving port IPMI.", "successRtadDisabled": "Successfully disabled RTAD security setting.", "successRtadEnabled": "Successfully enabled RTAD security setting.", "successSshDisabled": "Successfully disabled SSH security setting.", "successSshEnabled": "Successfully enabled SSH security setting.", + "successSshPort": "Successfully saving port SSH.", "successVtpmDisabled": "Successfully disabled VirtualTPM security setting.", "successVtpmEnabled": "Successfully enabled VirtualTPM security setting." }, diff --git a/src/locales/ru-RU.json b/src/locales/ru-RU.json index ff39c1e9..8bf5e8af 100644 --- a/src/locales/ru-RU.json +++ b/src/locales/ru-RU.json @@ -825,7 +825,10 @@ "rtadDescription": "Данная опция включает/отключает Remote Trusted Attestation Daemon для программного обеспечения хоста", "ssh": "Консоль BMC (через SSH)", "sshDescription": "Разрешить доступ к консольной сессии через SSH, через порт 22 на BMC.", + "port": "Порт", "modal": { + "editSshPort": "Изменить порт SSH", + "editIpmiPort": "Изменить порт IPMI", "disableMessage": { "ipmi": "Вы уверены, что хотите отключить @:pagePolicies.ipmi?", "ssh": "Вы уверены, что хотите отключить @:pagePolicies.ssh?" @@ -838,18 +841,22 @@ "toast": { "errorIpmiDisabled": "Ошибка отключения настроек безопасности IPMI.", "errorIpmiEnabled": "Ошибка включения настроек безопасности IPMI.", + "errorIpmiPort": "Ошибка сохранения порта IPMI.", "errorRtadDisabled": "Ошибка отключения настроек безопасности RTAD.", "errorRtadEnabled": "Ошибка включения настроек безопасности RTAD.", "errorSshDisabled": "Ошибка отключения настроек безопасности SSH.", "errorSshEnabled": "Ошибка включения настроек безопасности SSH.", + "errorSshPort": "Ошибка сохранения порта SSH.", "errorVtpmDisabled": "Ошибка отключения настроек безопасности VirtualTPM.", "errorVtpmEnabled": "Ошибка включения настроек безопасности VirtualTPM.", "successIpmiDisabled": "Успешное отключение настроек безопасности IPMI.", "successIpmiEnabled": "Успешное включение настроек безопасности IPMI.", + "successIpmiPort": "Успешное сохранение порта IPMI.", "successRtadDisabled": "Успешное отключение настроек безопасности RTAD.", "successRtadEnabled": "Успешное включение настроек безопасности RTAD.", "successSshDisabled": "Успешное отключение настроек безопасности SSH.", "successSshEnabled": "Успешное включение настроек безопасности SSH.", + "successSshPort": "Успешное сохранение порта SSH.", "successVtpmDisabled": "Успешное отключение настроек безопасности VirtualTPM.", "successVtpmEnabled": "Успешное включение настроек безопасности VirtualTPM." }, diff --git a/src/store/modules/SecurityAndAccess/PoliciesStore.js b/src/store/modules/SecurityAndAccess/PoliciesStore.js index 64bd3369..cd582195 100644 --- a/src/store/modules/SecurityAndAccess/PoliciesStore.js +++ b/src/store/modules/SecurityAndAccess/PoliciesStore.js @@ -5,21 +5,27 @@ const PoliciesStore = { namespaced: true, state: { sshProtocolEnabled: false, + sshPort: null, ipmiProtocolEnabled: false, + ipmiPort: null, rtadEnabled: 'Disabled', vtpmEnabled: 'Disabled', }, getters: { sshProtocolEnabled: (state) => state.sshProtocolEnabled, + sshPort: (state) => state.sshPort, ipmiProtocolEnabled: (state) => state.ipmiProtocolEnabled, + ipmiPort: (state) => state.ipmiPort, rtadEnabled: (state) => state.rtadEnabled, vtpmEnabled: (state) => state.vtpmEnabled, }, mutations: { setSshProtocolEnabled: (state, sshProtocolEnabled) => (state.sshProtocolEnabled = sshProtocolEnabled), + setSshPort: (state, sshPort) => (state.sshPort = sshPort), setIpmiProtocolEnabled: (state, ipmiProtocolEnabled) => (state.ipmiProtocolEnabled = ipmiProtocolEnabled), + setIpmiPort: (state, ipmiPort) => (state.ipmiPort = ipmiPort), setRtadEnabled: (state, rtadEnabled) => (state.rtadEnabled = rtadEnabled), setVtpmEnabled: (state, vtpmEnabled) => (state.vtpmEnabled = vtpmEnabled), }, @@ -29,9 +35,13 @@ const PoliciesStore = { .get('/redfish/v1/Managers/bmc/NetworkProtocol') .then((response) => { const sshProtocol = response.data.SSH.ProtocolEnabled; + const sshPort = response.data.SSH.Port; const ipmiProtocol = response.data.IPMI.ProtocolEnabled; + const ipmiPort = response.data.IPMI.Port; commit('setSshProtocolEnabled', sshProtocol); + commit('setSshPort', sshPort); commit('setIpmiProtocolEnabled', ipmiProtocol); + commit('setIpmiPort', ipmiPort); }) .catch((error) => console.log(error)); }, @@ -96,6 +106,40 @@ const PoliciesStore = { } }); }, + async saveSshPort({ commit }, port) { + const ssh = { + SSH: { + Port: +port, + }, + }; + return await api + .patch('/redfish/v1/Managers/bmc/NetworkProtocol', ssh) + .then(() => { + commit('setSshPort', port); + return i18n.t('pagePolicies.toast.successSshPort'); + }) + .catch((error) => { + console.log(error); + throw new Error(i18n.t('pagePolicies.toast.errorSshPort')); + }); + }, + async saveIpmiPort({ commit }, port) { + const ipmi = { + IPMI: { + Port: +port, + }, + }; + return await api + .patch('/redfish/v1/Managers/bmc/NetworkProtocol', ipmi) + .then(() => { + commit('setSshPort', port); + return i18n.t('pagePolicies.toast.successIpmiPort'); + }) + .catch((error) => { + console.log(error); + throw new Error(i18n.t('pagePolicies.toast.errorIpmiPort')); + }); + }, async saveRtadState({ commit }, updatedRtad) { commit('setRtadEnabled', updatedRtad); return await api diff --git a/src/views/_sila/SecurityAndAccess/Policies/ModalIpmi.vue b/src/views/_sila/SecurityAndAccess/Policies/ModalIpmi.vue new file mode 100644 index 00000000..6f1ddffc --- /dev/null +++ b/src/views/_sila/SecurityAndAccess/Policies/ModalIpmi.vue @@ -0,0 +1,106 @@ +<template> + <b-modal + id="modal-ipmi" + ref="modal" + :title="$t('pagePolicies.modal.editIpmiPort')" + @hidden="resetForm" + > + <b-form id="port-settings" @submit.prevent="handleSubmit"> + <b-row> + <b-col> + <b-form-group :label="$t('pagePolicies.port')" label-for="port"> + <b-form-input + id="port" + v-model="form.port" + type="text" + :state="getValidationState($v.form.port)" + @input="$v.form.port.$touch()" + /> + <b-form-invalid-feedback role="alert"> + <template v-if="!$v.form.port.required"> + {{ $t('global.form.fieldRequired') }} + </template> + <template v-else-if="!$v.form.port.port"> + {{ $t('global.form.invalidFormat') }} + </template> + </b-form-invalid-feedback> + </b-form-group> + </b-col> + </b-row> + </b-form> + <template #modal-footer="{ cancel }"> + <b-button variant="secondary" @click="cancel()"> + {{ $t('global.action.cancel') }} + </b-button> + <b-button + form="port-settings" + type="submit" + variant="primary" + @click="onOk" + > + {{ $t('global.action.save') }} + </b-button> + </template> + </b-modal> +</template> + +<script> +import VuelidateMixin from '@/components/_ibs/Mixins/VuelidateMixin.js'; +import { required, helpers } from 'vuelidate/lib/validators'; +import { isoPortRegex } from '@/utilities/_sila/regexConstants'; + +export default { + mixins: [VuelidateMixin], + props: { + port: { + type: String, + default: '', + }, + }, + data() { + return { + form: { + port: '', + }, + }; + }, + watch: { + port() { + this.form.port = this.port; + }, + }, + validations() { + return { + form: { + port: { + required, + pattern: helpers.regex('pattern', isoPortRegex), + }, + }, + }; + }, + methods: { + handleSubmit() { + this.$v.$touch(); + if (this.$v.$invalid) return; + this.$emit('ok', this.form.port); + this.closeModal(); + }, + closeModal() { + this.$nextTick(() => { + this.$refs.modal.hide(); + }); + }, + resetForm() { + this.form.port = this.port; + this.$v.$reset(); + this.$emit('hidden'); + }, + onOk(bvModalEvt) { + // prevent modal close + bvModalEvt.preventDefault(); + this.handleSubmit(); + }, + }, +}; +</script> diff --git a/src/views/_sila/SecurityAndAccess/Policies/ModalSsh.vue b/src/views/_sila/SecurityAndAccess/Policies/ModalSsh.vue new file mode 100644 index 00000000..3c0db9da --- /dev/null +++ b/src/views/_sila/SecurityAndAccess/Policies/ModalSsh.vue @@ -0,0 +1,106 @@ +<template> + <b-modal + id="modal-ssh" + ref="modal" + :title="$t('pagePolicies.modal.editSshPort')" + @hidden="resetForm" + > + <b-form id="port-settings" @submit.prevent="handleSubmit"> + <b-row> + <b-col> + <b-form-group :label="$t('pagePolicies.port')" label-for="port"> + <b-form-input + id="port" + v-model="form.port" + type="text" + :state="getValidationState($v.form.port)" + @input="$v.form.port.$touch()" + /> + <b-form-invalid-feedback role="alert"> + <template v-if="!$v.form.port.required"> + {{ $t('global.form.fieldRequired') }} + </template> + <template v-if="!$v.form.port.port"> + {{ $t('global.form.invalidFormat') }} + </template> + </b-form-invalid-feedback> + </b-form-group> + </b-col> + </b-row> + </b-form> + <template #modal-footer="{ cancel }"> + <b-button variant="secondary" @click="cancel()"> + {{ $t('global.action.cancel') }} + </b-button> + <b-button + form="port-settings" + type="submit" + variant="primary" + @click="onOk" + > + {{ $t('global.action.save') }} + </b-button> + </template> + </b-modal> +</template> + +<script> +import VuelidateMixin from '@/components/_ibs/Mixins/VuelidateMixin.js'; +import { required, helpers } from 'vuelidate/lib/validators'; +import { isoPortRegex } from '@/utilities/_sila/regexConstants'; + +export default { + mixins: [VuelidateMixin], + props: { + port: { + type: String, + default: '', + }, + }, + data() { + return { + form: { + port: '', + }, + }; + }, + watch: { + port() { + this.form.port = this.port; + }, + }, + validations() { + return { + form: { + port: { + required, + pattern: helpers.regex('pattern', isoPortRegex), + }, + }, + }; + }, + methods: { + handleSubmit() { + this.$v.$touch(); + if (this.$v.$invalid) return; + this.$emit('ok', this.form.port); + this.closeModal(); + }, + closeModal() { + this.$nextTick(() => { + this.$refs.modal.hide(); + }); + }, + resetForm() { + this.form.port = this.port; + this.$v.$reset(); + this.$emit('hidden'); + }, + onOk(bvModalEvt) { + // prevent modal close + bvModalEvt.preventDefault(); + this.handleSubmit(); + }, + }, +}; +</script> diff --git a/src/views/_sila/SecurityAndAccess/Policies/Policies.vue b/src/views/_sila/SecurityAndAccess/Policies/Policies.vue index d3f2ffcb..a9c273b0 100644 --- a/src/views/_sila/SecurityAndAccess/Policies/Policies.vue +++ b/src/views/_sila/SecurityAndAccess/Policies/Policies.vue @@ -10,6 +10,16 @@ <dd> {{ $t('pagePolicies.sshDescription') }} </dd> + <dt class="d-flex"> + {{ $t('pagePolicies.port') }}: {{ sshPort }} + <b-button + variant="link" + class="p-1 pr-0 ml-2" + @click="openSshModal()" + > + <icon-edit :title="$t('pagePolicies.modal.editSshPort')" /> + </b-button> + </dt> </dl> <b-form-checkbox id="sshSwitch" @@ -36,6 +46,16 @@ <dd> {{ $t('pagePolicies.ipmiDescription') }} </dd> + <!-- <dt class="d-flex"> + {{ $t('pagePolicies.port') }}: {{ ipmiPort }} + <b-button + variant="link" + class="p-1 pr-0 ml-2" + @click="openIpmiModal()" + > + <icon-edit :title="$t('pagePolicies.modal.editIpmiPort')" /> + </b-button> + </dt> --> </dl> <b-form-checkbox id="ipmiSwitch" @@ -55,7 +75,7 @@ </b-form-checkbox> </b-col> </b-row> - <b-row class="setting-section"> + <!-- <b-row class="setting-section"> <b-col class="d-flex align-items-center justify-content"> <dl class="mt-3 mr-3 w-75"> <dt>{{ $t('pagePolicies.vtpm') }}</dt> @@ -80,8 +100,8 @@ <span v-else>{{ $t('global.status.disabled') }}</span> </b-form-checkbox> </b-col> - </b-row> - <b-row class="setting-section"> + </b-row> --> + <!-- <b-row class="setting-section"> <b-col class="d-flex align-items-center justify-content"> <dl class="mt-3 mr-3 w-75"> <dt>{{ $t('pagePolicies.rtad') }}</dt> @@ -106,21 +126,27 @@ <span v-else>{{ $t('global.status.disabled') }}</span> </b-form-checkbox> </b-col> - </b-row> + </b-row> --> </b-col> </b-row> + <modal-ssh :port="sshPort" @ok="saveSsh" /> + <modal-ipmi :port="ipmiPort" @ok="saveIpmi" /> </b-container> </template> <script> +import { mapState } from 'vuex'; import PageTitle from '@/components/_sila/Global/PageTitle'; +import IconEdit from '@carbon/icons-vue/es/edit/16'; import LoadingBarMixin from '@/components/_sila/Mixins/LoadingBarMixin'; import BVToastMixin from '@/components/_sila/Mixins/BVToastMixin'; +import ModalSsh from './ModalSsh.vue'; +import ModalIpmi from './ModalIpmi.vue'; export default { name: 'Policies', - components: { PageTitle }, + components: { PageTitle, IconEdit, ModalSsh, ModalIpmi }, mixins: [LoadingBarMixin, BVToastMixin], beforeRouteLeave(to, from, next) { this.hideLoader(); @@ -176,6 +202,7 @@ export default { return newValue; }, }, + ...mapState('policies', ['sshPort', 'ipmiPort']), }, created() { this.startLoader(); @@ -209,6 +236,28 @@ export default { .then((message) => this.successToast(message)) .catch(({ message }) => this.errorToast(message)); }, + openSshModal() { + this.$bvModal.show('modal-ssh'); + }, + openIpmiModal() { + this.$bvModal.show('modal-ipmi'); + }, + saveSsh(modalFormData) { + this.startLoader(); + this.$store + .dispatch('policies/saveSshPort', modalFormData) + .then((message) => this.successToast(message)) + .catch(({ message }) => this.errorToast(message)) + .finally(() => this.endLoader()); + }, + saveIpmi(modalFormData) { + this.startLoader(); + this.$store + .dispatch('policies/saveIpmiPort', modalFormData) + .then((message) => this.successToast(message)) + .catch(({ message }) => this.errorToast(message)) + .finally(() => this.endLoader()); + }, }, }; </script> |