Exemplo n.º 1
0
class Emmer(object):
    """This is the wrapping class for the Emmer framework. It initializes
    running services and also offers the client level interface.
    """
    def __init__(self):
        self.host = config.HOST
        self.port = config.PORT
        self.response_router = ResponseRouter()
        self.conversation_table = ConversationTable()
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.reactor = Reactor(self.sock, self.response_router,
                               self.conversation_table)
        self.performer = Performer(self.sock, self.conversation_table,
                                   config.RESEND_TIMEOUT,
                                   config.RETRIES_BEFORE_GIVEUP)

    def route_read(self, filename_pattern):
        """Adds a function with a filename pattern to the Emmer server. Upon a
        read request, Emmer will run the action corresponding to the first
        filename pattern to match the request's filename.

        Use this function as a decorator on a function to add that function
        as an action with which to handle a tftp conversation.

        Args:
            filename_pattern: a regex pattern to match filenames against.
        """
        def decorator(action):
            self.response_router.append_read_rule(filename_pattern, action)

        return decorator

    def route_write(self, filename_pattern):
        """Adds a function with a filename pattern to the Emmer server. Upon a
        write request, Emmer will run the action corresponding to the first
        filename pattern to match the request's filename.

        Use this function as a decorator on a function to add that function
        as an action with which to handle a tftp conversation.

        Args:
            filename_pattern: a regex pattern to match filenames against.
        """
        def decorator(action):
            self.response_router.append_write_rule(filename_pattern, action)

        return decorator

    def run(self):
        """Initiates the Emmer server. This includes:
        * Listening on the given UDP host and port.
        * Sending messages through the given port to reach out on timed out
          tftp conversations.
        """
        self.sock.bind((self.host, self.port))
        print "TFTP Server running at %s:%s" % (self.host, self.port)
        thread.start_new_thread(self.performer.run,
                                (config.PERFORMER_THREAD_INTERVAL, ))
        self.reactor.run()
Exemplo n.º 2
0
class Emmer(object):
    """This is the wrapping class for the Emmer framework. It initializes
    running services and also offers the client level interface.
    """
    def __init__(self):
        self.host = config.HOST
        self.port = config.PORT
        self.response_router = ResponseRouter()
        self.conversation_table = ConversationTable()
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.reactor = Reactor(self.sock, self.response_router,
                               self.conversation_table)
        self.performer = Performer(self.sock, self.conversation_table,
                                   config.RESEND_TIMEOUT,
                                   config.RETRIES_BEFORE_GIVEUP)

    def route_read(self, filename_pattern):
        """Adds a function with a filename pattern to the Emmer server. Upon a
        read request, Emmer will run the action corresponding to the first
        filename pattern to match the request's filename.

        Use this function as a decorator on a function to add that function
        as an action with which to handle a tftp conversation.

        Args:
            filename_pattern: a regex pattern to match filenames against.
        """
        def decorator(action):
            self.response_router.append_read_rule(filename_pattern, action)

        return decorator

    def route_write(self, filename_pattern):
        """Adds a function with a filename pattern to the Emmer server. Upon a
        write request, Emmer will run the action corresponding to the first
        filename pattern to match the request's filename.

        Use this function as a decorator on a function to add that function
        as an action with which to handle a tftp conversation.

        Args:
            filename_pattern: a regex pattern to match filenames against.
        """
        def decorator(action):
            self.response_router.append_write_rule(filename_pattern, action)

        return decorator

    def run(self):
        """Initiates the Emmer server. This includes:
        * Listening on the given UDP host and port.
        * Sending messages through the given port to reach out on timed out
          tftp conversations.
        """
        self.sock.bind((self.host, self.port))
        print "TFTP Server running at %s:%s" % (self.host, self.port)
        thread.start_new_thread(self.performer.run,
                                (config.PERFORMER_THREAD_INTERVAL,))
        self.reactor.run()
Exemplo n.º 3
0
 def __init__(self):
     self.host = config.HOST
     self.port = config.PORT
     self.response_router = ResponseRouter()
     self.conversation_table = ConversationTable()
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     self.reactor = Reactor(self.sock, self.response_router,
                            self.conversation_table)
     self.performer = Performer(self.sock, self.conversation_table,
                                config.RESEND_TIMEOUT,
                                config.RETRIES_BEFORE_GIVEUP)
Exemplo n.º 4
0
    def setUp(self):
        self.router = ResponseRouter()
        # These lambda functions simulate user actions
        self.router.append_read_rule("test1", lambda x, y, z: "1")
        self.router.append_read_rule("test2", lambda x, y, z: "2")
        self.router.append_read_rule("test3.*", lambda x, y, z: "3")
        # These lambda functions simulate user actions
        self.write_action_one = lambda x, y, z, data: "%s_4" % data
        self.write_action_two = lambda x, y, z, data: "%s_5" % data
        self.write_action_three = lambda x, y, z, data: "%s_6" % data

        self.router.append_write_rule("test1", self.write_action_one)
        self.router.append_write_rule("test2", self.write_action_two)
        self.router.append_write_rule("test3.*", self.write_action_three)
Exemplo n.º 5
0
 def __init__(self):
     self.host = config.HOST
     self.port = config.PORT
     self.response_router = ResponseRouter()
     self.conversation_table = ConversationTable()
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
     self.reactor = Reactor(self.sock, self.response_router,
                            self.conversation_table)
     self.performer = Performer(self.sock, self.conversation_table,
                                config.RESEND_TIMEOUT,
                                config.RETRIES_BEFORE_GIVEUP)
Exemplo n.º 6
0
    def setUp(self):
        self.router = ResponseRouter()
        # These lambda functions simulate user actions
        self.router.append_read_rule("test1", lambda x, y, z: "1")
        self.router.append_read_rule("test2", lambda x, y, z: "2")
        self.router.append_read_rule("test3.*", lambda x, y, z: "3")
        # These lambda functions simulate user actions
        self.write_action_one = lambda x, y, z, data: "%s_4" % data
        self.write_action_two = lambda x, y, z, data: "%s_5" % data
        self.write_action_three = lambda x, y, z, data: "%s_6" % data

        self.router.append_write_rule("test1", self.write_action_one)
        self.router.append_write_rule("test2", self.write_action_two)
        self.router.append_write_rule("test3.*", self.write_action_three)
Exemplo n.º 7
0
class TestResponseRouter(unittest.TestCase):
    def setUp(self):
        self.router = ResponseRouter()
        # These lambda functions simulate user actions
        self.router.append_read_rule("test1", lambda x, y, z: "1")
        self.router.append_read_rule("test2", lambda x, y, z: "2")
        self.router.append_read_rule("test3.*", lambda x, y, z: "3")
        # These lambda functions simulate user actions
        self.write_action_one = lambda x, y, z, data: "%s_4" % data
        self.write_action_two = lambda x, y, z, data: "%s_5" % data
        self.write_action_three = lambda x, y, z, data: "%s_6" % data

        self.router.append_write_rule("test1", self.write_action_one)
        self.router.append_write_rule("test2", self.write_action_two)
        self.router.append_write_rule("test3.*", self.write_action_three)

    def test_initialize_read(self):
        read_buffer = self.router.initialize_read("test1", "127.0.0.1", 3942)
        self.assertEqual(read_buffer.data, "1")

        read_buffer = self.router.initialize_read("test2", "127.0.0.1", 3942)
        self.assertEqual(read_buffer.data, "2")

        read_buffer = self.router.initialize_read("test3", "127.0.0.1", 3942)
        self.assertEqual(read_buffer.data, "3")

        read_buffer = self.router.initialize_read("test3if", "127.0.0.1", 3942)
        self.assertEqual(read_buffer.data, "3")

    def test_initialize_read_for_no_action(self):
        read_buffer = self.router.initialize_read("test4", "127.0.0.1", 3942)
        self.assertEqual(read_buffer, None)

    def test_initialize_write(self):
        write_action = self.router.initialize_write("test1", "127.0.0.1", 3942)
        self.assertEqual(write_action("a", "b", "c", "d"), "d_4")

        write_action = self.router.initialize_write("test2", "127.0.0.1", 3942)
        self.assertEqual(write_action("a", "b", "c", "d"), "d_5")

        write_action = self.router.initialize_write("test3", "127.0.0.1", 3942)
        self.assertEqual(write_action("a", "b", "c", "d"), "d_6")

    def test_initialize_write_for_no_action(self):
        write_action = self.router.initialize_write("test4", "127.0.0.1", 3942)
        self.assertEqual(write_action, None)
Exemplo n.º 8
0
class TestResponseRouter(unittest.TestCase):
    def setUp(self):
        self.router = ResponseRouter()
        # These lambda functions simulate user actions
        self.router.append_read_rule("test1", lambda x, y, z: "1")
        self.router.append_read_rule("test2", lambda x, y, z: "2")
        self.router.append_read_rule("test3.*", lambda x, y, z: "3")
        # These lambda functions simulate user actions
        self.write_action_one = lambda x, y, z, data: "%s_4" % data
        self.write_action_two = lambda x, y, z, data: "%s_5" % data
        self.write_action_three = lambda x, y, z, data: "%s_6" % data

        self.router.append_write_rule("test1", self.write_action_one)
        self.router.append_write_rule("test2", self.write_action_two)
        self.router.append_write_rule("test3.*", self.write_action_three)

    def test_initialize_read(self):
        read_buffer = self.router.initialize_read("test1", "127.0.0.1", 3942)
        self.assertEqual(read_buffer.data, "1")

        read_buffer = self.router.initialize_read("test2", "127.0.0.1", 3942)
        self.assertEqual(read_buffer.data, "2")

        read_buffer = self.router.initialize_read("test3", "127.0.0.1", 3942)
        self.assertEqual(read_buffer.data, "3")

        read_buffer = self.router.initialize_read("test3if", "127.0.0.1", 3942)
        self.assertEqual(read_buffer.data, "3")

    def test_initialize_read_for_no_action(self):
        read_buffer = self.router.initialize_read("test4", "127.0.0.1", 3942)
        self.assertEqual(read_buffer, None)

    def test_initialize_write(self):
        write_action = self.router.initialize_write("test1", "127.0.0.1", 3942)
        self.assertEqual(write_action("a", "b", "c", "d"), "d_4")

        write_action = self.router.initialize_write("test2", "127.0.0.1", 3942)
        self.assertEqual(write_action("a", "b", "c", "d"), "d_5")

        write_action = self.router.initialize_write("test3", "127.0.0.1", 3942)
        self.assertEqual(write_action("a", "b", "c", "d"), "d_6")

    def test_initialize_write_for_no_action(self):
        write_action = self.router.initialize_write("test4", "127.0.0.1", 3942)
        self.assertEqual(write_action, None)