
    d                        d dl Z d dlZd dlZd dlZd dlZd dlZej                  D  cg c]	  } d| vs|  c} e_        d dlZd dlZd dl	Zd dl
mZ dadZ G d dej                  j                  j                         Z G d d	e      Z G d
 de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zd Zej:                  fdZd Zd Z  G d de      Z! G d  d!e!      Z" G d" d#e!      Z# G d$ d%e      Z$ G d& d'e      Z% G d( d)e      Z& G d* d+e      Z'd, Z( G d- d.ej                  j                  jR                        Z* G d/ d0ej                  jV                  jX                        Z-d1 Z.d Z/d2Z0d3Z1d4 Z2d5 Z3d6 Z4e5d7k(  re4e_4         ejl                   e3              yyc c} w )8    N_xmlplus)StringIOF1c                   $    e Zd ZdZ e       Zd Zy)OverrideEntityResolverzqThis class overrides the default behavior of xml.sax to download
    remote DTDs, instead returning blank stringsc                 "    t         j                  S N)r   empty)selfpublicIdsystemIds      '/usr/lib/python3/dist-packages/ndiff.pyresolveEntityz$OverrideEntityResolver.resolveEntity(   s    %+++    N)__name__
__module____qualname____doc__r   r
   r    r   r   r   r   #   s    4JE,r   r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
ScanzA single Nmap scan, corresponding to a single invocation of Nmap. It is
    a container for a list of hosts. It also has utility methods to load itself
    from an Nmap XML file.c                 t    d | _         d | _        d | _        d | _        d | _        g | _        g | _        g | _        y r	   )scannerversionargs
start_dateend_datehostspre_script_resultspost_script_resultsr   s    r   __init__zScan.__init__0   s<    	
"$#% r   c                 >    | j                   j                  d        y )Nc                 "    | j                         S r	   )get_id)hs    r   <lambda>z!Scan.sort_hosts.<locals>.<lambda>;   s    ahhj r   )key)r   sortr!   s    r   
sort_hostszScan.sort_hosts:   s    

01r   c                     t         j                  j                         }t        |       }|j	                  t                      |j                  |       |j                  |       y)z8Load a scan from the Nmap XML in the file-like object f.N)xmlsaxmake_parserNmapContentHandlersetEntityResolverr   setContentHandlerparse)r   fparserhandlers       r   loadz	Scan.load=   sI    $$&$T*  !7!9:  )Qr   c                 h    t        |d      5 }| j                  |       ddd       y# 1 sw Y   yxY w)z;Load a scan from the Nmap XML file with the given filename.rN)openr6   )r   filenamer3   s      r   load_from_filezScan.load_from_fileE   s.    (C  	AIIaL	 	 	s   (1c                    i }| j                   | j                   |d<   | j                  | j                  |d<   | j                  Qdt        j                  | j                  j                               z  |d<   | j                  j                  d      |d<   | j                  | j                  |d<   |j                  d|       y )	Nr   r   %dstart%a %b %d %H:%M:%S %Ystartstrr   nmaprun)	r   r   r   timemktime	timetuplestrftimer   startElement)r   writerattrss      r   write_nmaprun_openzScan.write_nmaprun_openJ   s    <<##||E)99  IIE&M??&!DKK0I0I0K$LLE'N $ 8 8*!,E*<<##||E)Iu-r   c                 &    |j                  d       y NrA   )
endElement)r   rG   s     r   write_nmaprun_closezScan.write_nmaprun_closeX   s    )$r   c                 H   |j                         }|j                  d      }| j                  |j                  d| j                         | j                  |j                  d| j                         | j
                  k|j                  ddt        j                  | j
                  j                               z         |j                  d| j
                  j                  d             | j                  |j                  d| j                         |j                  |       |S )	NrA   r   r   r>   r=   r@   r?   r   )createDocumentFragmentcreateElementr   setAttributer   r   rB   rC   rD   rE   r   appendChildr   documentfragelems       r   nmaprun_to_dom_fragmentzScan.nmaprun_to_dom_fragment[   s    ..0%%i0<<#i699 fdii0??&TDKK0I0I0K$LLNOO,,-CDF <<#i6r   N)r   r   r   r   r"   r*   r6   r;   rI   rM   rW   r   r   r   r   r   ,   s*    &2
.%r   r   c                   ^    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zy)HostzA single host, with a state, addresses, host names, a dict mapping port
    specs to Ports, and a list of OS matches. Host states are strings, or None
    for "unknown".c                 f    d | _         g | _        g | _        i | _        i | _        g | _        g | _        y r	   )state	addresses	hostnamesports
extraportsosscript_resultsr!   s    r   r"   zHost.__init__r   s4    

 r   c                    d}t        | j                        dkD  r$dt        t        | j                        d         z  }t        | j                        dkD  r(|xs dt        t        | j                        d         z   S |xs t        |       S )zTReturn an id that is used to determine if hosts are "the same"
        across scans.Nr   z%-40sz(                                        )lenr\   strsortedr]   id)r   hids     r   r%   zHost.get_id{   sx     t~~"S!7!:;<Ct~~"O8s6$..+A!+D'EEEbhr   c                    dj                  d t        | j                        D              }dj                  t        | j                              }t	        |      dkD  rt	        |      dkD  r|d|dS |S t	        |      dkD  r|S y)z1Return a human-readable identifier for this host., c              3   4   K   | ]  }|j                     y wr	   s).0as     r   	<genexpr>z#Host.format_name.<locals>.<genexpr>   s     BaaccBs   r   z ()z	<no name>)joinre   r\   r]   rc   )r   	address_s
hostname_ss      r   format_namezHost.format_name   st    IIB6$..+ABB	YYvdnn56
z?Q9~!$.	::!!^ar   c                 6    || j                   |j                  <   y r	   )r^   spec)r   ports     r   add_portzHost.add_port   s     $

499r   c                 X    || j                   vr| j                   j                  |       y y r	   )r\   append)r   addresss     r   add_addresszHost.add_address   s%    $..(NN!!'* )r   c                 X    || j                   vr| j                   j                  |       y y r	   )r]   rz   )r   hostnames     r   add_hostnamezHost.add_hostname   s%    4>>)NN!!(+ *r   c                 *    |d u xs || j                   v S r	   )r_   )r   r[   s     r   is_extraportszHost.is_extraports   s    }8 88r   c           	          t        | j                  j                               D cg c]	  \  }}||f }}}|j                  d       dj	                  |D cg c]  \  }}d||fz   c}}      S c c}}w c c}}w )NT)reverseri   z%d %s ports)listr_   itemsr)   rq   )r   r[   count	locallists       r   extraports_stringzHost.extraports_string   sw    :>t?T?T?V:WXeU^X	Xt$yyFOPNUE%/PR 	R Y Qs   A3A9
c                     |j                         }| j                  >|j                  d      }|j                  d| j                         |j	                  |       |S )Nstatusr[   )rO   r[   rP   rQ   rR   rS   s       r   state_to_dom_fragmentzHost.state_to_dom_fragment   sQ    ..0::!))(3Dgtzz2T"r   c                     |j                         }|j                  d      }|j                  d|       |j                  |       |S )Nr~   namerO   rP   rQ   rR   )r   rT   r~   rU   rV   s        r   hostname_to_dom_fragmentzHost.hostname_to_dom_fragment   sC    ..0%%j1&(+r   c                    |j                         }t        | j                  j                               D ]T  \  }}|j	                  d      }|j                  d|       |j                  dt        |             |j                  |       V |S )Nr_   r[   r   )rO   r   r_   r   rP   rQ   rd   rR   )r   rT   rU   r[   r   rV   s         r   extraports_to_dom_fragmentzHost.extraports_to_dom_fragment   s~    ..0 !6!6!89 	#LE5)),7Dgu-gs5z2T"		#
 r   c                     |j                         }|j                  d      }|j                  d|       |j                  |       |S )Nosmatchr   r   )r   rT   r`   rU   rV   s        r   os_to_dom_fragmentzHost.os_to_dom_fragment   sC    ..0%%i0&"%r   c                    |j                         }|j                  d      }| j                   |j                  | j	                  |             | j
                  D ]"  }|j                  |j                  |             $ t        | j                        dkD  rT|j                  d      }| j                  D ]#  }|j                  | j                  ||             % |j                  |       |j                  d      }|j                  | j                  |             t        | j                  j                               D ]>  }| j                  |j                        r|j                  |j                  |             @ |j                         r|j                  |       t        | j                         dkD  rT|j                  d      }	| j                   D ]#  }
|	j                  | j#                  ||
             % |j                  |	       t        | j$                        dkD  rS|j                  d      }| j$                  D ]"  }|j                  |j                  |             $ |j                  |       |j                  |       |S )Nhostr   r]   r^   r`   
hostscript)rO   rP   r[   rR   r   r\   to_dom_fragmentrc   r]   r   r   re   r^   valuesr   hasChildNodesr`   r   ra   )r   rT   rU   rV   addrhostnames_elemr~   
ports_elemrw   os_elemr`   hostscript_elemsrs                r   r   zHost.to_dom_fragment   s;   ..0%%f-::!T77ABNN 	=DT11(;<	= t~~"%33K@N NN K**55hIKK ^,++G4
t>>xHI4::,,./ 	GD%%djj1&&t';';H'EF	G ##%Z(tww<!,,T2Ggg K##D$;$;Hb$IJKW%t""#a'&44\BO)) J++B,>,>x,HIJ_-r   N)r   r   r   r   r"   r%   rt   rx   r|   r   r   r   r   r   r   r   r   r   r   r   rY   rY   n   sI    !%+,9R&r   rY   c                   R    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
 ee
      Z
d	 Zy
)Addressc                     || _         y r	   rk   r   rl   s     r   r"   zAddress.__init__   s	    r   c                 D    | j                         |j                         k(  S r	   sort_keyr   others     r   __eq__zAddress.__eq__   s    }}%.."222r   c                 &    | j                  |       S r	   r   r   s     r   __ne__zAddress.__ne__       ;;u%%%r   c                 4    t        | j                               S r	   )hashr   r!   s    r   __hash__zAddress.__hash__   s    DMMO$$r   c                 D    | j                         |j                         k  S r	   r   r   s     r   __lt__zAddress.__lt__   s    }}!111r   c                 ,    t        | j                        S r	   )rd   rl   r!   s    r   __str__zAddress.__str__   s    466{r   c                     | j                   S r	   rk   r!   s    r   __unicode__zAddress.__unicode__  s    vvr   c                 ~    | dk(  rt        |      S | dk(  rt        |      S | dk(  rt        |      S t        d| z        )Nipv4ipv6maczUnknown address type %s.)IPv4AddressIPv6Address
MACAddress
ValueError)typerl   s     r   newzAddress.new  sF    6>q>!V^q>!U]a= 7$>??r   c                     |j                         }|j                  d      }|j                  d| j                         |j                  d| j                         |j                  |       |S )Nr{   r   addrtype)rO   rP   rQ   rl   r   rR   rS   s       r   r   zAddress.to_dom_fragment  s[    ..0%%i0&$&&)*dii0r   N)r   r   r   r"   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r      s<    3&%2@ s
Cr   r   c                   $    e Zd Z ed       Zd Zy)r   c                      y)Nr   r   r!   s    r   r'   zIPv4Address.<lambda>      r   c                     d| j                   fS Nr   rk   r!   s    r   r   zIPv4Address.sort_key       466{r   Nr   r   r   propertyr   r   r   r   r   r   r         '(Dr   r   c                   $    e Zd Z ed       Zd Zy)r   c                      y)Nr   r   r!   s    r   r'   zIPv6Address.<lambda>%  r   r   c                     d| j                   fS N   rk   r!   s    r   r   zIPv6Address.sort_key'  r   r   Nr   r   r   r   r   r   $  r   r   r   c                   $    e Zd Z ed       Zd Zy)r   c                      y)Nr   r   r!   s    r   r'   zMACAddress.<lambda>,  r   r   c                     d| j                   fS )N   rk   r!   s    r   r   zMACAddress.sort_key.  r   r   Nr   r   r   r   r   r   +  s    &'Dr   r   c                   6    e Zd ZdZd	dZd Zd Zd Zd Zd Z	y)
PortzA single port, consisting of a port specification, a state, and a
    service version. A specification, or "spec," is the 2-tuple (number,
    protocol). So (10, "tcp") corresponds to the port 10/tcp. Port states are
    strings, or None for "unknown".Nc                 L    || _         || _        t               | _        g | _        y r	   )rv   r[   Serviceservicera   )r   rv   r[   s      r   r"   zPort.__init__7  s!    	
y r   c                 F    | j                   yt        | j                         S )Nunknown)r[   rd   r!   s    r   state_stringzPort.state_string=  s    ::tzz?"r   c                      d| j                   z  S )Nz%d/%s)rv   r!   s    r   spec_stringzPort.spec_stringC  s    ""r   c                 ,    t        | j                        S r	   )r   rv   r!   s    r   r   zPort.__hash__F  s    DIIr   c                     | j                   | j                  | j                  f|j                   |j                  |j                  fk  S r	   )rv   r   ra   r   s     r   r   zPort.__lt__I  s?    		4<<)<)<=JJu';';A= = 	=r   c                 B   |j                         }|j                  d      }|j                  dt        | j                  d                |j                  d| j                  d          | j
                  >|j                  d      }|j                  d| j
                         |j                  |       |j                  | j                  j                  |             | j                  D ]"  }|j                  |j                  |             $ |j                  |       |S )Nrw   portidr   protocolr   r[   )
rO   rP   rQ   rd   rv   r[   rR   r   r   ra   )r   rT   rU   rV   
state_elemr   s         r   r   zPort.to_dom_fragmentM  s    ..0%%f-(C		!$56*diil3::!!//8J##GTZZ8Z(55h?@%% 	;BR//9:	;r   r	   )
r   r   r   r   r"   r   r   r   r   r   r   r   r   r   r   2  s%    '!##=r   r   c                   8    e Zd ZdZd ZdZd Zd Zd Zd Z	d Z
y)	r   zjA service version as determined by -sV scan. Also contains the looked-up
    port name if -sV wasn't used.c                 J    d | _         d | _        d | _        d | _        d | _        y r	   r   productr   	extrainfotunnelr!   s    r   r"   zService.__init__`  s%    	r   Nc                     | j                   |j                   k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r	   )r   r   r   r   r   s     r   r   zService.__eq__m  sX    yyEJJ& 2-2-2 %//1	2r   c                 &    | j                  |       S r	   r   r   s     r   r   zService.__ne__s  r   r   c                     g }| j                   |j                  | j                          | j                  |j                  | j                         t        |      dk(  ry dj	                  |      S )Nr   /)r   rz   r   rc   rq   r   partss     r   name_stringzService.name_stringv  sW    ;;"LL%99 LL#u:?88E?"r   c                 6   g }| j                   |j                  | j                          | j                  |j                  | j                         | j                  |j                  d| j                  z         t	        |      dk(  rydj                  |      S )z7Get a string like in the VERSION column of Nmap output.Nz(%s)r    )r   rz   r   r   rc   rq   r   s     r   version_stringzService.version_string  sv    <<#LL&<<#LL&>>%LL$..01u:?88E?"r   c                     |j                         }|j                  d      }dD ]#  }t        | |      }||j                  ||       % t	        |j
                        dkD  r|j                  |       |S )Nr   r   r   )rO   rP   getattrrQ   rc   
attributesrR   )r   rT   rU   rV   attrvs         r   r   zService.to_dom_fragment  sy    ..0%%i0I 	'Dd#AydA&		'
 t!#T"r   )r   r   r   r   r"   r   r   r   r   r   r   r   r   r   r   r   ]  s,    % H2&
##
r   r   c                   .    e Zd Zd ZdZd Zd Zd Zd Zy)ScriptResultc                      d | _         d | _        y r	   rf   outputr!   s    r   r"   zScriptResult.__init__  s    r   Nc                 j    | j                   |j                   k(  xr | j                  |j                  k(  S r	   r   r   s     r   r   zScriptResult.__eq__  s'    ww%(("Bt{{ell'BBr   c                 &    | j                  |       S r	   r   r   s     r   r   zScriptResult.__ne__  r   r   c                    g }| j                   j                         }t        |      dkD  r| j                  dz   |d   z   |d<   |d d D ]  }|j	                  d|z           t        |      dkD  r|j	                  d|d   z          |S )Nr   : z|  z|_ )r   
splitlinesrc   rf   rz   )r   resultlineslines       r   	get_lineszScriptResult.get_lines  s    &&(u:>ww~a0E!H#2J 	(DMM%$,'	(u:>MM%%)+,r   c                     |j                         }|j                  d      }|j                  d| j                         |j                  d| j                         |j                  |       |S )Nscriptrf   r   )rO   rP   rQ   rf   r   rR   rS   s       r   r   zScriptResult.to_dom_fragment  s[    ..0%%h/$((DKK0r   )	r   r   r   r"   r   r   r   r
  r   r   r   r   r   r     s#     HC&	r   r   c                    d}| j                   | j                   dk7  r| j                   }|g}| j                  |j                  | j                         |j                  d       | j                  -|j                  d| j                  j	                  d      z         | j
                  |j                  d| j
                  z         dj                  |      S )z4Format a startup banner more or less like Nmap does.Nmapnmapscanzinitiated %sr?   zas: %sr   )r   r   rz   r   rE   r   rq   )r  r   r   s      r   format_bannerr    s    G||DLLF$:,,IE||T\\"	LL"^doo&>&>"'$ $ 	%yyX		)*88E?r   c                 6   t        d      }|D ]  }|j                  |        t        |      dkD  rht        |       t        |      dk(  rt        d| z  |       n/t        |      dk(  rt        d| z  |       nt        d| z  |       t        ||       y y )N*r   file-%s:+%s: %s:)Tableappend_to_port_tablerc   print)titlescript_results_ascript_results_bscript_result_diffsr3   tablesr_diffs          r   print_script_result_diffs_textr"    s    #JE& ,$$U+,
5zA~1 A%&5.q)!"a'&5.q)&5.q)e! r   c                    t        |      dk(  rt        |      dk(  r|j                         S t        |      dk(  rK|j                  d      }|D ]"  }| j                  |j	                  |             $ |j                  |        |S t        |      dk(  rK|j                  d      }|D ]"  }| j                  |j	                  |             $ |j                  |        |S |D ]"  }| j                  |j	                  |             $ | S )Nr   rn   b)rc   rO   rP   rR   r   )	rV   r  r  r  rT   a_elemr   b_elemr!  s	            r   #script_result_diffs_to_dom_fragmentr'    s   
!c*:&;q&@..00		!	#''," 	;BR//9:	;4 		!	#''," 	;BR//9:	;4 * 	@GW44X>?	@r   c              #   x  K   d}d}|t        |       k  r|t        |      k  r| |   j                         ||   j                         k  r| |   t               f |dz  }nT| |   j                         ||   j                         kD  rt               ||   f |dz  }n| |   ||   f |dz  }|dz  }|t        |       k  r|t        |      k  r|t        |       k  r%| |   t               f |dz  }|t        |       k  r%|t        |      k  r&t               ||   f |dz  }|t        |      k  r%yyw)aK  Take hosts lists a and b, which must be sorted by id, and return pairs.
    When the heads of both lists have the same ids, they are returned together.
    Otherwise the one with the smaller id is returned, with an empty host as
    its counterpart, and the one with the higher id will remain in its list for
    a later iteration.r   r   N)rc   r%   rY   )rn   r$  ijs       r   
host_pairsr+    s2     	
A	A
c!f*SVQ4;;=1Q4;;=(A$,FAqT[[]QqT[[]*&!A$,FAA$!*FAFA c!f*SV c!f*dDFl	Q c!f* c!f*fadl	Q c!f*s   CD:2D:2D:8D:c                   4    e Zd ZdZej
                  fdZd Zy)ScanDiffzeAn abstract class for different diff output types. Subclasses must
    define various output methods.c                 .    || _         || _        || _        y)zJCreate a ScanDiff from the "before" scan_a and the "after"
        scan_b.N)scan_ascan_br3   r   r/  r0  r3   s       r   r"   zScanDiff.__init__  s     r   c                    | j                   j                          | j                  j                          | j                          t        j                  | j                   j                  | j                  j                        }| j                  |       d}t        | j                   j                  | j                  j                        D ]G  \  }}t        ||      }||j                  z  }|j                  dkD  st        s7| j                  |       I t        j                  | j                   j                  | j                  j                        }| j                  |       | j!                          |S r   )r/  r*   r0  output_beginningScriptResultDiff
diff_listsr   output_pre_scriptsr+  r   HostDiffcostverboseoutput_host_diffr    output_post_scriptsoutput_ending)r   pre_script_result_diffsr8  host_ahost_bh_diffpost_script_result_diffss          r   r   zScanDiff.output  s!     "2"="=..0N0N#P 78 )):):DKK<M<MN 	.NFFff-FFKKD{{Q'%%f-		. $4#>#>////$1  	  !9:r   N)r   r   r   r   sysstdoutr"   r   r   r   r   r-  r-    s    &), r   r-  c                   H    e Zd Zej                  fdZd Zd Zd Zd Z	d Z
y)ScanDiffTextc                 4    t         j                  | |||       y r	   )r-  r"   r1  s       r   r"   zScanDiffText.__init__9  s    $2r   c                    t        | j                        }t        | j                        }||k7  r5t        d|z  | j                         t        d|z  | j                         y t
        rt        d|z  | j                         y y )Nz-%sr  z+%sz %s)r  r/  r0  r  r3   r9  )r   banner_abanner_bs      r   r3  zScanDiffText.output_beginning<  sg     - -x%("0%("0%("0 r   c                     t        d| j                  j                  | j                  j                  || j                         y )NzPre-scan script results)r"  r/  r   r0  r3   )r   r=  s     r   r6  zScanDiffText.output_pre_scriptsE  s/    &'@KK**DKK,J,J#TVV	-r   c                     t        d| j                  j                  | j                  j                  || j                         y )NzPost-scan script results)r"  r/  r    r0  r3   )r   rA  s     r   r;  z ScanDiffText.output_post_scriptsJ  s/    &'AKK++T[[-L-L$dff	.r   c                 f    t        | j                         |j                  | j                         y )Nr  )r  r3   
print_text)r   r@  s     r   r:  zScanDiffText.output_host_diffO  s     466$&&!r   c                      y r	   r   r!   s    r   r<  zScanDiffText.output_endingS  s    r   N)r   r   r   rB  rC  r"   r3  r6  r;  r:  r<  r   r   r   rE  rE  8  s'    ), 31-
.
"r   rE  c                   N    e Zd Zej                  fdZd Zd Zd Zd Z	d Z
d Zy)	ScanDiffXMLc                     t         j                  | |||       t        j                  j                  j                         }|j                  d d d       | _        t        |      | _	        y r	   )
r-  r"   r,   domminidomgetDOMImplementationcreateDocumentrT   	XMLWriterrG   )r   r/  r0  r3   impls        r   r"   zScanDiffXML.__init__X  sM    $2ww335++D$=lr   c                 t    dD ]3  }t        | j                  |d       t        | j                  |d       k7  s3 y y)N)r   r   r   r   r   TF)r   r/  r0  )r   r   s     r   nmaprun_differszScanDiffXML.nmaprun_differs`  s>    L 	Dt{{D$/DKKt45	 r   c                 X   | j                   j                          | j                   j                  ddt        i       | j                   j                  di        | j	                         r}| j                   j                  | j                  j                  | j                               | j                   j                  | j                  j                  | j                               y t        r?| j                   j                  | j                  j                  | j                               y y )Nnmapdiffr   scandiff)rG   startDocumentrF   NDIFF_XML_VERSIONrY  frag_ar/  rW   rT   frag_br0  r9  rU   r!   s    r   r3  zScanDiffXML.output_beginningg  s    !!#  i9J-KL  R0!KKKK77FHKKKK77FHKKKK77FH r   c                 <   t        |      dkD  st        r| j                  j                  d      }t	        || j
                  j                  | j                  j                  || j                        }| j                  j                  |       |j                          y y )Nr   	prescript)rc   r9  rT   rP   r'  r/  r   r0  rG   rU   unlink)r   r=  prescript_elemrU   s       r   r6  zScanDiffXML.output_pre_scriptsu  sx    &'!+w!]]88EN6 > >..0GD KKT"KKM 07r   c                 <   t        |      dkD  st        r| j                  j                  d      }t	        || j
                  j                  | j                  j                  || j                        }| j                  j                  |       |j                          y y )Nr   
postscript)rc   r9  rT   rP   r'  r/  r    r0  rG   rU   rc  )r   rA  postscript_elemrU   s       r   r;  zScanDiffXML.output_post_scripts  sx    '(1,"mm99,GO6!@!@//1ID KKT"KKM 18r   c                     |j                  | j                        }| j                  j                  |       |j	                          y r	   )r   rT   rG   rU   rc  )r   r@  rU   s      r   r:  zScanDiffXML.output_host_diff  s1    %%dmm4r   c                     | j                   j                  d       | j                   j                  d       | j                   j                          y )Nr\  r[  )rG   rL   endDocumentr!   s    r   r<  zScanDiffXML.output_ending  s6    z*z*!r   N)r   r   r   rB  rC  r"   rY  r3  r6  r;  r:  r<  r   r   r   rP  rP  W  s-    ), #H
"r   rP  c                   F    e Zd ZdZd Zd Zd Zej                  fdZ	d Z
y)r7  zA diff of two Hosts. It contains the two hosts, variables describing
    what changed, and a list of PortDiffs and OS differences.c                     || _         || _        d| _        d| _        d| _        d| _        g | _        i | _        g | _        g | _	        d| _
        | j                          y )NFr   )r>  r?  state_changed
id_changed
os_changedextraports_changedr^   
port_diffsos_diffsr  r8  diff)r   r>  r?  s      r   r"   zHostDiff.__init__  s[    ""'
#% 			r   c                    | j                   j                  | j                  j                  k7  rd| _        | xj                  dz  c_        t        | j                   j                        t        | j                  j                        k7  s?t        | j                   j                        t        | j                  j                        k7  rd| _        | xj                  dz  c_        t        t        | j                   j                  j                               j                  t        | j                  j                  j                                           }|j                          |D ]  }| j                   j                  j                  |      }| j                  j                  j                  |      }t        |xs t!        |      |xs t!        |            }| j#                  |      s|xs |}| j                  j%                  |       || j&                  |<   | xj                  |j                  z  c_         t)        j*                  d | j                   j,                  | j                  j,                        }|j/                         | _        t3        | j0                  D cg c]  }|d   dk7  s| c}      }	|	dkD  rd| _        | xj                  |	z  c_        t7        d t        | j                   j8                  j;                               D              }
t7        d t        | j                  j8                  j;                               D              }|
|k7  rd| _        | xj                  dz  c_        t>        jA                  | j                   jB                  | j                  jB                        | _"        | xj                  t3        | jD                        z  c_        y c c}w )NTr   r   equalc              3   *   K   | ]  \  }}||f  y wr	   r   rm   r[   r   s      r   ro   z HostDiff.diff.<locals>.<genexpr>  "      L"UE $U^ L   c              3   *   K   | ]  \  }}||f  y wr	   r   rw  s      r   ro   z HostDiff.diff.<locals>.<genexpr>  rx  ry  )#r>  r[   r?  rm  r8  setr\   r]   rn  r   r^   keysunionr)   getPortDiffr   include_diffrz   rq  difflibSequenceMatcherr`   get_opcodesrr  rc   ro  tupler_   r   rp  r4  r5  ra   r  )r   	all_specsrv   port_aport_brs  rw   rr  xos_costextraports_aextraports_bs               r   rs  zHostDiff.diff  s   ;; 1 11!%DIINIt{{$$%T[[-B-B)CC$++''(C0E0E,FF"DOIINIDKK%%**,-33))..0134	 	 	'D [[&&**40F[[&&**40FF0d4j&2FDJGD  &'

!!$'(,%		TYY&		' **dkknndkknn6 ,,.$--CQ1Q47?qCDQ;"DO		W	 L&*4;;+A+A+G+G+I&JL L L&*4;;+A+A+G+G+I&JL L<'&*D#IINI#3#>#>**DKK,F,F$H 		S1122	 Ds   #O$1O$c                     | j                   j                  |j                  j                        r0| j                  j                  |j
                  j                        ryt        ry|j                  dkD  S )NFTr   )r>  r   r  r[   r?  r  r9  r8  )r   rs  s     r   r  zHostDiff.include_diff  sS     ;;$$T[[%6%67;;$$T[[%6%67yy1}r   c                    | j                   }| j                  }| j                  r_|j                  t	        d|j                         z  |       | j                  j                  =t	        d|j                         z  |       nt	        d|j                         z  |       | j                  rM|j                  t	        d|j                  z  |       |j                  ;t	        d|j                  z  |       n t        rt	        d|j                  z  |       | j                  rmt        |j                        dkD  rt	        d	|j                         z  |       t        |j                        dkD  r[t	        d
|j                         z  |       n<t        r6t        |j                        dkD  rt	        d|j                         z  |       t        d      }|j                  d}n|j                  d}nd}|j                  |ddddf       | j                  D ]$  }| j                  |   }|j!                  |||       & t        |      dkD  rt	        ||       | j"                  st        r,t        |j$                        dkD  r4t        |j$                        dkD  rt	        d|       n3t	        d|       n%t        |j$                        dkD  rt	        d|       | j&                  D ]  \  }}	}
}}|dk(  s|dk(  r.t)        |	|
      D ]  }t	        d|j$                  |   z  |       ! |dk(  s|dk(  r.t)        ||      D ]  }t	        d|j$                  |   z  |       ! |dk(  st)        |	|
      D ]  }t	        d|j$                  |   z  |       !  t+        d|j,                  |j,                  | j.                         y ) Nr  r  r  r  z-Host is %s.z+Host is %s.z Host is %s.r   z-Not shown: %sz+Not shown: %sz Not shown: %sz** * * *+-r   PORTSTATESERVICEVERSIONr   z OS details:z-OS details:z+OS details:replacedeletez-  %sinsertz+  %sru  z   %szHost script results)r>  r?  rn  r[   r  rt   rm  r9  rp  rc   r_   r   r  rz   r^   rq  r  ro  r`   rr  ranger"  ra   r  )r   r3   r>  r?  
port_tablemarkrw   	port_diffopi1i2j1j2r)  s                 r   rM  zHostDiff.print_text  sF    ??||'fv1133!<{{  ,fv1133!<&6--//a8 ||'nv||3!<||'nv||3!<.6<</a8 ""6$$%)&)A)A)CC!L6$$%)&)A)A)CC!L6$$%)&)A)A)CC!L :&
<<D\\!DD4)YGHJJ 	GD-I**:vvF	G z?Q*1% ??g699~!vyy>A%.q1.q1VYY!#n1- '+mm 	>"BB?bHn"2r] >g		!41=>?bHn"2r] >g		!41=>="2r] >g		!41=>	> 	''<!!6#8#8$$	&r   c           	         | j                   }| j                  }|j                         }|j                  d      }|j	                  |       |j
                  |j
                  |j
                  D|j                  d      }|j	                  |j                  |             |j	                  |       |S |j
                  B|j                  d      }|j	                  |j                  |             |j	                  |       |S |j                  d      }|j
                  |j
                  k(  r't        r|j	                  |j                  |             n|j                  d      }|j	                  |j                  |             |j	                  |       |j                  d      }|j	                  |j                  |             |j	                  |       t        |j                        }	t        |j                        }
t        |	j                  |
            D ]"  }|j	                  |j                  |             $ |j                  d      }t        |	|
z
        D ]"  }|j	                  |j                  |             $ |j                         r|j	                  |       |j                  d      }t        |
|	z
        D ]"  }|j	                  |j                  |             $ |j                         r|j	                  |       |j                  d      }t        |j                        }t        |j                        }t        |j                  |            D ]#  }|j	                  |j                  ||             % |j                  d      }t        ||z
        D ]#  }|j	                  |j                  ||             % |j                         r|j	                  |       |j                  d      }t        ||z
        D ]#  }|j	                  |j                  ||             % |j                         r|j	                  |       |j                         r|j	                  |       |j                  d      }|j                   |j                   k(  r!|j	                  |j#                  |             n|j                  d      }|j	                  |j#                  |             |j	                  |       |j                  d      }|j	                  |j#                  |             |j	                  |       | j$                  D ]h  }| j&                  |   }|j(                  dk(  r(t        s(|j	                  |j                  |             I|j	                  |j                  |             j |j                         r|j	                  |       | j*                  st        rf|j                  d      }| j,                  D ]$  \  }}}}}|d	k(  s|d
k(  ra|j                  d      }t/        ||      D ]0  }|j	                  |j1                  ||j2                  |                2 |j	                  |       |d	k(  s|dk(  ra|j                  d      }t/        ||      D ]0  }|j	                  |j1                  ||j2                  |                2 |j	                  |       |dk(  st/        ||      D ]0  }|j	                  |j1                  ||j2                  |                2 ' |j                         r|j	                  |       t5        | j6                        dkD  st        rM|j                  d      }|j	                  t9        ||j:                  |j:                  | j6                  |             |j	                  |       |S )Nhostdiffrn   r$  r   r]   r^   r   r`   r  r  r  ru  r   )r>  r?  rO   rP   rR   r[   r   r9  r   r{  r\   re   intersectionr   r]   r   r_   r   r^   rq  r8  ro  rr  r  r   r`   rc   r  r'  ra   )r   rT   r>  r?  rU   hostdiff_elemr%  r&  	host_elem	addrset_a	addrset_br   r   hostnameset_ahostnameset_br~   r   rw   p_diffr   r  r  r  r  r  r)  r   s                              r   r   zHostDiff.to_dom_fragment*  s   ..0 ..z:'<<6<<#7||'!//4""6#9#9(#CD))&1
 K	 )!//4""6#9#9(#CD))&1K**62	 <<6<<'%%f&B&B8&LM++C0Fv;;HEF!!&)++C0Fv;;HEF!!&) (()	(()	911)<= 	BD!!$"6"6x"@A	B'',9y01 	?Dt33H=>	?!!!&)'',9y01 	?Dt33H=>	?!!!&) "//<F,,-F,,-}99-HI 	IH&&33HhGI	I '',}}<= 	IH33HhGI	I !&&v.'',}}<= 	IH33HhGI	I !&&v.'')!!.1++G4
 1 11""6#D#DX#NO++C0Fv@@JK""6*++C0Fv@@JK""6*JJ 	ID__T*F{{a**4+?+?+IJ&&v'='=h'GH	I ##%!!*- ??g,,T2G '+mm 5"BB?bHn%33C8F"2r] 5**6+D+D$fiil,4 55 ''/?bHn%33C8F"2r] 5**6+D+D$fiil,4 55 ''/="2r] 5++F,E,E$fiil-4 555" $$&%%g. t''(1,&44\BO!!"E!6!6%%t'?'?# 
 	!!),r   N)r   r   r   r   r"   rs  r  rB  rC  rM  r   r   r   r   r7  r7    s.    A-3^ :: I&VAr   r7  c                   (    e Zd ZdZd Zd Zd Zd Zy)r  zA diff of two Ports. It contains the two ports and the cost of changing
    one into the other. If the cost is 0 then the two ports are the same.c                 \    || _         || _        g | _        d| _        | j	                          y r   )r  r  r  r8  rs  )r   r  r  s      r   r"   zPortDiff.__init__  s(    #% 			r   c                 f   | j                   j                  | j                  j                  k7  r| xj                  dz  c_        | j                   j                  | j                  j                  k7  r| xj                  dz  c_        | j                   j
                  | j                  j
                  k7  r| xj                  dz  c_        t        j                  | j                   j                  | j                  j                        | _	        | xj                  t        | j                        z  c_        y r   )r  rv   r  r8  r[   r   r4  r5  ra   r  rc   r!   s    r   rs  zPortDiff.diff  s    ;;t{{///IINI;; 1 11IINI;;$++"5"55IINI#3#>#>**DKK,F,F$H 		S1122	r   c                 x   | j                   j                         | j                   j                         | j                   j                  j	                         | j                   j                  j                         g}| j                  j                         | j                  j                         | j                  j                  j	                         | j                  j                  j                         g}||k(  r+t        s| j                  dkD  r|j                  dg|z          nt|j                  | j                   j                        s|j                  dg|z          |j                  | j                  j                        s|j                  dg|z          | j                  D ]  }|j                  |        y)zAppend this port diff to a Table containing five columns:
            +- PORT STATE SERVICE VERSION
        The "+-" stands for the diff indicator column.r   r   r  r  N)r  r   r   r   r   r   r  r9  r  rz   r   r[   r  )r   r   r>  r?  	a_columns	b_columnsr!  s          r   r  zPortDiff.append_to_port_table  sR    [[,,.KK$$&KK++-KK..02	 [[,,.KK$$&KK++-KK..02	 	!$22Q6cUY./''(9(9:cUY./''(9(9:cUY./// 	0G((/	0r   c                    |j                         }|j                  d      }|j                  |       | j                  j                  | j
                  j                  k(  rJ| j                  j                  | j
                  j                  k(  r|j                  d      }|j                  dt        | j                  j                  d                |j                  d| j                  j                  d          | j                  j                  H|j                  d      }|j                  d| j                  j                         |j                  |       | j                  j                  | j
                  j                  k(  r5|j                  | j                  j                  j                  |             n|j                  d      }|j                  | j                  j                  j                  |             |j                  |       |j                  d	      }|j                  | j
                  j                  j                  |             |j                  |       | j                  D ]"  }|j                  |j                  |             $ |j                  |       |S |j                  d      }|j                  | j                  j                  |             |j                  |       |j                  d	      }|j                  | j
                  j                  |             |j                  |       |S )
Nportdiffrw   r   r   r   r   r[   rn   r$  )rO   rP   rR   r  rv   r  r[   rQ   rd   r   r   r  )	r   rT   rU   portdiff_elem	port_elemr   r%  r&  r!  s	            r   r   zPortDiff.to_dom_fragment  s   ..0 ..z:'KK 0 00!!T[[%6%66 ..v6I""8S1A1A!1D-EF"":t{{/?/?/BC{{  ,%33G<
''1B1BC%%j1{{""dkk&9&99%%++;;HEG "//4""++;;HEG%%f-!//4""++;;HEG%%f-33 I%%g&=&=h&GHI%%i0  ++C0Ft{{::8DE%%f-++C0Ft{{::8DE%%f-r   N)r   r   r   r   r"   rs  r  r   r   r   r   r  r    s    M3"00$r   r  c                   4    e Zd Zd Zd Z ee      Zd Zd Zy)r4  c                      || _         || _        y)z!One of sr_a and sr_b may be None.N)sr_asr_b)r   r  r  s      r   r"   zScriptResultDiff.__init__
  s    		r   c                 2   g }d}d}|t        |       k  r|t        |      k  r| |   j                  ||   j                  k  r$|j                  t        | |   d             |dz  }n| |   j                  ||   j                  kD  r$|j                  t        d||                |dz  }nP| |   j                  ||   j                  k7  st
        r!|j                  t        | |   ||                |dz  }|dz  }|t        |       k  r|t        |      k  r|t        |       k  r2|j                  t        | |   d             |dz  }|t        |       k  r2|t        |      k  r2|j                  t        d||                |dz  }|t        |      k  r2|S )zRReturn a list of ScriptResultDiffs from two sorted lists of
        ScriptResults.r   Nr   )rc   rf   rz   r4  r   r9  )rn   r$  diffsr)  r*  s        r   r5  zScriptResultDiff.diff_lists  sv    #a&jQQZtww1 -adD9:Q11Q477"-dAaD9:QQ4;;!A$++-LL!1!A$!!=>QQ #a&jQQZ #a&jLL)!A$56FA #a&j #a&jLL)$!56FA #a&j r   c                 D   g }g }| j                   | j                   j                         }| j                  | j                  j                         }||k7  st        rt	        j
                  d ||      }|j                         D ]  \  }}}}}	|dk(  s|dk(  r(t        ||      D ]  }
|j                  d||
   z           |dk(  s|dk(  r(t        ||	      D ]  }
|j                  d||
   z           |dk(  sst        ||      D ]  }
|j                  d||
   z            y y )Nr  r  r  r  r  ru  r   )	r  r
  r  r9  r  r  r  r  
append_raw)r   r   a_linesb_linesr  r  r  r  r  r  ks              r   r  z%ScriptResultDiff.append_to_port_table-  s/   99 ii))+G99 ii))+Gg++D'7CE&+&7&7&9 	;"BB?bHn"2r] ;((wqz)9:;?bHn"2r] ;((wqz)9:;="2r] ;((wqz)9:;	; ")r   c                 @   |j                         }| j                  Q| j                  E| j                  | j                  k(  r,|j                  | j                  j	                  |             |S | j                  L|j                  d      }|j                  | j                  j	                  |             |j                  |       | j                  L|j                  d      }|j                  | j                  j	                  |             |j                  |       |S )Nrn   r$  )rO   r  r  rR   r   rP   )r   rT   rU   r%  r&  s        r   r   z ScriptResultDiff.to_dom_fragmentA  s    ..0II!		%		TYY&TYY66x@A  yy$!//4""499#<#<X#FG  (yy$!//4""499#<#<X#FG  (r   N)r   r   r   r"   r5  r   r  r   r   r   r   r4  r4  	  s"    
4 j)J;(r   r4  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)r  z0A table of character data, like NmapOutputTable.c                    g | _         g | _        d| _        g | _        d}|t	        |      k  r$||   dk7  r|dz  }|t	        |      k  r	||   dk7  r|d| | _        |dz  }|}|t	        |      k  rg|t	        |      k  r$||   dk7  r|dz  }|t	        |      k  r	||   dk7  r| j                  j                  |||        |dz  }|}|t	        |      k  rfyy)ztemplate is a string consisting of "*" and other characters. Each
        "*" is a left-justified space-padded field. All other characters are
        copied to the output. r   r  r   N)widthsrowsprefixpaddingrc   rz   )r   templater*  r)  s       r   r"   zTable.__init__U  s     	#h-HQK3$6FA #h-HQK3$6rl	Q#h-c(m#s(:Q c(m#s(:LL1.FAA #h-r   c                 "   g }t        |      }t        |      dkD  r)|d   $|j                          t        |      dkD  r|d   $t        t        |            D ]  }||   d}nt	        ||         }|t        | j
                        k(  r%| j
                  j                  t        |             n3t        |      | j
                  |   kD  rt        |      | j
                  |<   |j                  |        | j                  j                  |       y )Nr   r  r  )r   rc   popr  rd   r  rz   r  )r   rowstringsr)  rl   s        r   rz   zTable.appendj  s    3i#hls2wGGI #hls2w s3x 		A1v~AKC$$""3q6*Q$++a.(!$QANN1		 			!r   c                 :    | j                   j                  |       y)zAAppend a raw string for a row that is not formatted into columns.N)r  rz   r   s     r   r  zTable.append_raw~  s    		r   c                 ,    t        | j                        S r	   )rc   r  r!   s    r   __len__zTable.__len__  s    499~r   c                    g }| j                   D ]  }| j                  g}d}t        |t              r|j	                  |       4|t        |      k  rz|j	                  ||   j                  | j                  |                |t        | j                        k  r|j	                  | j                  |          |dz  }|t        |      k  rz|j	                  dj                  |      j                                 dj                  |      S )Nr   r   r  
)r  r  
isinstancerd   rz   rc   ljustr  r  rq   rstrip)r   r  r  r   r)  s        r   r   zTable.__str__  s    99 	6C[[MEA#s#S!#c(lLLQdkk!n!=>3t||,,T\\!_5FA	 #c(l
 RWWU^2245	6 yyr   N)	r   r   r   r   r"   rz   r  r  r   r   r   r   r  r  S  s    :*"( r   r  c                 :    t        | t        j                         y)zPrint a warning to stderr.r  N)r  rB  stderr)rd   s    r   warnr    s    	#CJJr   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)r/   zThe xml.sax ContentHandler for the XML parser. It contains a Scan object
    that is filled in and can be read back again once the parse method is
    finished.c                 0   t         j                  j                  j                  j	                  |        || _        g | _        d | _        d | _        d| _	        | j                  | j                  | j                  | j                  | j                  | j                  | j                   | j"                  | j$                  | j&                  | j(                  | j*                  | j,                  d| _        | j0                  | j2                  | j4                  d| _        y )NF)rA   r   hosthintr   r{   r~   r_   rw   r[   r   r  r   finished)r   r  rw   )r,   r-   r5   ContentHandlerr"   r  element_stackcurrent_hostcurrent_port	skip_over_start_nmaprun_start_host_start_hosthint_start_status_start_address_start_hostname_start_extraports_start_port_start_state_start_service_start_script_start_osmatch_start_finished_start_elem_handlers	_end_host_end_hosthint	_end_port_end_elem_handlers)r   r  s     r   r"   zNmapContentHandler.__init__  s    &&//5	     **$$,,((**,,00$$&&**((**,,%
!  NN**NN#
r   c                 R    t        | j                        dk(  ry| j                  d   S )zgReturn the name of the element containing the current one, or None
        if this is the root element.r   Nr  )rc   r  r!   s    r   parent_elementz!NmapContentHandler.parent_element  s+     t!!"a'!!"%%r   c                     | j                   j                  |      }|| j                  s	 |||       | j                  j	                  |       y)zThis method keeps track of element_stack. The real parsing work is
        done in the _start_*() handlers. This is to make it easy for them to
        bail out on error.N)r  r~  r  r  rz   )r   r   rH   r5   s       r   rF   zNmapContentHandler.startElement  sD     ++//5t~~D% !!$'r   c                     | j                   j                          | j                  j                  |      }|	 ||       yy)zeThis method keeps track of element_stack. The real parsing work is
        done in _end_*() handlers.N)r  r  r  r~  )r   r   r5   s      r   rL   zNmapContentHandler.endElement  s>     	 ))--d3DM r   c                    | j                         J d|v rHt        |j                  d            }t        j                  j	                  |      | j
                  _        |j                  d      | j
                  _        |j                  d      | j
                  _        |j                  d      | j
                  _	        y )Nr>   r   r   r   )
r  intr~  datetimefromtimestampr  r   r   r   r   )r   r   rH   start_timestamps       r   r  z!NmapContentHandler._start_nmaprun  s    ""$,,,e!%))G"45O#+#4#4#B#B#$%DII !IIi0		6*		!IIi0		r   c                     | j                         dk(  sJ t               | _        | j                  j                  j                  | j                         y rK   )r  rY   r  r  r   rz   r   r   rH   s      r   r  zNmapContentHandler._start_host  s?    ""$	111 F		t001r   c                 <    | j                         dk(  sJ d| _        y )NrA   T)r  r  r  s      r   r  z"NmapContentHandler._start_hosthint  s     ""$	111r   c                     | j                         dk(  sJ | j                  J |j                  d      }|*t        |d| j                  j	                         d       y || j                  _        y )Nr   r[    element of host 6 is missing the "state" attribute; assuming "unknown".)r  r  r~  r  rt   r[   )r   r   rH   r[   s       r   r  z NmapContentHandler._start_status  ss    ""$...  ,,,		'"=d//;;=? @ "'r   c                 F   | j                         dk(  sJ | j                  J |j                  d      }|*t        |d| j                  j	                         d       y |j                  dd      }| j                  j                  t        j                  ||             y )Nr   r   r  z+ is missing the "addr" attribute; skipping.r   r   )r  r  r~  r  rt   r|   r   r   )r   r   rH   r   r   s        r   r  z!NmapContentHandler._start_address  s    ""$...  ,,,yy <d//;;=? @ 99Z0%%gkk(D&ABr   c                     | j                         dk(  sJ | j                  J |j                  d      }|*t        |d| j                  j	                         d       y | j                  j                  |       y )Nr]   r   r  + is missing the "name" attribute; skipping.)r  r  r~  r  rt   r   )r   r   rH   r~   s       r   r  z"NmapContentHandler._start_hostname  sz    ""$333  ,,,99V$d//;;=? @ &&x0r   c                    | j                         dk(  sJ | j                  J |j                  d      }|+t        |d| j                  j	                         d       d }|| j                  j
                  v r*t        d|d| j                  j	                         d       |j                  d      }|,t        |d| j                  j	                         d	       d
}n	 t        |      }|| j                  j
                  |<   y # t        $ r2 t        d|d   d| j                  j	                         d       d
}Y Tw xY w)Nr^   r[   r  r   zDuplicate extraports state "z
" in host .r   z. is missing the "count" attribute; assuming 0.r   z Can't convert extraports count "" to an integer in host z; assuming 0.)r  r  r~  r  rt   r_   r  r   )r   r   rH   r[   r   s        r   r  z$NmapContentHandler._start_extraports  s?   ""$///  ,,,		'"=d//;;=? @ ED%%000t((4468 9 		'"=d//;;=? @ EE
 /4$$U+  !'ND,=,=,I,I,KM N 	s   $D	 	8EEc                    | j                         dk(  sJ | j                  J |j                  d      }|*t        |d| j                  j	                         d       y 	 t        |      }|j                  d      }|*t        |d| j                  j	                         d	       y t        ||f      | _        y # t        $ r- t        d|d| j                  j	                         d       Y y w xY w)
Nr^   r   r  z* missing the "portid" attribute; skipping.zCan't convert portid "r  z; skipping port.r   z, missing the "protocol" attribute; skipping.)	r  r  r~  r  rt   r  r   r   r  )r   r   rH   
portid_strr   r   s         r   r  zNmapContentHandler._start_port+  s    ""$///  ,,,YYx(
d//;;=? @ 	_F 99Z(d//;;=? @  &(!34  	"D$5$5$A$A$CE F 		s   "B= =3C32C3c                 2   | j                         dk(  sJ | j                  J | j                  y d|vr*t        |d| j                  j	                         d       y |d   | j                  _        | j                  j                  | j                         y )Nrw   r[   z element of port r   )r  r  r  r  r   r[   rx   r  s      r   r  zNmapContentHandler._start_stateC  s    ""$...  ,,,$%d//;;=? @ "'.""4#4#45r   c                    | j                         dk(  sJ | j                  J | j                  y |j                  d      | j                  j                  _        |j                  d      | j                  j                  _        |j                  d      | j                  j                  _        |j                  d      | j                  j                  _        |j                  d      | j                  j                  _	        y )Nrw   r   r   r   r   r   )
r  r  r  r~  r   r   r   r   r   r   r  s      r   r  z!NmapContentHandler._start_serviceP  s    ""$...  ,,,$).6):!!&,1IIi,@!!),1IIi,@!!).3ii.D!!++099X+>!!(r   c                    t               }|j                  d      |_        |j                  t        d|z         y |j                  d      |_        |j                  t        d|z         y | j                         dk(  r&| j                  j                  j                  |       y | j                         dk(  r&| j                  j                  j                  |       y | j                         dk(  r&| j                  j                  j                  |       y | j                         dk(  r&| j                  j                  j                  |       y t        d	|z         y )
Nrf   z0%s element missing the "id" attribute; skipping.r   z4%s element missing the "output" attribute; skipping.rb  rf  r   rw   zS%s element not inside prescript, postscript, hostscript, or port element; ignoring.)r   r~  rf   r  r   r  r  r   rz   r    r  ra   r  )r   r   rH   r  s       r   r  z NmapContentHandler._start_script[  s#   IIdO	99CdJK		(+== G  K/II((//7  "l2II))008  "l2,,33F;  "f,,,33F; 1378 9r   c                     | j                         dk(  sJ | j                  J d|vr*t        |d| j                  j                         d       y | j                  j                  j                  |d          y )Nr`   r   r  r  )r  r  r  rt   r`   rz   r  s      r   r  z!NmapContentHandler._start_osmatcht  sx    ""$,,,  ,,,d//;;=? @ ##E&M2r   c                     | j                         dk(  sJ d|v rIt        |j                  d            }t        j                  j	                  |      | j
                  _        y y )NrunstatsrB   )r  r  r~  r  r  r  r   )r   r   rH   end_timestamps       r   r  z"NmapContentHandler._start_finished~  sU    ""$
222U?		& 12M!)!2!2!@!@!ODII r   c                 Z    | j                   j                  j                          d | _         y r	   )r  ra   r)   r   r   s     r   r  zNmapContentHandler._end_host  "    ((--/ r   c                     d| _         y )NF)r  r  s     r   r  z NmapContentHandler._end_hosthint  s	    r   c                 Z    | j                   j                  j                          d | _         y r	   )r  ra   r)   r  s     r   r  zNmapContentHandler._end_port  r  r   N)r   r   r   r   r"   r  rF   rL   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r/   r/     sn    
B&(12
	(
C	14:506	?23P!!r   r/   c                   $    e Zd Zd Zd Zd Zd Zy)rV  c                 |    t         j                  j                  j                  j	                  | |d       || _        y )Nzutf-8)r,   r-   saxutilsXMLGeneratorr"   r3   )r   r3   s     r   r"   zXMLWriter.__init__  s+    %%..tQ@r   c                 `    |j                   D ]  }|j                  | j                  d       ! y )Nr  newl)
childNodeswritexmlr3   r   rU   nodes      r   rU   zXMLWriter.frag  s)    OO 	-DMM$&&tM,	-r   c                     | j                  di        |j                  D ]  }|j                  | j                  d       ! | j	                  d       y )Nrn   r  r  rF   r  r  r3   rL   r  s      r   r_  zXMLWriter.frag_a  E    #r"OO 	-DMM$&&tM,	-r   c                     | j                  di        |j                  D ]  }|j                  | j                  d       ! | j	                  d       y )Nr$  r  r  r!  r  s      r   r`  zXMLWriter.frag_b  r"  r   N)r   r   r   r"   rU   r_  r`  r   r   r   rV  rV    s    -r   rV  c                  B    t        dt        j                  d   z         y )Na  Usage: %s [option] FILE1 FILE2
Compare two Nmap XML files and display a list of their differences.
Differences include host state changes, port state changes, and changes to
service and OS detection.

  -h, --help     display this help
  -v, --verbose  also show hosts and ports that haven't changed.
  --text         display output in text format (default)
  --xml          display output in XML formatr   )r  rB  argvr   r   r   usager&    s!    	 
 
hhqk
 
r   r   r   c                     t        t        j                  d   d| t        j                         t        dt        j                  d   z  t        j                         t        j                  t
               y )Nr   r  r  zTry '%s -h' for help.)r  rB  r%  r  exit
EXIT_ERROR)msgs    r   usage_errorr+    sE    	chhqk3
'cjj9	
!CHHQK
/cjjAHHZr   c                     d } 	 t        j                  t        j                  dd  dg d      \  }}D ]p  \  }}|dk(  s|dk(  r t                t        j                  d       0|dk(  s|dk(  rd	a	=|d
k(  r| | dk7  rt        d       d} W|dk(  s]| | dk7  rt        d       d} r t              dk7  rt        d       | d} |d   }|d   }	 t               }|j                  |       t               }	|	j                  |       | dk(  rt%        	      }
n| dk(  rt'        	      }

j)                         }|dk(  rt*        S t,        S # t         j                  $ r }t        |j                         Y d }~Ed }~ww xY w# t        $ rJ}t        dt        |      z  t        j                          t        j                  t"               Y d }~d }~ww xY w)Nr   hv)helptextr9  r,   z-hz--helpr   z-vz	--verboseTz--textr/  z$contradictory output format options.z--xmlr,   r   z!need exactly two input filenames.zCan't open file: %sr  )getopt
gnu_getoptrB  r%  GetoptErrorr+  r*  r&  r(  r9  rc   r   r;   IOErrorr  rd   r  r)  rE  rP  r   
EXIT_EQUALEXIT_DIFFERENT)output_formatoptsinput_filenameseorn   
filename_a
filename_br/  r0  rs  r8  s               r   mainr=    s   M & 1 1d$F!Ho  "19XGHHQK$Y!{*G(](]f-DBC"M'\(]e-CBC!M" ?q 78 #J #Jj)j)
 FF+	%	66*;;=DqyY  AEE>  #c!f,3::>s0   -E 6E> E;E66E;>	GA GGc                 d    t        j                  | ||       t        j                  t               y r	   )rB  __excepthook__r(  r)  )r   valuetbs      r   
excepthookrB    s     tUB'HHZr   __main__)7r  r  r0  rB  rB   r,   __path__xml.saxxml.sax.saxutilsxml.dom.minidomior   r9  r^  r-   r5   EntityResolverr   objectr   rY   r   r   r   r   r   r   r   r  rC  r"  r'  r+  r-  rE  rP  r7  r  r4  r  r  r  r/   r  r  rV  r&  r4  r5  r)  r+  r=  rB  r   r(  )r  s   0r   <module>rK     s      
  <<?a:Q+>?    
 ,SWW__;; ,?6 ?D6 D'f 'Z' '  (6 (V>f >B6 B$  #zz ,6$v $N8 >:"( :"zWv WtXv XvGv GTA F A H 
q!77 q!h!!.. , 

3p zCNCHHTV G/ @s
   	GG