1919import os
2020import asyncio
2121import sys
22- import tempfile
22+ import threading
2323import uuid
2424from typing import List , Any , Tuple , Callable , Dict
2525from charon .config import get_config , RadasConfig
2626from charon .pkgs .oras_client import OrasClient
2727from proton import SSLDomain , Message , Event
28+ from proton .utils import BlockingConnection
2829from proton .handlers import MessagingHandler
2930from proton .reactor import Container
3031
@@ -45,7 +46,6 @@ def __init__(self, sign_result_loc: str, request_id: str) -> None:
4546 self .sign_result_loc = sign_result_loc
4647 self .request_id = request_id
4748 self .conn = None
48- self .timer_task = None
4949
5050 def on_start (self , event : Event ) -> None :
5151 """
@@ -129,39 +129,56 @@ def _process_message(self, msg: Any) -> None:
129129 logger .info ("Number of files pulled: %d, path: %s" , len (files ), files [0 ])
130130
131131
132- def sign_in_radas (repo_url : str ,
133- requester : str ,
134- sign_key : str ,
135- result_path : str ,
136- ignore_patterns : List [str ],
137- radas_config : RadasConfig ):
132+
133+ class RadasSender (MessagingHandler ):
138134 """
139- This function will be responsible to do the overall controlling of the whole process,
140- like trigger the send and register the receiver, and control the wait and timeout there.
135+ This simple sender will send given string massage to UMB message queue to request signing.
136+ Attributes:
137+ payload (str): payload json string for radas to read,
138+ this value construct from the cmd flag
141139 """
142- logger . debug ( "params. repo_url: %s, requester: %s, sign_key: %s, result_path: %s,"
143- "radas_config: %s" , repo_url , requester , sign_key , result_path , radas_config )
144- request_id = str ( uuid . uuid4 ())
145- exclude = ignore_patterns if ignore_patterns else []
140+ def __init__ ( self , payload : str ):
141+ super (). __init__ ( )
142+ self . payload = payload
143+ self . container = None
146144
147- payload = {
148- "request_id" : request_id ,
149- "requested_by" : requester ,
150- "type" : "mrrc" ,
151- "file_reference" : repo_url ,
152- "sig_keyname" : sign_key ,
153- "exclude" : exclude
154- }
145+ def on_start (self , event ):
146+ """
147+ On start callback
148+ """
149+ conf = get_config ()
150+ if not (conf and conf .is_radas_enabled ()):
151+ sys .exit (1 )
155152
156- temp_dir = tempfile .mktemp ()
157- listener = RadasReceiver (temp_dir , json .dumps (payload ))
153+ rconf = conf .get_radas_config ()
154+ if rconf is None :
155+ sys .exit (1 )
158156
159- try :
160- Container (listener ).run ()
161- logger .info ("Successfully sent signing request ID: %s" , request_id )
162- finally :
163- if listener .conn and not listener .conn .closed :
164- listener .conn .close ()
157+ ssl_domain = SSLDomain (SSLDomain .MODE_CLIENT )
158+ ssl_domain .set_credentials (
159+ rconf .client_ca (),
160+ rconf .client_key (),
161+ rconf .client_key_password ()
162+ )
163+ ssl_domain .set_trusted_ca_db (rconf .root_ca ())
164+ ssl_domain .set_peer_authentication (SSLDomain .VERIFY_PEER )
165+
166+ self .conn = event .container .connect (
167+ url = rconf .umb_target (),
168+ ssl_domain = ssl_domain
169+ )
170+ self .container = event .container
171+ self .sender = event .container .create_sender (self .conn , rconf .request_queue ())
172+
173+ def on_sendable (self ):
174+ """
175+ On message able to send callback
176+ """
177+ request = self .payload
178+ msg = Message (body = request )
179+ self .sender .send (msg )
180+ if self .container :
181+ self .container .stop ()
165182
166183
167184def generate_radas_sign (top_level : str , sign_result_loc : str ) -> Tuple [List [str ], List [str ]]:
@@ -257,4 +274,34 @@ def sign_in_radas(repo_url: str,
257274 result_path : str ,
258275 ignore_patterns : List [str ],
259276 radas_config : RadasConfig ):
260- logger .info ("Start signing for %s" , repo_url )
277+ """
278+ This function will be responsible to do the overall controlling of the whole process,
279+ like trigger the send and register the receiver, and control the wait and timeout there.
280+ """
281+ logger .debug ("params. repo_url: %s, requester: %s, sign_key: %s, result_path: %s,"
282+ "radas_config: %s" , repo_url , requester , sign_key , result_path , radas_config )
283+ request_id = str (uuid .uuid4 ())
284+ exclude = ignore_patterns if ignore_patterns else []
285+
286+ payload = {
287+ "request_id" : request_id ,
288+ "requested_by" : requester ,
289+ "type" : "mrrc" ,
290+ "file_reference" : repo_url ,
291+ "sig_keyname" : sign_key ,
292+ "exclude" : exclude
293+ }
294+
295+ listener = RadasReceiver (result_path , request_id )
296+ sender = RadasSender (json .dumps (payload ))
297+
298+ try :
299+ Container (sender ).run ()
300+ logger .info ("Successfully sent signing request ID: %s" , request_id )
301+ Container (listener ).run ()
302+
303+ finally :
304+ if listener .conn is not None :
305+ listener .conn .close ()
306+ if sender .conn is not None :
307+ sender .conn .close ()
0 commit comments