GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Push — master ( ad34bf...a9a32b )
by P.R.
03:24
created

Spawner.__shutdown()   A

Complexity

Conditions 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 7
ccs 0
cts 2
cp 0
crap 2
rs 9.4285
c 0
b 0
f 0
1
"""
2
Enarksh
3
4
Copyright 2013-2016 Set Based IT Consultancy
5
6
Licence MIT
7
"""
8
import os
9
import pwd
10
import signal
11
12
import zmq
13
14
import enarksh
15
from enarksh.event.Event import Event
16
from enarksh.event.EventActor import EventActor
17
from enarksh.event.EventController import EventController
18
from enarksh.message.ExitMessage import ExitMessage
19
from enarksh.message.MessageController import MessageController
20
from enarksh.spawner.JobHandler import JobHandler
21
from enarksh.spawner.event_handler.EventQueueEmptyEventHandler import EventQueueEmptyEventHandler
22
from enarksh.spawner.event_handler.ExitMessageEventHandler import ExitMessageEventHandler
23
from enarksh.spawner.event_handler.SIGCHLDEventHandler import SIGCHLDEventHandler
24
from enarksh.spawner.event_handler.SpawnJobMessageEventHandler import SpawnJobMessageEventHandler
25
from enarksh.spawner.message.SpawnJobMessage import SpawnJobMessage
26
27
28
class Spawner(EventActor):
29
    """
30
    The spawner.
31
    """
32
    # ------------------------------------------------------------------------------------------------------------------
33
    instance = None
34
    """
35
    The instance of this class.
36
37
    :type: None|enarksh.spawner.Spawner.Spawner
38
    """
39
40
    # ------------------------------------------------------------------------------------------------------------------
41
    def __init__(self):
42
        """
43
        Object constructor.
44
        """
45
        Spawner.instance = self
46
47
        self.__event_controller = EventController()
48
        """
49
        The event controller.
50
51
        :type: enarksh.event.EventController.EventController
52
        """
53
54
        EventActor.__init__(self)
55
56
        self.__message_controller = MessageController()
57
        """
58
        The message controller.
59
60
        :type: enarksh.message.MessageController.MessageController
61
        """
62
63
        self.__job_handlers = {}
64
        """
65
        The job handlers. A dictionary from PID to the job handler for the process (of the job).
66
67
        :type: dict[int,enarksh.spawner.JobHandler.JobHandler]
68
        """
69
70
        self.__sigchld_event = Event(self)
71
        """
72
        Event for SIGCHLD has been received.
73
74
        :type: enarksh.event.Event.Event
75
        """
76
77
        self.__zmq_incoming_message_event = Event(self)
78
        """
79
        Event for a ZMQ message is available.
80
81
        :type: enarksh.event.Event.Event
82
        """
83
84
    # ------------------------------------------------------------------------------------------------------------------
85
    @property
86
    def sigchld_event(self):
87
        """
88
        Returns the event for SIGCHLD has been received.
89
90
        :rtype: enarksh.event.Event.Event
91
        """
92
        return self.__sigchld_event
93
94
    # ------------------------------------------------------------------------------------------------------------------
95
    @property
96
    def job_handlers(self):
97
        """
98
        Returns the job handlers for the currently running processes.
99
100
        :rtype: dict[int,enarksh.spawner.JobHandler.JobHandler]
101
        """
102
        return self.__job_handlers
103
104
    # ------------------------------------------------------------------------------------------------------------------
105
    @property
106
    def zmq_incoming_message_event(self):
107
        """
108
        Returns the event for a ZMQ message is available.
109
110
        :rtype: enarksh.event.Event.Event
111
        """
112
        return self.__zmq_incoming_message_event
113
114
    # ------------------------------------------------------------------------------------------------------------------
115
    def add_job_handler(self, job_handler):
116
        """
117
        Adds a job handler to this spawner.
118
119
        :param enarksh.spawner.JobHandler.JobHandler job_handler: The job handler.
120
        """
121
        self.__job_handlers[job_handler.pid] = job_handler
122
123
    # ------------------------------------------------------------------------------------------------------------------
124
    def remove_job_handler(self, pid):
125
        """
126
        Removes a job handler to this spawner.
127
128
        :param int pid: The (original) PID of the process that the jon handlers was handling.
129
        """
130
        del self.__job_handlers[pid]
131
132
    # ------------------------------------------------------------------------------------------------------------------
133
    @staticmethod
134
    def sigchld_handler(*_):
135
        """
136
        Static method for SIGCHLD. Set a flag that a child has exited.
137
        """
138
        Spawner.instance.sigchld_event.fire()
139
140
    # ------------------------------------------------------------------------------------------------------------------
141
    def __install_signal_handlers(self):
142
        """
143
        Install signal handlers for SIGCHLD and SIGHUP.
144
        """
145
        # Install signal handler for child has exited.
146
        signal.signal(signal.SIGCHLD, self.sigchld_handler)
147
148
    # ------------------------------------------------------------------------------------------------------------------
149
    @staticmethod
150
    def __set_unprivileged_user():
151
        """
152
        Set the real and effective user and group to an unprivileged user.
153
        """
154
        _, _, uid, gid, _, _, _ = pwd.getpwnam('enarksh')
155
156
        os.setresgid(gid, gid, 0)
157
        os.setresuid(uid, uid, 0)
158
159
    # ------------------------------------------------------------------------------------------------------------------
160
    def __startup(self):
161
        """
162
        Performs the necessary actions for starting the spawner daemon.
163
        """
164
        # Log stop of the spawner.
165
        print('Start spawner')
166
167
        # Set the effective user and group to an unprivileged user and group.
168
        self.__set_unprivileged_user()
169
170
        # Install signal handlers.
171
        self.__install_signal_handlers()
172
173
        # Read all user names under which the controller is allowed to start jobs.
174
        JobHandler.read_allowed_users()
175
176
    # ------------------------------------------------------------------------------------------------------------------
177
    @staticmethod
178
    def __shutdown():
179
        """
180
        Performs the necessary actions for stopping the spawner.
181
        """
182
        # Log stop of the spawner.
183
        print('Stop spawner')
184
185
    # ------------------------------------------------------------------------------------------------------------------
186
    def __register_sockets(self):
187
        """
188
        Registers ZMQ sockets for communication with other processes in Enarksh.
189
        """
190
        # Register socket for receiving asynchronous incoming messages.
191
        self.__message_controller.register_end_point('pull', zmq.PULL, enarksh.SPAWNER_PULL_END_POINT)
192
193
        # Register socket for sending asynchronous messages to the controller.
194
        self.__message_controller.register_end_point('controller', zmq.PUSH, enarksh.CONTROLLER_PULL_END_POINT)
195
196
        # Register socket for sending asynchronous messages to the logger.
197
        self.__message_controller.register_end_point('logger', zmq.PUSH, enarksh.LOGGER_PULL_END_POINT)
198
199
    # ------------------------------------------------------------------------------------------------------------------
200
    def __register_message_types(self):
201
        """
202
        Registers all message type that the spawner handles at the message controller.
203
        """
204
        self.__message_controller.register_message_type(ExitMessage.MESSAGE_TYPE)
205
        self.__message_controller.register_message_type(SpawnJobMessage.MESSAGE_TYPE)
206
207
    # ------------------------------------------------------------------------------------------------------------------
208
    def __register_events_handlers(self):
209
        """
210
        Registers all event handlers at the event controller.
211
        """
212
        EventQueueEmptyEventHandler.init()
213
214
        # Register message received event handlers.
215
        self.__message_controller.register_listener(ExitMessage.MESSAGE_TYPE, ExitMessageEventHandler.handle)
216
        self.__message_controller.register_listener(SpawnJobMessage.MESSAGE_TYPE,
217
                                                    SpawnJobMessageEventHandler.handle,
218
                                                    self)
219
        # Register other event handlers.
220
        self.__sigchld_event.register_listener(SIGCHLDEventHandler.handle, self)
221
        self.__zmq_incoming_message_event.register_listener(self.__message_controller.receive_message)
222
        self.__event_controller.event_queue_empty.register_listener(EventQueueEmptyEventHandler.handle, self)
223
224
    # ------------------------------------------------------------------------------------------------------------------
225
    def main(self):
226
        """
227
        The main function of the job spawner.
228
        """
229
        self.__startup()
230
231
        self.__register_sockets()
232
233
        self.__register_message_types()
234
235
        self.__register_events_handlers()
236
237
        self.__message_controller.no_barking(3)
238
239
        self.__event_controller.loop()
240
241
        self.__shutdown()
242
243
# ----------------------------------------------------------------------------------------------------------------------
244