add port conflict checker

This commit is contained in:
Meng Zhuo 2014-07-16 12:08:09 +08:00
parent da13e768b0
commit 1371beb17d
2 changed files with 45 additions and 1 deletions

View file

@ -61,6 +61,7 @@ def main():
a_config = config.copy()
a_config['server_port'] = int(port)
a_config['password'] = password
logging.info("starting server at %s:%d" %
(a_config['server'], int(port)))
tcp_servers.append(tcprelay.TCPRelay(a_config, dns_resolver, False))

View file

@ -238,4 +238,47 @@ def _decode_dict(data):
elif isinstance(value, dict):
value = _decode_dict(value)
rv[key] = value
return rv
return rv
def check_port_conflict(port, show_logging=True):
"""Check whether Shadowsock bind port conflicted with services
registered in services database from Linux /etc/services
If conflicted, show logging warning and return tuple that conflicted
else, return None
:port: int bind port (TCP/UDP)
:returns: None/tuple that conflicted
"""
conflicted = []
root_path = os.path.abspath(os.path.dirname(__file__))
services_path = os.path.join(root_path, 'services.db')
if not os.path.isfile(services_path):
logging.warn('Services file does not existed')
return conflicted
import mmap
with open(services_path) as services_file:
db = mmap.mmap(services_file.fileno(), 0, access=mmap.ACCESS_READ)
for protocal in ['tcp','udp']:
sub_index = db.find('%d/%s'% (port, protocal))
if sub_index < 0:
break
index = db.rfind('\n', max(sub_index-500, 0), sub_index)+1
db.seek(index)
line = db.readline()
if show_logging:
logging.warn('%s m)conflicting with: %s ', protocal.upper(),
line.replace('\t', ' '))
conflicted.append((protocal, port))
db.close()
return conflicted