import threading
import time
import traceback
+import signal
CTRL_SOCK = "ctrl.sock"
STD_ERR = "stderr.log"
while not self._stop:
conn, addr = self._ctrl_sock.accept()
conn.settimeout(5)
- while True:
+ while not self._stop:
try:
msg = self.recv_msg(conn)
except socket.timeout, e:
reply = self.stop_action()
else:
reply = self.reply_action(msg)
- self.send_reply(conn, reply)
- conn.close()
+
+ try:
+ self.send_reply(conn, reply)
+ except socket.error:
+ self.log_error()
+ print >>sys.stderr, "NOTICE: Awaiting for reconnection"
+ break
+ try:
+ conn.close()
+ except:
+ # Doesn't matter
+ self.log_error()
def recv_msg(self, conn):
data = ""
raise
if chunk == '':
continue
- data += chunk
- if chunk[-1] == "\n":
+ if chunk:
+ data += chunk
+ if chunk[-1] == "\n":
+ break
+ else:
+ # empty chunk = EOF
break
decoded = base64.b64decode(data)
return decoded.rstrip()
def reply_action(self, msg):
return "Reply to: %s" % msg
- def log_error(self, text = None):
+ def log_error(self, text = None, context = ''):
if text == None:
text = traceback.format_exc()
date = time.strftime("%Y-%m-%d %H:%M:%S")
- sys.stderr.write("ERROR: %s\n%s\n" % (date, text))
+ if context:
+ context = " (%s)" % (context,)
+ sys.stderr.write("ERROR%s: %s\n%s\n" % (context, date, text))
return text
def log_debug(self, text):
self.addr = (host, port)
self.user = user
self.agent = agent
+ self._stopped = False
self.connect()
+
+ def __del__(self):
+ if self._process.poll() is None:
+ os.kill(self._process.pid, signal.SIGTERM)
+ self._process.wait()
def connect(self):
root_dir = self.root_dir
def send_stop(self):
self.send_msg(STOP_MSG)
+ self._stopped = True
def read_reply(self):
data = self._process.stdout.readline()
c = server.Client(self.root_dir)
c.send_msg("Hola")
reply = c.read_reply()
- self.assertTrue(reply == "Reply to: Hola")
+ self.assertEqual(reply, "Reply to: Hola")
c.send_stop()
reply = c.read_reply()
- self.assertTrue(reply == "Stopping server")
+ self.assertEqual(reply, "Stopping server")
def test_server_reconnect(self):
s = server.Server(self.root_dir)
c.send_msg("Hola")
reply = c.read_reply()
- self.assertTrue(reply == "Reply to: Hola")
+ self.assertEqual(reply, "Reply to: Hola")
# disconnect
del c
c = server.Client(self.root_dir)
c.send_msg("Hola")
reply = c.read_reply()
- self.assertTrue(reply == "Reply to: Hola")
+ self.assertEqual(reply, "Reply to: Hola")
c.send_stop()
reply = c.read_reply()
- self.assertTrue(reply == "Stopping server")
+ self.assertEqual(reply, "Stopping server")
def test_server_auto_reconnect(self):
s = server.Server(self.root_dir)
c.send_msg("Hola")
reply = c.read_reply()
- self.assertTrue(reply == "Reply to: Hola")
+ self.assertEqual(reply, "Reply to: Hola")
# purposedly break the connection
c._process.stdin.close()
# assert that the communication works (possible with auto-reconnection)
c.send_msg("Hola")
reply = c.read_reply()
- self.assertTrue(reply == "Reply to: Hola")
+ self.assertEqual(reply, "Reply to: Hola")
c.send_stop()
reply = c.read_reply()
- self.assertTrue(reply == "Stopping server")
+ self.assertEqual(reply, "Stopping server")
def test_server_long_message(self):
s = server.Server(self.root_dir)
msg = "1"*1145
c.send_msg(msg)
reply = c.read_reply()
- self.assertTrue(reply == ("Reply to: "+msg))
+ self.assertEqual(reply, ("Reply to: "+msg))
c.send_stop()
reply = c.read_reply()
- self.assertTrue(reply == "Stopping server")
+ self.assertEqual(reply, "Stopping server")
def test_ssh_server(self):
env = test_util.test_environment()
user = user, agent = True)
c.send_msg("Hola")
reply = c.read_reply()
- self.assertTrue(reply == "Reply to: Hola")
+ self.assertEqual(reply, "Reply to: Hola")
c.send_stop()
reply = c.read_reply()
- self.assertTrue(reply == "Stopping server")
+ self.assertEqual(reply, "Stopping server")
def test_ssh_server_reconnect(self):
env = test_util.test_environment()
c.send_msg("Hola")
reply = c.read_reply()
- self.assertTrue(reply == "Reply to: Hola")
+ self.assertEqual(reply, "Reply to: Hola")
# disconnect
del c
c.send_msg("Hola")
reply = c.read_reply()
- self.assertTrue(reply == "Reply to: Hola")
+ self.assertEqual(reply, "Reply to: Hola")
c.send_stop()
reply = c.read_reply()
- self.assertTrue(reply == "Stopping server")
+ self.assertEqual(reply, "Stopping server")
def test_ssh_server_auto_reconnect(self):
env = test_util.test_environment()
c.send_msg("Hola")
reply = c.read_reply()
- self.assertTrue(reply == "Reply to: Hola")
+ self.assertEqual(reply, "Reply to: Hola")
# purposedly break the connection
c._process.stdin.close()
# assert that the communication works (possible with auto-reconnection)
c.send_msg("Hola")
reply = c.read_reply()
- self.assertTrue(reply == "Reply to: Hola")
+ self.assertEqual(reply, "Reply to: Hola")
c.send_stop()
reply = c.read_reply()
- self.assertTrue(reply == "Stopping server")
+ self.assertEqual(reply, "Stopping server")
def tearDown(self):
shutil.rmtree(self.root_dir)