99
1010logging .root .setLevel (logging .INFO )
1111mode = os .environ ["MODE" ]
12- ports = os .environ ["PORT" ].split ()
1312max_connections = os .environ .get ("MAX_CONNECTIONS" , 100 )
1413ip = target = os .environ ["TARGET" ]
1514udp_answers = os .environ .get ("UDP_ANSWERS" , "1" )
1615
16+
17+ def _expand_ports (port_tokens ):
18+ for token in port_tokens :
19+ token = token .strip ()
20+ if not token :
21+ continue
22+ if "-" in token :
23+ start , end = token .split ("-" , 1 )
24+ start = int (start )
25+ end = int (end )
26+ if end < start :
27+ raise ValueError (f"Invalid port range: { token } " )
28+ for p in range (start , end + 1 ):
29+ yield str (p )
30+ else :
31+ yield token
32+
33+
34+ ports = list (_expand_ports (os .environ ["PORT" ].split ()))
35+
1736# Resolve target if required
18- if os .environ [ "PRE_RESOLVE" ] == "1" :
37+ if os .environ . get ( "PRE_RESOLVE" , "0" ) == "1" :
1938 resolver = Resolver ()
2039 resolver .nameservers = os .environ ["NAMESERVERS" ].split ()
2140 ip = random .choice ([answer .address for answer in resolver .resolve (target )])
@@ -41,10 +60,11 @@ async def netcat(port):
4160 await process .wait ()
4261
4362
44- # Wait until all proxies exited, if they ever do
45- try :
46- loop = asyncio .get_event_loop ()
47- loop .run_until_complete (asyncio .gather (* map (netcat , ports )))
48- finally :
49- loop .run_until_complete (loop .shutdown_asyncgens ())
50- loop .close ()
63+ async def _main ():
64+ # Create tasks within a running event loop (robust on Python 3.10+)
65+ tasks = [asyncio .create_task (netcat (port )) for port in ports ]
66+ await asyncio .gather (* tasks )
67+
68+
69+ if __name__ == "__main__" :
70+ asyncio .run (_main ())
0 commit comments