subscribers.py
132 lines
| 4.8 KiB
| text/x-python
|
PythonLexer
Martin Bornhold
|
r559 | # -*- coding: utf-8 -*- | ||
# Copyright (C) 2016-2016 RhodeCode GmbH | ||||
# | ||||
# This program is free software: you can redistribute it and/or modify | ||||
# it under the terms of the GNU Affero General Public License, version 3 | ||||
# (only), as published by the Free Software Foundation. | ||||
# | ||||
# 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 Affero General Public License | ||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
# | ||||
# This program is dual-licensed. If you wish to learn more about the | ||||
# RhodeCode Enterprise Edition, including its added features, Support services, | ||||
# and proprietary license terms, please see https://rhodecode.com/licenses/ | ||||
Martin Bornhold
|
r831 | import logging | ||
Martin Bornhold
|
r1011 | import subprocess32 | ||
from threading import Thread | ||||
Martin Bornhold
|
r559 | |||
Martin Bornhold
|
r1011 | |||
Martin Bornhold
|
r563 | from .utils import generate_mod_dav_svn_config | ||
Martin Bornhold
|
r559 | |||
Martin Bornhold
|
r831 | log = logging.getLogger(__name__) | ||
Martin Bornhold
|
r563 | def generate_config_subscriber(event): | ||
Martin Bornhold
|
r560 | """ | ||
Subscriber to the `rhodcode.events.RepoGroupEvent`. This triggers the | ||||
automatic generation of mod_dav_svn config file on repository group | ||||
changes. | ||||
""" | ||||
Martin Bornhold
|
r831 | try: | ||
Martin Bornhold
|
r1011 | generate_mod_dav_svn_config(event.request.registry) | ||
Martin Bornhold
|
r831 | except Exception: | ||
log.exception( | ||||
'Exception while generating subversion mod_dav_svn configuration.') | ||||
Martin Bornhold
|
r1011 | |||
class Subscriber(object): | ||||
def __call__(self, event): | ||||
self.run(event) | ||||
def run(self, event): | ||||
raise NotImplementedError('Subclass has to implement this.') | ||||
class AsyncSubscriber(Subscriber): | ||||
def __init__(self, *args, **kwargs): | ||||
self._init_args = args | ||||
self._init_kwargs = kwargs | ||||
def __call__(self, event): | ||||
kwargs = {'event': event} | ||||
kwargs.update(self._init_kwargs) | ||||
self.thread = Thread( | ||||
target=self.run, args=self._init_args, kwargs=kwargs) | ||||
self.thread.start() | ||||
class AsyncSubprocessSubscriber(AsyncSubscriber): | ||||
def run(self, event, cmd, timeout=None): | ||||
log.debug('Executing command %s.', cmd) | ||||
try: | ||||
output = subprocess32.check_output( | ||||
cmd, timeout=timeout, stderr=subprocess32.STDOUT) | ||||
log.debug('Command finished %s', cmd) | ||||
if output: | ||||
log.debug('Command output: %s', output) | ||||
except subprocess32.TimeoutExpired as e: | ||||
log.exception('Timeout while executing command.') | ||||
if e.output: | ||||
log.error('Command output: %s', e.output) | ||||
except subprocess32.CalledProcessError as e: | ||||
log.exception('Error while executing command.') | ||||
if e.output: | ||||
log.error('Command output: %s', e.output) | ||||
except: | ||||
log.exception( | ||||
'Exception while executing command %s.', cmd) | ||||
# class ReloadApacheSubscriber(object): | ||||
# """ | ||||
# Subscriber to pyramids event system. It executes the Apache reload command | ||||
# if set in ini-file. The command is executed asynchronously in a separate | ||||
# task. This is done to prevent a delay of the function which triggered the | ||||
# event in case of a longer running command. If a timeout is passed to the | ||||
# constructor the command will be terminated after expiration. | ||||
# """ | ||||
# def __init__(self, settings, timeout=None): | ||||
# self.thread = None | ||||
# cmd = self.get_command_from_settings(settings) | ||||
# if cmd: | ||||
# kwargs = { | ||||
# 'cmd': cmd, | ||||
# 'timeout': timeout, | ||||
# } | ||||
# self.thread = Thread(target=self.run, kwargs=kwargs) | ||||
# def __call__(self, event): | ||||
# if self.thread is not None: | ||||
# self.thread.start() | ||||
# def get_command_from_settings(self, settings): | ||||
# cmd = settings[config_keys.reload_command] | ||||
# return cmd.split(' ') if cmd else cmd | ||||
# def run(self, cmd, timeout=None): | ||||
# log.debug('Executing svn proxy reload command %s.', cmd) | ||||
# try: | ||||
# output = subprocess32.check_output( | ||||
# cmd, timeout=timeout, stderr=subprocess32.STDOUT) | ||||
# log.debug('Svn proxy reload command finished.') | ||||
# if output: | ||||
# log.debug('Command output: %s', output) | ||||
# except subprocess32.TimeoutExpired as e: | ||||
# log.exception('Timeout while executing svn proxy reload command.') | ||||
# if e.output: | ||||
# log.error('Command output: %s', e.output) | ||||
# except subprocess32.CalledProcessError as e: | ||||
# log.exception('Error while executing svn proxy reload command.') | ||||
# if e.output: | ||||
# log.error('Command output: %s', e.output) | ||||
# except: | ||||
# log.exception( | ||||
# 'Exception while executing svn proxy reload command %s.', cmd) | ||||