diff --git a/html/pfappserver/root/src/components/new/BaseButtonService.vue b/html/pfappserver/root/src/components/new/BaseButtonService.vue index 317dc0bfc600..f4539488b651 100644 --- a/html/pfappserver/root/src/components/new/BaseButtonService.vue +++ b/html/pfappserver/root/src/components/new/BaseButtonService.vue @@ -65,7 +65,7 @@ diff --git a/html/pfappserver/root/src/components/new/BaseButtonSystemdUpdate.vue b/html/pfappserver/root/src/components/new/BaseButtonSystemdUpdate.vue new file mode 100644 index 000000000000..a1fb4788e0ab --- /dev/null +++ b/html/pfappserver/root/src/components/new/BaseButtonSystemdUpdate.vue @@ -0,0 +1,173 @@ + + diff --git a/html/pfappserver/root/src/views/Status/services/_components/BaseService.vue b/html/pfappserver/root/src/components/new/BaseService.vue similarity index 99% rename from html/pfappserver/root/src/views/Status/services/_components/BaseService.vue rename to html/pfappserver/root/src/components/new/BaseService.vue index b581fea9f97f..9cc75dc3637f 100644 --- a/html/pfappserver/root/src/views/Status/services/_components/BaseService.vue +++ b/html/pfappserver/root/src/components/new/BaseService.vue @@ -114,7 +114,7 @@ import { computed, toRefs, watch } from '@vue/composition-api' import { protectedServices } from '@/store/modules/cluster' import acl from '@/utils/acl' import i18n from '@/utils/locale' -import { localeStrings } from '../config' +import { localeStrings } from '@/globals/pfLocales' const setup = (props, context) => { diff --git a/html/pfappserver/root/src/components/new/BaseSystemService.vue b/html/pfappserver/root/src/components/new/BaseSystemService.vue new file mode 100644 index 000000000000..bc5e2280ebcc --- /dev/null +++ b/html/pfappserver/root/src/components/new/BaseSystemService.vue @@ -0,0 +1,158 @@ + + diff --git a/html/pfappserver/root/src/components/new/BaseSystemdUpdate.vue b/html/pfappserver/root/src/components/new/BaseSystemdUpdate.vue new file mode 100644 index 000000000000..a6c7ffa39f05 --- /dev/null +++ b/html/pfappserver/root/src/components/new/BaseSystemdUpdate.vue @@ -0,0 +1,96 @@ + + diff --git a/html/pfappserver/root/src/components/new/index.js b/html/pfappserver/root/src/components/new/index.js index 0b893f4359d2..4e057d938cc6 100644 --- a/html/pfappserver/root/src/components/new/index.js +++ b/html/pfappserver/root/src/components/new/index.js @@ -6,6 +6,8 @@ import BaseButtonRefresh from './BaseButtonRefresh' import BaseButtonSave from './BaseButtonSave' import BaseButtonSaveSearch from './BaseButtonSaveSearch' import BaseButtonService from './BaseButtonService' +import BaseButtonSystemService from './BaseButtonSystemService' +import BaseButtonSystemdUpdate from './BaseButtonSystemdUpdate' import BaseButtonUpload from './BaseButtonUpload' import BaseContainerLoading from './BaseContainerLoading' import BaseCsvImport from './BaseCsvImport' @@ -66,6 +68,8 @@ import BaseSearchInputAdvanced from './BaseSearchInputAdvanced' import BaseSearchInputColumns from './BaseSearchInputColumns' import BaseSearchInputLimit from './BaseSearchInputLimit' import BaseSearchInputPage from './BaseSearchInputPage' +import BaseService from './BaseService' +import BaseSystemService from './BaseSystemService' import BaseTableEmpty from './BaseTableEmpty' import BaseTableSortable from './BaseTableSortable' import BaseUpload from './BaseUpload' @@ -150,6 +154,8 @@ export { BaseButtonSave, BaseButtonSaveSearch, BaseButtonService, + BaseButtonSystemService, + BaseButtonSystemdUpdate, BaseButtonUpload, // containers @@ -163,6 +169,10 @@ export { BaseSearchInputLimit, BaseSearchInputPage, + // services + BaseService, + BaseSystemService, + // tables BaseTableEmpty, BaseTableSortable, diff --git a/html/pfappserver/root/src/globals/pfLocales.js b/html/pfappserver/root/src/globals/pfLocales.js index a03b6d114883..ea01886eecbf 100644 --- a/html/pfappserver/root/src/globals/pfLocales.js +++ b/html/pfappserver/root/src/globals/pfLocales.js @@ -6,10 +6,33 @@ export const pfLocales = [ 'fr_FR', 'he_IL', 'it_IT', - 'nb_NO', + 'nb_NO', 'nl_NL', 'pl_PL', 'pt_BR' ] export const pfLocalesList = pfLocales.map(locale => { return { text: locale, value: locale } }) + +export const localeStrings = { + SERVICES_DISABLED_SUCCESS: 'Disabled services {services}.', // i18n defer + SERVICES_DISABLED_ERROR: 'Failed to disable services {services}. See the server error logs for more information.', // i18n defer + SERVICES_PROTECTED_DISABLED_ERROR: 'Failed to disable services {services}. This service is required for this page to function and CLI access may be required to remediate any issues caused by the failure. See the server error logs for more information.', // i18n defer + + SERVICES_ENABLED_SUCCESS: 'Enabled services {services}.', // i18n defer + SERVICES_ENABLED_ERROR: 'Failed to enable services {services}. See the server error logs for more information.', // i18n defer + SERVICES_PROTECTED_ENABLED_ERROR: 'Failed to enable services {services}. This service is required for this page to function and CLI access may be required to remediate any issues caused by the failure. See the server error logs for more information.', // i18n defer + + SERVICES_RESTARTED_SUCCESS: 'Restarted services {services}.', // i18n defer + SERVICES_RESTARTED_ERROR: 'Failed to restart services {services}. See the server error logs for more information.', // i18n defer + SERVICES_PROTECTED_RESTARTED_ERROR: 'Failed to restart services {services}. This service is required for this page to function and CLI access may be required to remediate any issues caused by the failure. See the server error logs for more information.', // i18n defer + + SERVICES_STARTED_SUCCESS: 'Started services {services}.', // i18n defer + SERVICES_STARTED_ERROR: 'Failed to start services {services}. See the server error logs for more information.', // i18n defer + + SERVICES_STOPPED_SUCCESS: 'Stopped services {services}.', // i18n defer + SERVICES_STOPPED_ERROR: 'Failed to stop services {services}. See the server error logs for more information.', // i18n defer + + SYSTEMD_UPDATED_SUCCESS: 'Updated systemd for {service}.', // i18n defer + SYSTEMD_UPDATED_ERROR: 'Failed to update systemd for {service}. See the server error logs for more information.', // i18n defer +} diff --git a/html/pfappserver/root/src/store/modules/cluster.js b/html/pfappserver/root/src/store/modules/cluster.js index 9839049161b3..26a583addeb7 100644 --- a/html/pfappserver/root/src/store/modules/cluster.js +++ b/html/pfappserver/root/src/store/modules/cluster.js @@ -106,6 +106,17 @@ const api = (state, server = store.state.system.hostname) => { }) }) }, + systemService: id => { + return apiCall.getQuiet(['system_service', id, 'status'], { headers }).then(response => { + return response.data + }).catch(error => { + // 500 response error w/ not running + if (error.response && (!['ERR_BAD_RESPONSE'].includes(error.code) || ![500].includes(error.response.status))) { + throw error + } + return error.response.data + }) + }, restartSystem: id => { return apiCall.postQuiet(['system_service', id, 'restart'], { async: true }, { headers }) .then(response => { @@ -144,6 +155,7 @@ const types = { RESTARTING: 'restarting', STARTING: 'starting', STOPPING: 'stopping', + UPDATING: 'updating', SUCCESS: 'success', ERROR: 'error' } @@ -196,7 +208,50 @@ const getters = { } }, sorted) }, {}) - } + }, + systemServicesByServer: state => { + return Object.entries(state.servers).reduce((sorted, [server, {system_services = {}}]) => { + return Object.entries(system_services).reduce((sorted, [id, service]) => { + return { + ...sorted, + [id]: { + servers: { + ...((id in sorted) ? sorted[id].servers : {} ), + [server]: { + ...service, + isDisabling: service.status === types.DISABLING, + isEnabling: service.status === types.ENABLING, + isRestarting: service.status === types.RESTARTING, + isStarting: service.status === types.STARTING, + isStopping: service.status === types.STOPPING, + } + }, + hasAlive: Object.values(state.servers).findIndex(({ services: { [id]: service } }) => service && service.alive && service.pid) > -1, + hasDead: Object.values(state.servers).findIndex(({ services: { [id]: service } }) => service && !(service.alive || service.pid)) > -1, + } + } + }, sorted) + }, {}) + }, + systemdByServer: state => { + return Object.entries(state.servers).reduce((sorted, [server, {systemd = {}}]) => { + return Object.entries(systemd).reduce((sorted, [id, service]) => { + return { + ...sorted, + [id]: { + servers: { + ...((id in sorted) ? sorted[id].servers : {} ), + [server]: { + ...service, + isUpdating: service.status === types.UPDATING, + } + } + } + } + }, sorted) + }, {}) + }, + servers: state => Object.keys(state.servers), } const actions = { @@ -285,7 +340,7 @@ const actions = { disableServiceCluster: ({ state, dispatch }, id) => { return new Promise((resolve, reject) => { dispatch('getConfig').then(() => { - // async requests + // serialize async requests const async = (idx = 0) => { const server = Object.keys(state.servers)[idx] const next = () => { @@ -325,7 +380,7 @@ const actions = { enableServiceCluster: ({ state, dispatch }, id) => { return new Promise((resolve, reject) => { dispatch('getConfig').then(() => { - // async requests + // serialize async requests const async = (idx = 0) => { const server = Object.keys(state.servers)[idx] const next = () => { @@ -365,7 +420,7 @@ const actions = { restartServiceCluster: ({ state, dispatch }, id) => { return new Promise((resolve, reject) => { dispatch('getConfig').then(() => { - // async requests + // serialize async requests const async = (idx = 0) => { const server = Object.keys(state.servers)[idx] const next = () => { @@ -405,7 +460,7 @@ const actions = { startServiceCluster: ({ state, dispatch }, id) => { return new Promise((resolve, reject) => { dispatch('getConfig').then(() => { - // async requests + // serialize async requests const async = (idx = 0) => { const server = Object.keys(state.servers)[idx] const next = () => { @@ -445,7 +500,7 @@ const actions = { stopServiceCluster: ({ state, dispatch }, id) => { return new Promise((resolve, reject) => { dispatch('getConfig').then(() => { - // async requests + // serialize async requests const async = (idx = 0) => { const server = Object.keys(state.servers)[idx] const next = () => { @@ -471,42 +526,154 @@ const actions = { }) }, - restartSystemService: ({ state, commit }, { id, server = store.state.system.hostname }) => { + + getSystemService: ({ state, commit }, { server, id }) => { + commit('SYSTEM_SERVICE_REQUEST', { server, id }) + return api(state, server).systemService(id).then(service => { + commit('SYSTEM_SERVICE_SUCCESS', { server, id, service }) + return state.servers[server].services[id] + }).catch(err => { + const { response: { data: { message: error } = {} } = {} } = err + commit('SYSTEM_SERVICE_ERROR', { server, id, error }) + throw err + }) + }, + getSystemServiceCluster: ({ state, dispatch }, id) => { + return dispatch('getConfig').then(() => { + let promises = [] + Object.keys(state.servers).map(server => { + promises.push(dispatch('getSystemService', { server, id })) + }) + return Promise.all(promises).then(servers => { + return servers.reduce((assoc, service, index) => { + const server = Object.keys(state.servers)[index] + return { ...assoc, [server]: state.servers[server].system_services[id] } + }, {}) + }) + }) + }, + restartSystemService: ({ state, commit, dispatch }, { id, server = store.state.system.hostname }) => { commit('SYSTEM_SERVICE_REQUEST', { server, id }) commit('SYSTEM_SERVICE_RESTARTING', { server, id }) return api(state, server).restartSystem(id).then(response => { commit('SYSTEM_SERVICE_RESTARTED', { server, id, response }) - return state.servers[server].services[id] + return state.servers[server].system_services[id] }).catch(err => { const { response: { data: error } = {} } = err commit('SYSTEM_SERVICE_ERROR', { server, id, error }) throw err + }).finally(() => dispatch('getSystemService', { server, id })) + }, + restartSystemServiceCluster: ({ state, dispatch }, id) => { + return new Promise((resolve, reject) => { + dispatch('getConfig').then(() => { + // serialize async requests + const async = (idx = 0) => { + const server = Object.keys(state.servers)[idx] + const next = () => { + if (idx < Object.keys(state.servers).length-1) { + async(++idx) + } + else { + resolve() + } + } + const { [server]: { system_services: { [id]: { alive = false, pid = false } = {} } = {} } = {} } = state.servers + if (alive && pid) { + dispatch('restartSystemService', { server, id }) + .catch(err => reject(err)) + .then(() => next()) + } + else { + next() + } + } + async() + }) }) }, - startSystemService: ({ state, commit }, { id, server = store.state.system.hostname }) => { + startSystemService: ({ state, commit, dispatch }, { id, server = store.state.system.hostname }) => { commit('SYSTEM_SERVICE_REQUEST', { server, id }) commit('SYSTEM_SERVICE_STARTING', { server, id }) return api(state, server).startSystem(id).then(response => { commit('SYSTEM_SERVICE_STARTED', { server, id, response }) - return state.servers[server].services[id] + return state.servers[server].system_services[id] }).catch(err => { const { response: { data: error } = {} } = err commit('SYSTEM_SERVICE_ERROR', { server, id, error }) throw err + }).finally(() => dispatch('getSystemService', { server, id })) + }, + startSystemServiceCluster: ({ state, dispatch }, id) => { + return new Promise((resolve, reject) => { + dispatch('getConfig').then(() => { + // serialize async requests + const async = (idx = 0) => { + const server = Object.keys(state.servers)[idx] + const next = () => { + if (idx < Object.keys(state.servers).length - 1) { + async(++idx) + } + else { + resolve() + } + } + const { [server]: { system_services: { [id]: { alive = false, pid = false } = {} } = {} } = {} } = state.servers + if (!(alive && pid)) { + dispatch('startSystemService', { server, id }) + .catch(err => reject(err)) + .then(() => next()) + } + else { + next() + } + } + async() + }) }) }, - stopSystemService: ({ state, commit }, { id, server = store.state.system.hostname }) => { + stopSystemService: ({ state, commit, dispatch }, { id, server = store.state.system.hostname }) => { commit('SYSTEM_SERVICE_REQUEST', { server, id }) commit('SYSTEM_SERVICE_STOPPING', { server, id }) return api(state, server).stopSystem(id).then(response => { commit('SYSTEM_SERVICE_STOPPED', { server, id, response }) - return state.servers[server].services[id] + return state.servers[server].system_services[id] }).catch(err => { const { response: { data: error } = {} } = err commit('SYSTEM_SERVICE_ERROR', { server, id, error }) throw err + }).finally(() => dispatch('getSystemService', { server, id })) + }, + stopSystemServiceCluster: ({ state, dispatch }, id) => { + return new Promise((resolve, reject) => { + dispatch('getConfig').then(() => { + // serialize async requests + const async = (idx = 0) => { + const server = Object.keys(state.servers)[idx] + const next = () => { + if (idx < Object.keys(state.servers).length - 1) { + async(++idx) + } + else { + resolve() + } + } + const { [server]: { system_services: { [id]: { alive = false, pid = false } = {} } = {} } = {} } = state.servers + if (alive && pid) { + dispatch('stopSystemService', { server, id }) + .catch(err => reject(err)) + .then(() => next()) + } + else { + next() + } + } + async() + }) }) }, + + updateSystemd: ({ state, commit }, { id, server = store.state.system.hostname }) => { commit('SYSTEMD_REQUEST', { server, id }) return api(state, server).updateSystemd(id).then(response => { @@ -518,6 +685,28 @@ const actions = { throw err }) }, + updateSystemdCluster: ({ state, dispatch }, id) => { + return new Promise((resolve, reject) => { + dispatch('getConfig').then(() => { + // serialize async requests + const async = (idx = 0) => { + const server = Object.keys(state.servers)[idx] + const next = () => { + if (idx < Object.keys(state.servers).length - 1) { + async(++idx) + } + else { + resolve() + } + } + dispatch('updateSystemd', { server, id }) + .catch(err => reject(err)) + .then(() => next()) + } + async() + }) + }) + }, } const mutations = { @@ -529,7 +718,7 @@ const mutations = { }, CONFIG_SUCCESS: (state, items) => { items.map(server => { - Vue.set(state.servers, server.host, { services: {}, system_services: {}, ...state.servers[server.host], ...server }) + Vue.set(state.servers, server.host, { services: {}, system_services: {}, systemd: {}, ...state.servers[server.host], ...server }) }) state.status = types.SUCCESS state.message = '' @@ -561,7 +750,7 @@ const mutations = { SERVICE_REQUEST: (state, { server, id }) => { state.status = types.LOADING - Vue.set(state.servers, server, state.servers[server] || { services: {}, system_services: {} }) + Vue.set(state.servers, server, state.servers[server] || { services: {}, system_services: {}, systemd: {} }) Vue.set(state.servers[server].services, id, state.servers[server].services[id] || {}) Vue.set(state.servers[server].services[id], 'status', types.LOADING) }, @@ -639,10 +828,19 @@ const mutations = { SYSTEM_SERVICE_REQUEST: (state, { server, id }) => { state.status = types.LOADING - Vue.set(state.servers, server, state.servers[server] || { services: {}, system_services: {} }) - Vue.set(state.servers[server].system_services, id, state.servers[server].services[id] || {}) + Vue.set(state.servers, server, state.servers[server] || { services: {}, system_services: {}, systemd: {} }) + Vue.set(state.servers[server].system_services, id, state.servers[server].system_services[id] || {}) Vue.set(state.servers[server].system_services[id], 'status', types.LOADING) }, + SYSTEM_SERVICE_SUCCESS: (state, { server, id, service }) => { + service.id = id + service.pid = parseInt(service.pid) + service.alive = !!(service.pid) + service.message = '' + state.status = types.SUCCESS + state.message = '' + Vue.set(state.servers[server].system_services, id, { ...state.servers[server].system_services[id], ...service, status: types.SUCCESS }) + }, SYSTEM_SERVICE_RESTARTING: (state, { server, id }) => { state.status = types.LOADING Vue.set(state.servers[server].system_services[id], 'status', types.RESTARTING) @@ -673,17 +871,23 @@ const mutations = { Vue.set(state.servers[server].system_services[id], 'status', types.ERROR) }, - SYSTEMD_REQUEST: state => { + SYSTEMD_REQUEST: (state, { server, id }) => { state.status = types.LOADING + Vue.set(state.servers, server, state.servers[server] || { services: {}, system_services: {}, systemd: {} }) + Vue.set(state.servers[server].systemd, id, state.servers[server].systemd[id] || {}) + Vue.set(state.servers[server].systemd[id], 'status', types.UPDATING) }, - SYSTEMD_SUCCESS: state => { + SYSTEMD_SUCCESS: (state, { server, id }) => { state.status = types.SUCCESS state.message = '' + Vue.set(state.servers[server].systemd, id, { ...state.servers[server].systemd[id], status: types.SUCCESS }) }, - SYSTEMD_ERROR: (state, error) => { + SYSTEMD_ERROR: (state, { server, id, error }) => { state.status = types.ERROR state.message = error + Vue.set(state.servers[server].systemd[id], 'status', types.ERROR) }, + $RESET: (state) => { // eslint-disable-next-line no-unused-vars state = initialState() diff --git a/html/pfappserver/root/src/views/Configuration/eventLoggers/_components/TheSearch.vue b/html/pfappserver/root/src/views/Configuration/eventLoggers/_components/TheSearch.vue index a54d35166b55..9f113f1ff6c0 100644 --- a/html/pfappserver/root/src/views/Configuration/eventLoggers/_components/TheSearch.vue +++ b/html/pfappserver/root/src/views/Configuration/eventLoggers/_components/TheSearch.vue @@ -4,15 +4,15 @@

{{ $t('Event Loggers') }}

-
{{ $t(`Creating, modifying or deleting an event logger entry requires to restart the packetfence-mariadb service using the following command: systemctl restart packetfence-mariadb`) }}
{{ text }} + + +

+

+ {{ $t('Some services must be restarted to load the new settings.') }} + +

+ + + + + + diff --git a/html/pfappserver/root/src/views/Configuration/monit/_components/TheForm.vue b/html/pfappserver/root/src/views/Configuration/monit/_components/TheForm.vue index 94e6a0020ece..750a42d8a877 100644 --- a/html/pfappserver/root/src/views/Configuration/monit/_components/TheForm.vue +++ b/html/pfappserver/root/src/views/Configuration/monit/_components/TheForm.vue @@ -5,10 +5,6 @@ :schema="schema" :isLoading="isLoading" > -
{{ $t('Modifying this configuration requires to restart monit using the following command: `systemctl restart monit`') }}
- useViewResource(resource, props, context) + +const setup = (props, context) => { + + const viewResource = useViewResource(resource, props, context) + const { + isLoading, + isModified + } = viewResource + + const scopedSlotProps = computed(() => ({ ...props, isLoading: isLoading.value, isModified: isModified.value })) + + return { + ...viewResource, + scopedSlotProps + } +} + +const render = renderHOCWithScopedSlots(BaseView, { components, props, setup }, { + buttonsPrepend: AlertServices +}) // @vue/component export default { name: 'the-view', extends: BaseView, inheritAttrs: false, - components, props, - setup + render } - diff --git a/html/pfappserver/root/src/views/Configuration/monit/_components/index.js b/html/pfappserver/root/src/views/Configuration/monit/_components/index.js index a6eef0cbf351..0c769e1b0281 100644 --- a/html/pfappserver/root/src/views/Configuration/monit/_components/index.js +++ b/html/pfappserver/root/src/views/Configuration/monit/_components/index.js @@ -5,6 +5,7 @@ import { BaseFormGroupTextarea, BaseFormGroupToggleDisabledEnabled } from '@/components/new/' +import AlertServices from './AlertServices' import TheForm from './TheForm' import TheView from './TheView' @@ -18,7 +19,8 @@ export { BaseFormGroupToggleDisabledEnabled as FormGroupStatus, BaseFormGroupInput as FormGroupSubjectPrefix, - BaseViewResource as BaseView, + BaseViewResource as BaseView, + AlertServices, TheForm, TheView } diff --git a/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/AlertServices.vue b/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/AlertServices.vue new file mode 100644 index 000000000000..da310eae01dd --- /dev/null +++ b/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/AlertServices.vue @@ -0,0 +1,42 @@ + + + diff --git a/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/TheView.js b/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/TheView.js index e35e28224e69..fc91f061b9e8 100644 --- a/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/TheView.js +++ b/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/TheView.js @@ -1,6 +1,6 @@ import { + AlertServices, BaseView, - FormButtonBar, TheForm } from './' @@ -10,6 +10,8 @@ const components = { TheForm } +import { computed } from '@vue/composition-api' +import { renderHOCWithScopedSlots } from '@/components/new/' import { useViewCollectionItem, useViewCollectionItemProps } from '../../_composables/useViewCollectionItem' import * as collection from '../_composables/useCollection' @@ -18,14 +20,31 @@ const props = { ...collection.useItemProps } -const setup = (props, context) => useViewCollectionItem(collection, props, context) +const setup = (props, context) => { + + const viewCollectionItem = useViewCollectionItem(collection, props, context) + const { + isLoading, + isModified + } = viewCollectionItem + + const scopedSlotProps = computed(() => ({ ...props, isLoading: isLoading.value, isModified: isModified.value })) + + return { + ...viewCollectionItem, + scopedSlotProps + } +} + +const render = renderHOCWithScopedSlots(BaseView, { components, props, setup }, { + buttonsPrepend: AlertServices +}) // @vue/component export default { name: 'the-view', extends: BaseView, inheritAttrs: false, - components, props, - setup + render } diff --git a/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/index.js b/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/index.js index 8239d1e1e07a..ec65549bc336 100644 --- a/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/index.js +++ b/html/pfappserver/root/src/views/Configuration/syslogForwarders/_components/index.js @@ -7,6 +7,7 @@ import { BaseFormGroupInputNumber, BaseFormGroupToggleDisabledEnabled } from '@/components/new/' +import AlertServices from './AlertServices' import TheForm from './TheForm' import TheView from './TheView' @@ -21,6 +22,7 @@ export { BaseFormGroupInputNumber as FormGroupPort, BaseFormGroupChosenOne as FormGroupProto, + AlertServices, TheForm, TheView } diff --git a/html/pfappserver/root/src/views/Status/services/_components/BaseButtonBulkActions.vue b/html/pfappserver/root/src/views/Status/services/_components/BaseButtonBulkActions.vue index 827247c6224f..d49a4a78ded7 100644 --- a/html/pfappserver/root/src/views/Status/services/_components/BaseButtonBulkActions.vue +++ b/html/pfappserver/root/src/views/Status/services/_components/BaseButtonBulkActions.vue @@ -38,7 +38,7 @@ const props = { import { computed, nextTick, ref, toRefs } from '@vue/composition-api' import i18n from '@/utils/locale' -import { localeStrings } from '../config' +import { localeStrings } from '@/globals/pfLocales' const setup = (props, context) => { diff --git a/html/pfappserver/root/src/views/Status/services/_components/TheView.vue b/html/pfappserver/root/src/views/Status/services/_components/TheView.vue index a5cf7a1485c9..6fdfef665e48 100644 --- a/html/pfappserver/root/src/views/Status/services/_components/TheView.vue +++ b/html/pfappserver/root/src/views/Status/services/_components/TheView.vue @@ -4,6 +4,9 @@

+
+ +
import { + BaseButtonSystemdUpdate, + BaseService, BaseTableEmpty } from '@/components/new/' import BaseButtonBulkActions from './BaseButtonBulkActions' -import BaseService from './BaseService' const components = { BaseButtonBulkActions, + BaseButtonSystemdUpdate, BaseService, BaseTableEmpty } @@ -109,7 +114,7 @@ const components = { import { computed, customRef, onMounted, ref } from '@vue/composition-api' import { useBootstrapTableSelected } from '@/composables/useBootstrap' import i18n from '@/utils/locale' -import { localeStrings } from '../config' +import { localeStrings } from '@/globals/pfLocales' const setup = (props, context) => { diff --git a/html/pfappserver/root/src/views/Status/services/config.js b/html/pfappserver/root/src/views/Status/services/config.js deleted file mode 100644 index d81dd37139b5..000000000000 --- a/html/pfappserver/root/src/views/Status/services/config.js +++ /dev/null @@ -1,19 +0,0 @@ -export const localeStrings = { - SERVICES_DISABLED_SUCCESS: 'Disabled services {services}.', // i18n defer - SERVICES_DISABLED_ERROR: 'Failed to disable services {services}. See the server error logs for more information.', // i18n defer - SERVICES_PROTECTED_DISABLED_ERROR: 'Failed to disable services {services}. This service is required for this page to function and CLI access may be required to remediate any issues caused by the failure. See the server error logs for more information.', // i18n defer - - SERVICES_ENABLED_SUCCESS: 'Enabled services {services}.', // i18n defer - SERVICES_ENABLED_ERROR: 'Failed to enable services {services}. See the server error logs for more information.', // i18n defer - SERVICES_PROTECTED_ENABLED_ERROR: 'Failed to enable services {services}. This service is required for this page to function and CLI access may be required to remediate any issues caused by the failure. See the server error logs for more information.', // i18n defer - - SERVICES_RESTARTED_SUCCESS: 'Restarted services {services}.', // i18n defer - SERVICES_RESTARTED_ERROR: 'Failed to restart services {services}. See the server error logs for more information.', // i18n defer - SERVICES_PROTECTED_RESTARTED_ERROR: 'Failed to restart services {services}. This service is required for this page to function and CLI access may be required to remediate any issues caused by the failure. See the server error logs for more information.', // i18n defer - - SERVICES_STARTED_SUCCESS: 'Started services {services}.', // i18n defer - SERVICES_STARTED_ERROR: 'Failed to start services {services}. See the server error logs for more information.', // i18n defer - - SERVICES_STOPPED_SUCCESS: 'Stopped services {services}.', // i18n defer - SERVICES_STOPPED_ERROR: 'Failed to stop services {services}. See the server error logs for more information.', // i18n defer -} \ No newline at end of file