Projects
Kolab:16:Enterprise
pykolab
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 42
View file
pykolab.spec
Changed
@@ -33,7 +33,7 @@ Summary: Kolab Groupware Solution Name: pykolab -Version: 0.8.12 +Version: 0.8.13 Release: 1%{?dist} License: GPLv3+ Group: Applications/System @@ -42,8 +42,6 @@ Source0: pykolab-%{version}.tar.gz Source1: pykolab.logrotate -Patch0001: 0001-Fix-resolving-referrals.patch - BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root BuildArch: noarch
View file
0001-Fix-resolving-referrals.patch
Deleted
@@ -1,25 +0,0 @@ -From 814ffc770e3a696606b6ee1c58b4099d1a80071f Mon Sep 17 00:00:00 2001 -From: "Jeroen van Meeuwen (Kolab Systems)" <vanmeeuwen@kolabsys.com> -Date: Thu, 13 Jun 2019 13:08:40 +0200 -Subject: PATCH Fix resolving referrals - ---- - pykolab/auth/ldap/__init__.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/pykolab/auth/ldap/__init__.py b/pykolab/auth/ldap/__init__.py -index 3a30621..466f425 100644 ---- a/pykolab/auth/ldap/__init__.py -+++ b/pykolab/auth/ldap/__init__.py -@@ -846,7 +846,7 @@ class LDAP(pykolab.base.Base): - ) - - # Remove referrals -- _entry_dns = _e for _e in _results if _e0 is not None -+ _entry_dns = _e0 for _e in _results if _e0 is not None - - return _entry_dns - --- -2.20.1 -
View file
debian.changelog
Changed
@@ -1,3 +1,9 @@ +pykolab (0.8.13-0~kolab1) unstable; urgency=low + + * Release of version 0.8.13 + + -- Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Thu, 20 Jun 2019 01:49:00 +0100 + pykolab (0.8.12-0~kolab5) unstable; urgency=low * Release of version 0.8.12
View file
debian.series
Changed
@@ -1,2 +1,1 @@ cyrus-imapd.conf-cert-paths.patch -p1 -0001-Fix-resolving-referrals.patch -p1
View file
pykolab-0.8.13.tar.gz/.flake8
Added
@@ -0,0 +1,18 @@ +flake8 +exclude = + .git, + __pycache__, + docs/source/conf.py + +ignore = + # 'something' imported but unused + F401, + # 'from module import *' used: unable to detect undefined names + F403, + # name may be undefined, or defined from star imports: module + F405, + # line break before binary operator + W503 + +max-complexity = 18 +max-line-length = 100
View file
pykolab-0.8.13.tar.gz/.pylintrc
Added
@@ -0,0 +1,11 @@ +MASTER +disable= + cyclic-import, + duplicate-code, + missing-docstring, + unused-argument, + unused-wildcard-import, + wildcard-import + +function-rgx=a-z_a-z0-9_{2,90}$ +init-hook="import sys; sys.path.insert(0, './data/')"
View file
pykolab-0.8.12.tar.gz/conf/kolab.conf -> pykolab-0.8.13.tar.gz/conf/kolab.conf
Changed
@@ -428,9 +428,51 @@ result_attribute = mail wallace -modules = resources, invitationpolicy, footer -footer_text = /etc/kolab/footer.text -footer_html = /etc/kolab/footer.html +; List the modules to load and apply, in order. +; +; Available modules include; +; +; * resources +; * invitationpolicy +; * footer +; * signature +; +modules = resources, invitationpolicy + +; Footer module settings +;footer_text = /etc/kolab/footer.text +;footer_html = /etc/kolab/footer.html + +; Signature module settings +; +; Two modes: write out the exact signature in /etc/kolab/ as html and/or text, +; or use rules. +; +; If files are configured, rules do not apply. If files are configured, a +; fallback is /etc/kolab/signature_default.{html,txt}. +; +; signature_file_html = /etc/kolab/signature.d/%(mail)s.html +; signature_file_text = /etc/kolab/signature.d/%(mail)s.txt +; +; A list of dicts, with each dict holding an attribute name ("o", "cn", +; "entrydn"), and a regular expression to be matched against the attribute +; value. +; +; The module takes the first match, and uses the "html" and "text" files as +; templates. +; +;signature_rules = +; { +; "entrydn": "uid=.*,ou=IT,ou=People,dc=example,dc=org", +; "html": "/etc/kolab/signature_IT.html", +; "text": "/etc/kolab/signature_IT.txt" +; }, +; { +; "entrydn": "uid=.*,ou=Finance,ou=People,dc=example,dc=org", +; "html": "/etc/kolab/signature_Finance.html", +; "text": "/etc/kolab/signature_Finance.txt" +; } +; ; default settings for kolabInvitationPolicy LDAP attribute on user records kolab_invitation_policy = ACT_ACCEPT_IF_NO_CONFLICT:example.org, ACT_MANUAL
View file
pykolab-0.8.13.tar.gz/conf/signature_IT.html
Added
@@ -0,0 +1,13 @@ +<br clear="all"/> +<hr> +This is an example HTML signature. + +<p style="font-size: small; color: gray;"> +%(o)s + +%(manager:cn)s + +M: %(mobile)s +T: %(telephonenumber)s +W: https://it.services.inc +</p>
View file
pykolab-0.8.13.tar.gz/conf/signature_IT.txt
Added
@@ -0,0 +1,9 @@ +This is an example TEXT signature. + +%(o)s + +%(manager:cn)s + +M: %(mobile)s +T: %(telephonenumber)s +W: https://it.services.inc
View file
pykolab-0.8.12.tar.gz/configure.ac -> pykolab-0.8.13.tar.gz/configure.ac
Changed
@@ -1,4 +1,4 @@ -AC_INIT(pykolab, 0.8.12) +AC_INIT(pykolab, 0.8.13) AC_SUBST(RELEASE, 1) AC_CONFIG_SRCDIR(pykolab/constants.py.in)
View file
pykolab-0.8.12.tar.gz/pykolab/auth/ldap/__init__.py -> pykolab-0.8.13.tar.gz/pykolab/auth/ldap/__init__.py
Changed
@@ -846,7 +846,7 @@ ) # Remove referrals - _entry_dns = _e for _e in _results if _e0 is not None + _entry_dns = _e0 for _e in _results if _e0 is not None return _entry_dns
View file
pykolab-0.8.12.tar.gz/pykolab/setup/setup_ldap.py -> pykolab-0.8.13.tar.gz/pykolab/setup/setup_ldap.py
Changed
@@ -417,6 +417,7 @@ schema_error = True if os.path.isfile('/bin/systemctl'): + subprocess.call('/bin/systemctl', 'restart', 'dirsrv.target') subprocess.call('/bin/systemctl', 'restart', 'dirsrv@' + _input'hostname') time.sleep(20) elif os.path.isfile('/sbin/service'): @@ -429,6 +430,7 @@ log.error(_("Could not start the directory server service.")) if os.path.isfile('/bin/systemctl'): + subprocess.call('/bin/systemctl', 'enable', 'dirsrv.target') subprocess.call('/bin/systemctl', 'enable', 'dirsrv@' + _input'hostname') elif os.path.isfile('/sbin/chkconfig'): subprocess.call('/sbin/chkconfig', 'dirsrv', 'on')
View file
pykolab-0.8.12.tar.gz/pykolab/setup/setup_roundcube.py -> pykolab-0.8.13.tar.gz/pykolab/setup/setup_roundcube.py
Changed
@@ -112,7 +112,9 @@ log.error("Roundcube installation path not found.") return - if os.access(rcpath + 'skins/enterprise/', os.R_OK): + if os.access(rcpath + 'skins/kolab/', os.R_OK): + rc_settings'skin' = 'kolab' + elif os.access(rcpath + 'skins/enterprise/', os.R_OK): rc_settings'skin' = 'enterprise' elif os.access(rcpath + 'skins/chameleon/', os.R_OK): rc_settings'skin' = 'chameleon'
View file
pykolab-0.8.12.tar.gz/wallace/__init__.py -> pykolab-0.8.13.tar.gz/wallace/__init__.py
Changed
@@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright 2010-2013 Kolab Systems AG (http://www.kolabsys.com) +# Copyright 2010-2019 Kolab Systems AG (http://www.kolabsys.com) # # Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen a kolabsys.com> # @@ -17,6 +17,8 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # +from __future__ import print_function + import asyncore from distutils import version import grp @@ -31,31 +33,33 @@ import tempfile from threading import _Timer import time -import traceback import pykolab from pykolab import utils from pykolab.translate import _ +from modules import cb_action_ACCEPT + +# pylint: disable=invalid-name log = pykolab.getLogger('pykolab.wallace') conf = pykolab.getConf() -from modules import cb_action_ACCEPT -def pickup_message(filepath, *args, **kw): +def pickup_message(filepath, *args, **kwargs): wallace_modules = args0 - if kw.has_key('module'): + + if 'module' in kwargs: # Cause the previous modules to be skipped - wallace_modules = wallace_modules(wallace_modules.index(kw'module')+1): + wallace_modules = wallace_modules(wallace_modules.index(kwargs'module') + 1): log.debug(_("Wallace modules: %r") % (wallace_modules), level=8) # Execute the module - if kw.has_key('stage'): - modules.execute(kw'module', filepath, stage=kw'stage') + if 'stage' in kwargs: + modules.execute(kwargs'module', filepath, stage=kwargs'stage') else: - modules.execute(kw'module', filepath) + modules.execute(kwargs'module', filepath) # After all modules are executed, continue with a call to # accept the message and re-inject in to Postfix. @@ -64,11 +68,18 @@ for module in wallace_modules: try: result_filepath = modules.execute(module, filepath) - except: - log.error(_("Module %s.execute() failed on message %r with error: %s" % (module, filepath, traceback.format_exc()))) + except Exception: + log.error( + "Module %s.execute() failed on message %r with error: %s" % ( + module, + filepath, + traceback.format_exc() + ) + ) + result_filepath = False - if not result_filepath == None and not result_filepath == False: + if result_filepath is not None and result_filepath is not False: filepath = result_filepath else: # A module has returned False or None @@ -80,26 +91,38 @@ if continue_with_accept: cb_action_ACCEPT('wallace', filepath) + def modules_heartbeat(wallace_modules): lastrun = 0 - while True: + while not multiprocessing.current_process().finished.is_set(): try: for module in wallace_modules: try: modules.heartbeat(module, lastrun) - except: - log.error(_("Module %s.heartbeat() failed with error: %s" % (module, traceback.format_exc()))) + except Exception: + log.error( + "Module %s.heartbeat() failed with error: %s" % ( + module, + traceback.format_exc() + ) + ) lastrun = int(time.time()) - time.sleep(60) - except (SystemExit, KeyboardInterrupt), e: - log.info("Terminating heartbeat process") + multiprocessing.current_process().finished.wait(60) + + except (SystemExit, KeyboardInterrupt) as errmsg: + log.warning("Exiting %s, %s" % (multiprocessing.current_process().name, errmsg)) break -def worker_process(*args, **kw): - log.debug(_("Worker process %s initializing") % (multiprocessing.current_process().name), level=1) +def worker_process(*args, **kwargs): + import signal + signal.signal(signal.SIGINT, signal.SIG_IGN) + log.debug("Worker process %s initializing" % (multiprocessing.current_process().name), level=1) + + +# pylint: disable=too-few-public-methods class Timer(_Timer): def run(self): while True: @@ -109,92 +132,99 @@ self.finished.set() -class WallaceDaemon(object): + +class WallaceDaemon: def __init__(self): self.current_connections = 0 self.max_connections = 24 + self.parent_pid = None self.pool = None daemon_group = conf.add_cli_parser_option_group(_("Daemon Options")) daemon_group.add_option( - "--fork", - dest = "fork_mode", - action = "store_true", - default = False, - help = _("Fork to the background.") - ) + "--fork", + dest="fork_mode", + action="store_true", + default=False, + help=_("Fork to the background.") + ) daemon_group.add_option( - "-b", "--bind", - dest = "wallace_bind_address", - action = "store", - default = "localhost", - help = _("Bind address for Wallace.") - ) + "-b", "--bind", + dest="wallace_bind_address", + action="store", + default="localhost", + help=_("Bind address for Wallace.") + ) daemon_group.add_option( - "-g", - "--group", - dest = "process_groupname", - action = "store", - default = "kolab", - help = _("Run as group GROUPNAME"), - metavar = "GROUPNAME" - ) + "-g", "--group", + dest="process_groupname", + action="store", + default="kolab", + help=_("Run as group GROUPNAME"), + metavar="GROUPNAME" + ) daemon_group.add_option( - "--threads", - dest = "max_threads", - action = "store", - default = 4, - type = int, - help = _("Number of threads to use.") - ) + "--threads", + dest="max_threads", + action="store", + default=4, + type=int,
View file
pykolab-0.8.13.tar.gz/wallace/module_signature.py
Added
@@ -0,0 +1,248 @@ +# -*- coding: utf-8 -*- +# Copyright 2010-2019 Kolab Systems AG (http://www.kolabsys.com) +# +# Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen a kolabsys.com> +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +import json +import os +import re +import tempfile + +from email.encoders import encode_quopri +from email.parser import Parser +from email.utils import getaddresses + +import modules +import pykolab + +from pykolab.auth import Auth +from pykolab.translate import _ + +# pylint: disable=invalid-name +log = pykolab.getLogger('pykolab.wallace') +conf = pykolab.getConf() + +mybasepath = '/var/spool/pykolab/wallace/signature/' + + +def __init__(): + modules.register('signature', execute, description=description()) + + +def description(): + return """Append a signature to messages.""" + + +def set_part_content(part, content): + # Reset old encoding and use quoted-printable (#5414) + del part'Content-Transfer-Encoding' + part.set_payload(content) + encode_quopri(part) + + return True + + +def attr_resolve(sender_info, attr): + try: + attr, attr_val = attr.split(':') + except ValueError: + return None + + auth = Auth() + auth.connect() + + values = + + if not isinstance(sender_infoattr, list): + sender_infoattr = sender_infoattr + + for sender_attr_val in sender_infoattr: + values.append(auth.get_entry_attribute(None, sender_attr_val, attr_val)) + + return ", ".join(values) + + +# pylint: disable=too-many-branches,too-many-locals,too-many-statements +def execute(*args, **kw): # noqa: C901 + if not os.path.isdir(mybasepath): + os.makedirs(mybasepath) + + for stage in 'incoming', 'ACCEPT': + if not os.path.isdir(os.path.join(mybasepath, stage)): + os.makedirs(os.path.join(mybasepath, stage)) + + # TODO: Test for correct call. + filepath = args0 + + if 'stage' in kw: + log.debug(_("Issuing callback after processing to stage %s") % (kw'stage'), level=8) + log.debug(_("Testing cb_action_%s()") % (kw'stage'), level=8) + if hasattr(modules, 'cb_action_%s' % (kw'stage')): + log.debug(_("Attempting to execute cb_action_%s()") % (kw'stage'), level=8) + exec('modules.cb_action_%s(%r, %r)' % (kw'stage', 'signature', filepath)) + return + + log.debug(_("Executing module signature for %r, %r") % (args, kw), level=8) + + new_filepath = os.path.join( + '/var/spool/pykolab/wallace/signature/incoming', + os.path.basename(filepath) + ) + + os.rename(filepath, new_filepath) + filepath = new_filepath + + # parse message + message = Parser().parse(open(filepath, 'r')) + + sender_address = + address for displayname, address in getaddresses(message.get_all('X-Kolab-From')) + 0 + + auth = Auth() + auth.connect() + + sender_dn = auth.find_recipient(sender_address) + if not sender_dn: + exec('modules.cb_action_%s(%r, %r)' % ('ACCEPT', 'signature', filepath)) + return + + sender_info = auth.get_entry_attributes(None, sender_dn, '*', 'entrydn', 'manager') + + log.debug("Sender info: %r" % (sender_info), level=7) + + signature_rules = conf.get_raw('wallace', 'signature_rules') + + if signature_rules: + signature_rules = json.loads(signature_rules) + + log.debug("Signature rules: %r" % (signature_rules), level=7) + + signature_html = None + signature_text = None + + sig_html_conf = conf.get_raw('wallace', 'signature_file_html') + sig_text_conf = conf.get_raw('wallace', 'signature_file_text') + + if sig_html_conf and sig_text_conf: + _sig_html_conf = sig_html_conf % sender_info + _sig_text_conf = sig_text_conf % sender_info + + if not os.path.exists(_sig_html_conf): + _sig_html_conf = '/etc/kolab/signature.d/default.html' + + if not os.path.exists(_sig_text_conf): + _sig_text_conf = '/etc/kolab/signature.d/default.txt' + + if os.path.exists(_sig_html_conf): + signature_html = open(_sig_html_conf, 'r').read() + + if os.path.exists(_sig_text_conf): + signature_text = open(_sig_text_conf, 'r').read() + + if not signature_html and not signature_text: + for signature_rule in signature_rules: + try: + for attr, regex in signature_rule.iteritems(): + if attr == "html": + if not os.path.exists(signature_rule'html'): + raise ValueError + continue + + if attr == "text": + if not os.path.exists(signature_rule'text'): + raise ValueError + continue + + if attr in sender_info and re.match(regex, sender_infoattr, flags=re.IGNORECASE): + success = False + + while not success: + try: + signature_html = open(signature_rule'html', 'r').read() % sender_info + signature_text = open(signature_rule'text', 'r').read() % sender_info + + success = True + + except KeyError as errmsg: + sender_infoerrmsg = attr_resolve(sender_info, errmsg) + except ValueError: + continue + + if signature_html is None and signature_text is None: + exec('modules.cb_action_%s(%r, %r)' % ('ACCEPT', 'signature', filepath)) + return + + signature_added = False + + try: + _signature_added = message.get("X-Wallace-Signature") + + # pylint: disable=broad-except + except Exception: + pass + + if _signature_added == "YES":
View file
pykolab-0.8.12.tar.gz/wallace/modules.py -> pykolab-0.8.13.tar.gz/wallace/modules.py
Changed
@@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Copyright 2010-2013 Kolab Systems AG (http://www.kolabsys.com) +# Copyright 2010-2019 Kolab Systems AG (http://www.kolabsys.com) # # Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen a kolabsys.com> # @@ -17,6 +17,8 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # +from __future__ import print_function + import os import sys import time @@ -45,6 +47,7 @@ modules = {} + def __init__(): # We only want the base path modules_base_path = os.path.dirname(__file__) @@ -55,15 +58,16 @@ for filename in filenames: if filename.startswith('module_') and filename.endswith('.py'): - module_name = filename.replace('.py','') + module_name = filename.replace('.py', '') name = module_name.replace('module_', '') - #print "exec(\"from %s import __init__ as %s_register\"" % (module_name,name) + # print("exec(\"from %s import __init__ as %s_register\")" % (module_name,name)) exec("from %s import __init__ as %s_register" % (module_name, name)) exec("%s_register()" % (name)) for dirname in dirnames: register_group(modules_path, dirname) + def list_modules(*args, **kw): """ List modules @@ -75,8 +79,8 @@ if isinstance(module, tuple): module_group, module = module __modulesmodule_group = { - module: modules(module_group,module) - } + module: modules(module_group, module) + } else: __modulesmodule = modulesmodule @@ -84,38 +88,45 @@ _modules.sort() for _module in _modules: - if __modules_module.has_key('function'): + if 'function' in __modules_module: # This is a top-level module - if not __modules_module'description' == None: - print "%-25s - %s" % (_module.replace('_','-'),__modules_module'description') + if __modules_module'description' is not None: + print("%-25s - %s" % (_module.replace('_', '-'), __modules_module'description')) else: - print "%-25s" % (_module.replace('_','-')) + print("%-25s" % (_module.replace('_', '-'))) for _module in _modules: - if not __modules_module.has_key('function'): + if 'function' not in __modules_module: # This is a nested module - print "\n" + _("Module Group: %s") % (_module) + "\n" + print("\n" + _("Module Group: %s") % (_module) + "\n") ___modules = __modules_module.keys() ___modules.sort() for __module in ___modules: - if not __modules_module__module'description' == None: - print "%-4s%-21s - %s" % ('',__module.replace('_','-'),__modules_module__module'description') + if __modules_module__module'description' is not None: + print( + "%-4s%-21s - %s" % ( + '', + _module.replace('_', '-'), + __modules_module__module'description' + ) + ) + else: - print "%-4s%-21s" % ('',__module.replace('_','-')) + print("%-4s%-21s" % ('', __module.replace('_', '-'))) + def execute(name, *args, **kw): - if not modules.has_key(name): + if name not in modules: log.error(_("No such module %r in modules %r (1).") % (name, modules)) sys.exit(1) - if not modulesname.has_key('function') and \ - not modulesname.has_key('group'): - log.error(_("No such module %r in modules %r (2).") %(name, modules)) + if 'function' not in modulesname and 'group' not in modulesname: + log.error(_("No such module %r in modules %r (2).") % (name, modules)) sys.exit(1) try: return modulesname'function'(*args, **kw) - except Exception, errmsg: + except Exception as errmsg: log.exception(_("Module %r - Unknown error occurred; %r") % (name, errmsg)) def heartbeat(name, *args, **kw): @@ -156,35 +167,35 @@ success = True break - except smtplib.SMTPServerDisconnected, errmsg: + except smtplib.SMTPServerDisconnected as errmsg: log.error("SMTP Server Disconnected Error, %r" % (errmsg)) - except smtplib.SMTPConnectError, errmsg: + except smtplib.SMTPConnectError as errmsg: # DEFER log.error("SMTP Connect Error, %r" % (errmsg)) - except smtplib.SMTPDataError, errmsg: + except smtplib.SMTPDataError as errmsg: # DEFER log.error("SMTP Data Error, %r" % (errmsg)) - except smtplib.SMTPHeloError, errmsg: + except smtplib.SMTPHeloError as errmsg: # DEFER log.error("SMTP HELO Error, %r" % (errmsg)) - except smtplib.SMTPRecipientsRefused, errmsg: + except smtplib.SMTPRecipientsRefused as errmsg: # REJECT, send NDR log.error("SMTP Recipient(s) Refused, %r" % (errmsg)) - except smtplib.SMTPSenderRefused, errmsg: + except smtplib.SMTPSenderRefused as errmsg: # REJECT, send NDR log.error("SMTP Sender Refused, %r" % (errmsg)) - except Exception, errmsg: + except Exception as errmsg: log.exception(_("smtplib - Unknown error occurred: %r") % (errmsg)) try: smtp.quit() - except Exception, errmsg: + except Exception as errmsg: log.error("smtplib quit() error - %r" % errmsg) time.sleep(10) @@ -231,7 +242,7 @@ #now = datetime.datetime.now() #delta = now - fileage - #print "file:", filepath, "fileage:", fileage, "now:", now, "delta(seconds):", delta.seconds + #print("file:", filepath, "fileage:", fileage, "now:", now, "delta(seconds):", delta.seconds) #if delta.seconds > 1800: ## TODO: Send NDR back to user
View file
pykolab-0.8.12.tar.gz/wallace/wallace.systemd -> pykolab-0.8.13.tar.gz/wallace/wallace.systemd
Changed
@@ -10,7 +10,7 @@ EnvironmentFile=/etc/sysconfig/wallace ExecStart=/usr/sbin/wallaced $FLAGS --pid-file /run/wallaced/wallaced.pid ExecReload=/bin/kill -HUP $MAINPID -ExecStop=/bin/kill -TERM $MAINPID +ExecStop=/bin/kill -KILL $MAINPID Install WantedBy=multi-user.target
View file
pykolab.dsc
Changed
@@ -2,7 +2,7 @@ Source: pykolab Binary: pykolab, kolab-cli, kolab-conf, kolab-saslauthd, kolab-server, kolab-telemetry, kolab-xml, wallace Architecture: all -Version: 0.8.12-0~kolab5 +Version: 0.8.13-0~kolab1 Maintainer: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Uploaders: Paul Klos <kolab@klos2day.nl> Homepage: http://www.kolab.org @@ -40,5 +40,5 @@ pykolab deb python optional wallace deb python optional Files: - 00000000000000000000000000000000 0 pykolab-0.8.12.tar.gz + 00000000000000000000000000000000 0 pykolab-0.8.13.tar.gz 00000000000000000000000000000000 0 debian.tar.gz
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.