diff --git a/README.md b/README.md index 59980f5..249ce5b 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,11 @@ Asterisk4UCS ermöglicht zentrale Administration der gesamten Asterisk-Konfiguration mit allen Telefonen, Benutzerzuordnungen und weiteren IP-Telefonie-Peripheriegeräten/ -merkmalen und ist als App für den Univention Corporate Server (UCS) erhältlich. Der UCS stellt ein zentrales Identity- und Infrastruktur-Management basierend auf OpenLDAP zur Verfügung, in dem alle Teilnehmer mit ihren Login-Daten an einer Stelle im Netzwerk gehalten werden. Asterisk4UCS stellt die IP-Telefonie-Informationen dort bereit, wo sie benötigt werden: auf dem zentralen Anmeldesystemserver. -Asterisk4UCS erweitert eines der führenden LDAP-Verwaltungssysteme, den Univention Corporate Server (UCS) [1], um IP-Telefonie-Verwaltungsmöglichkeiten über eine web-basierte Oberfläche mit Hilfe eines dafür entwickelten UDM-Moduls (Univention Directory Management). +Ab UCS Version 4.3 wird Asterisk4UCS nicht mehr von uns gepflegt (end-of-life) und wird im Univention App Katalog deaktiviert. Als Hersteller der Lösung stehen wir Ihnen bei Fragen gerne zur Seite. Asterisk4UCS wurde zu unserer IP-Telefonanlage KITOMA weiterentwickelt. KITOMA ist statt reinen Administrationsmanagements nunmehr eine komplette IP-Telefonanlage, auf die durch die KITOMA-Oberfläche direkt zugegriffen werden kann. -Mehr Informationen unter http://www.asterisk4ucs.de oder https://www.decoit.de +Zwar ist KITOMA nicht direkt über den App-Katalog herunterladbar, aber trotzdem kompatibel zu UCS, so dass wir als Univention Premium Partner gerne Ihre UCS-Infrastruktur durch unsere IP-Telefonanlage erweitern. Weitere Informationen finden Sie unter www.kito.ma oder unter www.decoit.de/voip.html + +Viele Grüße vom DECOIT®-Team ## Repository-Struktur Der Master enthält die neuste Release-Version. Daneben gibt es noch spezifische Branches für die einzelnen UCS-Versionen, wie z.B. 4.1 oder 4.2. diff --git a/asterisk4ucs-testasterisk/debian/changelog b/asterisk4ucs-testasterisk/debian/changelog index 0cb75a4..c09d8ca 100644 --- a/asterisk4ucs-testasterisk/debian/changelog +++ b/asterisk4ucs-testasterisk/debian/changelog @@ -1,3 +1,9 @@ +asterisk4ucs-testasterisk (2.0.1) unstable; urgency=medium + + * Add UCS 5.0 support. Migrate to Python 3 + + -- Florian Best Sun, 03 Apr 2022 20:56:35 +0200 + asterisk4ucs-testasterisk (1.0.1) unstable; urgency=low * Nichtinteraktive Installation repariert diff --git a/asterisk4ucs-udm/42asterisk4ucs-udm.inst b/asterisk4ucs-udm/42asterisk4ucs-udm.inst index 32ffb9f..a94f109 100644 --- a/asterisk4ucs-udm/42asterisk4ucs-udm.inst +++ b/asterisk4ucs-udm/42asterisk4ucs-udm.inst @@ -30,4 +30,3 @@ umc_policy_append "default-umc-all" "udm-asterisk" joinscript_save_current_version exit 0 - diff --git a/asterisk4ucs-udm/conffiles/etc/ldap/slapd.conf.d/80asterisk b/asterisk4ucs-udm/conffiles/etc/ldap/slapd.conf.d/80asterisk index 4479417..c0a61d7 100644 --- a/asterisk4ucs-udm/conffiles/etc/ldap/slapd.conf.d/80asterisk +++ b/asterisk4ucs-udm/conffiles/etc/ldap/slapd.conf.d/80asterisk @@ -1,7 +1,5 @@ @%@UCRWARNING=# @%@ @!@ -if baseConfig['server/role'] == "domaincontroller_master": - print "include /usr/share/univention-ldap/schema/asterisk4ucs.schema" +if configRegistry['server/role'] == "domaincontroller_master": + print("include /usr/share/univention-ldap/schema/asterisk4ucs.schema") @!@ - - diff --git a/asterisk4ucs-udm/debian/asterisk4ucs-udm.postinst b/asterisk4ucs-udm/debian/asterisk4ucs-udm.postinst index 03e284a..733ecb1 100644 --- a/asterisk4ucs-udm/debian/asterisk4ucs-udm.postinst +++ b/asterisk4ucs-udm/debian/asterisk4ucs-udm.postinst @@ -25,8 +25,8 @@ udm container/cn create \ /usr/lib/asterisk4ucs/user-phone-extension/install # this is madness! - no, this is pkiiiiiiiiilllll!!!! -pkill -f '/usr/bin/python /usr/sbin/univention-management-console-module -m udm .*' -pkill -f '/usr/bin/python /usr/share/univention-directory-manager-tools/univention-cli-server' +pkill -f '/usr/bin/python3 /usr/sbin/univention-management-console-module -m udm .*' +pkill -f '/usr/bin/python3 /usr/share/univention-directory-manager-tools/univention-cli-server' /etc/init.d/univention-management-console-web-server stop /etc/init.d/univention-management-console-server restart /etc/init.d/univention-management-console-web-server start diff --git a/asterisk4ucs-udm/debian/changelog b/asterisk4ucs-udm/debian/changelog index 86f8e33..7125807 100644 --- a/asterisk4ucs-udm/debian/changelog +++ b/asterisk4ucs-udm/debian/changelog @@ -1,3 +1,9 @@ +asterisk4ucs-udm (2.0.1) unstable; urgency=medium + + * Add UCS 5.0 support. Migrate to Python 3 + + -- Florian Best Sun, 03 Apr 2022 20:58:30 +0200 + asterisk4ucs-udm (1.0.0) unstable; urgency=low * Einige Bugfixes, Vorbereitung auf Release diff --git a/asterisk4ucs-udm/debian/control b/asterisk4ucs-udm/debian/control index f36d40c..903e6f2 100644 --- a/asterisk4ucs-udm/debian/control +++ b/asterisk4ucs-udm/debian/control @@ -5,7 +5,7 @@ Maintainer: Tristan Bruns (Decoit GmbH) Build-Depends: debhelper (>= 7.0.50~), univention-config-dev, - python-univention + python3-univention Standards-Version: 3.5.2 Package: asterisk4ucs-udm diff --git a/asterisk4ucs-udm/devscripts/hardrestart b/asterisk4ucs-udm/devscripts/hardrestart index 44e455d..f89cc89 100755 --- a/asterisk4ucs-udm/devscripts/hardrestart +++ b/asterisk4ucs-udm/devscripts/hardrestart @@ -15,4 +15,4 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -kill -9 `ps aux | grep management-console | cut -d\ -f 7` ; /etc/init.d/univention-management-console-server start && /etc/init.d/univention-management-console-web-server start +systemctl restart univention-management-console-server diff --git a/asterisk4ucs-udm/modules/asterisk4ucs/__init__.py b/asterisk4ucs-udm/modules/asterisk4ucs/__init__.py index 9ac2908..32d7962 100644 --- a/asterisk4ucs-udm/modules/asterisk4ucs/__init__.py +++ b/asterisk4ucs-udm/modules/asterisk4ucs/__init__.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # coding=utf-8 """ @@ -20,10 +20,6 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ -import re -import sys - -import univention.admin.config import univention.admin.uldap import univention.admin.modules @@ -38,24 +34,18 @@ def __init__(self, pbdn): pbdn ist der DN des Telefonbuches im LDAP. (Kann z.B. per "udm asterisk/phoneBook list" ermittelt werden)""" - self.co = univention.admin.config.config() self.lo, self.pos = univention.admin.uldap.getAdminConnection() univention.admin.modules.update() - self.udmPhonebook = univention.admin.modules.get( - "asterisk/phoneBook") - self.udmContact = univention.admin.modules.get( - "asterisk/contact") - univention.admin.modules.init(self.lo, self.pos, - self.udmPhonebook) - univention.admin.modules.init(self.lo, self.pos, - self.udmContact) - - self.pb = self.udmPhonebook.object(self.co, self.lo, - None, pbdn) + self.udmPhonebook = univention.admin.modules.get("asterisk/phoneBook") + univention.admin.modules.init(self.lo, self.pos, self.udmPhonebook) + self.udmContact = univention.admin.modules.get("asterisk/contact") + univention.admin.modules.init(self.lo, self.pos, self.udmContact) + + self.pb = self.udmPhonebook.object(None, self.lo, None, pbdn) self.pb.open() if not self.pb.exists(): - raise Exception, "DN does not exist." + raise Exception("DN does not exist.") def getName(self): """Gibt den Namen des Telefonbuchs zurück""" @@ -65,17 +55,14 @@ def getName(self): def empty(self): """Löscht alle Kontakte im Telefonbuch""" - contacts = self.udmContact.lookup(self.co, self.lo, None, - superordinate=self.pb) + contacts = self.udmContact.lookup(None, self.lo, None, superordinate=self.pb) for contact in contacts: contact.remove() return len(contacts) - def addContact(self, title=None, firstname=None, lastname=None, - organisation=None, - phones=None, mobiles=None, faxes=None): + def addContact(self, title=None, firstname=None, lastname=None, organisation=None, phones=None, mobiles=None, faxes=None): """Fügt einen Kontakt hinzu Die Argumente sollten unbedingt als Keyword-Argumente @@ -87,8 +74,7 @@ def addContact(self, title=None, firstname=None, lastname=None, Strings. Der Rückgabewert ist der DN des neuen Kontakts.""" - contact = self.udmContact.object(self.co, self.lo, - self.pb.position, None, self.pb) + contact = self.udmContact.object(None, self.lo, self.pb.position, None, self.pb) contact.open() if title: diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/__init__.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/__init__.py index cb0df55..e29ae73 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/__init__.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/__init__.py @@ -16,6 +16,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ + from univention.management.console.log import MODULE import univention.config_registry import univention.admin.filter @@ -71,8 +72,7 @@ def genSipconfEntry(co, lo, phone): phone = phone.info if phoneUser.get("mailbox"): - phoneMailbox = mailbox.object(co, lo, None, - phoneUser["mailbox"]).info + phoneMailbox = mailbox.object(co, lo, None, phoneUser["mailbox"]).info callgroups = [] for group in phone.get("callgroups", []): @@ -84,9 +84,7 @@ def genSipconfEntry(co, lo, phone): group = phoneGroup.object(co, lo, None, group).info pickupgroups.append(group["id"]) - res = "[%s](template-%s)\n" % ( - phone["extension"], - phone.get("profile", "default")) + res = "[%s](template-%s)\n" % (phone["extension"], phone.get("profile", "default")) res += "secret=%s\n" % (phone["password"]) if phoneUser.get("extmode") == "normal": @@ -94,8 +92,7 @@ def genSipconfEntry(co, lo, phone): getNameFromUser(phoneUser), phone["extension"]) elif phoneUser.get("extmode") == "first": - firstPhone = sipPhone.object(co, lo, None, - llist(phoneUser["phones"])[0]).info + firstPhone = sipPhone.object(co, lo, None, llist(phoneUser["phones"])[0]).info res += "callerid=\"%s\" <%s>\n" % ( getNameFromUser(phoneUser), firstPhone["extension"]) @@ -113,10 +110,10 @@ def genSipconfEntry(co, lo, phone): def genSipconfFaxEntry(co, lo, phone): - res = "[%s]\n" % (phone["extension"]) + res = "[%s]\n" % (phone["extension"],) res += "type=friend\n" res += "host=dynamic\n" - res += "secret=%s\n" % (phone["password"]) + res += "secret=%s\n" % (phone["password"],) return res @@ -143,9 +140,8 @@ def genSipconf(co, lo, srv): conf += "; dn: %s\n" % (phone.dn) try: conf += genSipconfEntry(co, lo, phone) - except: - conf += re.sub("(?m)^", ";", - traceback.format_exc()[:-1]) + except Exception: + conf += re.sub("(?m)^", ";", traceback.format_exc()[:-1]) conf += "\n" conf += "\n\n; ===== Fax machines =====\n\n" @@ -153,9 +149,8 @@ def genSipconf(co, lo, srv): conf += "; dn: %s\n" % (phone.dn) try: conf += genSipconfFaxEntry(co, lo, phone) - except: - conf += re.sub("(?m)^", ";", - traceback.format_exc()[:-1]) + except Exception: + conf += re.sub("(?m)^", ";", traceback.format_exc()[:-1]) conf += "\n" return conf @@ -164,7 +159,7 @@ def genSipconf(co, lo, srv): def genVoicemailconfEntry(co, lo, box): from univention.admin.handlers.users import user boxUser = user.lookup(co, lo, filter_format("(ast4ucsUserMailbox=%s)", (box.dn,))) - if len(boxUser) == 0: + if not boxUser: return ";; Mailbox %s has no user.\n" % box["id"] if len(boxUser) > 1: msg = ";; Mailbox %s has multiple users:\n" % box["id"] @@ -211,9 +206,8 @@ def genVoicemailconf(co, lo, srv): conf += "; dn: %s\n" % (box.dn) try: conf += genVoicemailconfEntry(co, lo, box) - except: - conf += re.sub("(?m)^", ";", - traceback.format_exc()[:-1]) + except Exception: + conf += re.sub("(?m)^", ";", traceback.format_exc()[:-1]) conf += "\n" return conf @@ -246,9 +240,8 @@ def genQueuesconf(co, lo, srv): conf += "; dn: %s\n" % (queue.dn) try: conf += genQueuesconfEntry(co, lo, queue) - except: - conf += re.sub("(?m)^", ";", - traceback.format_exc()[:-1]) + except Exception: + conf += re.sub("(?m)^", ";", traceback.format_exc()[:-1]) conf += "\n" return conf @@ -277,9 +270,8 @@ def genMusiconholdconf(co, lo, srv): conf += "; dn: %s\n" % (moh.dn) try: conf += genMusiconholdconfEntry(co, lo, srv, moh) - except: - conf += re.sub("(?m)^", ";", - traceback.format_exc()[:-1]) + except Exception: + conf += re.sub("(?m)^", ";", traceback.format_exc()[:-1]) conf += "\n" return conf @@ -290,8 +282,7 @@ def genExtSIPPhoneEntry(co, lo, agis, extenPhone): # check if this phone is managed manually (not by ast4ucs) if extenPhone.get("skipExtension") == "1": - return ";; Extension %s is managed manually.\n" % ( - extenPhone["extension"]) + return ";; Extension %s is managed manually.\n" % (extenPhone["extension"],) from univention.admin.handlers.users import user from univention.admin.handlers.asterisk import sipPhone, mailbox @@ -311,22 +302,21 @@ def genExtSIPPhoneEntry(co, lo, agis, extenPhone): try: timeout = int(phoneUser["timeout"]) if timeout < 1 or timeout > 120: - raise Exception - except: + raise ValueError() + except ValueError: timeout = 10 try: ringdelay = int(phoneUser["ringdelay"]) if ringdelay < 1 or ringdelay > 120: - raise Exception - except: + raise ValueError() + except ValueError: ringdelay = 0 channels = [] hints = [] for dn in phoneUser.get("phones", []): - phone = sipPhone.object(co, lo, extenPhone.position, dn, - extenPhone.superordinate) + phone = sipPhone.object(co, lo, extenPhone.position, dn, extenPhone.superordinate) hints.append("SIP/%s" % phone["extension"]) if phone.get("forwarding"): channels.append("Local/%s" % phone["forwarding"]) @@ -342,8 +332,7 @@ def genExtSIPPhoneEntry(co, lo, agis, extenPhone): if channels: if ringdelay: for channel in channels[:-1]: - res.append("Dial(%s,%i,tT)" % (channel, - ringdelay)) + res.append("Dial(%s,%i,tT)" % (channel, ringdelay)) res.append("Wait(0.5)") res.append("Dial(%s,%i,tT)" % (channels[-1], timeout)) else: @@ -360,10 +349,9 @@ def genExtSIPPhoneEntry(co, lo, agis, extenPhone): resStr = "" if hints: - resStr += "exten => %s,hint,%s\n" % (extension, - '&'.join(hints)) + resStr += "exten => %s,hint,%s\n" % (extension, '&'.join(hints)) for i, data in enumerate(res): - resStr += "exten => %s,%i,%s\n" % (extension, i+1, data) + resStr += "exten => %s,%i,%s\n" % (extension, i + 1, data) return resStr @@ -463,8 +451,7 @@ def genExtensionsconf(co, lo, srv): int(agi["priority"]), "AGI(ast4ucs-%s)" % agi["name"] )) - sortkey = lambda x: x[0] - agis.sort(key=sortkey, reverse=True) + agis.sort(key=lambda x: x[0], reverse=True) agis = [x[1] for x in agis] conf = "; Automatisch generiert von Asterisk4UCS\n" @@ -476,9 +463,8 @@ def genExtensionsconf(co, lo, srv): conf += "; dn: %s\n" % (phone.dn) try: conf += genExtSIPPhoneEntry(co, lo, agis, phone) - except: - conf += re.sub("(?m)^", ";", - traceback.format_exc()[:-1]) + except Exception: + conf += re.sub("(?m)^", ";", traceback.format_exc()[:-1]) conf += "\n" conf += "\n\n; ===== Konferenzräume =====\n\n" @@ -486,9 +472,8 @@ def genExtensionsconf(co, lo, srv): conf += "; dn: %s\n" % (room.dn) try: conf += genExtRoomEntry(co, lo, agis, room) - except: - conf += re.sub("(?m)^", ";", - traceback.format_exc()[:-1]) + except Exception: + conf += re.sub("(?m)^", ";", traceback.format_exc()[:-1]) conf += "\n" conf += "\n\n; ===== Warteschleifen =====\n\n" @@ -496,9 +481,8 @@ def genExtensionsconf(co, lo, srv): conf += "; dn: %s\n" % (queue.dn) try: conf += genExtQueueEntry(co, lo, agis, queue) - except: - conf += re.sub("(?m)^", ";", - traceback.format_exc()[:-1]) + except Exception: + conf += re.sub("(?m)^", ";", traceback.format_exc()[:-1]) conf += "\n" conf += "\n\n; ===== Blockierte Vorwahlen =====\n\n" @@ -580,11 +564,3 @@ def reverseFieldsSave(self): obj.open() obj.info.setdefault(foreignField, []).append(self.dn) obj.modify() - - -class AsteriskBase(univention.admin.handlers.simpleLdap): - - def __init__(self, co, lo, position, dn='', superordinate=None, attributes=None): - if not superordinate and (dn or position): - superordinate = univention.admin.objects.get_superordinate(self.module, co, lo, dn or position.getDn()) - super(AsteriskBase, self).__init__(co, lo, position, dn, superordinate, attributes) diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/agiscript.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/agiscript.py index 524b539..46b6195 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/agiscript.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/agiscript.py @@ -17,19 +17,27 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ +import base64 + import univention.admin.filter import univention.admin.handlers import univention.admin.syntax from univention.admin.layout import Tab -from univention.admin.handlers.asterisk import AsteriskBase +from univention.admin.handlers import simpleLdap module = "asterisk/agiscript" short_description = u"Asterisk4UCS-Management: AGI-Script" operations = ['add', 'edit', 'remove', 'search', 'move'] -options = {} +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsAgiscript'], + ), +} -childs = 0 +childs = False superordinate = "asterisk/server" layout = [ @@ -61,52 +69,29 @@ } mapping = univention.admin.mapping.mapping() -mapping.register("name", "cn", - None, univention.admin.mapping.ListToString) -mapping.register("priority", "ast4ucsAgiscriptPriority", - None, univention.admin.mapping.ListToString) -mapping.register("content", "ast4ucsAgiscriptContent", - None, univention.admin.mapping.ListToString) +mapping.register("name", "cn", None, univention.admin.mapping.ListToString) +mapping.register("priority", "ast4ucsAgiscriptPriority", None, univention.admin.mapping.ListToString) +mapping.register("content", "ast4ucsAgiscriptContent", None, univention.admin.mapping.ListToString) -class object(AsteriskBase): +class object(simpleLdap): module = module def getContent(self): - return self.get("content", "").decode("base64") + return base64.b64decode(self.get("content", "").encode('UTF-8')).decode("ascii") def setContent(self, content): - self["content"] = content.encode("base64").replace("\n", "") + self["content"] = base64.b64encode(content.encode("utf-8")).decode('ascii') def _ldap_addlist(self): - return [('objectClass', ['ast4ucsAgiscript']), - ('ast4ucsSrvchildServer', self.superordinate.dn)] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsAgiscript") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsSrvchildServer', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) + return [('ast4ucsSrvchildServer', self.superordinate.dn)] - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsSrvchildServer', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'ast4ucsAgiscript' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/asterisk.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/asterisk.py index 67f6735..8611fc2 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/asterisk.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/asterisk.py @@ -41,8 +41,8 @@ operations = ['search'] default_containers = ["cn=asterisk"] -childs = 0 -virtual = 1 +childs = False +virtual = True modulesWithSuperordinates = { "None": [ diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/conferenceRoom.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/conferenceRoom.py index 340bf05..4916887 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/conferenceRoom.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/conferenceRoom.py @@ -22,14 +22,19 @@ import univention.admin.syntax from univention.admin.layout import Tab from univention.admin import uexceptions -from univention.admin.handlers.asterisk import AsteriskBase +from univention.admin.handlers import simpleLdap module = "asterisk/conferenceRoom" short_description = u"Asterisk4UCS-Management: Konferenzraum" operations = ['add', 'edit', 'remove', 'search', 'move'] -options = {} - -childs = 0 +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsConfroom'], + ), +} +childs = False superordinate = "asterisk/server" layout = [ @@ -87,26 +92,18 @@ } mapping = univention.admin.mapping.mapping() -mapping.register("extension", "ast4ucsExtensionExtension", - None, univention.admin.mapping.ListToString) -mapping.register("maxMembers", "ast4ucsConfroomMaxmembers", - None, univention.admin.mapping.ListToString) -mapping.register("pin", "ast4ucsConfroomPin", - None, univention.admin.mapping.ListToString) -mapping.register("adminPin", "ast4ucsConfroomAdminpin", - None, univention.admin.mapping.ListToString) - -mapping.register("announceCount", "ast4ucsConfroomAnnouncecount", - None, univention.admin.mapping.ListToString) -mapping.register("initiallyMuted", "ast4ucsConfroomInitiallymuted", - None, univention.admin.mapping.ListToString) -mapping.register("musicOnHold", "ast4ucsConfroomMusiconhold", - None, univention.admin.mapping.ListToString) -mapping.register("quietMode", "ast4ucsConfroomQuietmode", - None, univention.admin.mapping.ListToString) - - -class object(AsteriskBase): +mapping.register("extension", "ast4ucsExtensionExtension", None, univention.admin.mapping.ListToString) +mapping.register("maxMembers", "ast4ucsConfroomMaxmembers", None, univention.admin.mapping.ListToString) +mapping.register("pin", "ast4ucsConfroomPin", None, univention.admin.mapping.ListToString) +mapping.register("adminPin", "ast4ucsConfroomAdminpin", None, univention.admin.mapping.ListToString) + +mapping.register("announceCount", "ast4ucsConfroomAnnouncecount", None, univention.admin.mapping.ListToString) +mapping.register("initiallyMuted", "ast4ucsConfroomInitiallymuted", None, univention.admin.mapping.ListToString) +mapping.register("musicOnHold", "ast4ucsConfroomMusiconhold", None, univention.admin.mapping.ListToString) +mapping.register("quietMode", "ast4ucsConfroomQuietmode", None, univention.admin.mapping.ListToString) + + +class object(simpleLdap): module = module def _ldap_pre_ready(self): @@ -114,39 +111,18 @@ def _ldap_pre_ready(self): if self.info.get("pin"): if self.info.get("adminPin") == self.info["pin"]: class pinError(uexceptions.base): - message = "Pin und Admin-Pin dürfen " +\ - "nicht übereinstimmen." + message = "Pin und Admin-Pin dürfen nicht übereinstimmen." raise pinError def _ldap_addlist(self): - return [('objectClass', ['ast4ucsConfroom']), - ('ast4ucsSrvchildServer', self.superordinate.dn)] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsConfroom") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsSrvchildServer', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) + return [('ast4ucsSrvchildServer', self.superordinate.dn)] - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsSrvchildServer', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'ast4ucsConfroom' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/contact.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/contact.py index eb8317a..ef7d735 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/contact.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/contact.py @@ -22,14 +22,20 @@ import univention.admin.syntax import univention.admin.uexceptions from univention.admin.layout import Tab -from univention.admin.handlers.asterisk import AsteriskBase +from univention.admin.handlers import simpleLdap module = "asterisk/contact" short_description = u"Asterisk4UCS-Management: Kontakt" operations = ['add', 'edit', 'remove', 'search', 'move'] -options = {} +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['phonebookContact'], + ), +} -childs = 0 +childs = False superordinate = "asterisk/phoneBook" layout = [ @@ -84,27 +90,21 @@ } mapping = univention.admin.mapping.mapping() -mapping.register("commonName", "cn", - None, univention.admin.mapping.ListToString) -mapping.register("firstname", "ast4ucsContactFirstname", - None, univention.admin.mapping.ListToString) -mapping.register("lastname", "ast4ucsContactLastname", - None, univention.admin.mapping.ListToString) -mapping.register("title", "title", - None, univention.admin.mapping.ListToString) -mapping.register("organisation", "o", - None, univention.admin.mapping.ListToString) +mapping.register("commonName", "cn", None, univention.admin.mapping.ListToString) +mapping.register("firstname", "ast4ucsContactFirstname", None, univention.admin.mapping.ListToString) +mapping.register("lastname", "ast4ucsContactLastname", None, univention.admin.mapping.ListToString) +mapping.register("title", "title", None, univention.admin.mapping.ListToString) +mapping.register("organisation", "o", None, univention.admin.mapping.ListToString) mapping.register("telephoneNumber", "telephoneNumber") mapping.register("mobileNumber", "ast4ucsContactMobilenumber") mapping.register("faxNumber", "ast4ucsContactFaxnumber") class noNameError(univention.admin.uexceptions.insufficientInformation): - message = (u"Eines der Felder Vorname, Nachname und Organisation " - u"muss ausgefüllt sein.") + message = (u"Eines der Felder Vorname, Nachname und Organisation muss ausgefüllt sein.") -class object(AsteriskBase): +class object(simpleLdap): module = module def _ldap_pre_ready(self): @@ -134,34 +134,14 @@ def _ldap_pre_ready(self): self.info["commonName"] = cn def _ldap_addlist(self): - return [('objectClass', ['phonebookContact']), - ('ast4ucsPbchildPhonebook', self.superordinate.dn)] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "phonebookContact") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsPbchildPhonebook', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) + return [('ast4ucsPbchildPhonebook', self.superordinate.dn)] - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsPbchildPhonebook', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'phonebookContact' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/fax.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/fax.py index 2f1e05b..4c1e356 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/fax.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/fax.py @@ -21,14 +21,19 @@ import univention.admin.handlers import univention.admin.syntax from univention.admin.layout import Tab -from univention.admin.handlers.asterisk import AsteriskBase +from univention.admin.handlers import simpleLdap module = "asterisk/fax" short_description = u"Asterisk4UCS-Management: Fax" operations = ['add', 'edit', 'remove', 'search', 'move'] -options = {} - -childs = 0 +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsFax'], + ), +} +childs = False superordinate = "asterisk/server" layout = [ @@ -66,50 +71,25 @@ } mapping = univention.admin.mapping.mapping() -mapping.register("extension", "ast4ucsExtensionExtension", - None, univention.admin.mapping.ListToString) -mapping.register("ipaddress", "ast4ucsSipclientIp", - None, univention.admin.mapping.ListToString) -mapping.register("macaddress", "ast4ucsSipclientMacaddr", - None, univention.admin.mapping.ListToString) -mapping.register("hostname", "ast4ucsSipclientHostname", - None, univention.admin.mapping.ListToString) -mapping.register("password", "ast4ucsSipclientSecret", - None, univention.admin.mapping.ListToString) +mapping.register("extension", "ast4ucsExtensionExtension", None, univention.admin.mapping.ListToString) +mapping.register("ipaddress", "ast4ucsSipclientIp", None, univention.admin.mapping.ListToString) +mapping.register("macaddress", "ast4ucsSipclientMacaddr", None, univention.admin.mapping.ListToString) +mapping.register("hostname", "ast4ucsSipclientHostname", None, univention.admin.mapping.ListToString) +mapping.register("password", "ast4ucsSipclientSecret", None, univention.admin.mapping.ListToString) -class object(AsteriskBase): +class object(simpleLdap): module = module def _ldap_addlist(self): - return [('objectClass', ['ast4ucsFax']), - ('ast4ucsSrvchildServer', self.superordinate.dn)] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsFax") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsSrvchildServer', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) + return [('ast4ucsSrvchildServer', self.superordinate.dn)] - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsSrvchildServer', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'ast4ucsFax' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/faxGroup.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/faxGroup.py index c856326..98bf6c0 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/faxGroup.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/faxGroup.py @@ -21,14 +21,19 @@ import univention.admin.handlers import univention.admin.syntax from univention.admin.layout import Tab -from univention.admin.handlers.asterisk import AsteriskBase +from univention.admin.handlers import simpleLdap module = "asterisk/faxGroup" short_description = u"Asterisk4UCS-Management: Faxgruppe" operations = ['add', 'edit', 'remove', 'search', 'move'] -options = {} - -childs = 0 +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsFaxgroup'], + ), +} +childs = False superordinate = "asterisk/server" layout = [ @@ -57,43 +62,22 @@ } mapping = univention.admin.mapping.mapping() -mapping.register("extension", "ast4ucsExtensionExtension", - None, univention.admin.mapping.ListToString) +mapping.register("extension", "ast4ucsExtensionExtension", None, univention.admin.mapping.ListToString) mapping.register("members", "ast4ucsFaxgroupMember") -class object(AsteriskBase): +class object(simpleLdap): module = module def _ldap_addlist(self): - return [('objectClass', ['ast4ucsFaxgroup']), - ('ast4ucsSrvchildServer', self.superordinate.dn)] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsFaxgroup") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsSrvchildServer', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) + return [('ast4ucsSrvchildServer', self.superordinate.dn)] - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsSrvchildServer', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'ast4ucsFaxgroup' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/mailbox.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/mailbox.py index cc122fc..0e974b2 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/mailbox.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/mailbox.py @@ -21,17 +21,22 @@ import univention.admin.handlers import univention.admin.syntax from univention.admin.layout import Tab -from univention.admin.handlers.asterisk import AsteriskBase +from univention.admin.handlers import simpleLdap module = "asterisk/mailbox" short_description = u"Asterisk4UCS-Management: Anrufbeantworter" operations = ['add', 'edit', 'remove', 'search', 'move'] -options = {} +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsMailbox'], + ), +} -childs = 0 +childs = False superordinate = "asterisk/server" -# Definiert das Layout der Eingabefelder in der Weboberfläche layout = [ Tab('Allgemein', 'Allgemeine Einstellungen', layout=[ ["id"], @@ -40,8 +45,6 @@ ]) ] -# Definiert die verschiedenen UDM-Attribute -# http://wiki.univention.de/index.php?title=Entwicklung_und_Integration_eigener_Module_in_Univention_Directory_Manager#property-descriptions property_descriptions = { "commonName": univention.admin.property( short_description="Name", @@ -66,20 +69,14 @@ ), } -# Definiert die Zuordnung von UDM-Attributen zu LDAP-Attributen. -# http://wiki.univention.de/index.php?title=Entwicklung_und_Integration_eigener_Module_in_Univention_Directory_Manager#mapping mapping = univention.admin.mapping.mapping() -mapping.register("commonName", "cn", - None, univention.admin.mapping.ListToString) -mapping.register("id", "ast4ucsMailboxId", - None, univention.admin.mapping.ListToString) -mapping.register("password", "ast4ucsMailboxPassword", - None, univention.admin.mapping.ListToString) -mapping.register("email", "ast4ucsMailboxNotifybymail", - None, univention.admin.mapping.ListToString) +mapping.register("commonName", "cn", None, univention.admin.mapping.ListToString) +mapping.register("id", "ast4ucsMailboxId", None, univention.admin.mapping.ListToString) +mapping.register("password", "ast4ucsMailboxPassword", None, univention.admin.mapping.ListToString) +mapping.register("email", "ast4ucsMailboxNotifybymail", None, univention.admin.mapping.ListToString) -class object(AsteriskBase): +class object(simpleLdap): module = module def _ldap_pre_ready(self): @@ -100,44 +97,14 @@ def _ldap_addlist(self): Bei neuen Modulen müssen die objectClass und der Attributname des Superordinate-Verweises angepasst werden""" - return [('objectClass', ['ast4ucsMailbox']), - ('ast4ucsSrvchildServer', self.superordinate.dn)] - -# Sucht nach diesem Modul zugehörigen Objekten. Berücksichtigt dabei eventuell -# übergebene Einschränkungen (filter_s) und übergeordnete Objekte -# (superordinate). -# Für neue Module müssen in diesem Code nur die objectClass und das -# LDAP-Attribut für die Superordinate-Zuordnung angepasst werden. -# (in diesem Fall ast4ucsMailbox und ast4ucsSrvchildServer) - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsMailbox") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsSrvchildServer', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) - - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + return [('ast4ucsSrvchildServer', self.superordinate.dn)] -# Funktion, die True zurückliefert, wenn dieses Modul für das übergebene -# Objekt zuständig ist. Prüft einfach nur die LDAP objectClass. + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsSrvchildServer', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'ast4ucsMailbox' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/music.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/music.py index 27a0e6b..af85670 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/music.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/music.py @@ -21,14 +21,21 @@ import univention.admin.handlers import univention.admin.syntax from univention.admin.layout import Tab -from univention.admin.handlers.asterisk import AsteriskBase +from univention.admin.handlers import simpleLdap module = "asterisk/music" short_description = u"Asterisk4UCS-Management: Warteschlangenmusik" operations = ['add', 'edit', 'remove', 'search', 'move'] options = {} +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsMusic'], + ), +} -childs = 0 +childs = False superordinate = "asterisk/server" layout = [ @@ -53,44 +60,22 @@ } mapping = univention.admin.mapping.mapping() -mapping.register("name", "cn", - None, univention.admin.mapping.ListToString) -mapping.register("music", "ast4ucsMusicMusic", - None, None) +mapping.register("name", "cn", None, univention.admin.mapping.ListToString) +mapping.register("music", "ast4ucsMusicMusic", None, None) -class object(AsteriskBase): +class object(simpleLdap): module = module def _ldap_addlist(self): - return [('objectClass', ['ast4ucsMusic']), - ('ast4ucsSrvchildServer', self.superordinate.dn)] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsMusic") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsSrvchildServer', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) + return [('ast4ucsSrvchildServer', self.superordinate.dn)] - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsSrvchildServer', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'ast4ucsMusic' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneBook.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneBook.py index 8a332a7..79a79ce 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneBook.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneBook.py @@ -25,7 +25,13 @@ module = "asterisk/phoneBook" short_description = u"Asterisk4UCS-Management: Telefonbuch" operations = ['add', 'edit', 'remove', 'search', 'move'] -options = {} +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsPhonebook'], + ), +} childs = False childmodules = ["asterisk/contact"] @@ -46,37 +52,13 @@ } mapping = univention.admin.mapping.mapping() -mapping.register("commonName", "cn", - None, univention.admin.mapping.ListToString) +mapping.register("commonName", "cn", None, univention.admin.mapping.ListToString) class object(univention.admin.handlers.simpleLdap): module = module - def _ldap_addlist(self): - return [('objectClass', ['ast4ucsPhonebook'])] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsPhonebook") - ]) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) - - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res - -def identify(dn, attr, canonical=0): - return 'ast4ucsPhonebook' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneGroup.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneGroup.py index 2c05f34..fd91147 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneGroup.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneGroup.py @@ -20,14 +20,20 @@ import univention.admin.filter import univention.admin.handlers from univention.admin.handlers.asterisk import \ - reverseFieldsLoad, reverseFieldsSave, AsteriskBase + reverseFieldsLoad, reverseFieldsSave, simpleLdap import univention.admin.syntax from univention.admin.layout import Tab module = "asterisk/phoneGroup" short_description = u"Asterisk4UCS-Management: Telefongruppe" operations = ['add', 'edit', 'remove', 'search', 'move'] -options = {} +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsPhonegroup'], + ), +} childs = False superordinate = "asterisk/server" @@ -55,31 +61,29 @@ "callphones": univention.admin.property( short_description="Callgroup-Teilnehmer", syntax=univention.admin.syntax.LDAP_Search( - filter="objectClass=ast4ucsPhone", - attribute=['asterisk/sipPhone: extension'], - value='asterisk/sipPhone: dn', - ), + filter="objectClass=ast4ucsPhone", + attribute=['asterisk/sipPhone: extension'], + value='asterisk/sipPhone: dn', + ), multivalue=True, ), "pickupphones": univention.admin.property( short_description="Pickupgroup-Teilnehmer", syntax=univention.admin.syntax.LDAP_Search( - filter="objectClass=ast4ucsPhone", - attribute=['asterisk/sipPhone: extension'], - value='asterisk/sipPhone: dn', - ), + filter="objectClass=ast4ucsPhone", + attribute=['asterisk/sipPhone: extension'], + value='asterisk/sipPhone: dn', + ), multivalue=True, ), } mapping = univention.admin.mapping.mapping() -mapping.register("commonName", "cn", - None, univention.admin.mapping.ListToString) -mapping.register("id", "ast4ucsPhonegroupId", - None, univention.admin.mapping.ListToString) +mapping.register("commonName", "cn", None, univention.admin.mapping.ListToString) +mapping.register("id", "ast4ucsPhonegroupId", None, univention.admin.mapping.ListToString) -class object(AsteriskBase): +class object(simpleLdap): module = module def __init__(self, co, lo, position, dn='', superordinate=None, attributes=None): @@ -109,34 +113,14 @@ def _ldap_pre_remove(self): reverseFieldsSave(self) def _ldap_addlist(self): - return [('objectClass', ['ast4ucsPhonegroup']), - ('ast4ucsSrvchildServer', self.superordinate.dn)] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsPhonegroup") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsSrvchildServer', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) + return [('ast4ucsSrvchildServer', self.superordinate.dn)] - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsSrvchildServer', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'ast4ucsPhonegroup' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneType.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneType.py index fa12f4c..3cf9b1a 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneType.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/phoneType.py @@ -21,14 +21,21 @@ import univention.admin.handlers import univention.admin.syntax from univention.admin.layout import Tab -from univention.admin.handlers.asterisk import AsteriskBase +from univention.admin.handlers import simpleLdap module = "asterisk/phoneType" short_description = u"Asterisk4UCS-Management: Telefontyp" operations = ['add', 'edit', 'remove', 'search', 'move'] options = {} +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsPhonetype'], + ), +} -childs = 0 +childs = False superordinate = "asterisk/server" layout = [ @@ -61,48 +68,24 @@ } mapping = univention.admin.mapping.mapping() -mapping.register("commonName", "cn", - None, univention.admin.mapping.ListToString) -mapping.register("displaySize", "ast4ucsPhonetypeDisplaysize", - None, univention.admin.mapping.ListToString) -mapping.register("manufacturer", "ast4ucsPhonetypeManufacturer", - None, univention.admin.mapping.ListToString) -mapping.register("type", "ast4ucsPhonetypeType", - None, univention.admin.mapping.ListToString) +mapping.register("commonName", "cn", None, univention.admin.mapping.ListToString) +mapping.register("displaySize", "ast4ucsPhonetypeDisplaysize", None, univention.admin.mapping.ListToString) +mapping.register("manufacturer", "ast4ucsPhonetypeManufacturer", None, univention.admin.mapping.ListToString) +mapping.register("type", "ast4ucsPhonetypeType", None, univention.admin.mapping.ListToString) -class object(AsteriskBase): +class object(simpleLdap): module = module def _ldap_addlist(self): - return [('objectClass', ['ast4ucsPhonetype']), - ('ast4ucsSrvchildServer', self.superordinate.dn)] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsPhonetype") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsSrvchildServer', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) + return [('ast4ucsSrvchildServer', self.superordinate.dn)] - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsSrvchildServer', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'ast4ucsPhonetype' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/server.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/server.py index 6ee6e50..eda377e 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/server.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/server.py @@ -30,6 +30,13 @@ short_description = u"Asterisk4UCS-Management: Asterisk-Server" operations = ['add', 'edit', 'remove', 'search', 'move'] options = {} +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsServer'], + ), +} childs = False @@ -56,6 +63,7 @@ class upstreamBug34040Exception(univention.admin.uexceptions.base): message = u'Leider kann zur Zeit nicht mehr als ein Asterisk-Server angelegt werden, da ein Univention-Bug dies verhindert.' + layout = [ Tab('Allgemein', 'Allgemeine Einstellungen', layout=[ ["commonName"], @@ -158,17 +166,17 @@ class upstreamBug34040Exception(univention.admin.uexceptions.base): "mailboxEmailsubject": univention.admin.property( short_description="Betreff der eMails", long_description=u"""Die folgenden Platzhalter können verwendet werden: - ${VM_NAME} Name des Mailbox-Inhabers - ${VM_DUR} Länge der Nachricht - ${VM_MSGNUM} Nummer der Nachricht - ${VM_MAILBOX} Name der Mailbox - ${VM_CALLERID} Telefonnummer und Name des Anrufers - ${VM_CIDNUM} Telefonnummer des Anrufers - ${VM_CIDNAME} Name des Anrufers - ${VM_DATE} Datum und Uhrzeit des Anrufs - ${VM_MESSAGEFILE} - Name der Sounddatei, in der die - Nachricht abgespeichert ist""".replace("\n", "
"), + ${VM_NAME} Name des Mailbox-Inhabers + ${VM_DUR} Länge der Nachricht + ${VM_MSGNUM} Nummer der Nachricht + ${VM_MAILBOX} Name der Mailbox + ${VM_CALLERID} Telefonnummer und Name des Anrufers + ${VM_CIDNUM} Telefonnummer des Anrufers + ${VM_CIDNAME} Name des Anrufers + ${VM_DATE} Datum und Uhrzeit des Anrufs + ${VM_MESSAGEFILE} + Name der Sounddatei, in der die + Nachricht abgespeichert ist""".replace("\n", "
").replace("\t", " "), syntax=univention.admin.syntax.string, required=True, default="New message from ${VM_CALLERID}", @@ -176,25 +184,24 @@ class upstreamBug34040Exception(univention.admin.uexceptions.base): "mailboxEmailbody": univention.admin.property( short_description="Textkörper der eMails", long_description=u"""Die folgenden Platzhalter können verwendet werden: - ${VM_NAME} Name des Mailbox-Inhabers - ${VM_DUR} Länge der Nachricht - ${VM_MSGNUM} Nummer der Nachricht - ${VM_MAILBOX} Name der Mailbox - ${VM_CALLERID} Telefonnummer und Name des Anrufers - ${VM_CIDNUM} Telefonnummer des Anrufers - ${VM_CIDNAME} Name des Anrufers - ${VM_DATE} Datum und Uhrzeit des Anrufs - ${VM_MESSAGEFILE} - Name der Sounddatei, in der die - Nachricht abgespeichert ist + ${VM_NAME} Name des Mailbox-Inhabers + ${VM_DUR} Länge der Nachricht + ${VM_MSGNUM} Nummer der Nachricht + ${VM_MAILBOX} Name der Mailbox + ${VM_CALLERID} Telefonnummer und Name des Anrufers + ${VM_CIDNUM} Telefonnummer des Anrufers + ${VM_CIDNAME} Name des Anrufers + ${VM_DATE} Datum und Uhrzeit des Anrufs + ${VM_MESSAGEFILE} + Name der Sounddatei, in der die + Nachricht abgespeichert ist Weiterhin können die folgenden Escapesequenzen verwendet werden: - \\n Neue Zeile - \\t Tabulator-Zeichen""".replace("\n", "
"), + \\n Neue Zeile + \\t Tabulator-Zeichen""".replace("\n", "
").replace("\t", " "), syntax=univention.admin.syntax.string, required=True, - default="Hello ${VM_NAME},\n\nThere is a new message " + \ - "in mailbox ${VM_MAILBOX}.", + default="Hello ${VM_NAME},\n\nThere is a new message in mailbox ${VM_MAILBOX}.", ), "mailboxEmaildateformat": univention.admin.property( short_description="Datumsformat in eMails", @@ -232,8 +239,7 @@ class upstreamBug34040Exception(univention.admin.uexceptions.base): ), "mailboxMailcommand": univention.admin.property( short_description="Befehl zum Versenden der eMails", - long_description=u"Programm zum Versenden von E-Mails " + \ - "(unbedingt den absoluten Pfad angeben!)", + long_description=u"Programm zum Versenden von E-Mails (unbedingt den absoluten Pfad angeben!)", syntax=univention.admin.syntax.string, required=True, default="/usr/sbin/sendmail -t", @@ -251,45 +257,28 @@ class upstreamBug34040Exception(univention.admin.uexceptions.base): } mapping = univention.admin.mapping.mapping() -mapping.register("commonName", "cn", - None, univention.admin.mapping.ListToString) +mapping.register("commonName", "cn", None, univention.admin.mapping.ListToString) mapping.register("blockedAreaCodes", "ast4ucsServerBlockedareacode") mapping.register("extnums", "ast4ucsServerExtnum") -mapping.register("defaultext", "ast4ucsServerDefaultext", - None, univention.admin.mapping.ListToString) - -mapping.register("sshuser", "ast4ucsServerSshuser", - None, univention.admin.mapping.ListToString) -mapping.register("sshhost", "ast4ucsServerSshhost", - None, univention.admin.mapping.ListToString) -mapping.register("sshpath", "ast4ucsServerSshpath", - None, univention.admin.mapping.ListToString) -mapping.register("sshmohpath", "ast4ucsServerSshmohpath", - None, univention.admin.mapping.ListToString) -mapping.register("sshagipath", "ast4ucsServerSshagipath", - None, univention.admin.mapping.ListToString) -mapping.register("sshcmd", "ast4ucsServerSshcmd", - None, univention.admin.mapping.ListToString) - -mapping.register("mailboxMaxlength", "ast4ucsServerMailboxmaxlen", - None, univention.admin.mapping.ListToString) -mapping.register("mailboxEmailsubject", "ast4ucsServerMailboxemailsubject", - None, univention.admin.mapping.ListToString) -mapping.register("mailboxEmailbody", "ast4ucsServerMailboxemailbody", - None, univention.admin.mapping.ListToString) -mapping.register("mailboxEmaildateformat", "ast4ucsServerMailboxemaildateformat", - None, univention.admin.mapping.ListToString) -mapping.register("mailboxAttach", "ast4ucsServerMailboxattach", - None, univention.admin.mapping.ListToString) -mapping.register("mailboxMailcommand", "ast4ucsServerMailboxemailcommand", - None, univention.admin.mapping.ListToString) -mapping.register("globalCallId", "ast4ucsServerGlobalCallId", - None, univention.admin.mapping.ListToString) - -mapping.register("agi-user", "ast4ucsServerAgiuser", - None, univention.admin.mapping.ListToString) -mapping.register("agi-password", "ast4ucsServerAgipassword", - None, univention.admin.mapping.ListToString) +mapping.register("defaultext", "ast4ucsServerDefaultext", None, univention.admin.mapping.ListToString) + +mapping.register("sshuser", "ast4ucsServerSshuser", None, univention.admin.mapping.ListToString) +mapping.register("sshhost", "ast4ucsServerSshhost", None, univention.admin.mapping.ListToString) +mapping.register("sshpath", "ast4ucsServerSshpath", None, univention.admin.mapping.ListToString) +mapping.register("sshmohpath", "ast4ucsServerSshmohpath", None, univention.admin.mapping.ListToString) +mapping.register("sshagipath", "ast4ucsServerSshagipath", None, univention.admin.mapping.ListToString) +mapping.register("sshcmd", "ast4ucsServerSshcmd", None, univention.admin.mapping.ListToString) + +mapping.register("mailboxMaxlength", "ast4ucsServerMailboxmaxlen", None, univention.admin.mapping.ListToString) +mapping.register("mailboxEmailsubject", "ast4ucsServerMailboxemailsubject", None, univention.admin.mapping.ListToString) +mapping.register("mailboxEmailbody", "ast4ucsServerMailboxemailbody", None, univention.admin.mapping.ListToString) +mapping.register("mailboxEmaildateformat", "ast4ucsServerMailboxemaildateformat", None, univention.admin.mapping.ListToString) +mapping.register("mailboxAttach", "ast4ucsServerMailboxattach", None, univention.admin.mapping.ListToString) +mapping.register("mailboxMailcommand", "ast4ucsServerMailboxemailcommand", None, univention.admin.mapping.ListToString) +mapping.register("globalCallId", "ast4ucsServerGlobalCallId", None, univention.admin.mapping.ListToString) + +mapping.register("agi-user", "ast4ucsServerAgiuser", None, univention.admin.mapping.ListToString) +mapping.register("agi-password", "ast4ucsServerAgipassword", None, univention.admin.mapping.ListToString) class object(univention.admin.handlers.simpleLdap): @@ -299,7 +288,7 @@ def open(self): univention.admin.handlers.simpleLdap.open(self) for areaCode in ["+", "00"]: - if not areaCode in self.info.get("blockedAreaCodes", []): + if areaCode not in self.info.get("blockedAreaCodes", []): break else: self.info["blockInternational"] = "1" @@ -354,31 +343,7 @@ def _ldap_post_create(self): number2name.setContent(open("/usr/lib/asterisk4ucs/number2name.agi").read()) number2name.create() - def _ldap_addlist(self): - return [('objectClass', ['ast4ucsServer'])] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsServer") - ]) - #logging.debug('server.py UDM 366: filter: %s', filter) - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) - - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - #logging.debug('server.py UDM 378: res: %s',res) - return res - - -def identify(dn, attr, canonical=0): - return 'ast4ucsServer' in attr.get('objectClass', []) + +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/sipPhone.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/sipPhone.py index 174f889..73b0e1e 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/sipPhone.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/sipPhone.py @@ -21,14 +21,20 @@ import univention.admin.handlers import univention.admin.syntax from univention.admin.layout import Tab -from univention.admin.handlers.asterisk import AsteriskBase +from univention.admin.handlers import simpleLdap module = "asterisk/sipPhone" short_description = u"Asterisk4UCS-Management: IP-Telefon" operations = ['add', 'edit', 'remove', 'search', 'move'] -options = {} +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsPhone'], + ), +} -childs = 0 +childs = False superordinate = "asterisk/server" layout = [ @@ -66,10 +72,10 @@ "phonetype": univention.admin.property( short_description="Telefontyp", syntax=univention.admin.syntax.LDAP_Search( - filter="objectClass=ast4ucsPhonetype", - attribute=['asterisk/phoneType: commonName'], - value='asterisk/phoneType: dn' - ), + filter="objectClass=ast4ucsPhonetype", + attribute=['asterisk/phoneType: commonName'], + value='asterisk/phoneType: dn' + ), ), "profile": univention.admin.property( short_description="Profil", @@ -83,28 +89,28 @@ "callgroups": univention.admin.property( short_description="Callgroups", syntax=univention.admin.syntax.LDAP_Search( - filter="objectClass=ast4ucsPhonegroup", - attribute=['asterisk/phoneGroup: commonName'], - value='asterisk/phoneGroup: dn' - ), + filter="objectClass=ast4ucsPhonegroup", + attribute=['asterisk/phoneGroup: commonName'], + value='asterisk/phoneGroup: dn' + ), multivalue=True, ), "pickupgroups": univention.admin.property( short_description="Pickupgroups", syntax=univention.admin.syntax.LDAP_Search( - filter="objectClass=ast4ucsPhonegroup", - attribute=['asterisk/phoneGroup: commonName'], - value='asterisk/phoneGroup: dn' - ), + filter="objectClass=ast4ucsPhonegroup", + attribute=['asterisk/phoneGroup: commonName'], + value='asterisk/phoneGroup: dn' + ), multivalue=True, ), "waitingloops": univention.admin.property( short_description="Warteschleifen", syntax=univention.admin.syntax.LDAP_Search( - filter="objectClass=ast4ucsWaitingloop", - attribute=['asterisk/waitingLoop: extension'], - value='asterisk/waitingLoop: dn' - ), + filter="objectClass=ast4ucsWaitingloop", + attribute=['asterisk/waitingLoop: extension'], + value='asterisk/waitingLoop: dn' + ), multivalue=True, ), "forwarding": univention.admin.property( @@ -118,63 +124,32 @@ } mapping = univention.admin.mapping.mapping() -mapping.register("extension", "ast4ucsExtensionExtension", - None, univention.admin.mapping.ListToString) - -mapping.register("ipaddress", "ast4ucsSipclientIp", - None, univention.admin.mapping.ListToString) -mapping.register("macaddress", "ast4ucsSipclientMacaddr", - None, univention.admin.mapping.ListToString) -mapping.register("hostname", "ast4ucsSipclientHostname", - None, univention.admin.mapping.ListToString) -mapping.register("password", "ast4ucsSipclientSecret", - None, univention.admin.mapping.ListToString) - -mapping.register("phonetype", "ast4ucsPhonePhonetype", - None, univention.admin.mapping.ListToString) -mapping.register("profile", "ast4ucsPhoneProfile", - None, univention.admin.mapping.ListToString) +mapping.register("extension", "ast4ucsExtensionExtension", None, univention.admin.mapping.ListToString) +mapping.register("ipaddress", "ast4ucsSipclientIp", None, univention.admin.mapping.ListToString) +mapping.register("macaddress", "ast4ucsSipclientMacaddr", None, univention.admin.mapping.ListToString) +mapping.register("hostname", "ast4ucsSipclientHostname", None, univention.admin.mapping.ListToString) +mapping.register("password", "ast4ucsSipclientSecret", None, univention.admin.mapping.ListToString) +mapping.register("phonetype", "ast4ucsPhonePhonetype", None, univention.admin.mapping.ListToString) +mapping.register("profile", "ast4ucsPhoneProfile", None, univention.admin.mapping.ListToString) mapping.register("callgroups", "ast4ucsPhoneCallgroup") mapping.register("pickupgroups", "ast4ucsPhonePickupgroup") mapping.register("waitingloops", "ast4ucsPhoneWaitingloop") -mapping.register("forwarding", "ast4ucsPhoneForwarding", - None, univention.admin.mapping.ListToString) -mapping.register("skipExtension", "ast4ucsPhoneSkipextension", - None, univention.admin.mapping.ListToString) +mapping.register("forwarding", "ast4ucsPhoneForwarding", None, univention.admin.mapping.ListToString) +mapping.register("skipExtension", "ast4ucsPhoneSkipextension", None, univention.admin.mapping.ListToString) -class object(AsteriskBase): +class object(simpleLdap): module = module def _ldap_addlist(self): - return [('objectClass', ['ast4ucsPhone']), - ('ast4ucsSrvchildServer', self.superordinate.dn)] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsPhone") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsSrvchildServer', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) + return [('ast4ucsSrvchildServer', self.superordinate.dn)] - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsSrvchildServer', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'ast4ucsPhone' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/waitingLoop.py b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/waitingLoop.py index 4531701..4c6b6c9 100644 --- a/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/waitingLoop.py +++ b/asterisk4ucs-udm/modules/univention/admin/handlers/asterisk/waitingLoop.py @@ -19,8 +19,8 @@ import univention.admin.filter import univention.admin.handlers -from univention.admin.handlers.asterisk import \ - reverseFieldsLoad, reverseFieldsSave, AsteriskBase +from univention.admin.handlers.asterisk import reverseFieldsLoad, reverseFieldsSave +from univention.admin.handlers import simpleLdap import univention.admin.syntax from univention.admin.layout import Tab @@ -28,6 +28,13 @@ short_description = u"Asterisk4UCS-Management: Warteschlange" operations = ['add', 'edit', 'remove', 'search', 'move'] options = {} +options = { + 'default': univention.admin.option( + short_description=short_description, + default=True, + objectClasses=['ast4ucsWaitingloop'], + ), +} childs = 0 usewizard = 1 @@ -55,6 +62,7 @@ class SyntaxStrategy(univention.admin.syntax.select): ("random", u"Einen zufälligen Anschluss anklingeln"), ] + property_descriptions = { "extension": univention.admin.property( short_description="Durchwahl", @@ -83,8 +91,7 @@ class SyntaxStrategy(univention.admin.syntax.select): "delayMusic": univention.admin.property( short_description="Warteschlangenmusik", syntax=univention.admin.syntax.LDAP_Search( - filter="(&(objectClass=ast4ucsMusic)" - + "(ast4ucsMusicMusic=*))", + filter="(&(objectClass=ast4ucsMusic)(ast4ucsMusicMusic=*))", attribute=["asterisk/music: name"], value="asterisk/music: name", ), @@ -103,19 +110,14 @@ class SyntaxStrategy(univention.admin.syntax.select): } mapping = univention.admin.mapping.mapping() -mapping.register("extension", "ast4ucsExtensionExtension", - None, univention.admin.mapping.ListToString) -mapping.register("strategy", "ast4ucsWaitingloopStrategy", - None, univention.admin.mapping.ListToString) -mapping.register("maxCalls", "ast4ucsWaitingloopMaxcalls", - None, univention.admin.mapping.ListToString) -mapping.register("memberDelay", "ast4ucsWaitingloopMemberdelay", - None, univention.admin.mapping.ListToString) -mapping.register("delayMusic", "ast4ucsWaitingloopDelaymusic", - None, univention.admin.mapping.ListToString) - - -class object(AsteriskBase): +mapping.register("extension", "ast4ucsExtensionExtension", None, univention.admin.mapping.ListToString) +mapping.register("strategy", "ast4ucsWaitingloopStrategy", None, univention.admin.mapping.ListToString) +mapping.register("maxCalls", "ast4ucsWaitingloopMaxcalls", None, univention.admin.mapping.ListToString) +mapping.register("memberDelay", "ast4ucsWaitingloopMemberdelay", None, univention.admin.mapping.ListToString) +mapping.register("delayMusic", "ast4ucsWaitingloopDelaymusic", None, univention.admin.mapping.ListToString) + + +class object(simpleLdap): module = module def __init__(self, co, lo, position, dn='', superordinate=None, attributes=None): @@ -145,34 +147,14 @@ def _ldap_pre_remove(self): reverseFieldsSave(self) def _ldap_addlist(self): - return [('objectClass', ['ast4ucsWaitingloop']), - ('ast4ucsSrvchildServer', self.superordinate.dn)] - - -def lookup(co, lo, filter_s, base='', superordinate=None, scope='sub', - unique=False, required=False, timeout=-1, sizelimit=0): - filter = univention.admin.filter.conjunction('&', [ - univention.admin.filter.expression( - 'objectClass', "ast4ucsWaitingloop") - ]) - - if superordinate: - filter.expressions.append(univention.admin.filter.expression( - 'ast4ucsSrvchildServer', superordinate.dn)) - - if filter_s: - filter_p = univention.admin.filter.parse(filter_s) - univention.admin.filter.walk(filter_p, - univention.admin.mapping.mapRewrite, arg=mapping) - filter.expressions.append(filter_p) + return [('ast4ucsSrvchildServer', self.superordinate.dn)] - res = [] - for dn, attrs in lo.search(unicode(filter), base, scope, [], unique, - required, timeout, sizelimit): - res.append(object(co, lo, None, dn=dn, - superordinate=superordinate, attributes=attrs)) - return res + @classmethod + def lookup_filter_superordinate(cls, filter, superordinate): + filter.expressions.append(univention.admin.filter.expression('ast4ucsSrvchildServer', superordinate.dn, escape=True)) + return filter -def identify(dn, attr, canonical=0): - return 'ast4ucsWaitingloop' in attr.get('objectClass', []) +lookup = object.lookup +lookup_filter = object.lookup_filter +identify = object.identify diff --git a/asterisk4ucs-udm/modules/univention/admin/hooks.d/asterisk.py b/asterisk4ucs-udm/modules/univention/admin/hooks.d/asterisk.py index 1e297f6..c9d9cb8 100644 --- a/asterisk4ucs-udm/modules/univention/admin/hooks.d/asterisk.py +++ b/asterisk4ucs-udm/modules/univention/admin/hooks.d/asterisk.py @@ -16,9 +16,11 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ +import ldap.dn +from ldap.filter import filter_format + from univention.admin.hook import simpleHook from univention.admin.handlers.users import user -from univention.admin.filter import escapeForLdapFilter from univention.admin import uexceptions @@ -38,55 +40,24 @@ def __init__(self, *args): self.message = self._message % args def checkFields(self, module): - def nameFromDn(dn): - return dn.split(",")[0].split("=", 1)[1] + def dn_to_name(dn): + return ldap.dn.explode_rdn(dn, True)[0] for phonedn in module.info.get("phones", []): if not phonedn: continue - phoneUsers = user.lookup(module.co, module.lo, - "(&(ast4ucsUserPhone=%s)(!(uid=%s)))" % ( - escapeForLdapFilter(phonedn), - escapeForLdapFilter(module.info["username"]))) + phoneUsers = user.lookup(module.co, module.lo, filter_format("(&(ast4ucsUserPhone=%s)(!(uid=%s)))", (phonedn, module.info["username"]))) if phoneUsers: - raise self.phoneError( - nameFromDn(phonedn), - nameFromDn(phoneUsers[0].dn)) + raise self.phoneError(dn_to_name(phonedn), dn_to_name(phoneUsers[0].dn)) mailboxdn = module.info.get("mailbox") if mailboxdn: - mailboxUsers = user.lookup(module.co, module.lo, - "(&(ast4ucsUserMailbox=%s)(!(uid=%s)))" % ( - escapeForLdapFilter(mailboxdn), - escapeForLdapFilter(module.info["username"]))) + mailboxUsers = user.lookup(module.co, module.lo, filter_format("(&(ast4ucsUserMailbox=%s)(!(uid=%s)))", (mailboxdn, module.info["username"]))) if mailboxUsers: - raise self.mailboxError( - nameFromDn(mailboxdn), - nameFromDn(mailboxUsers[0].dn)) - - def hook_open(self, module): - pass + raise self.mailboxError(dn_to_name(mailboxdn), dn_to_name(mailboxUsers[0].dn)) def hook_ldap_pre_create(self, module): self.checkFields(module) def hook_ldap_pre_modify(self, module): self.checkFields(module) - - def hook_ldap_pre_remove(self, module): - pass - - def hook_ldap_addlist(self, module, al=[]): - return al - - def hook_ldap_modlist(self, module, ml=[]): - return ml - - def hook_ldap_post_create(self, module): - pass - - def hook_ldap_post_modify(self, module): - pass - - def hook_ldap_post_remove(self, module): - pass diff --git a/asterisk4ucs-udm/modules/univention/admin/syntax.d/asterisk.py b/asterisk4ucs-udm/modules/univention/admin/syntax.d/asterisk.py index ca106e6..d90364c 100644 --- a/asterisk4ucs-udm/modules/univention/admin/syntax.d/asterisk.py +++ b/asterisk4ucs-udm/modules/univention/admin/syntax.d/asterisk.py @@ -1,4 +1,3 @@ - """ Copyright (C) 2012 DECOIT GmbH @@ -16,6 +15,10 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ +import re +from univention.admin.syntax import select, integer, string +import univention.admin.uexceptions + class ast4ucsExtmodeSyntax(select): name = "ast4ucsExtmodeSyntax" @@ -35,10 +38,9 @@ def parse(self, text): try: number = int(text) if number > 300 or number < 1: - raise ValueError + raise ValueError() except ValueError: - raise univention.admin.uexceptions.valueError, \ - "Value must be a number between 1 and 120!" + raise univention.admin.uexceptions.valueError("Value must be a number between 1 and 120!") return text @@ -48,10 +50,7 @@ class ast4ucsMusicNameSyntax(integer): @classmethod def parse(self, text): if not bool(re.match(r"^[a-zA-Z0-9_-]+$", text)): - raise univention.admin.uexceptions.valueError, \ - "Der Name einer Musikklasse darf nur " \ - + "Buchstaben, Zahlen und die " \ - + "Zeichen '-' und '_' enthalten." + raise univention.admin.uexceptions.valueError("Der Name einer Musikklasse darf nur Buchstaben, Zahlen und die Zeichen '-' und '_' enthalten.") return text @@ -61,8 +60,9 @@ class ast4ucsPhoneNumberSyntax(string): @classmethod def parse(self, text): if not bool(re.match(r"^\+[0-9]{2,30}$", text)): - raise univention.admin.uexceptions.valueError, \ - "Eine Telefonnummer muss im internationalen " \ - + "Format angegeben werden, z.B. " \ - + "+494215960640 anstatt 0421 596064-0" + raise univention.admin.uexceptions.valueError( + "Eine Telefonnummer muss im internationalen " + "Format angegeben werden, z.B. " + "+494215960640 anstatt 0421 596064-0" + ) return text diff --git a/asterisk4ucs-udm/number2name.agi b/asterisk4ucs-udm/number2name.agi index 97605ef..2f99a2b 100644 --- a/asterisk4ucs-udm/number2name.agi +++ b/asterisk4ucs-udm/number2name.agi @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ @@ -18,19 +18,14 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ -import re import sys -import time import ldap -import random import logging -import psycopg2 -import psycopg2.extras LOG_FILENAME = '/tmp/ast4ucs-number2name.log' # read options from config file -config = open("/etc/asterisk4ucs.ldapconfig").read().split("\n") +config = open("/etc/asterisk4ucs.ldapconfig").read().splitlines() LDAP_IP = config[0] LDAP_SEARCH_BASE = config[1] ADMIN_DN = config[2] @@ -47,7 +42,7 @@ logging.basicConfig( ) # Read and ignore AGI environment (read until blank line) -env = dict() +env = {} while len(sys.argv) < 2: line = sys.stdin.readline().strip() if not line: @@ -77,42 +72,42 @@ elif search_num.startswith('0'): logging.info("Normalisierte Nummer: " + search_num) logging.debug("Verbinde mit LDAP-Server: " + LDAP_IP) -l = ldap.initialize("ldap://" + LDAP_IP) -l.simple_bind_s(ADMIN_DN, ADMIN_PW) - -query = ("(|" - "(ast4ucsContactFaxnumber=%s)" - "(telephoneNumber=%s)" - "(ast4ucsContactMobilenumber=%s)" +lo = ldap.initialize("ldap://" + LDAP_IP) +lo.simple_bind_s(ADMIN_DN, ADMIN_PW) + +query = ( + "(|" + "(ast4ucsContactFaxnumber=%s)" + "(telephoneNumber=%s)" + "(ast4ucsContactMobilenumber=%s)" ")") % (search_num, search_num, search_num) logging.debug("Query: %s" % query) -result = l.search_s(LDAP_SEARCH_BASE, ldap.SCOPE_SUBTREE, query) +result = lo.search_s(LDAP_SEARCH_BASE, ldap.SCOPE_SUBTREE, query) if not result: logging.info("Keinen Namen gefunden, exit") sys.exit(0) result = result[0][1] -unwrap = lambda x: x[0] if x else None -orga = unwrap(result.get('o')) -last = unwrap(result.get('ast4ucsContactLastname')) -first = unwrap(result.get('ast4ucsContactFirstname')) +orga = result.get('o', [b''])[0].decode('UTF-8') +last = result.get('ast4ucsContactLastname', [b''])[0].decode('UTF-8') +first = result.get('ast4ucsContactFirstname', [b''])[0].decode('UTF-8') if first and last: name = "%s %s" % (first, last) elif last: name = last else: - name = first # could be string or None + name = first if orga and name: cn = "%s (%s)" % (name, orga) elif orga: cn = orga else: - cn = name # could be string or None + cn = name if not cn: logging.info("Kontakt hat weder Name noch Organisation, exit") @@ -122,7 +117,7 @@ cname = "%s <%s>" % (cn, env["agi_callerid"]) # Sonderzeichen ersetzen rules = [ -# (" ", "_"), + # (" ", "_"), ("ä", "ae"), ("ö", "oe"), ("ü", "ue"), @@ -137,7 +132,7 @@ for rule in rules: # Namen an Asterisk senden logging.info("Setze Variable CALLERID auf " + cname) -#cname = unicode(cname, 'utf-8').encode('iso-8859-1') +#cname = cname.encode('iso-8859-1') sys.stdout.write('SET CALLERID "%s"\n' % (cname)) sys.stdout.flush() diff --git a/asterisk4ucs-udm/osgaImport.py b/asterisk4ucs-udm/osgaImport.py index 94ed006..9463d85 100644 --- a/asterisk4ucs-udm/osgaImport.py +++ b/asterisk4ucs-udm/osgaImport.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # coding=utf-8 """ @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ +from __future__ import print_function import sys @@ -32,8 +33,8 @@ pguser = sys.argv[4] pgpass = sys.argv[5] except IndexError: - print "Usage:" - print "%s " % sys.argv[0] + print("Usage:") + print("%s " % sys.argv[0]) sys.exit(1) import re @@ -43,19 +44,16 @@ import univention.admin.uexceptions pb = PhoneBookWrapper(astpbdn) -print "Deleting all contacts in phonebook %s, may take a while..." % ( - pb.getName()) +print("Deleting all contacts in phonebook %s, may take a while..." % (pb.getName())) pb.empty() -print "Done." -print "Importing..." +print("Done.") +print("Importing...") -conn = psycopg2.connect(host=pghost, database=pgdb, - user=pguser, password=pgpass) +conn = psycopg2.connect(host=pghost, database=pgdb, user=pguser, password=pgpass) cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) -cur.execute("SELECT * FROM contacts " - "WHERE status != 'D' AND acc_read = 'group';") +cur.execute("SELECT * FROM contacts WHERE status != 'D' AND acc_read = 'group';") contacts = cur.fetchall() @@ -64,26 +62,26 @@ def formatNumber(number): return None return re.sub(r"[-/ ]", "", number) + for contact in contacts: - sys.stdout.write("%s (%s) \r" % ( - contact["nachname"], contact["id"])) + sys.stdout.write("%s (%s) \r" % (contact["nachname"], contact["id"])) sys.stdout.flush() try: dn = pb.addContact( firstname=contact["vorname"], lastname=contact["nachname"], organisation=contact["firma"], - phones=[formatNumber(contact["tel1"]), - formatNumber(contact["tel2"])], + phones=[ + formatNumber(contact["tel1"]), + formatNumber(contact["tel2"]) + ], mobiles=formatNumber(contact["mobil"]), faxes=formatNumber(contact["fax"]), ) - #print "Created %s" % dn + #print("Created %s" % dn) except univention.admin.uexceptions.valueInvalidSyntax: - print "Syntax error in contact %s (%s), skipping." % ( - contact["nachname"], contact["id"]) + print("Syntax error in contact %s (%s), skipping." % (contact["nachname"], contact["id"])) except univention.admin.uexceptions.objectExists: - print "Found duplicate contact %s (%s), skipping." % ( - contact["nachname"], contact["id"]) + print("Found duplicate contact %s (%s), skipping." % (contact["nachname"], contact["id"])) -print "Done. " +print("Done. ") diff --git a/asterisk4ucs-umc-deploy/debian/asterisk4ucs-umc-deploy.postinst b/asterisk4ucs-umc-deploy/debian/asterisk4ucs-umc-deploy.postinst index 9c9d720..8a91bdb 100644 --- a/asterisk4ucs-umc-deploy/debian/asterisk4ucs-umc-deploy.postinst +++ b/asterisk4ucs-umc-deploy/debian/asterisk4ucs-umc-deploy.postinst @@ -2,7 +2,7 @@ #DEBHELPER# -PID=$(echo `pgrep -f '^/usr/bin/python /usr/sbin/univention-management-console-module.* -m asteriskDeploy' || true`) +PID=$(echo `pgrep -f '^/usr/bin/python3 /usr/sbin/univention-management-console-module.* -m asteriskDeploy' || true`) if [ -n "$PID" ]; then echo "Killing old module process(es): $PID" kill $PID diff --git a/asterisk4ucs-umc-deploy/debian/changelog b/asterisk4ucs-umc-deploy/debian/changelog index 043dc7d..46b6577 100644 --- a/asterisk4ucs-umc-deploy/debian/changelog +++ b/asterisk4ucs-umc-deploy/debian/changelog @@ -1,3 +1,9 @@ +asterisk4ucs-umc-deploy (2.0.1) unstable; urgency=medium + + * Add UCS 5.0 support. Migrate to Python 3 + + -- Florian Best Sun, 03 Apr 2022 20:53:55 +0200 + asterisk4ucs-umc-deploy (1.0.1) unstable; urgency=low * Bugfix für 'FileNotFound'-Fehler diff --git a/asterisk4ucs-umc-deploy/debian/control b/asterisk4ucs-umc-deploy/debian/control index 020bbcd..74eaa33 100644 --- a/asterisk4ucs-umc-deploy/debian/control +++ b/asterisk4ucs-umc-deploy/debian/control @@ -4,7 +4,7 @@ Priority: optional Maintainer: Tristan Bruns (Decoit GmbH) Build-Depends: debhelper (>= 7.0.50~), univention-management-console-dev, - python-univention + python3-univention Standards-Version: 3.5.2 XS-Python-Version: all diff --git a/asterisk4ucs-umc-deploy/umc/asteriskDeploy.xml b/asterisk4ucs-umc-deploy/umc/asteriskDeploy.xml index c7276d9..5252c0f 100644 --- a/asterisk4ucs-umc-deploy/umc/asteriskDeploy.xml +++ b/asterisk4ucs-umc-deploy/umc/asteriskDeploy.xml @@ -1,6 +1,6 @@ - + Asterisk4UCS Deployment Deploys Asterisk4UCS configuration files diff --git a/asterisk4ucs-umc-deploy/umc/python/asteriskDeploy/__init__.py b/asterisk4ucs-umc-deploy/umc/python/asteriskDeploy/__init__.py index 1d4fbda..0dab53c 100644 --- a/asterisk4ucs-umc-deploy/umc/python/asteriskDeploy/__init__.py +++ b/asterisk4ucs-umc-deploy/umc/python/asteriskDeploy/__init__.py @@ -14,6 +14,7 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ +from __future__ import print_function from univention.management.console.base import Base from univention.management.console.log import MODULE @@ -22,7 +23,6 @@ import univention.admin.uldap import univention.admin.modules -univention.admin.modules.update() import univention.admin.handlers.asterisk import univention.admin.handlers.asterisk.server @@ -36,6 +36,9 @@ import tempfile import subprocess +univention.admin.modules.update() + + class Instance(Base): def queryServers(self, request): @@ -51,8 +54,7 @@ def queryServers(self, request): def copyid(self, request): server = getServer(request.options["server"]) log = openLog(server["commonName"]) - print >>log, "Die Funktion zum Kopieren des SSH-Schlüssels ist noch " \ - "nicht implementiert." + print("Die Funktion zum Kopieren des SSH-Schlüssels ist noch nicht implementiert.", file=log) closeLog(log) self.finished(request.id, True) @@ -71,14 +73,14 @@ def deploy(self, request): log = openLog(server["commonName"]) configs = createConfigs(log, server) - print >>log, "\n\n" + print("\n\n", file=log) try: deployConfigs(log, server, configs) except subprocess.CalledProcessError: - print >>log, "\n\nERROR: Aborted deployment because of an error.\n" + print("\n\nERROR: Aborted deployment because of an error.\n", file=log) else: - print >>log, "\n\nDie neue Konfiguration ist jetzt aktiv." - print >>log, "Viel Spaß beim Telefonieren!\n" + print("\n\nDie neue Konfiguration ist jetzt aktiv.", file=log) + print("Viel Spaß beim Telefonieren!\n", file=log) closeLog(log) self.finished(request.id, True) @@ -95,6 +97,7 @@ def getCoLoPos(): return co, lo, pos + def getServers(): co, lo, pos = getCoLoPos() @@ -107,6 +110,7 @@ def getServers(): return servers + def getServer(dn): co, lo, pos = getCoLoPos() server = univention.admin.modules.get("asterisk/server") @@ -117,80 +121,82 @@ def getServer(dn): return obj + def getLog(servername): servername = re.sub(r"[^a-zA-Z0-9]+", "_", servername) filename = "/var/log/univention/asteriskDeploy-%s.log" % servername try: return open(filename).read() - except: + except IOError: return "(Für diesen Server gibt es noch kein Deployment-Log)" + def openLog(servername): servername = re.sub(r"[^a-zA-Z0-9]+", "_", servername) filename = "/var/log/univention/asteriskDeploy-%s.log" % servername time = strftime("%a, %d %b %Y %H:%M:%S", localtime()) - + log = open(filename, "w", False) log.write("Log opened %s\n" % time) log.write("===========%s\n" % ("=" * len(time))) log.write("\n") return log + def closeLog(log): time = strftime("%a, %d %b %Y %H:%M:%S", localtime()) log.write("\n") log.write("Log closed %s\n" % time) log.close() + def createConfigs(log, server): - print >>log, "Creating config files for server %s" % server["commonName"] - print >>log, "=================================%s" % ( - "=" * len(server["commonName"])) - + print("Creating config files for server %s" % server["commonName"], file=log) + print("=================================%s" % ("=" * len(server["commonName"])), file=log) + configs = univention.admin.handlers.asterisk.genConfigs(server) for name, data in configs.items(): - print >>log - print >>log - print >>log, "Creating %s:" % name - print >>log, "---------%s-" % ("-" * len(name)) - print >>log + print(file=log) + print(file=log) + print("Creating %s:" % name, file=log) + print("---------%s-" % ("-" * len(name)), file=log) + print(file=log) errors = re.findall(r"^;; .*", data, re.MULTILINE) for error in errors: - print >>log, error[3:] + print(error[3:], file=log) if not errors: - print >>log, "(no error)" + print("(no error)", file=log) return configs + def logCall(log, args, cwd): - print >>log, "Creating child process: %s" % str(args) - proc = subprocess.Popen(args, stdout=log, stderr=log, - stdin=open("/dev/zero"), cwd=cwd) - print >>log, "Child process has pid %i" % proc.pid + print("Creating child process: %s" % str(args), file=log) + proc = subprocess.Popen(args, stdout=log, stderr=log, stdin=open("/dev/zero"), cwd=cwd) + print("Child process has pid %i" % proc.pid, file=log) sleeptime = 0.1 timeleft = 30 while timeleft > 0: - if proc.poll() != None: + if proc.poll() is not None: break sleep(sleeptime) timeleft -= sleeptime else: - print >>log, "Child process did not terminate in time, killing it..." + print("Child process did not terminate in time, killing it...", file=log) proc.kill() raise subprocess.CalledProcessError(proc.returncode, args[0]) - print >>log, "Child returned code %i" % proc.returncode + print("Child returned code %i" % proc.returncode, file=log) if proc.returncode != 0: raise subprocess.CalledProcessError(proc.returncode, args[0]) + def deployConfigs(log, server, configs): - print >>log, "Deploying config files to server %s" % ( - server["commonName"]) - print >>log, "=================================%s" % ( - "=" * len(server["commonName"])) - print >>log + print("Deploying config files to server %s" % (server["commonName"]), file=log) + print("=================================%s" % ("=" * len(server["commonName"])), file=log) + print(file=log) agis = {} for agi in agiscript.lookup(server.co, server.lo, False): @@ -214,24 +220,18 @@ def deployConfigs(log, server, configs): f.close() for name, data in configs.items(): - f = open("%s/%s" % (tmpdirConfig, name), "w") - f.write(data) - f.close() + with open("%s/%s" % (tmpdirConfig, name), "w") as fd: + fd.write(data) for name, data in agis.items(): - f = open("%s/%s" % (tmpdirAgi, name), "w") - f.write(data) - os.fchmod(f.fileno(), 0755) - f.close() - - logCall(log, ["scp", "-Bq", tmpfileLdapconf, - scptargetLdapconf], tmpdirConfig) - logCall(log, ["scp", "-Bq"] + configs.keys() - + [scptargetConfig], tmpdirConfig) - logCall(log, ["scp", "-Bq"] + agis.keys() - + [scptargetAgi], tmpdirAgi) - logCall(log, ["ssh", "-oBatchMode=yes", sshtarget, sshcmd], - tmpdirConfig) + with open("%s/%s" % (tmpdirAgi, name), "w") as fd: + fd.write(data) + os.fchmod(fd.fileno(), 0o755) + + logCall(log, ["scp", "-Bq", tmpfileLdapconf, scptargetLdapconf], tmpdirConfig) + logCall(log, ["scp", "-Bq"] + configs.keys() + [scptargetConfig], tmpdirConfig) + logCall(log, ["scp", "-Bq"] + agis.keys() + [scptargetAgi], tmpdirAgi) + logCall(log, ["ssh", "-oBatchMode=yes", sshtarget, sshcmd], tmpdirConfig) finally: shutil.rmtree(tmpdirConfig) shutil.rmtree(tmpdirAgi) diff --git a/asterisk4ucs-umc-music/debian/asterisk4ucs-umc-music.postinst b/asterisk4ucs-umc-music/debian/asterisk4ucs-umc-music.postinst index 945fb59..e1aecac 100644 --- a/asterisk4ucs-umc-music/debian/asterisk4ucs-umc-music.postinst +++ b/asterisk4ucs-umc-music/debian/asterisk4ucs-umc-music.postinst @@ -2,7 +2,7 @@ #DEBHELPER# -PID=$(echo `pgrep -f '^/usr/bin/python /usr/sbin/univention-management-console-module.* -m asteriskMusic' || true`) +PID=$(echo `pgrep -f '^/usr/bin/python3 /usr/sbin/univention-management-console-module.* -m asteriskMusic' || true`) if [ -n "$PID" ]; then echo "Killing old module process(es): $PID" kill $PID diff --git a/asterisk4ucs-umc-music/debian/changelog b/asterisk4ucs-umc-music/debian/changelog index 2b7f4a5..3643c2d 100644 --- a/asterisk4ucs-umc-music/debian/changelog +++ b/asterisk4ucs-umc-music/debian/changelog @@ -1,3 +1,9 @@ +asterisk4ucs-umc-music (2.0.1) unstable; urgency=medium + + * Add UCS 5.0 support. Migrate to Python 3 + + -- Florian Best Sun, 03 Apr 2022 20:51:11 +0200 + asterisk4ucs-umc-music (1.0.0) unstable; urgency=low * Einige Bugfixes, Vorbereitung auf Release diff --git a/asterisk4ucs-umc-music/debian/control b/asterisk4ucs-umc-music/debian/control index 15ba238..be216ab 100644 --- a/asterisk4ucs-umc-music/debian/control +++ b/asterisk4ucs-umc-music/debian/control @@ -4,7 +4,7 @@ Priority: optional Maintainer: Tristan Bruns (Decoit GmbH) Build-Depends: debhelper (>= 7.0.50~), univention-management-console-dev, - python-univention + python3-univention Standards-Version: 3.5.2 XS-Python-Version: all diff --git a/asterisk4ucs-umc-music/umc/asteriskMusic.xml b/asterisk4ucs-umc-music/umc/asteriskMusic.xml index ab32ecb..48bf565 100644 --- a/asterisk4ucs-umc-music/umc/asteriskMusic.xml +++ b/asterisk4ucs-umc-music/umc/asteriskMusic.xml @@ -1,6 +1,6 @@ - + Asterisk4UCS Warteschlangenmusiken Musikupload für Asterisk4UCS-Warteschlangen diff --git a/asterisk4ucs-umc-music/umc/python/asteriskMusic/__init__.py b/asterisk4ucs-umc-music/umc/python/asteriskMusic/__init__.py index 88328c7..10137c8 100644 --- a/asterisk4ucs-umc-music/umc/python/asteriskMusic/__init__.py +++ b/asterisk4ucs-umc-music/umc/python/asteriskMusic/__init__.py @@ -15,12 +15,10 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.""" from univention.management.console.base import Base -from univention.management.console.log import MODULE import univention.admin.uldap import univention.admin.modules -univention.admin.modules.update() import univention.admin.handlers.asterisk.server import univention.admin.handlers.asterisk.music @@ -33,16 +31,21 @@ import subprocess import logging +univention.admin.modules.update() + logfile = "/var/log/univention/asteriskMusicPython.log" logFilename = "/var/log/univention/asteriskMusicUpload.log" + class Instance(Base): - logging.basicConfig(filename=logfile, + logging.basicConfig( + filename=logfile, #level=logging.INFO, level=logging.DEBUG, - format = "%(asctime)s\t%(levelname)s\t%(message)s", - datefmt = "%d.%m.%Y %H:%M:%S" - ) + format="%(asctime)s\t%(levelname)s\t%(message)s", + datefmt="%d.%m.%Y %H:%M:%S" + ) + def queryServers(self, request): servers = getServers() result = [] @@ -91,7 +94,7 @@ def querySongs(self, request): def create(self, request): server = request.options['server'] name = request.options["name"] - logging.debug('__init__.py: server: %s , %s',request.options['server'],name) + logging.debug('__init__.py: server: %s , %s', request.options['server'], name) result = { "newDn": create(server, name), } @@ -99,7 +102,7 @@ def create(self, request): self.finished(request.id, result) def delete(self, request): - logging.debug('__init__.py: moh: %s' , request) + logging.debug('__init__.py: moh: %s', request) moh = getMoh(request.options["mohdn"]) delete(moh) moh.remove() @@ -107,7 +110,7 @@ def delete(self, request): self.finished(request.id, True) def upload(self, request): - logging.debug('__init__.py: Upload requestMoh: %s',request.options["moh"]) + logging.debug('__init__.py: Upload requestMoh: %s', request.options["moh"]) moh = getMoh(request.options["moh"]) logging.debug('__init__.py: getMoh: %s', moh) server = getServer(re.sub(r"^[^,]+,", "", request.options["moh"])) @@ -121,26 +124,27 @@ def upload(self, request): stem = re.sub(r"^_+", "", stem) stem = re.sub(r"_+$", "", stem) logging.debug('__init__.py: stem: %s', stem) - logging.debug('__init__.py: moh.info.get: %s',moh.info.get("music")); + logging.debug('__init__.py: moh.info.get: %s', moh.info.get("music")) if stem in moh.info.get("music", []): - logging.debug('__init__.py: moh.info.get: %s',moh.info.get("music")); + logging.debug('__init__.py: moh.info.get: %s', moh.info.get("music")) self.finished(request.id, { "success": False, "details": "Ein Musikstueck mit diesem Namen wurde bereits hochgeladen!", }) - logging.debug('__init__.py: vor return'); + logging.debug('__init__.py: vor return') return #logging.debug('__init__.py: Upload Server: %s, MOH: %s, stem: %s, filename: %s',server,moh,stem,filenane) if uploadMusic(server, moh, data, stem, filename): moh.info.setdefault("music", []).append(stem) moh.modify() - self.finished(request.id, {"foo":"bar"}) + self.finished(request.id, {"foo": "bar"}) else: log = open(logFilename).read() self.finished(request.id, {"error": log}) + def getCoLoPos(): co = None #logging.debug('__init__.py: co: %s',co)""" @@ -149,6 +153,7 @@ def getCoLoPos(): return co, lo, pos + def getServers(): co, lo, pos = getCoLoPos() @@ -161,6 +166,7 @@ def getServers(): return servers + def getMohs(): co, lo, pos = getCoLoPos() @@ -173,17 +179,19 @@ def getMohs(): return mohs + def getMoh(dn): co, lo, pos = getCoLoPos() music = univention.admin.modules.get("asterisk/music") univention.admin.modules.init(lo, pos, music) - + moh = music.object(co, lo, None, dn) moh.open() return moh + def getServer(dn): co, lo, pos = getCoLoPos() @@ -194,6 +202,7 @@ def getServer(dn): return obj + def create(serverdn, name): co, lo, pos = getCoLoPos() @@ -202,7 +211,7 @@ def create(serverdn, name): srv = server.object(co, lo, pos, serverdn) srv.open() if not srv.exists(): - raise Exception, "Invalid serverDN" + raise Exception("Invalid serverDN") pos.setDn(serverdn) @@ -215,6 +224,7 @@ def create(serverdn, name): return moh.dn + def uploadMusic(server, moh, data, stem, filename): log = open(logFilename, "w", 0) @@ -227,18 +237,16 @@ def uploadMusic(server, moh, data, stem, filename): tmpdir = tempfile.mkdtemp() try: inputfilename = "input_file" - logging.debug('__init__.py: filename: %s',filename); - logging.debug('__init__.py: inputfilename: %s',inputfilename); - if re.search("\.mp3$", filename): + logging.debug('__init__.py: filename: %s', filename) + logging.debug('__init__.py: inputfilename: %s', inputfilename) + if re.search(r"\.mp3$", filename): inputfilename += ".mp3" inputfile = open("%s/%s" % (tmpdir, inputfilename), "wb") inputfile.write(data) inputfile.close() - subprocess.check_call([scriptpath, stem, inputfilename, - mohname, sshtarget, sshmohpath, sshcmd], - stdout=log, stderr=log, cwd=tmpdir) + subprocess.check_call([scriptpath, stem, inputfilename, mohname, sshtarget, sshmohpath, sshcmd], stdout=log, stderr=log, cwd=tmpdir) except subprocess.CalledProcessError: return False finally: @@ -246,8 +254,10 @@ def uploadMusic(server, moh, data, stem, filename): return True + def escaped_command_string(x): - return ' '.join(map(pipes.quote, x)) + return ' '.join(pipes.quote(s) for s in x) + def delete(moh): server = moh.superordinate @@ -260,8 +270,9 @@ def delete(moh): mohpath = "%s/%s" % (sshmohpath, mohname) remotecmd = ';'.join([escaped_command_string(['rm', '-r', mohpath]), escaped_command_string([sshcmd, '-rx', 'moh reload'])]) - subprocess.check_call(["ssh", "-oBatchMode=yes", sshtarget, remotecmd], - stdout=log, stderr=log) + subprocess.check_call(["ssh", "-oBatchMode=yes", sshtarget, remotecmd], stdout=log, stderr=log) + + def deleteSong(moh, song): server = moh.superordinate log = open(logFilename, "w", 0) @@ -272,10 +283,6 @@ def deleteSong(moh, song): sshmohpath = server.info.get("sshmohpath", "/opt/asterisk4ucs/moh") mohpath = "%s/%s/%s" % (sshmohpath, mohname, song) bashcmd = "rm %s.*" % pipes.quote(mohpath) - remotecmd = "bash -c %s; %s -rx 'moh reload'" % ( - pipes.quote(bashcmd), - pipes.quote(sshcmd)) - - subprocess.check_call(["ssh", "-oBatchMode=yes", sshtarget, remotecmd], - stdout=log, stderr=log) + remotecmd = "bash -c %s; %s -rx 'moh reload'" % (pipes.quote(bashcmd), pipes.quote(sshcmd)) + subprocess.check_call(["ssh", "-oBatchMode=yes", sshtarget, remotecmd], stdout=log, stderr=log) diff --git a/asterisk4ucs-umc-user/debian/asterisk4ucs-umc-user.postinst b/asterisk4ucs-umc-user/debian/asterisk4ucs-umc-user.postinst index 41f089b..bbc6e9d 100644 --- a/asterisk4ucs-umc-user/debian/asterisk4ucs-umc-user.postinst +++ b/asterisk4ucs-umc-user/debian/asterisk4ucs-umc-user.postinst @@ -2,7 +2,7 @@ #DEBHELPER# -PID=$(echo `pgrep -f '^/usr/bin/python /usr/sbin/univention-management-console-module.* -m asteriskUser' || true`) +PID=$(echo `pgrep -f '^/usr/bin/python3 /usr/sbin/univention-management-console-module.* -m asteriskUser' || true`) if [ -n "$PID" ]; then echo "Killing old module process(es): $PID" kill $PID diff --git a/asterisk4ucs-umc-user/debian/changelog b/asterisk4ucs-umc-user/debian/changelog index a22b1f1..c9ce27d 100644 --- a/asterisk4ucs-umc-user/debian/changelog +++ b/asterisk4ucs-umc-user/debian/changelog @@ -1,3 +1,9 @@ +asterisk4ucs-umc-user (2.0.1) unstable; urgency=medium + + * Add UCS 5.0 support. Migrate to Python 3 + + -- Florian Best Sun, 03 Apr 2022 20:52:20 +0200 + asterisk4ucs-umc-user (1.0.0) unstable; urgency=low * Einige Bugfixes, Vorbereitung auf Release diff --git a/asterisk4ucs-umc-user/debian/control b/asterisk4ucs-umc-user/debian/control index 7f2231c..565c80c 100644 --- a/asterisk4ucs-umc-user/debian/control +++ b/asterisk4ucs-umc-user/debian/control @@ -4,7 +4,7 @@ Priority: optional Maintainer: Tristan Bruns (Decoit GmbH) Build-Depends: debhelper (>= 7.0.50~), univention-management-console-dev, - python-univention + python3-univention Standards-Version: 3.5.2 XS-Python-Version: all diff --git a/asterisk4ucs-umc-user/umc/asteriskUser.xml b/asterisk4ucs-umc-user/umc/asteriskUser.xml index 235eb18..d6939bf 100644 --- a/asterisk4ucs-umc-user/umc/asteriskUser.xml +++ b/asterisk4ucs-umc-user/umc/asteriskUser.xml @@ -1,6 +1,6 @@ - + Asterisk4UCS Telefoneinstellungen Asterisk4UCS Telefoneinstellungen diff --git a/asterisk4ucs-umc-user/umc/python/asteriskUser/__init__.py b/asterisk4ucs-umc-user/umc/python/asteriskUser/__init__.py index 972d91a..677d932 100644 --- a/asterisk4ucs-umc-user/umc/python/asteriskUser/__init__.py +++ b/asterisk4ucs-umc-user/umc/python/asteriskUser/__init__.py @@ -21,21 +21,23 @@ import univention.config_registry import univention.admin.uldap import univention.admin.modules -univention.admin.modules.update() import univention.admin.handlers.users.user import univention.admin.handlers.asterisk.sipPhone import univention.admin.handlers.asterisk.mailbox import univention.admin.handlers.asterisk.server +univention.admin.modules.update() + + class Instance(Base): - def load( self, request ): + def load(self, request): user, mailbox = getUserAndMailbox(self._user_dn) raise UMC_Error("Es wurde kein Asterisk-Server angelegt!") result = { "phones/interval": user["ringdelay"], - "forwarding/number": user.get("forwarding",""), + "forwarding/number": user.get("forwarding", ""), "mailbox/timeout": user["timeout"], "mailbox": False, @@ -48,16 +50,15 @@ def load( self, request ): "mailbox/email": mailbox["email"], }) - self.finished( request.id, result ) + self.finished(request.id, result) - def save( self, request ): + def save(self, request): user, mailbox = getUserAndMailbox(self._user_dn) user["ringdelay"] = request.options["phones/interval"] user["timeout"] = request.options["mailbox/timeout"] if request.options["forwarding/number"]: - user["forwarding"] = request.options[ - "forwarding/number"] + user["forwarding"] = request.options["forwarding/number"] else: try: del user.info["forwarding"] @@ -70,21 +71,16 @@ def save( self, request ): mailbox["email"] = request.options["mailbox/email"] mailbox.modify() - self.finished( request.id, None, "Speichern war erfolgreich!" ) + self.finished(request.id, None, "Speichern war erfolgreich!") def phonesQuery(self, request): - if (request.options.get("dn") and - request.options.get("position") - in ["-1", "1"]): - changePhoneOrder( - self._user_dn, - request.options["dn"], - int(request.options["position"])) + if (request.options.get("dn") and request.options.get("position") in ["-1", "1"]): + changePhoneOrder(self._user_dn, request.options["dn"], int(request.options["position"])) phones = getPhones(self._user_dn) result = [] - for i,phone in enumerate(phones): + for i, phone in enumerate(phones): result.append({ "position": i, "dn": phone.dn, @@ -93,34 +89,35 @@ def phonesQuery(self, request): self.finished(request.id, result) + def getCoLo(): lo = univention.admin.uldap.getAdminConnection()[0] co = None return co, lo + def getUser(co, lo, dn): position = univention.admin.uldap.position(lo.base) - univention.admin.modules.init(lo, position, - univention.admin.handlers.users.user) + univention.admin.modules.init(lo, position, univention.admin.handlers.users.user) - obj = univention.admin.handlers.users.user.object(co, lo, - None, dn) + obj = univention.admin.handlers.users.user.object(co, lo, None, dn) obj.open() return obj + def getPhone(co, lo, dn): - obj = univention.admin.handlers.asterisk.sipPhone.object(co, lo, - None, dn) + obj = univention.admin.handlers.asterisk.sipPhone.object(co, lo, None, dn) obj.open() return obj + def getMailbox(co, lo, dn): - obj = univention.admin.handlers.asterisk.mailbox.object(co, lo, - None, dn) + obj = univention.admin.handlers.asterisk.mailbox.object(co, lo, None, dn) obj.open() return obj + def getPhones(userdn): co, lo = getCoLo() @@ -132,6 +129,7 @@ def getPhones(userdn): return phones + def getUserAndMailbox(userdn): co, lo, pos = getCoLoPos() @@ -141,12 +139,12 @@ def getUserAndMailbox(userdn): checkServers = [] for obj in objs: - checkServers.append({ - "label": obj["commonName"], - }) + checkServers.append({ + "label": obj["commonName"], + }) MODULE.error('User: server: %s' % len(checkServers)) - if len(checkServers) >0 : + if checkServers: co, lo = getCoLo() user = getUser(co, lo, userdn) @@ -156,7 +154,7 @@ def getUserAndMailbox(userdn): mailbox = getMailbox(co, lo, mailbox) return user, mailbox - elif len(checkServers) == 0 : + else: MODULE.error('Fehler gefunden!') mailbox = "KeinServer" user = "KeinServer" @@ -168,6 +166,7 @@ def getCoLoPos(): lo, pos = univention.admin.uldap.getAdminConnection() return co, lo, pos + def changePhoneOrder(userdn, phonedn, change): co, lo = getCoLo() @@ -177,9 +176,9 @@ def changePhoneOrder(userdn, phonedn, change): i = phones.index(phonedn) phones.pop(i) if change == -1 and i > 0: - phones.insert(i-1, phonedn) + phones.insert(i - 1, phonedn) elif change == 1: - phones.insert(i+1, phonedn) + phones.insert(i + 1, phonedn) user["phones"] = phones user.modify()