# Copyright (C) 2014 INRIA
#
# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation;
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# Author: Alina Quereilhac <alina.quereilhac@inria.fr>
import base64
-import cPickle
+import pickle
import errno
import logging
import os
from optparse import OptionParser, SUPPRESS_HELP
-from ns3wrapper import NS3Wrapper
+from nepi.resources.ns3.ns3wrapper import NS3Wrapper
class NS3WrapperMessage:
CREATE = "CREATE"
return "FLUSHED"
-def create_socket(socket_name):
+def open_socket(socket_name):
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind(socket_name)
return sock
+def close_socket(sock):
+ try:
+ sock.close()
+ except:
+ pass
+
def recv_msg(conn):
msg = []
chunk = ''
while '\n' not in chunk:
try:
chunk = conn.recv(1024)
- except (OSError, socket.error), e:
+ except (OSError, socket.error) as e:
if e[0] != errno.EINTR:
raise
# Ignore eintr errors
def decode(item):
item = base64.b64decode(item).rstrip()
- return cPickle.loads(item)
+ return pickle.loads(item)
- decoded = map(decode, msg.split("|"))
+ decoded = [ decode(x) for x in msg.split("|") ]
# decoded message
dmsg_type = decoded.pop(0)
return (dmsg_type, dargs, dkwargs)
def send_reply(conn, reply):
- encoded = base64.b64encode(cPickle.dumps(reply))
+ encoded = base64.b64encode(pickle.dumps(reply))
conn.send("%s\n" % encoded)
def get_options():
ns3_wrapper.logger.info("STARTING...")
# create unix socket to receive instructions
- sock = create_socket(socket_name)
+ sock = open_socket(socket_name)
sock.listen(0)
# wait for messages to arrive and process them
while not stop:
conn, addr = sock.accept()
- conn.settimeout(5)
+ conn.settimeout(30)
try:
(msg_type, args, kwargs) = recv_msg(conn)
- except socket.timeout, e:
+ except socket.timeout as e:
# Ingore time-out
+ close_socket(conn)
continue
if not msg_type:
# Ignore - connection lost
+ close_socket(conn)
continue
if msg_type == NS3WrapperMessage.SHUTDOWN:
import traceback
err = traceback.format_exc()
ns3_wrapper.logger.error(err)
+ close_socket(conn)
raise
try:
import traceback
err = traceback.format_exc()
ns3_wrapper.logger.error(err)
+ close_socket(conn)
raise
+ close_socket(conn)
+
+ close_socket(sock)
+
ns3_wrapper.logger.info("EXITING...")
if __name__ == '__main__':