o
    j                     @   sd   d dl Z d dlmZmZ d dlmZ d dlmZ G dd dZdd Z	d	d
 Z
edkr0e
  dS dS )    N)
EnumResultEnumResultStatus)SMBConnectionFactory)
SMBMachinec                   @   sF   e Zd ZdddZdd Zdd	 Zd
d Zdd Zdd Zdd Z	dS )
SMBScannerd      Tc                 C   sR   g | _ t|| _|| _d | _d | _|| _g | _d | _	|| _
d| _d| _d| _d S )NFr   )target_gensr   from_urlsmb_mgrworker_counttask_qres_qdepthworkersresult_processing_taskenum_url_SMBScanner__gens_finished_SMBScanner__total_targets_SMBScanner__total_finished)selfsmb_urlr   r   r    r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/aiosmb/commons/scanner/scanner.py__init__   s   
zSMBScanner.__init__c                    s  zz[| j |}|4 I d H B | I d H \}}|d ur|t|}|j| jd2 z3 d H W \}}}t|||||f}	| j|	I d H  q*6 W d   I d H  n1 I d H sWw   Y  W n> t	j
yy   Y W | jt||d tjdI d H  d S  ty }
 z| jt||d |
tjdI d H  W Y d }
~
nd }
~
ww W | jt||d tjdI d H  d S W | jt||d tjdI d H  d S | jt||d tjdI d H  w )N)r   )status)errorr   )r   create_connection_newtargetloginr   enum_all_recursivelyr   r   r   putasyncioCancelledErrorr   FINISHED	ExceptionERROR)r   tidtarget
connection_errmachinepathotypeerer   r   r   
__executor   s2    (
$.$FzSMBScanner.__executorc              
      s   z*	 | j  I d H }|d u rW d S |\}}ztj| ||ddI d H  W n   Y q tjy6   Y d S  tyI } z|W  Y d }~S d }~ww )NT
   )timeout)r   getr!   wait_for_SMBScanner__executorr"   r$   )r   indatar&   r'   r/   r   r   r   worker.   s$    
zSMBScanner.workerc              
      s   zS	 | j  I d H }|jtjkr-|  jd7  _| j| jkr-| jdu r-|  I d H  W d S |j	d urT|j	\}}}|d urHt
d|d  |f  |d urTt
d||f  q tjy_   Y d S  tyu } zt
| W Y d }~d S d }~ww )NT   z[%s] %sr   z	[E] %s %s)r   r3   r   r   r#   r   r   r   	terminateresultprintupperr!   r"   r$   )r   r.   r,   r-   r*   r/   r   r   r   result_processing@   s,   
zSMBScanner.result_processingc                    s2   | j D ]}|  q| jd ur| j  d S d S N)r   cancelr   )r   r7   r   r   r   r9   V   s   


zSMBScanner.terminatec              
      s   z4| j d u rt| j| _ t|  | _| jd u r t | _t| jD ]}| j	
t|   q%W dS  tyK } z
d |fW  Y d }~S d }~ww )NTN)r   r!   Queuer   create_taskr=   r   r   ranger   appendr7   r$   )r   r)   r/   r   r   r   setup\   s   


zSMBScanner.setupc              
      s   zd|   I d H \}}|d ur|| jdu r1|  jd7  _| jtt | j	 
 fI d H  | jD ]}|| jI d H \}}|  j|7  _|d urRtd|  q4d| _tj| j I d H  td W dS  ty } zt| d |fW  Y d }~S d }~ww )NTr8   zTarget gen error! %sr@   )rE   r   r   r   r    struuiduuid4r   
get_targetget_hostname_or_ipr	   runr;   r   r!   gatherr   r$   )r   r)   r*   
target_gentotalr/   r   r   r   rK   k   s.   
(
zSMBScanner.runN)r   r   T)
__name__
__module____qualname__r   r5   r7   r=   r9   rE   rK   r   r   r   r   r   
   s    
r   c                     s   dd l } | jdd}|jddtddd |jd	d
tddd |jdddd |jdddd |jddd | }t|j|j|jd}|j	d urR|j
t|j	 |jd ur`|j
t|j | I d H  td d S )Nr   zSMB Share enumerator)descriptionz-dz--depthr   z"Recursion depth, -1 means infinite)typedefaulthelpz-wz--smb-worker-countr   zParallell countz-tz--targets-filez)Targets file, one ip or hostname per line)rU   z-mz	--machinez-Targetmachoine ip or hostname, can be stackedr   zConnection string that describes the authentication and target. Example: smb+ntlm-password://TEST\Administrator:password@10.10.10.2)r   r   zDone!)argparseArgumentParseradd_argumentint
parse_argsSMBFileEnumr   smb_worker_countr   targets_filer	   rD   FileTargetGenr+   ListTargetGenrK   r;   )rV   parserargs
enumeratorr   r   r   amain   s    

rc   c                   C   s   t t  d S r>   )r!   rK   rc   r   r   r   r   main   s   rd   __main__)r!   #aiosmb.commons.scanner.common.commsr   r   !aiosmb.commons.connection.factoryr   !aiosmb.commons.interfaces.machiner   r   rc   rd   rO   r   r   r   r   <module>   s   z
