summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/assets/styles/bmc/_sila/_modal.scss2
-rw-r--r--src/env/components/AppNavigation/sila.js4
-rw-r--r--src/locales/en-US.json7
-rw-r--r--src/locales/ru-RU.json7
-rw-r--r--src/store/modules/SecurityAndAccess/PoliciesStore.js44
-rw-r--r--src/views/_sila/SecurityAndAccess/Policies/ModalIpmi.vue106
-rw-r--r--src/views/_sila/SecurityAndAccess/Policies/ModalSsh.vue106
-rw-r--r--src/views/_sila/SecurityAndAccess/Policies/Policies.vue59
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>