mirror of https://github.com/dnomd343/ProxyC
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.1 KiB
69 lines
2.1 KiB
2 years ago
|
#!/usr/bin/env python3
|
||
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
import time
|
||
|
import random
|
||
|
import socket
|
||
|
from Basis.Logger import logging
|
||
|
|
||
|
|
||
|
def genFlag(length: int = 12) -> str: # generate random task flag
|
||
|
flag = ''
|
||
|
for i in range(0, length):
|
||
|
tmp = random.randint(0, 15)
|
||
|
if tmp >= 10:
|
||
|
flag += chr(tmp + 87) # a ~ f
|
||
|
else:
|
||
|
flag += str(tmp) # 0 ~ 9
|
||
|
logging.debug('generate new flag -> ' + flag)
|
||
|
return flag
|
||
|
|
||
|
|
||
|
def getAvailablePort(rangeStart: int = 41952, rangeEnd: int = 65535) -> int: # get a available port
|
||
|
if rangeStart > rangeEnd or rangeStart < 1 or rangeEnd > 65535:
|
||
|
raise RuntimeError('invalid port range')
|
||
|
while True:
|
||
|
port = random.randint(rangeStart, rangeEnd) # choose randomly
|
||
|
if checkPortStatus(port):
|
||
|
logging.debug('get new port -> %i' % port)
|
||
|
return port
|
||
|
time.sleep(0.1) # wait for 100ms
|
||
|
|
||
|
|
||
|
def checkPortStatus(port: int) -> bool: # check if the port is occupied
|
||
|
ipv4Tcp = None
|
||
|
ipv4Udp = None
|
||
|
ipv6Tcp = None
|
||
|
ipv6Udp = None
|
||
|
try:
|
||
|
ipv4Tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
|
ipv4Udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||
|
ipv4Tcp.bind(('0.0.0.0', port))
|
||
|
ipv4Udp.bind(('0.0.0.0', port))
|
||
|
ipv4Tcp.close()
|
||
|
ipv4Udp.close()
|
||
|
ipv6Tcp = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
|
||
|
ipv6Udp = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
|
||
|
ipv6Tcp.bind(('::', port))
|
||
|
ipv6Udp.bind(('::', port))
|
||
|
ipv6Tcp.close()
|
||
|
ipv6Udp.close()
|
||
|
logging.debug('check status of port %i -> available' % port)
|
||
|
return True # IPv4 TCP / IPv4 UDP / IPv6 TCP / IPv6 UDP are normal
|
||
|
except:
|
||
|
logging.debug('check status of port %i -> occupied' % port)
|
||
|
return False
|
||
|
finally: # close socket
|
||
|
try:
|
||
|
ipv4Tcp.close()
|
||
|
except: pass
|
||
|
try:
|
||
|
ipv4Udp.close()
|
||
|
except: pass
|
||
|
try:
|
||
|
ipv6Tcp.close()
|
||
|
except: pass
|
||
|
try:
|
||
|
ipv6Udp.close()
|
||
|
except: pass
|