Skip to content

Commit eb67c03

Browse files
Makman2tsnoam
authored andcommitted
Updater: Issue INFO log upon received signal (python-telegram-bot#951)
Fixes python-telegram-bot#946
1 parent 2ca7ff8 commit eb67c03

File tree

5 files changed

+35
-5
lines changed

5 files changed

+35
-5
lines changed

AUTHORS.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ The following wonderful people contributed directly or indirectly to this projec
4545
- `Li-aung Yip <https://github.com/LiaungYip>`_
4646
- `macrojames <https://github.com/macrojames>`_
4747
- `Michael Elovskikh <https://github.com/wronglink>`_
48+
- `Mischa Krüger <https://github.com/Makman2>`_
4849
- `naveenvhegde <https://github.com/naveenvhegde>`_
4950
- `neurrone <https://github.com/neurrone>`_
5051
- `njittam <https://github.com/njittam>`_

requirements-dev.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ yapf
66
pre-commit
77
beautifulsoup4
88
pytest
9+
pytest-catchlog
910
pytest-timeout

telegram/ext/updater.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from telegram import Bot, TelegramError
3232
from telegram.ext import Dispatcher, JobQueue
3333
from telegram.error import Unauthorized, InvalidToken, RetryAfter
34+
from telegram.utils.helpers import get_signal_name
3435
from telegram.utils.request import Request
3536
from telegram.utils.webhookhandler import (WebhookServer, WebhookHandler)
3637

@@ -449,6 +450,8 @@ def _join_threads(self):
449450
def signal_handler(self, signum, frame):
450451
self.is_idle = False
451452
if self.running:
453+
self.logger.info('Received signal {} ({}), stopping...'.format(
454+
signum, get_signal_name(signum)))
452455
self.stop()
453456
if self.user_sig_handler:
454457
self.user_sig_handler(signum, frame)

telegram/utils/helpers.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,26 @@
1919
"""This module contains helper functions."""
2020

2121
import re
22+
import signal
2223
from datetime import datetime
2324

2425
try:
2526
from html import escape as escape_html # noqa: F401
2627
except ImportError:
2728
from cgi import escape as escape_html # noqa: F401
2829

30+
31+
# From https://stackoverflow.com/questions/2549939/get-signal-names-from-numbers-in-python
32+
_signames = {v: k
33+
for k, v in reversed(sorted(vars(signal).items()))
34+
if k.startswith('SIG') and not k.startswith('SIG_')}
35+
36+
37+
def get_signal_name(signum):
38+
"""Returns the signal name of the given signal number."""
39+
return _signames[signum]
40+
41+
2942
# Not using future.backports.datetime here as datetime value might be an input from the user,
3043
# making every isinstace() call more delicate. So we just use our own compat layer.
3144
if hasattr(datetime, 'timestamp'):

tests/test_updater.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
#
1717
# You should have received a copy of the GNU Lesser Public License
1818
# along with this program. If not, see [http://www.gnu.org/licenses/].
19+
import logging
1920
import os
2021
import signal
2122
import sys
23+
from functools import partial
2224
from queue import Queue
2325
from random import randrange
2426
from threading import Thread
@@ -238,15 +240,25 @@ def _send_webhook_msg(self,
238240

239241
return urlopen(req)
240242

241-
def signal_sender(self):
243+
def signal_sender(self, updater):
242244
sleep(0.2)
245+
while not updater.running:
246+
sleep(0.2)
247+
243248
os.kill(os.getpid(), signal.SIGTERM)
244249

245250
@signalskip
246-
def test_idle(self, updater):
251+
def test_idle(self, updater, caplog):
247252
updater.start_polling(0.01)
248-
Thread(target=self.signal_sender).start()
249-
updater.idle()
253+
Thread(target=partial(self.signal_sender, updater=updater)).start()
254+
255+
with caplog.at_level(logging.INFO):
256+
updater.idle()
257+
258+
rec = caplog.records[-1]
259+
assert rec.msg.startswith('Received signal {}'.format(signal.SIGTERM))
260+
assert rec.levelname == 'INFO'
261+
250262
# If we get this far, idle() ran through
251263
sleep(.5)
252264
assert updater.running is False
@@ -260,7 +272,7 @@ def user_signal_inc(signum, frame):
260272

261273
updater.user_sig_handler = user_signal_inc
262274
updater.start_polling(0.01)
263-
Thread(target=self.signal_sender).start()
275+
Thread(target=partial(self.signal_sender, updater=updater)).start()
264276
updater.idle()
265277
# If we get this far, idle() ran through
266278
sleep(.5)

0 commit comments

Comments
 (0)