aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Lindstad <jonaslindstad@gmail.com>2015-02-20 00:44:40 +0100
committerJonas Lindstad <jonaslindstad@gmail.com>2015-02-20 00:44:40 +0100
commit91f05e1be848c651fd02a613a901d9553b8de400 (patch)
tree466b9265e7276c852dd2191aead04c67f63d5294
parent370defe26443e9cadacbcf1c8d0102a84cc2c06e (diff)
Tested working with no static data - pure DB implementation
-rw-r--r--junos-bootstrap/dhcpd/server_dhcp.py30
1 files changed, 10 insertions, 20 deletions
diff --git a/junos-bootstrap/dhcpd/server_dhcp.py b/junos-bootstrap/dhcpd/server_dhcp.py
index 7c64ad8..8dde368 100644
--- a/junos-bootstrap/dhcpd/server_dhcp.py
+++ b/junos-bootstrap/dhcpd/server_dhcp.py
@@ -64,8 +64,8 @@ def prettyprint_hex_as_str(hex):
# CIDR notation to subnet string ('25' => '255.255.255.128')
def cidr_to_subnet(cidr):
mask = [0, 0, 0, 0]
- for i in range(cidr):
- mask[i/8] = mask[i/8] + (1 << (7 - i % 8))
+ for i in range(int(cidr)):
+ mask[i//8] = mask[i//8] + (1 << (7 - i % 8))
return '.'.join(str(x) for x in mask)
# Parses DHCP options - raw = hex options
@@ -207,7 +207,8 @@ def reqparse(message):
l={
'hostname': lease(lease_identifiers).get('hostname'),
'mgmt_addr': lease(lease_identifiers).get('mgmt_addr'),
- 'mgmt_gw': lease(lease_identifiers).get('mgmt_gw')
+ 'mgmt_gw': lease(lease_identifiers).get('mgmt_gw'),
+ 'mgmt_cidr': lease(lease_identifiers).get('mgmt_cidr')
}
# lease_details = lease({'distro_name': distro, 'distro_phy_port': phy[:-2]}).get_dict()
@@ -224,11 +225,8 @@ def reqparse(message):
if mode == 'dhcp_request':
print('[%s] --> Crafting DHCP ACK response' % client)
-
print('[%s] --> XID/Transaction ID: %s' % (client, prettyprint_hex_as_str(messagesplit[4])))
- # print('[%s] --> Client IP: %s' % (client, lease_details['mgmt_addr']))
print('[%s] --> Client IP: %s' % (client, l['mgmt_addr']))
- # print('[%s] --> DHCP forwarder IP: %s' % (client, lease_details['mgmt_gw']))
print('[%s] --> DHCP forwarder IP: %s' % (client, l['mgmt_gw']))
print('[%s] --> Client MAC: %s' % (client, client))
@@ -240,11 +238,9 @@ def reqparse(message):
data += b'\x00\x00' # seconds elapsed - 1 second
data += b'\x80\x00' # BOOTP flags - broadcast (unicast: 0x0000)
data += b'\x00'*4 # Client IP address
- # data += socket.inet_aton(lease_details['mgmt_addr']) # New IP to client
data += socket.inet_aton(l['mgmt_addr']) # New IP to client
data += socket.inet_aton(dhcp_server_address) # Next server IP address
- # data += binascii.unhexlify(lease_details['mgmt_gw']) # Relay agent IP - DHCP forwarder
- data += binascii.unhexlify(l['mgmt_gw']) # Relay agent IP - DHCP forwarder
+ data += socket.inet_aton(l['mgmt_gw']) # Relay agent IP - DHCP forwarder
data += binascii.unhexlify(messagesplit[11]) # Client MAC
data += b'\x00'*202 # Client hardware address padding (10) + Server hostname (64) + Boot file name (128)
data += b'\x63\x82\x53\x63' # Magic cookie
@@ -268,26 +264,19 @@ def reqparse(message):
data += craft_option(51).raw_hex(b'\x00\x00\xa8\xc0') # Option 51 - Lease time left padded with "0"
print('[%s] --> Option 51 (Lease time): %s' % (client, '43200 (12 hours)'))
- # data += craft_option(1).ip(cidr_to_subnet(lease_details['mgmt_addr'])) # Option 1 - Subnet mask
- data += craft_option(1).ip(cidr_to_subnet(l['mgmt_addr'])) # Option 1 - Subnet mask
- # print('[%s] --> Option 1 (subnet mask): %s' % (client, cidr_to_subnet(lease_details['mgmt_addr'])))
- print('[%s] --> Option 1 (subnet mask): %s' % (client, cidr_to_subnet(l['mgmt_addr'])))
+ data += craft_option(1).ip(cidr_to_subnet(l['mgmt_cidr'])) # Option 1 - Subnet mask
+ print('[%s] --> Option 1 (subnet mask): %s' % (client, cidr_to_subnet(l['mgmt_cidr'])))
- # data += craft_option(3).ip(lease_details['mgmt_gw']) # Option 3 - Default gateway (set to DHCP forwarders IP)
data += craft_option(3).ip(l['mgmt_gw']) # Option 3 - Default gateway (set to DHCP forwarders IP)
-
- # print('[%s] --> Option 3 (default gateway): %s' % (client, lease_details['mgmt_gw']))
print('[%s] --> Option 3 (default gateway): %s' % (client, l['mgmt_gw']))
data += craft_option(150).bytes(socket.inet_aton(dhcp_server_address)) # Option 150 - TFTP Server. Used as target for the Zero Touch Protocol. Not necessarily TFTP protocol used.
print('[%s] --> Option 150 (Cisco proprietary TFTP server(s)): %s' % (client, dhcp_server_address))
# http://www.juniper.net/documentation/en_US/junos13.2/topics/concept/software-image-and-configuration-automatic-provisioning-understanding.html
- # data += craft_option(43).bytes(craft_option(0).string(target_junos_file) + craft_option(1).string('/tg-edge/' + lease_details['hostname']) + craft_option(3).string('http')) # Option 43 - ZTP
data += craft_option(43).bytes(craft_option(0).string(target_junos_file) + craft_option(1).string('/tg-edge/' + l['hostname']) + craft_option(3).string('http')) # Option 43 - ZTP
print('[%s] --> Option 43 (Vendor-specific option):' % client)
print('[%s] --> Suboption 0: %s' % (client, target_junos_file))
- # print('[%s] --> Suboption 1: %s' % (client, '/tg-edge/' + lease_details['hostname']))
print('[%s] --> Suboption 1: %s' % (client, '/tg-edge/' + l['hostname']))
print('[%s] --> Suboption 3: %s' % (client, 'http'))
@@ -322,8 +311,9 @@ if __name__ == "__main__":
reply_to = '<broadcast>'
else:
print('[%s] DHCP unicast - DHCP forwarding' % client)
- # reply_to = addressf[0]
- reply_to = '10.0.0.1'
+ reply_to = addressf[0] # senders (DHCP forwarders) IP
+ # print(addressf[0])
+ # reply_to = '10.0.0.1'
data=reqparse(message) # Parse the DHCP request
if data:
print('[%s] --> replying to %s' % (client, reply_to))