Source code for univention.admin.handlers.nagios.timeperiod

#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
# Copyright 2004-2022 Univention GmbH
#
# https://www.univention.de/
#
# All rights reserved.
#
# The source code of this program is made available
# under the terms of the GNU Affero General Public License version 3
# (GNU AGPL V3) as published by the Free Software Foundation.
#
# Binary versions of this program provided by Univention to you as
# well as other copyrighted, protected or trademarked materials like
# Logos, graphics, fonts, specific documentations and configurations,
# cryptographic keys etc. are subject to a license agreement between
# you and Univention and not subject to the GNU AGPL V3.
#
# In the case you use this program under the terms of the GNU AGPL V3,
# the program is provided in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public
# License with the Debian GNU/Linux or Univention distribution in file
# /usr/share/common-licenses/AGPL-3; if not, see
# <https://www.gnu.org/licenses/>.

"""
|UDM| module for nagios time priod objects
"""

import re
from ldap.filter import filter_format

from univention.admin.layout import Tab, Group
import univention.admin.filter
import univention.admin.handlers
import univention.admin.syntax
import univention.admin.localization
import univention.admin.uexceptions

translation = univention.admin.localization.translation('univention.admin.handlers.nagios')
_ = translation.translate

module = 'nagios/timeperiod'
default_containers = ['cn=nagios']

childs = False
short_description = _('Nagios time period')
object_name = _('Nagios time period')
object_name_plural = _('Nagios time periods')
long_description = ''
operations = ['search', 'edit', 'add', 'remove']


[docs]class syntax_timeperiod(univention.admin.syntax.simple): name = 'timeperiod' _re = re.compile(r'^([0-9][0-9]\:[0-9][0-9]-[0-9][0-9]\:[0-9][0-9](,[0-9][0-9]\:[0-9][0-9]-[0-9][0-9]\:[0-9][0-9])*)?$')
[docs] @classmethod def parse(self, text): if text and self._re.match(text) is not None: for period in text.split(','): (start, end) = period.split('-') (shour, smin) = start.split(':') (ehour, emin) = end.split(':') if ((int(shour) >= 24) and (int(smin) != 0)) or (int(smin) > 59): raise univention.admin.uexceptions.valueError(_("No valid timeperiod list!")) if ((int(ehour) >= 24) and (int(emin) != 0)) or (int(emin) > 59): raise univention.admin.uexceptions.valueError(_("No valid timeperiod list!")) shour += smin ehour += emin if (int(shour) > int(ehour)): raise univention.admin.uexceptions.valueError(_("No valid timeperiod list!")) return text raise univention.admin.uexceptions.valueError(_("No valid timeperiod list!"))
options = { 'default': univention.admin.option( short_description=short_description, default=True, objectClasses=['top', 'univentionNagiosTimeperiodClass'], ), } property_descriptions = { 'name': univention.admin.property( short_description=_('Name'), long_description=_('Name'), syntax=univention.admin.syntax.string_numbers_letters_dots, include_in_default_search=True, required=True, may_change=False, identifies=True ), 'description': univention.admin.property( short_description=_('Description'), long_description=_('Description of time period (eg. non-workhours)'), syntax=univention.admin.syntax.string_numbers_letters_dots_spaces, include_in_default_search=True, required=True, ), 'periodMonday': univention.admin.property( short_description=_('Monday'), long_description=_('enter list of periods (e.g. 00:00-07:15,14:30-18:32,23:00-24:00)'), syntax=syntax_timeperiod, ), 'periodTuesday': univention.admin.property( short_description=_('Tuesday'), long_description=_('enter list of periods (e.g. 00:00-07:15,14:30-18:32,23:00-24:00)'), syntax=syntax_timeperiod, ), 'periodWednesday': univention.admin.property( short_description=_('Wednesday'), long_description=_('enter list of periods (e.g. 00:00-07:15,14:30-18:32,23:00-24:00)'), syntax=syntax_timeperiod, ), 'periodThursday': univention.admin.property( short_description=_('Thursday'), long_description=_('enter list of periods (e.g. 00:00-07:15,14:30-18:32,23:00-24:00)'), syntax=syntax_timeperiod, ), 'periodFriday': univention.admin.property( short_description=_('Friday'), long_description=_('enter list of periods (e.g. 00:00-07:15,14:30-18:32,23:00-24:00)'), syntax=syntax_timeperiod, ), 'periodSaturday': univention.admin.property( short_description=_('Saturday'), long_description=_('enter list of periods (e.g. 00:00-07:15,14:30-18:32,23:00-24:00)'), syntax=syntax_timeperiod, ), 'periodSunday': univention.admin.property( short_description=_('Sunday'), long_description=_('enter list of periods (e.g. 00:00-07:15,14:30-18:32,23:00-24:00)'), syntax=syntax_timeperiod, ) } layout = [ Tab(_('General'), _('Time Period Settings'), layout=[ Group(_('General Nagios time period settings'), layout=[ ["name", "description"], ["periodMonday", "periodTuesday"], ["periodWednesday", "periodThursday"], ["periodFriday", "periodSaturday"], "periodSunday" ]), ]), ] mapping = univention.admin.mapping.mapping() mapping.register('name', 'cn', None, univention.admin.mapping.ListToString) mapping.register('description', 'description', None, univention.admin.mapping.ListToString)
[docs]class object(univention.admin.handlers.simpleLdap): module = module def _post_unmap(self, info, values): value = values.get('univentionNagiosTimeperiod', [b''])[0].decode('ASCII') if value: periods = value.split('#', 6) info['periodMonday'] = periods[0] info['periodTuesday'] = periods[1] info['periodWednesday'] = periods[2] info['periodThursday'] = periods[3] info['periodFriday'] = periods[4] info['periodSaturday'] = periods[5] info['periodSunday'] = periods[6] return info def _ldap_pre_remove(self): super(object, self)._ldap_pre_remove() # refuse deletion if there is still a reference period_filter = filter_format('(&(objectClass=univentionNagiosServiceClass)(|(univentionNagiosCheckPeriod=%s)(univentionNagiosNotificationPeriod=%s)))', [self['name'], self['name']]) if self.lo.searchDn(base=self.position.getDomain(), filter=period_filter, scope='sub'): raise univention.admin.uexceptions.nagiosTimeperiodUsed() def _ldap_modlist(self): ml = univention.admin.handlers.simpleLdap._ldap_modlist(self) # timeperiod list for one weekday is hash separated - only usage of [0-9:-] is allowed # those lists are concatenated with hashes as delimiter periodslist = [self['periodMonday'], self['periodTuesday'], self['periodWednesday'], self['periodThursday'], self['periodFriday'], self['periodSaturday'], self['periodSunday']] for i in range(len(periodslist)): if periodslist[i] is None: periodslist[i] = '' newperiods = '#'.join(periodslist) ml.append(('univentionNagiosTimeperiod', self.oldattr.get('univentionNagiosTimeperiod', []), [newperiods.encode('ASCII')])) return ml
lookup = object.lookup lookup_filter = object.lookup_filter identify = object.identify