Completed
Push — master ( b8c6cd...f2913e )
by Thomas
13:07
created

exabgp.reactor.interrupt.Signal.name()   A

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nop 2
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
# encoding: utf-8
2
"""
3
reactor/interrupt.py
4
5
Created by Thomas Mangin on 2017-07-01.
6
Copyright (c) 2009-2017 Exa Networks. All rights reserved.
7
License: 3-clause BSD. (See the COPYRIGHT file)
8
"""
9
10
import signal
11
12
from exabgp.logger import log
13
14
15
class Signal(object):
16
    NONE = 0
17
    SHUTDOWN = -1
18
    RESTART = -2
19
    RELOAD = -4
20
    FULL_RELOAD = -8
21
22
    _names = {
23
        **dict(
24
            (k, v)
25
            for v, k in reversed(sorted(signal.__dict__.items()))
26
            if v.startswith('SIG') and not v.startswith('SIG_')
27
        ),
28
        **{
29
            NONE: 'none',
30
            SHUTDOWN: 'shutdown',
31
            RESTART: 'restart',
32
            RELOAD: 'reload',
33
            FULL_RELOAD: 'full reload',
34
            # some padding to make black format this as we like :-)
35
        },
36
    }
37
38
    @classmethod
39
    def name(cls, received):
40
        return cls._names.get(received, 'unknown')
41
42
    def __init__(self):
43
        self.received = self.NONE
44
        self.number = 0
45
        self.rearm()
46
47
    def rearm(self):
48
        self.received = Signal.NONE
49
        self.number = 0
50
51
        signal.signal(signal.SIGTERM, self.sigterm)
52
        signal.signal(signal.SIGHUP, self.sighup)
53
        signal.signal(signal.SIGALRM, self.sigalrm)
54
        signal.signal(signal.SIGUSR1, self.sigusr1)
55
        signal.signal(signal.SIGUSR2, self.sigusr2)
56
57
    def sigterm(self, signum, frame):
58
        log.critical('SIGTERM received', 'reactor')
59
        if self.received:
60
            log.critical('ignoring - still handling previous signal', 'reactor')
61
            return
62
        log.critical('scheduling shutdown', 'reactor')
63
        self.received = self.SHUTDOWN
64
        self.number = signum
65
66
    def sighup(self, signum, frame):
67
        log.critical('SIGHUP received', 'reactor')
68
        if self.received:
69
            log.critical('ignoring - still handling previous signal', 'reactor')
70
            return
71
        log.critical('scheduling shutdown', 'reactor')
72
        self.received = self.SHUTDOWN
73
        self.number = signum
74
75
    def sigalrm(self, signum, frame):
76
        log.critical('SIGALRM received', 'reactor')
77
        if self.received:
78
            log.critical('ignoring - still handling previous signal', 'reactor')
79
            return
80
        log.critical('scheduling restart', 'reactor')
81
        self.received = self.RESTART
82
        self.number = signum
83
84
    def sigusr1(self, signum, frame):
85
        log.critical('SIGUSR1 received', 'reactor')
86
        if self.received:
87
            log.critical('ignoring - still handling previous signal', 'reactor')
88
            return
89
        log.critical('scheduling reload of configuration', 'reactor')
90
        self.received = self.RELOAD
91
        self.number = signum
92
93
    def sigusr2(self, signum, frame):
94
        log.critical('SIGUSR2 received', 'reactor')
95
        if self.received:
96
            log.critical('ignoring - still handling previous signal', 'reactor')
97
            return
98
        log.critical('scheduling reload of configuration and processes', 'reactor')
99
        self.received = self.FULL_RELOAD
100
        self.number = signum
101