Files
TP1-R504/start-servers.py
2025-11-04 08:19:56 +01:00

153 lines
4.1 KiB
Python

import subprocess
import time
import json
import sys
import os
import select
servers_config = [
{
"region": "World",
"nation": "World",
"host": "localhost",
"port": 9000,
"neighbors": ["localhost:8001", "localhost:8004"],
"servers": [
{"host": "localhost", "port": 9000},
],
},
{
"region": "FRA",
"nation": "France",
"host": "localhost",
"port": 8001,
"neighbors": ["localhost:9000", "localhost:8002", "localhost:8003", "localhost:8101"],
"servers": [
{"host": "localhost", "port": 8001},
{"host": "localhost", "port": 8101},
],
},
{
"region": "Paris",
"nation": "France",
"host": "localhost",
"port": 8002,
"neighbors": ["localhost:8001", "localhost:8101"],
"servers": [
{"host": "localhost", "port": 8002},
{"host": "localhost", "port": 8102},
],
},
{
"region": "Marseille",
"nation": "France",
"host": "localhost",
"port": 8003,
"neighbors": ["localhost:8001"],
"servers": [
{"host": "localhost", "port": 8003},
{"host": "localhost", "port": 8103},
],
},
{
"region": "USA",
"nation": "USA",
"host": "localhost",
"port": 8004,
"neighbors": ["localhost:9000", "localhost:8005", "localhost:8006"],
"servers": [
{"host": "localhost", "port": 8004},
{"host": "localhost", "port": 8104},
],
},
{
"region": "NYC",
"nation": "USA",
"host": "localhost",
"port": 8005,
"neighbors": ["localhost:8004"],
"servers": [
{"host": "localhost", "port": 8005},
{"host": "localhost", "port": 8105},
],
},
{
"region": "LA",
"nation": "USA",
"host": "localhost",
"port": 8006,
"neighbors": ["localhost:8004"],
"servers": [
{"host": "localhost", "port": 8006},
{"host": "localhost", "port": 8106},
],
}
]
config_filename = "servers_config.json"
with open(config_filename, "w") as f:
json.dump(servers_config, f, indent=2)
processes = []
server_script = os.path.abspath("server.py")
for s in servers_config:
region = s["region"]
host = s["host"]
for srv in s["servers"]:
port = srv["port"]
print(f"[{region}] Starting server on port {port} ...")
p = subprocess.Popen(
[sys.executable, server_script, region, host, str(port), config_filename],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
bufsize=1,
)
processes.append((region, port, p))
time.sleep(0.3)
print("\nAll servers launched.")
print("Use: python client.py <username> localhost <port>")
print("Regions:", ", ".join([s["region"] for s in servers_config]))
try:
while True:
for region, port, p in list(processes):
while True:
ready, _, _ = select.select([p.stdout], [], [], 0)
if p.stdout in ready:
line = p.stdout.readline()
if not line:
break
print(f"[{region}:{port}] {line.strip()}")
else:
break
while True:
ready, _, _ = select.select([p.stderr], [], [], 0)
if p.stderr in ready:
line = p.stderr.readline()
if not line:
break
print(f"[{region}:{port}][ERR] {line.strip()}")
else:
break
if p.poll() is not None:
print(f"\n[{region}:{port}] Server exited.")
processes.remove((region, port, p))
if not processes:
print("All servers stopped.")
break
time.sleep(0.1)
except KeyboardInterrupt:
print("\nShutting down all servers...")
for _, _, p in processes:
p.terminate()
print("Bye!")