66import datetime
77import databases
88import sqlalchemy
9- import bcrypt
9+ import traceback
1010from sqlalchemy .sql import select
1111from sqlalchemy .dialects .postgresql import ARRAY
1212
1919DB_HOST = os .getenv ("DB_HOST" )
2020
2121DATABASE_URI = f"postgresql://{ DB_USER } :{ DB_PASS } @{ DB_HOST } :{ DB_PORT } /{ DB_NAME } "
22- DISPATCHER_URL = "http://dispatcher.tracker .svc.cluster.local"
22+ QUEUE_URL = "http://scan-queue.scanners .svc.cluster.local"
2323
2424metadata = sqlalchemy .MetaData ()
2525
219219 sqlalchemy .Column ("ref_links" , sqlalchemy .String ),
220220)
221221
222- Classification = sqlalchemy .Table (
223- "classification" ,
224- metadata ,
225- sqlalchemy .Column ("id" , sqlalchemy .Integer , primary_key = True ),
226- sqlalchemy .Column ("UNCLASSIFIED" , sqlalchemy .String ),
227- )
228-
229222
230- def Service (database = databases .Database (DATABASE_URI ), client = requests ):
223+ def Dispatch (database = databases .Database (DATABASE_URI ), client = requests ):
231224
232- async def dispatch_web (domain , scan_id ):
225+ async def dispatch_https (domain , scan_id ):
233226
234227 payload = {
235228 "scan_id" : scan_id ,
236229 "domain" : domain .get ("domain" ),
237- "selectors" : domain .get ("selectors" ),
238- "user_init" : False ,
239230 }
240- headers = {
241- "Content-Type" : "application/json" ,
242- "Data" : str (payload ),
243- "Scan-Type" : "web" ,
231+ client .post (QUEUE_URL + "/https" , json = payload )
232+
233+ async def dispatch_ssl (domain , scan_id ):
234+
235+ payload = {
236+ "scan_id" : scan_id ,
237+ "domain" : domain .get ("domain" ),
244238 }
245- client .post (DISPATCHER_URL + "/receive " , headers = headers )
239+ client .post (QUEUE_URL + "/ssl " , json = payload )
246240
247- async def dispatch_mail (domain , scan_id ):
241+ async def dispatch_dns (domain , scan_id ):
248242
249243 payload = {
250244 "scan_id" : scan_id ,
251245 "domain" : domain .get ("domain" ),
252246 "selectors" : domain .get ("selectors" ),
253- "user_init" : False ,
254- }
255- headers = {
256- "Content-Type" : "application/json" ,
257- "Data" : str (payload ),
258- "Scan-Type" : "mail" ,
259247 }
260- client .post (DISPATCHER_URL + "/receive " , headers = headers )
248+ client .post (QUEUE_URL + "/dns " , json = payload )
261249
262- async def main ():
250+ async def scan ():
263251 logging .info ("Retrieving domains for scheduled scan..." )
264252 try :
265253 await database .connect ()
@@ -273,8 +261,14 @@ async def main():
273261 system = await database .fetch_one (system_user_query )
274262
275263 scan_time = datetime .datetime .utcnow ()
264+ count = 0
276265
277266 for domain in domains :
267+ count = count + 1
268+ dispatched .append (domain .get ('domain' ))
269+ logging .info (f"Dispatching scan number { count } of { len (domains )} " )
270+ logging .info (f"Requesting scan for { domain .get ('domain' )} " )
271+
278272 web_insert = Web_scans .insert ().values (
279273 domain_id = domain .get ("id" ),
280274 scan_date = scan_time ,
@@ -297,25 +291,23 @@ async def main():
297291 web_scan_query = select ([Web_scans ]).order_by (Web_scans .c .id .desc ())
298292 web_scan = await database .fetch_one (web_scan_query )
299293
300- dispatched .append (dispatch_web (domain , web_scan .get ("id" )))
301- dispatched .append (dispatch_mail (domain , mail_scan .get ("id" )))
302-
303- for domain in dispatched :
304- await domain
294+ await dispatch_https (domain , web_scan .get ("id" ))
295+ await dispatch_ssl (domain , web_scan .get ("id" ))
296+ await dispatch_dns (domain , mail_scan .get ("id" ))
305297
306298 await database .disconnect ()
307- return { "Dispatched" : [domain . get ( 'domain' ) for domain in domains ]}
299+ return [domain for domain in dispatched ]
308300
309301 except Exception as e :
310302 try :
311303 await database .disconnect ()
312304 except :
313305 pass
314- logging .error (e )
315- return {"Dispatched" : []}
316-
317- return asyncio .run (main ())
306+ logging .error (f"An unexpected error occurred while initiating scheduled scan: { str (e )} \n \n Full traceback: { traceback .format_exc ()} " )
307+ return [domain for domain in dispatched ]
318308
309+ return asyncio .run (scan ())
319310
320311if __name__ == "__main__" :
321- logging .info (Service ())
312+ dispatched_domains = Dispatch ()
313+ logging .info (f"Dispatched scans for: { str (dispatched_domains )} " )
0 commit comments