99from threading import Thread
1010from jade .jade_tools import *
1111from queue import Queue
12+
13+
14+ class GracefulKiller :
15+ kill_now = False
16+ signals = {
17+ signal .SIGINT : 'SIGINT' ,
18+ signal .SIGTERM : 'SIGTERM'
19+ }
20+
21+ def __init__ (self , func , * args ):
22+ self .func = func
23+ self .args = args
24+ signal .signal (signal .SIGINT , self .exit_gracefully )
25+ signal .signal (signal .SIGTERM , self .exit_gracefully )
26+
27+ def exit_gracefully (self , signum , frame ):
28+ self .func (self .args [0 ][0 ], self .args [0 ][1 ], self .args [0 ][2 ])
29+ time .sleep (1 )
30+ self .kill_now = True
31+
32+
1233class MonitorLDKThread (Thread ):
13- def __init__ (self ,pyldk ,JadeLog ,ldkqueue ,time = 60 * 60 ,max_session_size = 1 ,feature_id_list = None ,max_featuer_id = None ):
34+ def __init__ (self , pyldk , JadeLog , ldkqueue , time = 60 * 60 , max_session_size = 1 , feature_id_list = None ,
35+ max_featuer_id = None , exit_queue = None ):
1436 self .pyldk = pyldk
1537 self .JadeLog = JadeLog
1638 self .ldkqueue = ldkqueue
@@ -19,39 +41,45 @@ def __init__(self,pyldk,JadeLog,ldkqueue,time=60*60,max_session_size=1,feature_i
1941 self .max_featuer_id = max_featuer_id
2042 self .max_session_size = max_session_size
2143 self .handlequeue = Queue (maxsize = max_session_size )
44+ self .exit_queue = exit_queue
2245 super (MonitorLDKThread , self ).__init__ ()
2346 self .start ()
2447
2548 def exit (self ):
2649 self .JadeLog .ERROR ("加密狗异常,程序退出" )
27- Exit (- 800 )
50+ Exit (- 800 , self . exit_queue )
2851
2952 def logout (self ):
3053 handle = self .handlequeue .get ()
3154 self .pyldk .adapter .logout (handle )
55+
3256 def run (self ):
3357 if self .feature_id_list :
3458 for feature_id in self .feature_id_list :
35- haspStruct , feature_id , login_status = self .pyldk .login (feature_id ,is_mutiple_feature_id = True )
59+ haspStruct , feature_id , login_status = self .pyldk .login (feature_id , is_mutiple_feature_id = True )
3660 if haspStruct .status == 0 :
3761 self .handlequeue .put (haspStruct .handle )
3862 break
3963 if haspStruct .status != 0 :
4064 haspStruct , feature_id , login_status = self .pyldk .login ()
4165 self .pyldk .adapter .logout (haspStruct .handle )
42- self .JadeLog .ERROR ("加密狗初始化失败,请检查授权ID是否正确,支持的授权ID为:{},当前加密狗授权ID为:{},请重新授权..." .format (',' .join (str (i ) for i in self .feature_id_list ),feature_id ))
66+ self .JadeLog .ERROR (
67+ "加密狗初始化失败,请检查授权ID是否正确,支持的授权ID为:{},当前加密狗授权ID为:{},请重新授权..." .format (
68+ ',' .join (str (i ) for i in self .feature_id_list ), feature_id ))
4369 self .exit ()
4470 elif self .max_featuer_id :
4571 haspStruct , feature_id , login_status = self .pyldk .login ()
4672 self .pyldk .adapter .logout (haspStruct .handle )
4773 if feature_id > self .max_featuer_id :
48- self .JadeLog .ERROR ("加密狗初始化失败,请检查授权ID是否正确,最大支持授权ID为:{},当前加密狗授权ID为:{},请重新授权..." .format (self .max_featuer_id ,feature_id ))
74+ self .JadeLog .ERROR (
75+ "加密狗初始化失败,请检查授权ID是否正确,最大支持授权ID为:{},当前加密狗授权ID为:{},请重新授权..." .format (
76+ self .max_featuer_id , feature_id ))
4977 self .exit ()
5078 else :
5179 haspStruct , feature_id , login_status = self .pyldk .login ()
5280 self .pyldk .adapter .logout (haspStruct .handle )
5381 while haspStruct .status == 0 and login_status :
54- haspStruct , feature_id ,login_status = self .pyldk .login (feature_id )
82+ haspStruct , feature_id , login_status = self .pyldk .login (feature_id )
5583 if haspStruct .status == 0 and login_status :
5684 if self .handlequeue .qsize () == self .max_session_size :
5785 self .logout ()
@@ -67,3 +95,15 @@ def run(self):
6795 self .JadeLog .DEBUG ("加密狗监听正常" )
6896 time .sleep (self .time )
6997 self .exit ()
98+
99+
100+ class GetExitSignalThread (Thread ):
101+ def __init__ (self , func , * args ):
102+ self .killer = GracefulKiller (func , args )
103+ super (GetExitSignalThread , self ).__init__ ()
104+ self .start ()
105+
106+ def run (self ):
107+ while not self .killer .kill_now :
108+ time .sleep (1 )
109+ Exit (- 1 )
0 commit comments