From b44466d696771aacdc79eab40afe56b82f5c290d Mon Sep 17 00:00:00 2001 From: zack-vii Date: Thu, 5 Nov 2020 14:19:28 +0100 Subject: [PATCH 1/2] packet: fixed mac starting with 00: --- dhcppython/packet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dhcppython/packet.py b/dhcppython/packet.py index a53f4c2..6579de0 100644 --- a/dhcppython/packet.py +++ b/dhcppython/packet.py @@ -65,7 +65,7 @@ class DHCPPacket(object): magic_cookie: ClassVar[bytes] = b"\x63\x82\x53\x63" cookie_offset_start: ClassVar[int] = 236 cookie_offset_end: ClassVar[int] = 240 - packet_fmt: ClassVar[str] = ">BBBBLHHLLLL16s64s128s" + packet_fmt: ClassVar[str] = "!BBBBLHHLLLL16s64s128s" op_map: ClassVar[Dict[int, str]] = {1: "BOOTREQUEST", 2: "BOOTREPLY"} inverse_op_map: ClassVar[Dict[str, int]] = {v: k for k, v in op_map.items()} htype_map: ClassVar[Dict[int, str]] = { @@ -125,7 +125,7 @@ def from_bytes(cls, packet: bytes): raise MalformedPacketError("Magic cookie missing") try: decoded_packet = [ - field.strip(b"\x00") if isinstance(field, bytes) else field + field.rstrip(b"\x00") if isinstance(field, bytes) else field for field in struct.unpack( cls.packet_fmt, packet[: cls.cookie_offset_start] ) From 5bb8d8e79b58774a3fed9240ba3b606323d48aa6 Mon Sep 17 00:00:00 2001 From: zack-vii Date: Thu, 5 Nov 2020 14:30:09 +0100 Subject: [PATCH 2/2] fixed for python3.7; replaced := and format {var=} syntax --- dhcppython/client.py | 49 ++++++++++++++++++++++--------------------- dhcppython/options.py | 6 ++---- dhcppython/packet.py | 3 ++- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/dhcppython/client.py b/dhcppython/client.py index 9a90749..7954230 100644 --- a/dhcppython/client.py +++ b/dhcppython/client.py @@ -29,11 +29,8 @@ def format_dhcp_packet(pkt: packet.DHCPPacket) -> str: broadcast = "BROADCAST" if pkt.flags else "UNICAST" client_info_padding = 18 client_info = f"{pkt.htype} - {pkt.chaddr} ({utils.mac2vendor(pkt.chaddr)})" - if ( - visual_diff := ( - utils.visual_length(client_info) - (COL_LEN - client_info_padding) - ) - ) > 0: + visual_diff = (utils.visual_length(client_info) - (COL_LEN - client_info_padding)) + if visual_diff > 0: client_info = client_info[:-visual_diff] output = ( @@ -172,15 +169,16 @@ def get_lease( if verbose > 1: print(format_dhcp_packet(discover)) start = default_timer() - logging.debug(f"Sending discover packet to {server} with {tx_id=}") + logging.debug(f"Sending discover packet to {server} with {tx_id}") self.send_discover(server, discover, verbose) # O tries = 0 - while not (offer := self.receive_offer(tx_id, verbose)): + offer = self.receive_offer(tx_id, verbose) + while not offer: logging.debug(f"Sleeping {self.retry_interval} ms then retrying discover") sleep(self.retry_interval / 1000) logging.debug( - f"Attempt {tries} - Sending discover packet to {server} with {tx_id=}" + f"Attempt {tries} - Sending discover packet to {server} with {tx_id}" ) if verbose > 1: print("Resending DISCOVER packet") @@ -190,6 +188,7 @@ def get_lease( "Unable to obtain offer run client with -d for debug info" ) tries += 1 + offer = self.receive_offer(tx_id, verbose) # R request = packet.DHCPPacket.Request( mac_addr, @@ -204,15 +203,16 @@ def get_lease( print("REQUEST Packet") print(format_dhcp_packet(request)) logging.debug(f"Constructed request packet: {request}") - logging.debug(f"Sending request packet to {server} with {tx_id=}") + logging.debug(f"Sending request packet to {server} with {tx_id}") self.send_request(server, request, verbose) # A tries = 0 - while not (ack := self.receive_ack(tx_id, verbose)): + ack = self.receive_ack(tx_id, verbose) + while not ack: logging.debug(f"Sleeping {self.retry_interval} ms then retrying request") sleep(self.retry_interval / 1000) logging.debug( - f"Attempt {tries} - Sending request packet to {server} with {tx_id=}" + f"Attempt {tries} - Sending request packet to {server} with {tx_id}" ) if verbose > 1: print("Resending REQUEST packet") @@ -222,7 +222,7 @@ def get_lease( "Unable to obtain ack run client with -d for debug info" ) tries += 1 - + ack = self.receive_ack(tx_id, verbose) lease_time = default_timer() - start lease = Lease(discover, offer, request, ack, lease_time, self.ack_server) @@ -256,19 +256,19 @@ def listen( logging.debug( f"Select: {select.select(self.listening_sockets, self.writing_sockets, self.except_sockets, 0)}" ) - if len( - socks := select.select( + socks = select.select( self.listening_sockets, self.writing_sockets, self.except_sockets, self.select_timout, )[0] - ): + if len(socks): for sock in socks: data, addr = sock.recvfrom(self.max_pkt_size) logging.debug(f"Received data from {addr}: {data}") + dhcp_packet = self.get_valid_pkt(data) if ( - (dhcp_packet := self.get_valid_pkt(data)) is not None + dhcp_packet is not None and dhcp_packet.xid == tx_id and dhcp_packet.msg_type == msg_type ): @@ -283,12 +283,14 @@ def listen( logging.debug( f"TX ID does not match expected ID {dhcp_packet.xid} != {tx_id}" ) - elif (msg_type_actual := dhcp_packet.msg_type) != msg_type: - logging.debug( - f"DHCP message type does not match expected: {msg_type_actual} != {msg_type}" - ) else: - logging.debug("Something is wrong with this packet") + msg_type_actual = dhcp_packet.msg_type + if msg_type_actual != msg_type: + logging.debug( + f"DHCP message type does not match expected: {msg_type_actual} != {msg_type}" + ) + else: + logging.debug("Something is wrong with this packet") logging.debug(dhcp_packet) dhcp_packet = None tries += 1 @@ -346,14 +348,13 @@ def send(self, remote_addr: str, remote_port: int, data: bytes, verbosity: int): tries = 0 while tries < self.max_tries: logging.debug(f"Select: {select.select(self.listening_sockets, self.writing_sockets, self.except_sockets, self.select_timout,)}") - if len( - socks := select.select( + socks = select.select( self.listening_sockets, self.writing_sockets, self.except_sockets, self.select_timout, )[1] - ): + if socks: sock = socks[0] logging.debug(f"Connecting to {remote_addr}:{remote_port}") logging.debug(f"Sending data {data!r}") diff --git a/dhcppython/options.py b/dhcppython/options.py index 1cfecdb..0c2b1e4 100644 --- a/dhcppython/options.py +++ b/dhcppython/options.py @@ -54,7 +54,7 @@ import csv from abc import ABC, abstractmethod import collections.abc -from typing import Dict, Union, List, Tuple, Optional, TypedDict +from typing import Dict, Union, List, Tuple, Optional import ipaddress import struct import json @@ -74,9 +74,7 @@ } -class CodeDataMapping(TypedDict): - obj: Option - index: int +CodeDataMapping = dict class OptionList(collections.abc.MutableSequence): diff --git a/dhcppython/packet.py b/dhcppython/packet.py index 6579de0..3f6e286 100644 --- a/dhcppython/packet.py +++ b/dhcppython/packet.py @@ -111,7 +111,8 @@ def asbytes(self): @property def msg_type(self) -> Optional[str]: - if msg_type_option := self.options.by_code(53): + msg_type_option = self.options.by_code(53) + if msg_type_option: return list(msg_type_option.value.values())[0] else: return None