From c63b9171635cc0ca27689bf2562b61f3e6af4a20 Mon Sep 17 00:00:00 2001 From: Florian Bezannier Date: Tue, 13 Apr 2021 16:45:19 +0200 Subject: [PATCH] check if port is available before anything else --- server.py | 16 +++++++++++----- utils.py | 6 ++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/server.py b/server.py index fdc2dcc..28ffc6c 100755 --- a/server.py +++ b/server.py @@ -14,6 +14,7 @@ from MyLogger import my_logger import argparse from MyLogger import logger from MyPSACC import MyPSACC +from utils import is_port_in_use from web.app import start_app, save_config parser = argparse.ArgumentParser() @@ -21,19 +22,21 @@ parser = argparse.ArgumentParser() def parse_args(): parser = argparse.ArgumentParser() - parser.add_argument("-f", "--config", help="config file, default file: config.json", type=argparse.FileType('r'), default="config.json") + parser.add_argument("-f", "--config", help="config file, default file: config.json", type=argparse.FileType('r'), + default="config.json") parser.add_argument("-c", "--charge-control", help="enable charge control, default charge_config.json", const="charge_config.json", nargs='?', metavar='charge config file') - parser.add_argument("-d", "--debug", help="enable debug", const=10, default=20, nargs='?', metavar='Debug level number') + parser.add_argument("-d", "--debug", help="enable debug", const=10, default=20, nargs='?', + metavar='Debug level number') parser.add_argument("-l", "--listen", help="change server listen address", default="127.0.0.1", metavar="IP") parser.add_argument("-p", "--port", help="change server listen port", default="5000") parser.add_argument("-r", "--record", help="save vehicle data to db", action='store_true') - parser.add_argument("-R", "--refresh", help="refresh vehicles status every x min",type=int) + parser.add_argument("-R", "--refresh", help="refresh vehicles status every x min", type=int) parser.add_argument("-m", "--mail", default=environ.get('USER_EMAIL', None), help="set the email address") parser.add_argument("-P", "--password", default=environ.get('USER_PASSWORD', None), help="set the password") parser.add_argument("--remote-disable", help="disable remote control", action='store_true') parser.add_argument("--offline", help="offline limited mode", action='store_true') - parser.add_argument("-b", "--base-path", help="base path for web app",default="/") + parser.add_argument("-b", "--base-path", help="base path for web app", default="/") parser.parse_args() return parser @@ -44,10 +47,13 @@ if __name__ == "__main__": parser = parse_args() args = parser.parse_args() try: - args.debug=int(args.debug) + args.debug = int(args.debug) except ValueError: pass my_logger(handler_level=args.debug) + if is_port_in_use(args.listen, int(args.port)): + logger.error(" Address already in use") + exit(1) logger.info("server start") if args.config: config_name = args.config.name diff --git a/utils.py b/utils.py index 9e080e1..7659228 100644 --- a/utils.py +++ b/utils.py @@ -3,6 +3,7 @@ from functools import wraps from threading import Semaphore, Timer import requests +import socket from MyLogger import logger @@ -42,3 +43,8 @@ def rate_limit(limit, every): return wrapper return limit_decorator + + +def is_port_in_use(ip, port): + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + return s.connect_ex((ip, port)) == 0