mirror of
https://github.com/ShaYmez/pYSFReflector.git
synced 2025-06-14 11:52:25 -04:00
updated YSFReflector
added timeout wild-PTT added
This commit is contained in:
parent
570619d94b
commit
81e0e6785a
99
YSFReflector
99
YSFReflector
@ -154,7 +154,9 @@ def TimeoutNodi(cl):
|
|||||||
cl.remove(c)
|
cl.remove(c)
|
||||||
|
|
||||||
|
|
||||||
def TimeoutTX(t, t_lock, r_lock, lista_lh, lista_lhd):
|
def TimeoutTX(t, t_lock, r_lock, lista_lh, lista_lhd, t_out, t_react):
|
||||||
|
global BLK_TMP
|
||||||
|
global SCHED
|
||||||
while True:
|
while True:
|
||||||
if (t[1] < 5):
|
if (t[1] < 5):
|
||||||
t[1] += 0.1
|
t[1] += 0.1
|
||||||
@ -180,12 +182,56 @@ def TimeoutTX(t, t_lock, r_lock, lista_lh, lista_lhd):
|
|||||||
for x in pop_list:
|
for x in pop_list:
|
||||||
t_lock.pop(x)
|
t_lock.pop(x)
|
||||||
printlog(1, 'Removed from blockeds queue ' + str(x))
|
printlog(1, 'Removed from blockeds queue ' + str(x))
|
||||||
|
|
||||||
|
if (((time.time() - t[6]) > t_out) and (t[0] != 0)): # Tx timeout
|
||||||
|
if (not inlist(BLK_TMP, t[3])):
|
||||||
|
bisect.insort(BLK_TMP,t[3])
|
||||||
|
printlog(1, 'Timeout ' + t[3])
|
||||||
|
t[0] = 0 # drop transmission/force reauthorisation
|
||||||
|
t_sched = time.time() + t_react
|
||||||
|
SCHED.append([t[3], 'RC', t_sched]) # append scheduled remove from blocked list
|
||||||
|
printlog(1, 'Appended scheduled job: ' + t[3] + '/RC at time ' + time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(t_sched)))
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
|
def scheduler():
|
||||||
|
global BLK_TMP
|
||||||
|
global SCHED
|
||||||
|
while True:
|
||||||
|
time.sleep(1)
|
||||||
|
t = time.time()
|
||||||
|
for sc in SCHED:
|
||||||
|
if (t > sc[2]):
|
||||||
|
if (sc[1] == 'RC'):
|
||||||
|
BLK_TMP.remove(sc[0])
|
||||||
|
SCHED.remove(sc)
|
||||||
|
printlog(1, 'Removed from temporary blockeds queue ' + sc[0])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def ckeck_wild_ptt(cs, tw, cnt, trea):
|
||||||
|
global W_PTT
|
||||||
|
global BLK_TMP
|
||||||
|
n = 0
|
||||||
|
tc = time.time()
|
||||||
|
W_PTT.append([cs, tc])
|
||||||
|
for r in W_PTT:
|
||||||
|
if (r[1] < (tc - tw)):
|
||||||
|
W_PTT.remove(r)
|
||||||
|
else:
|
||||||
|
if (r[0] == cs):
|
||||||
|
n += 1
|
||||||
|
if (n >= cnt):
|
||||||
|
printlog(1, 'Wild-PTT ' + r[0])
|
||||||
|
if (not inlist(BLK_TMP, r[0])):
|
||||||
|
bisect.insort(BLK_TMP,r[0])
|
||||||
|
SCHED.append([r[0], 'RC', tc + trea])
|
||||||
|
printlog(1, 'Appended scheduled job: ' + r[0] + '/RC at time ' + time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(tc + trea)))
|
||||||
|
|
||||||
|
|
||||||
def canTrasmit(cs, re_en):
|
def canTrasmit(cs, re_en):
|
||||||
global BLACK_LIST
|
global BLACK_LIST
|
||||||
global WHITE_LIST
|
global WHITE_LIST
|
||||||
|
global BLK_TMP
|
||||||
call_sp = re.split(r'[-/]', cs)
|
call_sp = re.split(r'[-/]', cs)
|
||||||
call = call_sp[0]
|
call = call_sp[0]
|
||||||
|
|
||||||
@ -193,6 +239,9 @@ def canTrasmit(cs, re_en):
|
|||||||
if (len(call_sp) > 1):
|
if (len(call_sp) > 1):
|
||||||
if (call_sp[1] == 'RPT'):
|
if (call_sp[1] == 'RPT'):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
if inlist(BLK_TMP, call):
|
||||||
|
return False
|
||||||
|
|
||||||
## case CheckRE == 1 ###
|
## case CheckRE == 1 ###
|
||||||
if (re_en == 1):
|
if (re_en == 1):
|
||||||
@ -422,7 +471,29 @@ def ReadConfig(f,p):
|
|||||||
debug = 0
|
debug = 0
|
||||||
except:
|
except:
|
||||||
debug = 0
|
debug = 0
|
||||||
|
|
||||||
|
try:
|
||||||
|
timeout = float(config['Protections']['Timeout'])
|
||||||
|
except:
|
||||||
|
timeout = 240.0
|
||||||
|
|
||||||
|
try:
|
||||||
|
treactivate = float(config['Protections']['Treactivate'])
|
||||||
|
except:
|
||||||
|
treactivate = 1800.0
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
wildptttime = float(config['Protections']['WildPTTTime'])
|
||||||
|
except:
|
||||||
|
wildptttime = 5.0
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
wildpttcount = int(config['Protections']['WildPTTCount'])
|
||||||
|
except:
|
||||||
|
wildpttcount = 3
|
||||||
|
|
||||||
p.append(id) # 0
|
p.append(id) # 0
|
||||||
p.append(name) # 1
|
p.append(name) # 1
|
||||||
p.append(description) # 2
|
p.append(description) # 2
|
||||||
@ -437,6 +508,10 @@ def ReadConfig(f,p):
|
|||||||
p.append(display_level) #11
|
p.append(display_level) #11
|
||||||
p.append(file_level) #12
|
p.append(file_level) #12
|
||||||
p.append(debug) #13
|
p.append(debug) #13
|
||||||
|
p.append(timeout) #14
|
||||||
|
p.append(treactivate) #15
|
||||||
|
p.append(wildptttime) #16
|
||||||
|
p.append(wildpttcount) #17
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -464,6 +539,7 @@ def RunServer(config):
|
|||||||
global IP_BL
|
global IP_BL
|
||||||
global GW_LK
|
global GW_LK
|
||||||
global IP_LK
|
global IP_LK
|
||||||
|
global BLK_TMP
|
||||||
global debug
|
global debug
|
||||||
host = '0.0.0.0'
|
host = '0.0.0.0'
|
||||||
port = config[5]
|
port = config[5]
|
||||||
@ -502,6 +578,12 @@ def RunServer(config):
|
|||||||
|
|
||||||
en_ext_cmd = config[10]
|
en_ext_cmd = config[10]
|
||||||
|
|
||||||
|
timeout = config[14]
|
||||||
|
treactivate = config[15]
|
||||||
|
|
||||||
|
wptttime = config[16]
|
||||||
|
wpttcount = config[17]
|
||||||
|
|
||||||
recvPackets = queue.Queue()
|
recvPackets = queue.Queue()
|
||||||
|
|
||||||
print('Starting pYSFReflector-' + version)
|
print('Starting pYSFReflector-' + version)
|
||||||
@ -513,7 +595,8 @@ def RunServer(config):
|
|||||||
threading.Thread(target=RecvData,args=(s,recvPackets)).start()
|
threading.Thread(target=RecvData,args=(s,recvPackets)).start()
|
||||||
threading.Thread(target=ElencoNodi,args=(clients,)).start()
|
threading.Thread(target=ElencoNodi,args=(clients,)).start()
|
||||||
threading.Thread(target=TimeoutNodi,args=(clients,)).start()
|
threading.Thread(target=TimeoutNodi,args=(clients,)).start()
|
||||||
threading.Thread(target=TimeoutTX,args=(tx,rx_lock_tout,rx_lock,LH,LHD)).start()
|
threading.Thread(target=TimeoutTX,args=(tx,rx_lock_tout,rx_lock,LH,LHD,timeout,treactivate)).start()
|
||||||
|
threading.Thread(target=scheduler,args=[]).start()
|
||||||
if (len(f_blacklist) > 0):
|
if (len(f_blacklist) > 0):
|
||||||
threading.Thread(target=blacklist,args=(f_blacklist,tr_blacklist,clients)).start()
|
threading.Thread(target=blacklist,args=(f_blacklist,tr_blacklist,clients)).start()
|
||||||
|
|
||||||
@ -576,7 +659,7 @@ def RunServer(config):
|
|||||||
tx_ok = canTrasmit(data[14:24].decode().strip(), CheckRE)
|
tx_ok = canTrasmit(data[14:24].decode().strip(), CheckRE)
|
||||||
block_r = 'CS'
|
block_r = 'CS'
|
||||||
if tx_ok:
|
if tx_ok:
|
||||||
if ((tx[0] == 0) and (id_corr != 0)):
|
if ((tx[0] == 0) and (id_corr != 0)): # new stream
|
||||||
tx[0] = id_corr
|
tx[0] = id_corr
|
||||||
# gateway
|
# gateway
|
||||||
tx[2] = data[4:14].decode().strip()
|
tx[2] = data[4:14].decode().strip()
|
||||||
@ -590,7 +673,7 @@ def RunServer(config):
|
|||||||
tx[6] = time.time()
|
tx[6] = time.time()
|
||||||
id_str += 1
|
id_str += 1
|
||||||
printlog(1, 'Received data from ' + tx[3].ljust(10) + ' to ' + tx[4].ljust(10) + ' at ' + tx[2].ljust(10))
|
printlog(1, 'Received data from ' + tx[3].ljust(10) + ' to ' + tx[4].ljust(10) + ' at ' + tx[2].ljust(10))
|
||||||
|
ckeck_wild_ptt(tx[3], wptttime, wpttcount, treactivate)
|
||||||
else:
|
else:
|
||||||
if (id_corr not in rx_lock):
|
if (id_corr not in rx_lock):
|
||||||
rx_lock.append(id_corr)
|
rx_lock.append(id_corr)
|
||||||
@ -646,7 +729,7 @@ def RunServer(config):
|
|||||||
|
|
||||||
if (cmd == b'QSRI'):
|
if (cmd == b'QSRI'):
|
||||||
printlog(0, 'Received command ' + cmd.decode() + ' from: ' + addr[0] + ':' + str(addr[1]))
|
printlog(0, 'Received command ' + cmd.decode() + ' from: ' + addr[0] + ':' + str(addr[1]))
|
||||||
info = 'ASRI;' + str(refl_id) + ':' + refl_name + ':' + refl_desc + ':' + 'pYSFReflector' + ':' + version + ':' + str(CheckRE) + ';'
|
info = 'ASRI;' + str(refl_id) + ':' + refl_name + ':' + refl_desc + ':' + 'pYSFReflector' + ':' + version + ':' + str(CheckRE) + ':' + str(timeout) + ':' + str(treactivate) + ':' + str(wptttime) + ':' + str(wpttcount) + ';'
|
||||||
s.sendto(str.encode(info),addr)
|
s.sendto(str.encode(info),addr)
|
||||||
|
|
||||||
if (cmd == b'QGWL'):
|
if (cmd == b'QGWL'):
|
||||||
@ -772,7 +855,7 @@ def hex_dump(data):
|
|||||||
|
|
||||||
######## main ########
|
######## main ########
|
||||||
|
|
||||||
version = '20210419'
|
version = '20210512'
|
||||||
|
|
||||||
if (len(sys.argv) != 2):
|
if (len(sys.argv) != 2):
|
||||||
print('Invalid Number of Arguments')
|
print('Invalid Number of Arguments')
|
||||||
@ -817,7 +900,9 @@ GW_BL = []
|
|||||||
IP_BL = []
|
IP_BL = []
|
||||||
GW_LK = []
|
GW_LK = []
|
||||||
IP_LK = []
|
IP_LK = []
|
||||||
|
BLK_TMP = []
|
||||||
|
SCHED = []
|
||||||
|
W_PTT = []
|
||||||
|
|
||||||
RunServer(config)
|
RunServer(config)
|
||||||
|
|
||||||
|
@ -35,3 +35,12 @@ Time=5
|
|||||||
# see table in README.md for more informations
|
# see table in README.md for more informations
|
||||||
CheckRE=1
|
CheckRE=1
|
||||||
|
|
||||||
|
[Protections]
|
||||||
|
# timeout Tx [sec]
|
||||||
|
Timeout = 240
|
||||||
|
# Wild PTT time window [sec]
|
||||||
|
WildPTTTime = 5
|
||||||
|
# Wild PTT stream count
|
||||||
|
WildPTTCount = 3
|
||||||
|
# time to callsign reactivation after timeout or WildPTT [sec]
|
||||||
|
Treactivate = 1800
|
||||||
|
Loading…
x
Reference in New Issue
Block a user