Further support for IPv6 and Dual-Stack in OpenBridge
To enable IPv6 only - put an IPv6 address in IP (bind specific address) To enable IPv4 only - put IPv4 address in IP or leave blank (default - binds all IPv4) To enable dual-stack put '::' in IP (Binds all IPv4 and IPv6 address)
This commit is contained in:
parent
09a3015f77
commit
48354372f4
49
config.py
49
config.py
@ -31,14 +31,17 @@ import sys
|
||||
import const
|
||||
|
||||
import socket
|
||||
import ipaddress
|
||||
from socket import gethostbyname
|
||||
|
||||
|
||||
# Does anybody read this stuff? There's a PEP somewhere that says I should do this.
|
||||
__author__ = 'Cortney T. Buffington, N0MJS'
|
||||
__copyright__ = 'Copyright (c) 2016-2018 Cortney T. Buffington, N0MJS and the K0USY Group'
|
||||
__copyright__ = '(c) Simon Adlem, G7RZU 2020-2021, Copyright (c) 2016-2018 Cortney T. Buffington, N0MJS and the K0USY Group'
|
||||
__credits__ = 'Colin Durbridge, G4EML, Steve Zingman, N4IRS; Mike Zingman, N4IRR; Jonathan Naylor, G4KLX; Hans Barthen, DL5DI; Torsten Shultze, DG1HT'
|
||||
__license__ = 'GNU GPLv3'
|
||||
__maintainer__ = 'Cort Buffington, N0MJS'
|
||||
__email__ = 'n0mjs@me.com'
|
||||
__maintainer__ = 'Simon Adlem, G7RZU'
|
||||
__email__ = 'simon@gb7fr.org.uk'
|
||||
|
||||
# Processing of ALS goes here. It's separated from the acl_build function because this
|
||||
# code is hblink config-file format specific, and acl_build is abstracted
|
||||
@ -96,6 +99,22 @@ def acl_build(_acl, _max):
|
||||
|
||||
return (action, acl)
|
||||
|
||||
def IsIPv4Address(ip):
|
||||
try:
|
||||
ipaddress.IPv4Address(ip)
|
||||
return True
|
||||
except ValueError as errorCode:
|
||||
pass
|
||||
return False
|
||||
|
||||
def IsIPv6Address(ip):
|
||||
try:
|
||||
ipaddress.IPv6Address(ip)
|
||||
return True
|
||||
except ValueError as errorCode:
|
||||
pass
|
||||
return False
|
||||
|
||||
def build_config(_config_file):
|
||||
config = configparser.ConfigParser()
|
||||
|
||||
@ -312,16 +331,30 @@ def build_config(_config_file):
|
||||
}})
|
||||
|
||||
try:
|
||||
addr_info = socket.getaddrinfo(CONFIG['SYSTEMS'][section]['TARGET_IP'],CONFIG['SYSTEMS'][section]['TARGET_PORT'],socket.AF_UNSPEC, socket.IPPROTO_IP)
|
||||
|
||||
|
||||
if CONFIG['SYSTEMS'][section]['IP'] == '::':
|
||||
addr_info = socket.getaddrinfo(CONFIG['SYSTEMS'][section]['TARGET_IP'],CONFIG['SYSTEMS'][section]['TARGET_PORT'],socket.AF_UNSPEC, socket.IPPROTO_IP)
|
||||
|
||||
elif CONFIG['SYSTEMS'][section]['IP'] and IsIPv6Address(CONFIG['SYSTEMS'][section]['IP']):
|
||||
addr_info = socket.getaddrinfo(CONFIG['SYSTEMS'][section]['TARGET_IP'],CONFIG['SYSTEMS'][section]['TARGET_PORT'],socket.AF_INET6, socket.IPPROTO_IP)
|
||||
|
||||
elif not CONFIG['SYSTEMS'][section]['IP'] or IsIPv4Address(CONFIG['SYSTEMS'][section]['IP']):
|
||||
addr_info = socket.getaddrinfo(CONFIG['SYSTEMS'][section]['TARGET_IP'],CONFIG['SYSTEMS'][section]['TARGET_PORT'],socket.AF_INET, socket.IPPROTO_IP)
|
||||
else:
|
||||
raise
|
||||
|
||||
family, socktype, proto, canonname, sockaddr = addr_info[0]
|
||||
CONFIG['SYSTEMS'][section]['TARGET_SOCK'] = sockaddr
|
||||
CONFIG['SYSTEMS'][section]['TARGET_IP'] = sockaddr[0]
|
||||
|
||||
|
||||
if CONFIG['SYSTEMS'][section]['IP'] == '::' and IsIPv4Address(CONFIG['SYSTEMS'][section]['TARGET_IP']):
|
||||
CONFIG['SYSTEMS'][section]['TARGET_IP'] = '::ffff:' + CONFIG['SYSTEMS'][section]['TARGET_IP']
|
||||
|
||||
CONFIG['SYSTEMS'][section]['TARGET_SOCK'] = (CONFIG['SYSTEMS'][section]['TARGET_IP'],CONFIG['SYSTEMS'][section]['TARGET_PORT'])
|
||||
|
||||
except:
|
||||
CONFIG['SYSTEMS'][section]['TARGET_IP'] = False
|
||||
CONFIG['SYSTEMS'][section]['TARGET_SOCK'] = (CONFIG['SYSTEMS'][section]['TARGET_IP'], CONFIG['SYSTEMS'][section]['TARGET_PORT'])
|
||||
|
||||
|
||||
|
||||
except configparser.Error as err:
|
||||
sys.exit('Error processing configuration file -- {}'.format(err))
|
||||
|
Loading…
Reference in New Issue
Block a user