Source code for mirakuru.tcp
# Copyright (C) 2014 by Clearcode <http://clearcode.cc>
# and associates (see AUTHORS).
# This file is part of mirakuru.
# mirakuru is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# mirakuru 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 Lesser General Public License for more details.
# You should have received a copy of the GNU Lesser General Public License
# along with mirakuru. If not, see <http://www.gnu.org/licenses/>.
"""TCP executor definition."""
import socket
from mirakuru.base import StartCheckExecutor
[docs]class TCPExecutor(StartCheckExecutor):
"""
TCP-listening process executor.
Used to start (and wait to actually be running) processes that can accept
TCP connections.
"""
def __init__(self, command, host, port,
shell=False, timeout=None, sleep=0.1):
"""
Initialize TCPExecutor executor.
:param str command: command to run to start service
:param str host: host under which process is accessible
:param int port: port under which process is accessible
:param bool shell: see `subprocess.Popen`
:param int timeout: time to wait for process to start or stop.
if None, wait indefinitely.
:param float sleep: how often to check for start/stop condition
"""
StartCheckExecutor.__init__(self, command, shell=shell,
timeout=timeout, sleep=sleep)
self.host = host
"""Host name, process is listening on."""
self.port = port
"""Port number, process is listening on."""
[docs] def pre_start_check(self):
"""
Check if process accepts connections.
.. note::
Process will be considered started, when it'll be able to accept
TCP connections as defined in initializer.
"""
try:
sock = socket.socket()
sock.connect((self.host, self.port))
return True
except (socket.error, socket.timeout):
return False
finally:
# close socket manually for sake of pypy
sock.close()
[docs] def after_start_check(self):
"""
Check if process accepts connections.
.. note::
Process will be considered started, when it'll be able to accept
TCP connections as defined in initializer.
"""
return self.pre_start_check() # we can reuse logic from `pre_start()`