61
61
from scapy .error import warning
62
62
from scapy .config import conf
63
63
64
+ # Typing imports
65
+ from typing import (
66
+ List ,
67
+ Optional ,
68
+ Union ,
69
+ )
70
+
64
71
dhcpmagic = b"c\x82 Sc"
65
72
66
73
@@ -601,27 +608,33 @@ class BOOTP_am(AnsweringMachine):
601
608
filter = "udp and port 68 and port 67"
602
609
603
610
def parse_options (self ,
604
- pool = Net ("192.168.1.128/25" ),
605
- network = "192.168.1.0/24" ,
606
- gw = "192.168.1.1" ,
607
- nameserver = None ,
608
- domain = None ,
609
- renewal_time = 60 ,
610
- lease_time = 1800 ,
611
+ pool : Union [ Net , List [ str ]] = Net ("192.168.1.128/25" ),
612
+ network : str = "192.168.1.0/24" ,
613
+ gw : str = "192.168.1.1" ,
614
+ nameserver : Union [ str , List [ str ]] = None ,
615
+ domain : Optional [ str ] = None ,
616
+ renewal_time : int = 60 ,
617
+ lease_time : int = 1800 ,
611
618
** kwargs ):
612
619
"""
613
620
:param pool: the range of addresses to distribute. Can be a Net,
614
621
a list of IPs or a string (always gives the same IP).
615
622
:param network: the subnet range
616
623
:param gw: the gateway IP (can be None)
617
- :param nameserver: the DNS server IP (by default, same than gw)
624
+ :param nameserver: the DNS server IP (by default, same than gw).
625
+ This can also be a list.
618
626
:param domain: the domain to advertise (can be None)
619
627
620
628
Other DHCP parameters can be passed as kwargs. See DHCPOptions in dhcp.py.
621
629
For instance::
622
630
623
631
dhcpd(pool=Net("10.0.10.0/24"), network="10.0.0.0/8", gw="10.0.10.1",
624
632
classless_static_routes=["1.2.3.4/32:9.8.7.6"])
633
+
634
+ Other example with different options::
635
+
636
+ dhcpd(pool=Net("10.0.10.0/24"), network="10.0.0.0/8", gw="10.0.10.1",
637
+ nameserver=["8.8.8.8", "4.4.4.4"], domain="DOMAIN.LOCAL")
625
638
"""
626
639
self .domain = domain
627
640
netw , msk = (network .split ("/" ) + ["32" ])[:2 ]
@@ -630,7 +643,13 @@ def parse_options(self,
630
643
self .network = ltoa (atol (netw ) & msk )
631
644
self .broadcast = ltoa (atol (self .network ) | (0xffffffff & ~ msk ))
632
645
self .gw = gw
633
- self .nameserver = nameserver or gw
646
+ if nameserver is None :
647
+ self .nameserver = (gw ,)
648
+ elif isinstance (nameserver , str ):
649
+ self .nameserver = (nameserver ,)
650
+ else :
651
+ self .nameserver = tuple (nameserver )
652
+
634
653
if isinstance (pool , str ):
635
654
pool = Net (pool )
636
655
if isinstance (pool , Iterable ):
@@ -691,7 +710,7 @@ def make_reply(self, req):
691
710
("server_id" , self .gw ),
692
711
("domain" , self .domain ),
693
712
("router" , self .gw ),
694
- ("name_server" , self .nameserver ),
713
+ ("name_server" , * self .nameserver ),
695
714
("broadcast_address" , self .broadcast ),
696
715
("subnet_mask" , self .netmask ),
697
716
("renewal_time" , self .renewal_time ),
0 commit comments