Commit dadc8d9a authored by Vladimir Erokhov's avatar Vladimir Erokhov

Merged develop into bugfix/view-duplication

parents 550f6b19 e5f40cf5
Pipeline #4484 passed with stage
in 1 minute and 59 seconds
......@@ -19,7 +19,7 @@ for engine in {"core","cat","prov","cat-prov"}; do
done
# Go engines
if [ "${push_go}" = "Y" ]||[ "${push_go}" = "y" ]; then
for engine in {"init", "engine-axe","engine-che","engine-heartbeat","engine-stat","engine-watcher","engine-action"}; do
for engine in {"init","engine-axe","engine-che","engine-heartbeat","engine-stat","engine-watcher","engine-action"}; do
docker push canopsis/$engine:${CANOPSIS_TAG}
done
fi
......@@ -28,6 +28,6 @@ if [ "${push_pe}" = "Y" ]||[ "${push_pe}" = "y" ]; then
docker push canopsis/init-pe:${CANOPSIS_TAG}
docker push canopsis/canopsis-cat-pe:${CANOPSIS_TAG}
docker push canopsis/canopsis-cat-pe:longoutput-${CANOPSIS_TAG}
#docker push canopsis/canopsis-connector-email2canopsis-pe:${CANOPSIS_TAG}
docker push canopsis/canopsis-connector-email2canopsis-pe:${CANOPSIS_TAG}
#docker push canopsis/canopsis-connector-snmp2canopsis-pe:${CANOPSIS_TAG}
fi
# Authentification
- [LDAP](#ldap)
To do
- [SAML2](#saml2)
- [Paramétrage ldP](#paramétrage-idp)
- [Création du paramètrage côté Canopsis](#création-du-paramétrage-côté-canopsis)
- [Intégration des paramètres en base](#intégration-des-paramètres-en-base)
- [Activation de l'authentification SAML2](#activation-de-lauthentification-saml2)
- [Test et logs](#tests-et-log)
- [troubleshooting](#troubleshooting)
- [Troubleshooting](#troubleshooting)
## LDAP
!!! attention
Les fonctionnalités liées à LDAP sont en cours de développement. Toutes les fonctionnalités d'LDAP ne sont pas encore implémentées.
L'authentification LDAP est actuellement fonctionnelle et est basée sur [python-ldap](https://python-ldap.readthedocs.io) qui utilise la *libldap* du projet [OpenLDAP](http://www.openldap.org/).
Canopsis utilise la version 3 du protocole LDAP.
Sa configuration par l'interface web n'est pas prise en charge pour le moment.
Les fonctionnalités actuellement implémentées permettent l'authentification des utilisateurs sur n'importe quel annuaire LDAP, tant que celui-ci respecte la [RFC4510](https://tools.ietf.org/html/rfc4510) et ses déclinaisons.
## SAML2
......
......@@ -41,7 +41,7 @@ systemctl start canopsis-engine-cat@snmp
Pour créer des règles de transformations il faut se logger sur la page dédiée sur l'UIv2 :
http://<canopsis_addr:port>/en/static/canopsis/index.html#/userview/view.snmprule
http://CANOPSIS_ADDR:PORT/en/static/canopsis/index.html#/userview/view.snmprule
Une règle de transformation consiste à convertir des `OID` en valeurs compréhensibles et associer les attributs nécessaires à un message Canopsis.
......
......@@ -22,7 +22,7 @@ Voici la structure de base d'un évènement, commune à tous les type d'évènem
'resource': // Resource's name (only if source_type is 'resource')
// /!\ The following is optional /!\
'hostgroups': // Nagios hostgroups for component, default []
'servicegroups': // Nagios servicegroups for resource, default []
'timestamp': // UNIX timestamp for when the event was emitted (optional: set by the server to now)
......@@ -31,8 +31,6 @@ Voici la structure de base d'un évènement, commune à tous les type d'évènem
'long_output': // Description
'tags': // Tags for the event (optional, the server adds connector, connector_name, event_type, source_type, component and resource if present)
'perf_data': // Nagios formatted perfdata string
'perf_data_array': // array of metrics (see below)
}
```
......@@ -47,9 +45,9 @@ Aprés avoir défini la structure de base de l'évènement, choississez ce que v
'event_type': 'check',
'state': // Check state (0 - INFO, 1 - MINOR, 2 - MAJOR, 3 - CRITICAL), default is 0
// /!\ The following is optional /!\
'scheduled': // True if the check was scheduled, False otherwise
'check_type': // Nagios Check Type (host or service)
......@@ -65,21 +63,6 @@ Aprés avoir défini la structure de base de l'évènement, choississez ce que v
}
```
### Event Log Structure
```javascript
{
'event_type': 'log',
'output': // Becomes mandatory
'long_output': // Remains optional
'display_name': // Remains optional
'level': // Optional log level
'facility': // Optional log facility
}
```
### Event Acknowledgment Structure
```javascript
......@@ -89,7 +72,7 @@ Aprés avoir défini la structure de base de l'évènement, choississez ce que v
'ref_rk': // Routing Key of acknowledged event, mandatory
'author': // Acknowledgment author, mandatory
'output': // Acknowledgment comment, mandatory
```
### Event Cancel Structure
......@@ -156,21 +139,6 @@ Aprés avoir défini la structure de base de l'évènement, choississez ce que v
}
```
### Event Perf Structure
Un évènement de type `perf` ne sera jamais sauvegardé dans une base de données, il est uniquement utilisé pour envoyer des perfdata :
```javascript
{
'event_type': 'perf', // mandatory
'perf_data': // mandatory
'perf_data_array': // mandatory
}
```
See below for more informations about those fields.
### Event Statistics Counter Increment Structure
```javascript
......@@ -218,22 +186,6 @@ Le champ `entity` devrait contenir l'entité sous forme d'objet JSON.
Le champ `alarm` devrait contenir la valeur de l'alarme sous forme d'objet JSON.
Le champ `entity` devrait contenir l'entité sous forme d'objet JSON.
## Metrology
Pour envoyer des perfdata vers Canopsis, vous avez juste besoin de spécifier l'un des champs suivants :
```javascript
{
'perf_data': // Performance data ("Nagios format":http://nagiosplug.sourceforge.net/developer-guidelines.html#AEN201)
'perf_data_array': // Array of performance data with metric's type ('GAUGE', 'DERIVE', 'COUNTER', 'ABSOLUTE'), Ex:
[
{'metric': 'shortterm', 'value': 0.25, 'unit': None, 'min': None, 'max': None, 'warn': None, 'crit': None, 'type': 'GAUGE' },
{'metric': 'midterm', 'value': 0.16, 'unit': None, 'min': None, 'max': None, 'warn': None, 'crit': None, 'type': 'GAUGE' },
{'metric': 'longterm', 'value': 0.12, 'unit': None, 'min': None, 'max': None, 'warn': None, 'crit': None, 'type': 'GAUGE' }
]
}
```
### Basic Alert Structure
Un alarme est le résultat de l'analyse des évènements. Elle historise et résume les changements d'état, les actions utilisateurs (acquittement, mise en pause, etc.).
......@@ -253,7 +205,6 @@ Type | Description |
-----|-------------|
check | Utilisé pour envoyer le résultat d'un check (depuis Nagios, Icinga,...) |
comment | Utilisé pour envoyer un commentaire |
perf | Utilisé pour envoyer seulement des perfdata |
selector | Envoyé par l'engine selector |
sla | Envoyé par l'engine selector sla |
statcounterinc | Utilisé pour incrémenter un compteur dans l'engine statistics |
......
......@@ -3,6 +3,7 @@
Lorsqu'un évènement arrive, il est envoyé vers le bac à évènements, puis traité. Il devient alors une alarme (Une alarme est le résultat de l'analyse des évènements. cf [vocabulaire](../../../vocabulaire/index.md)).
Les différentes actions possibles sur cette alarme sont :
* [Accuser réception (Ack)](#accuser-réception-ack)
* Une fois la réception faite, la gestion de l'incident :
* [Déclarer un incident](#déclarer-un-ticket)
......
......@@ -185,7 +185,7 @@ Le langage utilisé ici est le Handlebars.
Cliquez sur le bouton 'Afficher/Editer'. Une fenêtre s'ouvre avec un éditeur de texte. Entre le texte souhaité pour le template des tuiles, puis cliquez sur 'Envoyer'.
Une variable est disponible ici pour vous permettre d'affiché les détails de l'entité : `entity`.
Une variable est disponible ici pour vous permettre d'afficher les détails de l'entité : `entity`.
Exemple : Pour afficher le champ 'name' de l'entité (qui correspond au nom de l'entité), il vous faut écrire dans le template : `{{ entity.name }}`.
Tous les champs disponibles dans l'entité sont disponibles ici.
......
......@@ -32,7 +32,7 @@ Pour le tableau, le choix de la stat part du même principe que celle de l'histo
Pour **ajouter une statistique** parmi celles-ci :
* Les alarmes créées, résolues et annulées.
* Le temps SLA (Service Level Agreement) des accusé de réception.
* Le temps SLA (Service Level Agreement) des accusés de réception.
* Le temps de résolution SLA.
* Le taux d'état (d'alarme).
* Le MTBF (mean time between failures), temps moyen entre pannes.
......
# Présentation
# Présentation du widget stats
## Stats calculées et mises à disposition
......@@ -6,13 +6,13 @@ Canopsis vous propose d'afficher des statistiques détaillées sur vos alarmes s
Les données pouvant être calculées sont :
- Les alarmes créées, résolues et annulées.
- Le temps SLA (Service Level Agreement) des accusé de réception.
- Le temps de résolution SLA.
- Le taux d'état (d'alarme).
- Le MTBF (mean time between failures), temps moyen entre pannes.
- L'état courant.
- Les alarmes en cours : Ongoing alarms
- Les alarmes actuellement en cours : Current Ongoing alarms
* Les alarmes créées, résolues et annulées.
* Le temps SLA (Service Level Agreement) des accusés de réception.
* Le temps de résolution SLA.
* Le taux d'état (d'alarme).
* Le MTBF (mean time between failures), temps moyen entre pannes.
* L'état courant.
* Les alarmes en cours : Ongoing alarms
* Les alarmes actuellement en cours : Current Ongoing alarms
Pour plus de détails sur les indicateurs, [rendez-vous ici !](Utilisation-du-widget.md)
{
"plugins": [
"lodash"
],
"presets": [
"@vue/app"
]
}
\ No newline at end of file
}
......@@ -5,3 +5,5 @@ VUE_APP_POPUP_AUTO_CLOSE_DELAY=3000
VUE_APP_PAGINATION_LIMIT=10
VUE_APP_COOKIE_SESSION_KEY=beaker.session.id
BUNDLE_ANALYZER_MODE=disabled # disabled / server / static
......@@ -54,6 +54,7 @@
"@vue/test-utils": "^1.0.0-beta.10",
"babel-core": "^7.0.0-0",
"babel-jest": "^22.0.4",
"babel-plugin-lodash": "^3.3.4",
"husky": "^1.3.1",
"jest-localstorage-mock": "^2.2.0",
"lint-staged": "^6.0.0",
......@@ -64,6 +65,7 @@
"sass-loader": "^6.0.6",
"stylus": "^0.54.5",
"stylus-loader": "^3.0.2",
"vue-cli-plugin-webpack-bundle-analyzer": "^1.2.0",
"vue-template-compiler": "^2.5.21"
},
"browserslist": [
......
......@@ -32,7 +32,7 @@
r-rule-form(@input="changeRRule")
v-layout(row)
v-combobox(
label="Reason",
:label="$t('modals.createPbehavior.fields.reason')",
v-model="form.reason",
:items="selectItems.reasons",
:error-messages="errors.collect('reason')",
......@@ -41,13 +41,18 @@
)
v-layout(row)
v-select(
label="Type",
:label="$t('modals.createPbehavior.fields.type')",
v-model="form.type_",
:items="selectItems.types",
:error-messages="errors.collect('type')",
name="type",
v-validate="'required'"
)
v-layout(row)
v-textarea(
:label="$t('modals.createPbehavior.fields.comment')",
v-model="commentMessage",
)
v-layout(row)
v-alert(:value="serverError", type="error")
span {{ serverError }}
......@@ -88,6 +93,7 @@ export default {
data() {
return {
rRuleObject: null,
commentMessage: '',
form: {
name: '',
tstart: new Date(),
......@@ -141,6 +147,13 @@ export default {
data.rrule = this.rRuleObject.toString();
}
if (this.commentMessage !== '') {
data.comments = [{
author: this.currentUser.crecord_name,
message: this.commentMessage,
}];
}
this.$emit('submit', data);
}
},
......
......@@ -172,8 +172,7 @@
<script>
import RRule from 'rrule';
import mapValues from 'lodash/mapValues';
import pickBy from 'lodash/pickBy';
import { mapValues, pickBy } from 'lodash';
import DateTimePicker from '@/components/forms/fields/date-time-picker.vue';
......
......@@ -5,12 +5,12 @@
transition="slide-y-reverse-transition",
v-bind="wrapperProps"
)
v-tooltip(slot="activator", left)
v-tooltip(slot="activator", right)
v-btn.primary(slot="activator", :input-value="isVSpeedDialOpen", v-bind="buttonProps")
v-icon settings
v-icon close
span {{ $t('layout.sideBar.buttons.settings') }}
v-tooltip(v-if="hasUpdateAnyViewAccess || hasDeleteAnyViewAccess", left)
v-tooltip(v-if="hasUpdateAnyViewAccess || hasDeleteAnyViewAccess", right)
v-btn(
slot="activator",
:input-value="isEditingMode",
......@@ -23,7 +23,7 @@
v-icon(dark) edit
v-icon(dark) done
span {{ $t('layout.sideBar.buttons.edit') }}
v-tooltip(v-if="hasCreateAnyViewAccess", left)
v-tooltip(v-if="hasCreateAnyViewAccess", right)
v-btn(
slot="activator",
color="green darken-4",
......
......@@ -30,25 +30,30 @@
)
v-icon(small) edit
v-card.secondary.lighten-1.white--text(v-for="view in getAvailableViewsForGroup(group)", :key="view._id")
v-card-text.panel-item-content
router-link.panel-item-content-link(:title="view.title", :to="{ name: 'view', params: { id: view._id } }")
span.pl-3 {{ view.title }}
v-btn(
v-show="(checkUpdateViewAccessById(view._id) || checkDeleteViewAccessById(view._id)) && isEditingMode",
depressed,
small,
icon,
@click.prevent="showEditViewModal(view)"
)
v-icon(small) edit
v-btn(
v-show="isEditingMode",
depressed,
small,
icon,
@click.prevent="showDuplicateViewModal(view)"
)
v-icon(small) file_copy
router-link.panel-item-content-link(:title="view.title", :to="{ name: 'view', params: { id: view._id } }")
v-card-text.panel-item-content
v-layout(align-center, justify-space-between)
v-flex
span.pl-2 {{ view.title }}
v-flex
v-layout(justify-end)
v-btn.ma-0(
v-show="checkViewEditButtonAccessById(view._id)",
depressed,
small,
icon,
@click.prevent="showEditViewModal(view)"
)
v-icon(small) edit
v-btn.ma-0(
v-show="isEditingMode",
depressed,
small,
icon,
@click.prevent="showDuplicateViewModal(view)"
)
v-icon(small) file_copy
v-divider
v-divider
groups-settings-button(
:isEditingMode="isEditingMode",
......@@ -57,8 +62,11 @@
</template>
<script>
import { groupSchema } from '@/store/schemas';
import versionMixin from '@/mixins/entities/version';
import layoutNavigationGroupMenuMixin from '@/mixins/layout/navigation/group-menu';
import registrableMixin from '@/mixins/registrable';
import GroupsSettingsButton from './groups-settings-button.vue';
......@@ -71,7 +79,12 @@ import GroupsSettingsButton from './groups-settings-button.vue';
*/
export default {
components: { GroupsSettingsButton },
mixins: [versionMixin, layoutNavigationGroupMenuMixin],
mixins: [
versionMixin,
layoutNavigationGroupMenuMixin,
registrableMixin([groupSchema], 'groups'),
],
props: {
value: {
type: Boolean,
......
......@@ -31,7 +31,7 @@
v-list-tile-title
span {{ view.title }}
v-btn.edit-view-button(
v-show="(checkUpdateViewAccessById(view._id) || checkDeleteViewAccessById(view._id)) && isEditingMode",
v-show="checkViewEditButtonAccessById(view._id)",
color="grey darken-2",
depressed,
small,
......@@ -57,15 +57,24 @@
</template>
<script>
import { groupSchema } from '@/store/schemas';
import vuetifyTabsMixin from '@/mixins/vuetify/tabs';
import entitiesViewGroupMixin from '@/mixins/entities/view/group/index';
import layoutNavigationGroupMenuMixin from '@/mixins/layout/navigation/group-menu';
import registrableMixin from '@/mixins/registrable';
import GroupsSettingsButton from './groups-settings-button.vue';
export default {
components: { GroupsSettingsButton },
mixins: [vuetifyTabsMixin, entitiesViewGroupMixin, layoutNavigationGroupMenuMixin],
mixins: [
vuetifyTabsMixin,
entitiesViewGroupMixin,
layoutNavigationGroupMenuMixin,
registrableMixin([groupSchema], 'groups'),
],
watch: {
groups() {
this.$nextTick(this.callTabsOnResizeMethod);
......
......@@ -39,7 +39,7 @@ v-card
</template>
<script>
import pick from 'lodash/pick';
import { pick } from 'lodash';
import { MODALS } from '@/constants';
......
......@@ -72,8 +72,7 @@
<script>
import sha1 from 'sha1';
import omit from 'lodash/omit';
import pick from 'lodash/pick';
import { omit, pick } from 'lodash';
import { MODALS } from '@/constants';
......
......@@ -26,7 +26,7 @@
</template>
<script>
import find from 'lodash/find';
import { find } from 'lodash';
import { MODALS } from '@/constants';
......
......@@ -25,7 +25,7 @@
</template>
<script>
import pick from 'lodash/pick';
import { pick } from 'lodash';
import { MODALS } from '@/constants';
......
......@@ -16,8 +16,7 @@
</template>
<script>
import union from 'lodash/union';
import filter from 'lodash/filter';
import { union, filter } from 'lodash';
import ContextGeneralList from '@/components/other/context/context-general-list.vue';
......
......@@ -25,7 +25,7 @@
</template>
<script>
import omit from 'lodash/omit';
import { omit } from 'lodash';
import { MODALS } from '@/constants';
......
......@@ -33,7 +33,7 @@
</template>
<script>
import cloneDeep from 'lodash/cloneDeep';
import { cloneDeep } from 'lodash';
import { MODALS, EVENT_FILTER_RULE_TYPES, EVENT_FILTER_ENRICHMENT_RULE_AFTER_TYPES } from '@/constants';
import modalInnerMixin from '@/mixins/modal/inner';
......
......@@ -50,8 +50,7 @@
<script>
import Draggable from 'vuedraggable';
import cloneDeep from 'lodash/cloneDeep';
import pick from 'lodash/pick';
import { cloneDeep, pick } from 'lodash';
import { MODALS, EVENT_FILTER_ENRICHMENT_ACTIONS_TYPES } from '@/constants';
......
......@@ -18,7 +18,7 @@
</template>
<script>
import cloneDeep from 'lodash/cloneDeep';
import { cloneDeep } from 'lodash';
import { MODALS } from '@/constants';
......
......@@ -19,7 +19,7 @@
</template>
<script>
import get from 'lodash/get';
import { get } from 'lodash';
import { MODALS } from '@/constants';
......
......@@ -69,8 +69,7 @@
</template>
<script>
import find from 'lodash/find';
import omit from 'lodash/omit';
import { find, omit } from 'lodash';
import { MODALS, USERS_RIGHTS_TYPES, USERS_RIGHTS_MASKS } from '@/constants';
import {
......@@ -244,10 +243,10 @@ export default {
this.fetchGroupsList(),
]);
this.addSuccessPopup({ text: this.$t('modals.view.success') });
this.addSuccessPopup({ text: this.$t('modals.view.success.delete') });
this.hideModal();
} catch (err) {
this.addErrorPopup({ text: this.$t('modals.view.fail') });
this.addErrorPopup({ text: this.$t('modals.view.fail.delete') });
}
},
},
......
......@@ -31,7 +31,7 @@
</template>
<script>
import find from 'lodash/find';
import { find } from 'lodash';
import {
MODALS,
......
......@@ -32,8 +32,7 @@
</template>
<script>
import pick from 'lodash/pick';
import mapValues from 'lodash/mapValues';
import { pick, mapValues } from 'lodash';
import VRuntimeTemplate from 'v-runtime-template';
......
......@@ -3,7 +3,7 @@
</template>
<script>
import pickBy from 'lodash/pickBy';
import { pickBy } from 'lodash';
import {
MODALS,
......