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.
Test Setup Failed
Push — master ( 19fcc2...697e45 )
by P.R.
03:59
created

Spawner.remove_job_handler()   A

Complexity

Conditions 1

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
dl 0
loc 8
rs 9.4285
ccs 0
cts 2
cp 0
crap 2
1
"""
2
Enarksh
3
4
Copyright 2013-2016 Set Based IT Consultancy
5
6
Licence MIT
7
"""
8
import os
9
import signal
10
11
import pwd
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
0 ignored issues
show
Bug introduced by
The name message does not seem to exist in module enarksh.
Loading history...
Configuration introduced by
The import enarksh.message.ExitMessage could not be resolved.

This can be caused by one of the following:

1. Missing Dependencies

This error could indicate a configuration issue of Pylint. Make sure that your libraries are available by adding the necessary commands.

# .scrutinizer.yml
before_commands:
    - sudo pip install abc # Python2
    - sudo pip3 install abc # Python3
Tip: We are currently not using virtualenv to run pylint, when installing your modules make sure to use the command for the correct version.

2. Missing __init__.py files

This error could also result from missing __init__.py files in your module folders. Make sure that you place one file in each sub-folder.

Loading history...
19
from enarksh.message.MessageController import MessageController
0 ignored issues
show
Bug introduced by
The name message does not seem to exist in module enarksh.
Loading history...
Configuration introduced by
The import enarksh.message.MessageController could not be resolved.

This can be caused by one of the following:

1. Missing Dependencies

This error could indicate a configuration issue of Pylint. Make sure that your libraries are available by adding the necessary commands.

# .scrutinizer.yml
before_commands:
    - sudo pip install abc # Python2
    - sudo pip3 install abc # Python3
Tip: We are currently not using virtualenv to run pylint, when installing your modules make sure to use the command for the correct version.

2. Missing __init__.py files

This error could also result from missing __init__.py files in your module folders. Make sure that you place one file in each sub-folder.

Loading history...
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
        EventActor.__init__(self)
46
47
        Spawner.instance = self
48
49
        self._event_controller = EventController()
50
        """
51
        The event controller.
52
53
        :type: enarksh.event.EventController.EventController
54
        """
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
        self._job_handlers[pid].destroy()
131
        del self._job_handlers[pid]
132
133
    # ------------------------------------------------------------------------------------------------------------------
134
    @staticmethod
135
    def sigchld_handler(*_):
136
        """
137
        Static method for SIGCHLD. Set a flag that a child has exited.
138
        """
139
        Spawner.instance.sigchld_event.fire()
140
141
    # ------------------------------------------------------------------------------------------------------------------
142
    def _install_signal_handlers(self):
143
        """
144
        Install signal handlers for SIGCHLD and SIGHUP.
145
        """
146
        # Install signal handler for child has exited.
147
        signal.signal(signal.SIGCHLD, self.sigchld_handler)
148
149
    # ------------------------------------------------------------------------------------------------------------------
150
    @staticmethod
151
    def _set_unprivileged_user():
152
        """
153
        Set the real and effective user and group to an unprivileged user.
154
        """
155
        _, _, uid, gid, _, _, _ = pwd.getpwnam('enarksh')
156
157
        os.setresgid(gid, gid, 0)
158
        os.setresuid(uid, uid, 0)
159
160
    # ------------------------------------------------------------------------------------------------------------------
161
    def _startup(self):
162
        """
163
        Performs the necessary actions for starting the spawner daemon.
164
        """
165
        # Log stop of the spawner.
166
        print('Start spawner')
167
168
        # Set the effective user and group to an unprivileged user and group.
169
        self._set_unprivileged_user()
170
171
        # Install signal handlers.
172
        self._install_signal_handlers()
173
174
        # Read all user names under which the controller is allowed to start jobs.
175
        JobHandler.read_allowed_users()
176
177
    # ------------------------------------------------------------------------------------------------------------------
178
    @staticmethod
179
    def _shutdown():
180
        """
181
        Performs the necessary actions for stopping the spawner.
182
        """
183
        # Log stop of the spawner.
184
        print('Stop spawner')
185
186
    # ------------------------------------------------------------------------------------------------------------------
187
    def _register_sockets(self):
188
        """
189
        Registers ZMQ sockets for communication with other processes in Enarksh.
190
        """
191
        # Register socket for receiving asynchronous incoming messages.
192
        self._message_controller.register_end_point('pull', zmq.PULL, enarksh.SPAWNER_PULL_END_POINT)
1 ignored issue
show
Bug introduced by
The Module zmq does not seem to have a member named PULL.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
193
194
        # Register socket for sending asynchronous messages to the controller.
195
        self._message_controller.register_end_point('controller', zmq.PUSH, enarksh.CONTROLLER_PULL_END_POINT)
1 ignored issue
show
Bug introduced by
The Module zmq does not seem to have a member named PUSH.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
196
197
        # Register socket for sending asynchronous messages to the logger.
198
        self._message_controller.register_end_point('logger', zmq.PUSH, enarksh.LOGGER_PULL_END_POINT)
1 ignored issue
show
Bug introduced by
The Module zmq does not seem to have a member named PUSH.

This check looks for calls to members that are non-existent. These calls will fail.

The member could have been renamed or removed.

Loading history...
199
200
    # ------------------------------------------------------------------------------------------------------------------
201
    def _register_message_types(self):
202
        """
203
        Registers all message type that the spawner handles at the message controller.
204
        """
205
        self._message_controller.register_message_type(ExitMessage.MESSAGE_TYPE)
206
        self._message_controller.register_message_type(SpawnJobMessage.MESSAGE_TYPE)
207
208
    # ------------------------------------------------------------------------------------------------------------------
209
    def _register_events_handlers(self):
210
        """
211
        Registers all event handlers at the event controller.
212
        """
213
        EventQueueEmptyEventHandler.init()
214
215
        # Register message received event handlers.
216
        self._message_controller.register_listener(ExitMessage.MESSAGE_TYPE, ExitMessageEventHandler.handle)
217
        self._message_controller.register_listener(SpawnJobMessage.MESSAGE_TYPE,
218
                                                   SpawnJobMessageEventHandler.handle,
219
                                                   self)
220
        # Register other event handlers.
221
        self._sigchld_event.register_listener(SIGCHLDEventHandler.handle, self)
222
        self._zmq_incoming_message_event.register_listener(self._message_controller.receive_message)
223
        self._event_controller.event_queue_empty.register_listener(EventQueueEmptyEventHandler.handle, self)
224
225
    # ------------------------------------------------------------------------------------------------------------------
226
    def main(self):
227
        """
228
        The main function of the job spawner.
229
        """
230
        self._startup()
231
232
        self._register_sockets()
233
234
        self._register_message_types()
235
236
        self._register_events_handlers()
237
238
        self._message_controller.no_barking(3)
239
240
        self._event_controller.loop()
241
242
        self._shutdown()
243
244
# ----------------------------------------------------------------------------------------------------------------------
245