Пример #1
0
    def __init__(self, **kwargs):
        threading.Thread.__init__(self)

        # TODO find a better Database name
        self.db_name = kwargs.get('db_name', self.__class__.__name__)
        self.db = DTNDatabase(self.db_name)

        # IP
        self.my_ip = kwargs.get(
            'ip', '127.0.0.1')  #socket.gethostbyname(socket.gethostname()))

        self.dtn_port = kwargs.get('dtn_port', 5555)
        self.dtn_listen = None

        self.bcast_port = kwargs.get('bcast_port', 6666)
        self.bcast_listen = None

        # Sensor Host Information
        # = server if it is Server Site Manager
        # = mobile if it is Mobile Site Manager
        self.sh = kwargs.get('sh', '')

        # Target
        # * means all
        # or a list of SH
        # Normally, server needs *
        #           client needs data of its own sh
        self.target = kwargs.get('target', '*')

        # DTN connection dict
        # (SH, DTNConn)
        self.dtn = dict()
        # Dict which stores (SH, LastHash)
        self.last_hash = dict()

        # The last message received
        # (SH, HASH)
        self.last_hash = dict()

        # flags
        self.stop_flag = False
        self.server_connected = False

        # FIXME check if I need this
        self.bufs = dict()

        # FIXME seems does not work
        signal.signal(signal.SIGINT, self.sighandler)
Пример #2
0
    def __init__(self, **kwargs):
        threading.Thread.__init__(self)

        # TODO find a better Database name
        self.db_name = kwargs.get('db_name', self.__class__.__name__)
        self.db = DTNDatabase(self.db_name)

        # IP
        self.my_ip = kwargs.get('ip', '127.0.0.1')#socket.gethostbyname(socket.gethostname()))

        self.dtn_port = kwargs.get('dtn_port', 5555)
        self.dtn_listen = None

        self.bcast_port = kwargs.get('bcast_port', 6666)
        self.bcast_listen = None

        # Sensor Host Information
        # = server if it is Server Site Manager
        # = mobile if it is Mobile Site Manager
        self.sh = kwargs.get('sh', '')

        # Target
        # * means all
        # or a list of SH
        # Normally, server needs *
        #           client needs data of its own sh
        self.target = kwargs.get('target', '*')

        # DTN connection dict
        # (SH, DTNConn)
        self.dtn = dict()
        # Dict which stores (SH, LastHash)
        self.last_hash = dict()

        # The last message received 
        # (SH, HASH)
        self.last_hash = dict()

        # flags
        self.stop_flag = False
        self.server_connected = False

        # FIXME check if I need this
        self.bufs = dict()

        # FIXME seems does not work
        signal.signal(signal.SIGINT, self.sighandler)
Пример #3
0
__date__ = 'Sun Apr  3 15:29:43 2011'
__version__ = '0.1'

import sys
import time

from DTNDatabase import DTNDatabase
from DTNMessage import DTNMessage

# dtncmd HOST NODE {CMD}

if len(sys.argv) < 3:
    print 'python dtncmd.py 001E8C6C9172 ls'
    sys.exit()
t = int(time.time() * 1000)

msg = '%d %s %d CMD {%s}' % (t, sys.argv[1], 30 * 24 * 60 * 60 * 1000,
                             ' '.join(sys.argv[2:]))
m = DTNMessage()
m.handle(msg)

# TODO set message ip and port if possible

db = DTNDatabase('trapper')
db.insert_msg(m)
db.close()

print 'OK'
#for msg in db.select_all():
#print msg
Пример #4
0
class BaseDTNDevice(threading.Thread):
    def __init__(self, **kwargs):
        threading.Thread.__init__(self)

        # TODO find a better Database name
        self.db_name = kwargs.get('db_name', self.__class__.__name__)
        self.db = DTNDatabase(self.db_name)

        # IP
        self.my_ip = kwargs.get('ip', '127.0.0.1')#socket.gethostbyname(socket.gethostname()))

        self.dtn_port = kwargs.get('dtn_port', 5555)
        self.dtn_listen = None

        self.bcast_port = kwargs.get('bcast_port', 6666)
        self.bcast_listen = None

        # Sensor Host Information
        # = server if it is Server Site Manager
        # = mobile if it is Mobile Site Manager
        self.sh = kwargs.get('sh', '')

        # Target
        # * means all
        # or a list of SH
        # Normally, server needs *
        #           client needs data of its own sh
        self.target = kwargs.get('target', '*')

        # DTN connection dict
        # (SH, DTNConn)
        self.dtn = dict()
        # Dict which stores (SH, LastHash)
        self.last_hash = dict()

        # The last message received 
        # (SH, HASH)
        self.last_hash = dict()

        # flags
        self.stop_flag = False
        self.server_connected = False

        # FIXME check if I need this
        self.bufs = dict()

        # FIXME seems does not work
        signal.signal(signal.SIGINT, self.sighandler)
        
    def sighandler(self, signum, frame):
        self.stop()

    def sub_init(self):
        pass

    def run(self):

        self.sub_init()
        self.stop_flag = False

        # open listener
        self.open_listener()

        while not self.stop_flag:
            try:
                self.work()
            except :
                logger.error(sys.exc_info()[0])
                break

    # TODO 
    def stop(self):
        self.stop_flag = True
        for sh in self.dtn:
            if self.dtn[sh] is not None:
                self.dtn[sh].stop()
                self.dtn[sh] = None
        self.close_all_sockets()

        self.db.close()
        self.db.join()

    def open_listener(self):
        """ Open Listeners  
            @rewrite if implementing subclass
        """
        self.dtn_listen = DTN._tcp_listen(self.my_ip, self.dtn_port)
        self.bcast_listen = DTN._broadcast_listen(self.bcast_port)

    def close_all_sockets(self):
        """ Close all sockets """
        readers = self.get_sockets(self.get_handle_map())

        for s in readers:
            if s is not None:
                DTN._cleanup_socket(s)

    def get_handle_map(self):
        """ Return new (variable, function) list
            f_map is a list of tuples
            [(socket, func), (socket, func)]
            @rewrite if implementing subclass which handles more sockets
            """
        f_map = [
                (self.dtn_listen    ,self.handle_dtn_listen),
                (self.bcast_listen  ,self.handle_bcast_listen),
                ]

        return f_map

    def get_sockets(self, l):
        """ return all the sockets
        """
        readers = list()
        for s in l:
            if isinstance(s[0], socket.socket):
                readers += [s[0]]
            elif isinstance(s[0], list):
                readers += s[0]

        return readers

    def work(self):

        # update f_map and readers
        f_map = self.get_handle_map()
        readers = self.get_sockets(f_map)

        try:
            ready_to_read, ready_to_write, in_error = select.select(readers, [], [], 3)
        except socket.timeout:
            return
        except:
            logger.error('work error')
            return

        for r in ready_to_read:
            for s in f_map:
                if isinstance(s[0], socket.socket):
                    if r == s[0]:
                        s[1](r)
                        break
                elif isinstance(s[0], list):
                    if r in s[0]:
                        s[1](r)
                        break


    def handle_bcast_listen(self, s):
        """docstring for handle_bcast_listen"""
        logger.debug('Recv bcast')

        msg, addr = s.recvfrom(65535)

        # send back DTN Port
        s.sendto('%s %d' % (self.my_ip, self.dtn_port), addr)

    def bcast(self, bcast_port):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        s.sendto(BCAST_MSG, ('<broadcast>', bcast_port))
        logger.debug('send broadcast')

        s.settimeout(2)

        try:
            buf, addr = s.recvfrom(2048)
            logger.info('Received from %s: %s' % (buf.split()[0], buf.split()[1]))
            s.close()
            return buf.split()[0], int(buf.split()[1])

        except socket.timeout:
            logger.debug('no feedback')
        except :
            logger.debug('bcast socket error')

        s.close()
        return None

    def handle_dtn_listen(self, s):

        logger.info('DTN connection request')
        conn_recv, remote = s.accept()

        data = conn_recv.recv(1024)
        sh = data.split()[0]
        tar = ' '.join(data.split()[1:])
        logger.debug('SH: %s, Target: %s' % (sh, tar))

        if self.dtn.has_key(sh):
            logger.debug(self.dtn[sh])

        if self.dtn.has_key(sh) and self.dtn[sh] is not None:
            conn_recv.send(EXIST_ERR)
            logger.debug('DTN connection already exists between these two Site Managers')
            return False

        # Generate a random port for listening
        random_n = 1
        listener = None
        while True:
            try:
                listener = DTN._tcp_listen(self.my_ip, self.dtn_port+random_n)
            except:
                random_n += 1
                continue

            break
        conn_recv.send('%s %d %s' % (self.sh, self.dtn_port+random_n, self.target))
        data = conn_recv.recv(1024)

        if data == EXIST_ERR:
            logger.debug('DTN connection already exists between these two Site Managers')
            return False

        # wait for connection
        listener.settimeout(5)
        try:
            conn_send, remote = listener.accept()
        except socket.timeout:
            logger.debug('timeout')
            return False

        # remote[0] is IP
        # remote[1] is PORT
        #conn_send = DTN._tcp_connect(remote[0], port)

        if conn_send is not None:
            # send my SH info
            #conn_send.send('%s %s' % (self.sh, self.target))

            #data = conn_send.recv(1024) 
            #if data == EXIST_ERR:
                #logger.debug('DTN connection already exists between these two Site Managers')
                #return 
            #else:
                #logger.debug('Good')

            # Ready
            dtn_conn = DTNConnection(conn_send, conn_recv, self.sh, sh, tar, self)
            self.dtn[sh] = dtn_conn
            if not self.last_hash.has_key(sh):
                self.last_hash[sh] = ''
            #if sh == SERVER_SH_INFO:
                #self.server_connected = True
            logger.info('New DTN connection established')
            dtn_conn.start()
            return True

        return False

    def connect_to_sm(self, ip, port, server_conn=False):
        """ connect to specific IP:PORT
        """
        logger.debug('Try to connect to Site Manager and establish DTN connection')

        conn_send = DTN._tcp_connect(ip, port)

        if conn_send is not None:

            # send information
            conn_send.send('%s %s\n' % (self.sh, self.target))

            data = conn_send.recv(1024) 
            port_recv = 0

            if data == EXIST_ERR:
                logger.debug('DTN connection already exists between these two Site Managers')
                return False

            sh = data.split()[0]
            port_recv = int(data.split()[1])
            tar = ' '.join(data.split()[2:])
            logger.debug('SH: %s, Port: %d, Target: %s' % (sh, port_recv, tar))

            # check if site manager is connected
            if self.dtn.has_key(sh) and self.dtn[sh] is not None:
                conn_send.send(EXIST_ERR)
                logger.debug('DTN connection already exists between these two Site Managers')
                return False
            else:
                conn_send.send(SUCCESS_INFO)

            # connect to ip using another port
            conn_recv = DTN._tcp_connect(ip, port_recv)

            if conn_recv is not None:

                # Ready
                dtn_conn = DTNConnection(conn_send, conn_recv, self.sh, sh, tar, self, server_conn=server_conn)

                self.dtn[sh] = dtn_conn
                if not self.last_hash.has_key(sh):
                    self.last_hash[sh] = ''

                logger.info('New DTN connection established')
                dtn_conn.start()

                return True

        return False

    def stop_sh(self, sh):
        if self.dtn[sh].has_key(sh):
            self.dtn[sh].stop()
        else:
            logger.warning("no connection to %s" % sh)

    def list_connected_sh(self):
        return self.dtn.keys()
Пример #5
0
class BaseDTNDevice(threading.Thread):
    def __init__(self, **kwargs):
        threading.Thread.__init__(self)

        # TODO find a better Database name
        self.db_name = kwargs.get('db_name', self.__class__.__name__)
        self.db = DTNDatabase(self.db_name)

        # IP
        self.my_ip = kwargs.get(
            'ip', '127.0.0.1')  #socket.gethostbyname(socket.gethostname()))

        self.dtn_port = kwargs.get('dtn_port', 5555)
        self.dtn_listen = None

        self.bcast_port = kwargs.get('bcast_port', 6666)
        self.bcast_listen = None

        # Sensor Host Information
        # = server if it is Server Site Manager
        # = mobile if it is Mobile Site Manager
        self.sh = kwargs.get('sh', '')

        # Target
        # * means all
        # or a list of SH
        # Normally, server needs *
        #           client needs data of its own sh
        self.target = kwargs.get('target', '*')

        # DTN connection dict
        # (SH, DTNConn)
        self.dtn = dict()
        # Dict which stores (SH, LastHash)
        self.last_hash = dict()

        # The last message received
        # (SH, HASH)
        self.last_hash = dict()

        # flags
        self.stop_flag = False
        self.server_connected = False

        # FIXME check if I need this
        self.bufs = dict()

        # FIXME seems does not work
        signal.signal(signal.SIGINT, self.sighandler)

    def sighandler(self, signum, frame):
        self.stop()

    def sub_init(self):
        pass

    def run(self):

        self.sub_init()
        self.stop_flag = False

        # open listener
        self.open_listener()

        while not self.stop_flag:
            try:
                self.work()
            except:
                logger.error(sys.exc_info()[0])
                break

    # TODO
    def stop(self):
        self.stop_flag = True
        for sh in self.dtn:
            if self.dtn[sh] is not None:
                self.dtn[sh].stop()
                self.dtn[sh] = None
        self.close_all_sockets()

        self.db.close()
        self.db.join()

    def open_listener(self):
        """ Open Listeners  
            @rewrite if implementing subclass
        """
        self.dtn_listen = DTN._tcp_listen(self.my_ip, self.dtn_port)
        self.bcast_listen = DTN._broadcast_listen(self.bcast_port)

    def close_all_sockets(self):
        """ Close all sockets """
        readers = self.get_sockets(self.get_handle_map())

        for s in readers:
            if s is not None:
                DTN._cleanup_socket(s)

    def get_handle_map(self):
        """ Return new (variable, function) list
            f_map is a list of tuples
            [(socket, func), (socket, func)]
            @rewrite if implementing subclass which handles more sockets
            """
        f_map = [
            (self.dtn_listen, self.handle_dtn_listen),
            (self.bcast_listen, self.handle_bcast_listen),
        ]

        return f_map

    def get_sockets(self, l):
        """ return all the sockets
        """
        readers = list()
        for s in l:
            if isinstance(s[0], socket.socket):
                readers += [s[0]]
            elif isinstance(s[0], list):
                readers += s[0]

        return readers

    def work(self):

        # update f_map and readers
        f_map = self.get_handle_map()
        readers = self.get_sockets(f_map)

        try:
            ready_to_read, ready_to_write, in_error = select.select(
                readers, [], [], 3)
        except socket.timeout:
            return
        except:
            logger.error('work error')
            return

        for r in ready_to_read:
            for s in f_map:
                if isinstance(s[0], socket.socket):
                    if r == s[0]:
                        s[1](r)
                        break
                elif isinstance(s[0], list):
                    if r in s[0]:
                        s[1](r)
                        break

    def handle_bcast_listen(self, s):
        """docstring for handle_bcast_listen"""
        logger.debug('Recv bcast')

        msg, addr = s.recvfrom(65535)

        # send back DTN Port
        s.sendto('%s %d' % (self.my_ip, self.dtn_port), addr)

    def bcast(self, bcast_port):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
        s.sendto(BCAST_MSG, ('<broadcast>', bcast_port))
        logger.debug('send broadcast')

        s.settimeout(2)

        try:
            buf, addr = s.recvfrom(2048)
            logger.info('Received from %s: %s' %
                        (buf.split()[0], buf.split()[1]))
            s.close()
            return buf.split()[0], int(buf.split()[1])

        except socket.timeout:
            logger.debug('no feedback')
        except:
            logger.debug('bcast socket error')

        s.close()
        return None

    def handle_dtn_listen(self, s):

        logger.info('DTN connection request')
        conn_recv, remote = s.accept()

        data = conn_recv.recv(1024)
        sh = data.split()[0]
        tar = ' '.join(data.split()[1:])
        logger.debug('SH: %s, Target: %s' % (sh, tar))

        if self.dtn.has_key(sh):
            logger.debug(self.dtn[sh])

        if self.dtn.has_key(sh) and self.dtn[sh] is not None:
            conn_recv.send(EXIST_ERR)
            logger.debug(
                'DTN connection already exists between these two Site Managers'
            )
            return False

        # Generate a random port for listening
        random_n = 1
        listener = None
        while True:
            try:
                listener = DTN._tcp_listen(self.my_ip,
                                           self.dtn_port + random_n)
            except:
                random_n += 1
                continue

            break
        conn_recv.send('%s %d %s' %
                       (self.sh, self.dtn_port + random_n, self.target))
        data = conn_recv.recv(1024)

        if data == EXIST_ERR:
            logger.debug(
                'DTN connection already exists between these two Site Managers'
            )
            return False

        # wait for connection
        listener.settimeout(5)
        try:
            conn_send, remote = listener.accept()
        except socket.timeout:
            logger.debug('timeout')
            return False

        # remote[0] is IP
        # remote[1] is PORT
        #conn_send = DTN._tcp_connect(remote[0], port)

        if conn_send is not None:
            # send my SH info
            #conn_send.send('%s %s' % (self.sh, self.target))

            #data = conn_send.recv(1024)
            #if data == EXIST_ERR:
            #logger.debug('DTN connection already exists between these two Site Managers')
            #return
            #else:
            #logger.debug('Good')

            # Ready
            dtn_conn = DTNConnection(conn_send, conn_recv, self.sh, sh, tar,
                                     self)
            self.dtn[sh] = dtn_conn
            if not self.last_hash.has_key(sh):
                self.last_hash[sh] = ''
            #if sh == SERVER_SH_INFO:
            #self.server_connected = True
            logger.info('New DTN connection established')
            dtn_conn.start()
            return True

        return False

    def connect_to_sm(self, ip, port, server_conn=False):
        """ connect to specific IP:PORT
        """
        logger.debug(
            'Try to connect to Site Manager and establish DTN connection')

        conn_send = DTN._tcp_connect(ip, port)

        if conn_send is not None:

            # send information
            conn_send.send('%s %s\n' % (self.sh, self.target))

            data = conn_send.recv(1024)
            port_recv = 0

            if data == EXIST_ERR:
                logger.debug(
                    'DTN connection already exists between these two Site Managers'
                )
                return False

            sh = data.split()[0]
            port_recv = int(data.split()[1])
            tar = ' '.join(data.split()[2:])
            logger.debug('SH: %s, Port: %d, Target: %s' % (sh, port_recv, tar))

            # check if site manager is connected
            if self.dtn.has_key(sh) and self.dtn[sh] is not None:
                conn_send.send(EXIST_ERR)
                logger.debug(
                    'DTN connection already exists between these two Site Managers'
                )
                return False
            else:
                conn_send.send(SUCCESS_INFO)

            # connect to ip using another port
            conn_recv = DTN._tcp_connect(ip, port_recv)

            if conn_recv is not None:

                # Ready
                dtn_conn = DTNConnection(conn_send,
                                         conn_recv,
                                         self.sh,
                                         sh,
                                         tar,
                                         self,
                                         server_conn=server_conn)

                self.dtn[sh] = dtn_conn
                if not self.last_hash.has_key(sh):
                    self.last_hash[sh] = ''

                logger.info('New DTN connection established')
                dtn_conn.start()

                return True

        return False

    def stop_sh(self, sh):
        if self.dtn[sh].has_key(sh):
            self.dtn[sh].stop()
        else:
            logger.warning("no connection to %s" % sh)

    def list_connected_sh(self):
        return self.dtn.keys()
Пример #6
0
__credits__ = 'Python best'
__date__    = 'Sun Apr  3 15:29:43 2011'
__version__ = '0.1'

import sys
import time

from DTNDatabase import DTNDatabase
from DTNMessage import DTNMessage

# dtncmd HOST NODE {CMD}

if len(sys.argv) < 3:
    print 'python dtncmd.py 001E8C6C9172 ls'
    sys.exit()
t = int(time.time()*1000)

msg = '%d %s %d CMD {%s}' % (t, sys.argv[1], 30*24*60*60*1000, ' '.join(sys.argv[2:]))
m = DTNMessage()
m.handle(msg)

# TODO set message ip and port if possible

db = DTNDatabase('trapper')
db.insert_msg(m)
db.close()

print 'OK'
#for msg in db.select_all():
    #print msg