From 5f20fe23653490535d94d94d1a6a023164b693a1 Mon Sep 17 00:00:00 2001 From: powerjungle Date: Thu, 26 Jan 2023 00:46:12 +0100 Subject: [PATCH] server: new options to choose certain IP versions On some setups, IPv6 or IPv4 might be disabled in the OS. In my case IPv6 is disabled and this causes errors when starting the server. --- syncplay/ep_server.py | 30 ++++++++++++++++++++++++------ syncplay/messages_de.py | 2 ++ syncplay/messages_en.py | 2 ++ syncplay/messages_eo.py | 2 ++ syncplay/messages_es.py | 2 ++ syncplay/messages_fr.py | 2 ++ syncplay/messages_it.py | 2 ++ syncplay/messages_pt_BR.py | 2 ++ syncplay/messages_pt_PT.py | 2 ++ syncplay/messages_ru.py | 2 ++ syncplay/messages_tr.py | 2 ++ syncplay/messages_zh_CN.py | 2 ++ syncplay/server.py | 12 +++++++----- 13 files changed, 53 insertions(+), 11 deletions(-) diff --git a/syncplay/ep_server.py b/syncplay/ep_server.py index 548ddd0..f21854d 100644 --- a/syncplay/ep_server.py +++ b/syncplay/ep_server.py @@ -6,19 +6,26 @@ from twisted.internet.error import CannotListenError from syncplay.server import SyncFactory, ConfigurationGetter -class ServerStatus: pass + +class ServerStatus: + listening6 = False + listening4 = False + def isListening6(f): ServerStatus.listening6 = True + def isListening4(f): ServerStatus.listening4 = True + def failed6(f): ServerStatus.listening6 = False print(f.value) print("IPv6 listening failed.") + def failed4(f): ServerStatus.listening4 = False if f.type is CannotListenError and ServerStatus.listening6: @@ -27,6 +34,7 @@ def failed4(f): print(f.value) print("IPv4 listening failed.") + def main(): argsGetter = ConfigurationGetter() args = argsGetter.getConfiguration() @@ -45,15 +53,25 @@ def main(): args.stats_db_file, args.tls ) - endpoint6 = TCP6ServerEndpoint(reactor, int(args.port)) - endpoint6.listen(factory).addCallbacks(isListening6, failed6) - endpoint4 = TCP4ServerEndpoint(reactor, int(args.port)) - endpoint4.listen(factory).addCallbacks(isListening4, failed4) + + if args.ipv6_only is True: + endpoint6 = TCP6ServerEndpoint(reactor, int(args.port)) + endpoint6.listen(factory).addCallbacks(isListening6, failed6) + elif args.ipv4_only is True: + endpoint4 = TCP4ServerEndpoint(reactor, int(args.port)) + endpoint4.listen(factory).addCallbacks(isListening4, failed4) + else: + endpoint6 = TCP6ServerEndpoint(reactor, int(args.port)) + endpoint6.listen(factory).addCallbacks(isListening6, failed6) + endpoint4 = TCP4ServerEndpoint(reactor, int(args.port)) + endpoint4.listen(factory).addCallbacks(isListening4, failed4) + if ServerStatus.listening6 or ServerStatus.listening4: reactor.run() else: print("Unable to listen using either IPv4 and IPv6 protocols. Quitting the server now.") sys.exit() + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/syncplay/messages_de.py b/syncplay/messages_de.py index 9718162..943e5af 100755 --- a/syncplay/messages_de.py +++ b/syncplay/messages_de.py @@ -499,6 +499,8 @@ de = { "server-startTLS-argument": "Erlaube TLS-Verbindungen mit den Zertifikatdateien im Angegebenen Pfad", "server-messed-up-motd-unescaped-placeholders": "Die Nachricht des Tages hat unmaskierte Platzhalter. Alle $-Zeichen sollten verdoppelt werden ($$).", "server-messed-up-motd-too-long": "Die Nachricht des Tages ist zu lang - Maximal {} Zeichen, aktuell {}.", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "Unbekannter Befehl {}", # message diff --git a/syncplay/messages_en.py b/syncplay/messages_en.py index 4798962..0100d8e 100644 --- a/syncplay/messages_en.py +++ b/syncplay/messages_en.py @@ -500,6 +500,8 @@ en = { "server-startTLS-argument": "Enable TLS connections using the certificate files in the path provided", "server-messed-up-motd-unescaped-placeholders": "Message of the Day has unescaped placeholders. All $ signs should be doubled ($$).", "server-messed-up-motd-too-long": "Message of the Day is too long - maximum of {} chars, {} given.", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "Unknown command {}", # message diff --git a/syncplay/messages_eo.py b/syncplay/messages_eo.py index f2fe771..3d1dda8 100644 --- a/syncplay/messages_eo.py +++ b/syncplay/messages_eo.py @@ -503,6 +503,8 @@ eo = { "server-startTLS-argument": "Ŝalti TLS-konektojn per la atestilaj dosieroj en la donita vojo", "server-messed-up-motd-unescaped-placeholders": "Mesaĝo de tago havas neŝirmitajn anstataŭiĝojn. Ĉiuj dolarsignoj devus aperi duoble ($$).", "server-messed-up-motd-too-long": "Mesaĝo de tago estas tro longa – maksimuma kvanto estas {} signoj, sed {} estas donitaj.", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "Nekonata ordono {}", # message diff --git a/syncplay/messages_es.py b/syncplay/messages_es.py index f46761a..ef2438c 100644 --- a/syncplay/messages_es.py +++ b/syncplay/messages_es.py @@ -499,6 +499,8 @@ es = { "server-startTLS-argument": "Habilitar conexiones TLS usando los archivos de certificado en la ruta provista", "server-messed-up-motd-unescaped-placeholders": "El mensaje del dia contiene marcadores de posición sin escapar. Todos los signos $ deberían ser dobles ($$).", "server-messed-up-motd-too-long": "El mensaje del día es muy largo - máximo de {} caracteres, se recibieron {}.", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "Comando desconocido {}", # message diff --git a/syncplay/messages_fr.py b/syncplay/messages_fr.py index b35adb2..1abe4a4 100644 --- a/syncplay/messages_fr.py +++ b/syncplay/messages_fr.py @@ -500,6 +500,8 @@ fr = { "server-startTLS-argument": "Activer les connexions TLS à l'aide des fichiers de certificat dans le chemin fourni", "server-messed-up-motd-unescaped-placeholders": "Le message du jour a des espaces réservés non échappés. Tous les signes $ doivent être doublés ($$).", "server-messed-up-motd-too-long": "Le message du jour est trop long: {}caractères maximum, {} donnés.", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "Commande inconnue {}", # message diff --git a/syncplay/messages_it.py b/syncplay/messages_it.py index 2fdad31..35941e5 100755 --- a/syncplay/messages_it.py +++ b/syncplay/messages_it.py @@ -499,6 +499,8 @@ it = { "server-startTLS-argument": "Abilita il protocollo TLS usando i certificati contenuti nel percorso indicato", "server-messed-up-motd-unescaped-placeholders": "Il messaggio del giorno ha dei caratteri non 'escaped'. Tutti i simboli $ devono essere doppi ($$).", "server-messed-up-motd-too-long": "Il messaggio del giorno è troppo lungo - numero massimo di caratteri è {}, {} trovati.", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "Comando non riconosciuto {}", # message diff --git a/syncplay/messages_pt_BR.py b/syncplay/messages_pt_BR.py index e328180..927c3d5 100644 --- a/syncplay/messages_pt_BR.py +++ b/syncplay/messages_pt_BR.py @@ -500,6 +500,8 @@ pt_BR = { "server-startTLS-argument": "Habilita conexões TLS usando os arquivos de certificado no caminho fornecido", "server-messed-up-motd-unescaped-placeholders": "A Mensagem do Dia possui placeholders não escapados. Todos os sinais de $ devem ser dobrados (como em $$).", "server-messed-up-motd-too-long": "A Mensagem do Dia é muito longa - máximo de {} caracteres, {} foram dados.", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "Comando desconhecido: {}", # message diff --git a/syncplay/messages_pt_PT.py b/syncplay/messages_pt_PT.py index 8b48efe..337e789 100644 --- a/syncplay/messages_pt_PT.py +++ b/syncplay/messages_pt_PT.py @@ -499,6 +499,8 @@ pt_PT = { "server-startTLS-argument": "Habilita conexões TLS usando os arquivos de certificado no caminho fornecido", "server-messed-up-motd-unescaped-placeholders": "A Mensagem do Dia possui placeholders não escapados. Todos os sinais de $ devem ser dobrados (como em $$).", "server-messed-up-motd-too-long": "A Mensagem do Dia é muito longa - máximo de {} caracteres, {} foram dados.", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "Comando desconhecido: {}", # message diff --git a/syncplay/messages_ru.py b/syncplay/messages_ru.py index 6ecef4e..4f104a8 100755 --- a/syncplay/messages_ru.py +++ b/syncplay/messages_ru.py @@ -496,6 +496,8 @@ ru = { "server-startTLS-argument": "Включить TLS-соединения используя файлы сертификатов в указанном пути", "server-messed-up-motd-unescaped-placeholders": "MOTD-сообщение содержит неэкранированные спецсимволы. Все знаки $ должны быть продублированы ($$).", "server-messed-up-motd-too-long": "MOTD-сообщение слишком длинное: максимальная длина - {} символ(ов), текущая длина - {} символ(ов).", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "Неизвестная команда: {}", # message diff --git a/syncplay/messages_tr.py b/syncplay/messages_tr.py index 09cc5aa..a23abb6 100644 --- a/syncplay/messages_tr.py +++ b/syncplay/messages_tr.py @@ -500,6 +500,8 @@ tr = { "server-startTLS-argument": "Dosya yolundaki sertifika dosyalarını kullanarak TLS bağlantılarını etkinleştirin", "server-messed-up-motd-unescaped-placeholders": "Günün Mesajında çıkış karaktersiz yer tutucular var. Tüm $ işaretleri iki katına çıkarılmalıdır ($$).", "server-messed-up-motd-too-long": "Günün Mesajı çok uzun - maksimum {} karakter olmalı, {} verildi.", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "Bilinmeyen komut {}", # message diff --git a/syncplay/messages_zh_CN.py b/syncplay/messages_zh_CN.py index 0df6abf..7170495 100644 --- a/syncplay/messages_zh_CN.py +++ b/syncplay/messages_zh_CN.py @@ -500,6 +500,8 @@ zh_CN = { "server-startTLS-argument": "使用提供的路径中的证书文件启用TLS连接", "server-messed-up-motd-unescaped-placeholders": "每日信息中有未转义的占位符。所有 $ 字符应当重复两遍 ($$).", "server-messed-up-motd-too-long": "每日信息过长 - 最大{}个chars, 给出的长度{}", + "server-listen-only-on-ipv4": "Listen only on IPv4 when starting the server.", + "server-listen-only-on-ipv6": "Listen only on IPv6 when starting the server.", # Server errors "unknown-command-server-error": "未知命令 {}", # message diff --git a/syncplay/server.py b/syncplay/server.py index 72ccfa1..51cbd3d 100755 --- a/syncplay/server.py +++ b/syncplay/server.py @@ -290,18 +290,18 @@ class StatsRecorder(object): def __init__(self, dbHandle, roomManager): self._dbHandle = dbHandle self._roomManagerHandle = roomManager - + def startRecorder(self, delay): try: self._dbHandle.connect() reactor.callLater(delay, self._scheduleClientSnapshot) except: print("--- Error in initializing the stats database. Server Stats not enabled. ---") - + def _scheduleClientSnapshot(self): self._clientSnapshotTimer = task.LoopingCall(self._runClientSnapshot) - self._clientSnapshotTimer.start(constants.SERVER_STATS_SNAPSHOT_INTERVAL) - + self._clientSnapshotTimer.start(constants.SERVER_STATS_SNAPSHOT_INTERVAL) + def _runClientSnapshot(self): try: snapshotTime = int(time.time()) @@ -497,7 +497,7 @@ class RoomManager(object): while username.lower() in allnames: username += '_' return username - + def exportRooms(self): return self._rooms @@ -889,3 +889,5 @@ class ConfigurationGetter(object): self._argparser.add_argument('--max-username-length', metavar='maxUsernameLength', type=int, nargs='?', help=getMessage("server-maxusernamelength-argument").format(constants.MAX_USERNAME_LENGTH)) self._argparser.add_argument('--stats-db-file', metavar='file', type=str, nargs='?', help=getMessage("server-stats-db-file-argument")) self._argparser.add_argument('--tls', metavar='path', type=str, nargs='?', help=getMessage("server-startTLS-argument")) + self._argparser.add_argument('--ipv4-only', action='store_true', help=getMessage("server-listen-only-on-ipv4")) + self._argparser.add_argument('--ipv6-only', action='store_true', help=getMessage("server-listen-only-on-ipv6"))