|
1 | 1 | #!/usr/bin/env python |
2 | 2 | # -*- coding: utf-8 -*- |
3 | 3 |
|
4 | | -from .main import RawPacket, RawSocket |
| 4 | +from .packet import RawPacket |
| 5 | +from .socket import RawSocket |
5 | 6 | from .util import get_hw, to_bytes, protocol_to_ethertype |
6 | 7 |
|
7 | 8 | class RawServer(object): |
| 9 | + """A **Blocking** base server implementation of a server on top of the RawSocket. |
| 10 | + It waits for data, encapsulate the data in the RequestHandlerClass provided and blocks until the RequestHandlerClass run() function finishes. |
| 11 | +
|
| 12 | + :note: packet = recv() |
| 13 | + -> RequestHandlerClass(packet) |
| 14 | + -> RequestHandlerClass.run() |
| 15 | + -> loop |
| 16 | + """ |
8 | 17 | def __init__(self, interface, protocol, RequestHandlerClass): |
| 18 | + """ |
| 19 | +
|
| 20 | + :param interface: interface to be used. |
| 21 | + :type interface: str |
| 22 | + :param protocol: Ethernet II protocol, RawSocket [1536-65535] |
| 23 | + :type protocol: int |
| 24 | + :param RequestHandlerClass: The class that will handle the requests |
| 25 | + :type RequestHandlerClass: RawServerCallback |
| 26 | + """ |
9 | 27 | self.RequestHandlerClass = RequestHandlerClass |
10 | 28 | self.socket = RawSocket(interface, protocol) |
11 | 29 | self.recv = self.socket.recv |
12 | 30 | self.running = False |
13 | 31 |
|
14 | 32 | def spin_once(self): |
| 33 | + """Handles the next message""" |
15 | 34 | packet = self.recv() |
16 | 35 | handler = self.RequestHandlerClass(packet, self) |
17 | 36 | self.handle_handler(handler) |
18 | 37 |
|
19 | 38 | def handle_handler(self, handler): |
| 39 | + """Manage the handler, can be overwritten""" |
20 | 40 | handler.run() |
21 | 41 |
|
22 | 42 | def spin(self): |
| 43 | + """Loops until self.running becomes False (from a Request Handler or another thread/coroutine)""" |
23 | 44 | self.running = True |
24 | 45 | while self.running: |
25 | 46 | self.spin_once() |
26 | 47 |
|
27 | 48 |
|
28 | 49 | class RawServerCallback(RawServer): |
| 50 | + """A blocking server implementation that uses a centralized callback. This is useful for a stateful server. |
| 51 | +
|
| 52 | + :note: packet = recv() |
| 53 | + -> RequestHandlerClass(packet, self) |
| 54 | + -> callback(RequestHandlerClass, self) |
| 55 | + -> loop |
| 56 | + """ |
29 | 57 | def __init__(self, interface, protocol, RequestHandlerClass, callback): |
| 58 | + """ |
| 59 | + :param interface: interface to be used. |
| 60 | + :type interface: str |
| 61 | + :param protocol: Ethernet II protocol, RawSocket [1536-65535] |
| 62 | + :type protocol: int |
| 63 | + :param RequestHandlerClass: The class that will handle the requests |
| 64 | + :type RequestHandlerClass: RawServerCallback |
| 65 | + :param callback: callback to be used. |
| 66 | + :type callback: function |
| 67 | + """ |
30 | 68 | self.callback = callback |
31 | 69 | RawServer.__init__(self, interface, protocol, RequestHandlerClass) |
32 | 70 |
|
33 | 71 | def handle_handler(self, handler): |
| 72 | + """ |
| 73 | + Overwritten: Calls callback(handler, self) instead. |
| 74 | + """ |
34 | 75 | self.callback(handler, self) |
35 | 76 |
|
36 | 77 |
|
37 | 78 | class RawRequestHandler(object): |
| 79 | + """The class that handles the request. |
| 80 | + It has access to the packet and the server data. |
| 81 | + """ |
38 | 82 | def __init__(self, packet, server): |
39 | 83 | self.packet = packet |
| 84 | + """:description: Packet received |
| 85 | + :type: RawPacket""" |
40 | 86 | self.server = server |
41 | | - # self.server.socket.sock = low level socket |
| 87 | + """:description: Server from which the packet comes |
| 88 | + :type: RawServer""" |
42 | 89 |
|
43 | 90 | def finish(self): |
| 91 | + """empty: To be **overwritten**""" |
44 | 92 | pass |
45 | 93 |
|
46 | 94 | def setup(self): |
| 95 | + """empty: To be **overwritten**""" |
47 | 96 | pass |
48 | 97 |
|
49 | 98 | def handle(self): |
50 | | - print(self.packet) |
| 99 | + """empty: To be **overwritten**""" |
| 100 | + pass |
51 | 101 |
|
52 | 102 | def run(self): |
| 103 | + """Run the request handling process: |
| 104 | +
|
| 105 | + try: |
| 106 | + * self.setup() |
| 107 | + * self.handle() |
| 108 | + finally: |
| 109 | + * self.finish() |
| 110 | + """ |
53 | 111 | try: |
54 | 112 | self.setup() |
55 | 113 | self.handle() |
|
0 commit comments