
    i0                         d dl mZmZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZ ddlmZmZ ddlmZmZmZmZmZmZmZ erddlmZ  eed      s
 eedd	        G d
 de      Z G d de      Z G d de      Zy)    )print_functionunicode_literalsN)IPv4AddressIPv4NetworkIPv6AddressIPv6Network
ip_address
ip_network   )MACOSTYPE_CHECKING)IP6_LLIP64_LLDaemonNetdevfind_prefixmin_exspack)SvcHubIPPROTO_IPV6)   c                       e Zd Zy)NoIPsN)__name__
__module____qualname__     F/home/ubuntu/myenv/lib/python3.12/site-packages/copyparty/multicast.pyr   r      s    r   r   c                       e Zd ZdZd Zy)MC_Sckz&there is one socket for each server ipc                     || _         |j                  | _        |j                  | _        || _        d| _        || _        || _        ||i| _        d|v | _        d|v| _	        d|v | _
        y )Nr   :)sckidxnamegrpmreqipnetipsv6have4have6)selfr$   ndr'   r)   r*   s         r   __init__zMC_Sck.__init__"   si     66GG		9)]
BY
r   N)r   r   r   __doc__r1   r   r   r   r!   r!      s
    0r   r!   c                   8    e Zd Zd Zd	dZd Zd Zd Zd Zd Z	y)
MCastc	                 j   || _         || _        |j                  | _        |j                  | _        |j                  | _        || _        || _        || _        || _	        || _
        || _        i | _        t               | _        t               | _        i | _        g | _        g | _        i | _        d| _        y)z(disable ipv%d by setting mc_grp_%d emptyTN)hubSrvargsasrvloglog_funconoffgrp4grp6portvinitsrvsetsipsll_okb2srvb4b6cscacherunning)	r/   r6   r7   r<   r=   mc_grp_4mc_grp_6r@   rA   s	            r   r1   zMCast.__init__8   s     HH	HH				
U	e

r   c                 *    | j                  d||       y )N	multicast)r;   )r/   msgcs      r   r:   z	MCast.logZ   s    k3*r   c           
         g }| j                   j                  j                  }| j                   j                  j                  }| j                  j
                  r | j                   j                  j                  }|D cg c]  }|d   	 }}d|v rX|D cg c]
  }|dk7  s	| c}t        |D cg c]  }d|v s|j                  d      d    c}      z   }|j                  d       d|v rG|D cg c]
  }|dk7  s	| c}t        |D cg c]  }d|vs|j                  d      d    c}      z   }|D cg c]	  }|dvs| }}t        |t        |            }| j                  d d  }| j                  d d  }||fD ]  }t        |      D ]  }		 t        |	d      }
|j                         D ]{  \  }}|
r6t        |j                  d      d         }||
v r||vr|j                  |       |	t!        |j"                        k(  s|	|j$                  k(  sf||vsk|j                  |       }   |r|D cg c]	  }||v s| }}n|r|D cg c]	  }||vs| }}| j&                  s|D cg c]	  }d|v s| }}| j(                  s|D cg c]	  }d|vs| }}t        t+        |            }|d d  }|D cg c]  }d|vs|j-                  t.              s|  }}|s
t1               |D ]N  }d|v }||   }|j"                  s4d}| j2                  s&|d	vr"| j5                  |j7                  ||      d
       |rt8        j:                  nt8        j<                  }t9        j8                  |t8        j>                  t8        j@                        }|jC                  d        |jE                  t8        jF                  t8        jH                  d       	 |jE                  t8        jF                  t8        jJ                  d       t+               }|rh|jM                         D ]U  }|j"                  |j"                  k(  s|jN                  |v s,d|jN                  v s;|jQ                  |jN                         W tS        j                  |d      }|j                  d      d   }| jU                  ||d|v r| j(                  n| j&                  ||      }|D ]7  }tS        j                  |d      |jV                  |j                  d      d   <   9 |jV                  j                         D ci c]  \  }}|j-                  tX              s||  }}}|jV                  j                         D ci c]  \  }}||vs|| }}}| j                  jZ                  s|s$| j\                  j_                  t        |             | j                  jZ                  s|xs ||_+        |jV                  s$| j5                  dj7                  ||      d
       	 | ja                  |       || j2                  |<   |j                  |       Q | j                  jf                  r| j2                  jM                         D ]w  }| j2                  jM                         D ]X  }|j"                  |j"                  k7  r|jN                  |jV                  vs6|jh                  |jV                  |jN                  <   Z y | j                  jj                  r| j2                  jM                         D ]  }| j2                  jM                         D ]s  }t        |jV                  j                               D ]K  \  } }!t        |jV                  j                               D ]   \  }"}#|!|#k(  s| |"k7  s|#|jV                  |"<   " M u  t+        |D cg c]  }|j                  d      d    c}      | _6        | j2                  jM                         D ]  }|jN                  | jl                  v rJ  to        | jp                  d       |S c c}w c c}w c c}w c c}w c c}w c c}w #  d }
Y xY wc c}w c c}w c c}w c c}w c c}w #  Y vxY wc c}}w c c}}w #  d}| j5                  |j7                  ||tc                     d
       |je                          Y xY wc c}w )Nr   ::r#   /0.0.0.0)::1	127.0.0.1Fz)using INADDR_ANY for ip [{}], netdev [{}])rR   rT      r   zno IPs on {}; skipping [{}]zannounce failed on {} [{}]:
{}zmc-hop)9r6   tcpsrvnetdevsboundr8   http_no_tcpseen_epslistsplitappendr   r<   r=   r
   itemsr	   strr%   r&   r>   r?   rC   
startswithr   r   rB   r:   formatsocketAF_INET6AF_INET
SOCK_DGRAMIPPROTO_UDP
settimeout
setsockopt
SOL_SOCKETSO_REUSEADDRSO_REUSEPORTvaluesr)   add	ipaddressr7   r+   r   llrE   updatesetup_socketr   closezm_msubr*   zm_mnicrD   r   hopper)$r/   rZ   rY   blistxr+   r<   r=   lstavarg_netsksvnet_ipall_selectedr)   r,   netdevtipvr$   	other_ipsr0   r*   rB   oth_ipkvrq   rts1s2ip1net1ip2net2s$                                       r   create_serverszMCast.create_servers]   sb   ((//))%%99  HHOO,,E"#qt##3;!/Q$Y1/$*1>QSAXa>3 C JJy!!4Q)^14t*1BQS\aB8 C ?Q*>!>q??#tG}-WWQZhhqk9 	'C3i '#(U3G &mmo 'FB!+BHHSM!,<!=!W,3JJrNc"&&k)R277]#

2''	'  !-Q"W1-C-!2Qc\12C2yy!.SAX1.C.yy!2S\12C23s8n1v FQAf1EqFF'M 5	BBR[F::?xxB.?$?HHQXXb&115%'&//V^^C--V%6%68J8JKCNN4 NN6,,f.A.A1Ev00&2E2EqI I!..* -Bvv+0E#QSQVQV,!bee,- &&r51C#q!B((3SBY		DIIrSVWC# T090D0DVU0SS)!,-T $'77==?L41aall76K!Q$LBL#&77==?B41aark!Q$BBByy||2

!!$r(+99<<(776==fbI1M!!#& #R c5	n 99hhoo' /((//+ /Bvv' uuBFF*(*ruu// 99hhoo' 3((//+ 3B%)"&&,,.%9 3	T)-bfflln)= 3IC#t|s
.2s3333 ,?Qa?@	88??$ 	'C66TYY&&&	' 	t{{H%G $ 0>
 5B @#"G .2 / 3 G(" MB 5&"fh7;		& @s   =`,
`1`1-	`6
7`6
/
`;:`;		a 
a 
6	a aa
3	a=a
	aa*	a4a
	a#a#7a(a(/a-"a5 a5%a;2a;1b4c
a-a2?cc                 x
   |j                   }|j                  r| j                  rZt        |j                  j                               }| j                  dj                  |j                  |j                  |      d       |j                  D ]P  }t        j                  t        j                  |      }|| j                  |<   | j                  j                  |       R |j                  r| j                   nd}	 t"        r
t%               |j'                  || j(                  d|j                  f       t        j                  t        j                  | j                         }t+        d|j                        }||z   |_        |j                  t        j.                  k7  r/|j1                  t        j2                  t        j4                  |       	 |j1                  t        j2                  t        j6                  d       |j1                  t        j2                  t        j8                  d       n| j                  r6| j                  d
j                  |j                  |j                        d       t        j:                  |j                        }|| j                  |<   | j<                  j                  |       |j                  r| j>                  nd}	 t"        r
t%               |j'                  || j(                  f       t        j:                  | j>                        }|j                  t        j.                  k(  rt+        dt        j.                        nt        j:                  |j                        }||z   |_        |j                  t        j.                  k7  r/|j1                  t        j@                  t        jB                  |       	 |j1                  t        j@                  t        jD                  d       |j1                  t        j@                  t        jF                  d       | jI                  |d      r'| j                  dd	       tK        jL                  d       | jI                  |d       | j<                  jO                  d       | j                  jO                  d       y #  |j'                  d| j(                  d|j                  f       Y xY w#  d}	| j                  |	d	       Y xY w#  |j'                  d| j(                  f       Y xY w#  d}	| j                  |	d	       Y xY w)Nzv6({}) idx({}) {}    r   s   @I   r   zTfailed to set IPv6 TTL/LOOP; announcements may not survive multiple switches/routersrW   zv4({}) idx({})s   =IzTfailed to set IPv4 TTL/LOOP; announcements may not survive multiple switches/routersFz,igmp was already joined?? chilling for a sec333333?T)reverse)(r$   r,   rA   r]   r+   keysr:   rc   r)   r%   rd   	inet_ptonre   rF   rH   r_   r?   r   	Exceptionbindr@   r   r(   
INADDR_ANYrj   r   IPV6_MULTICAST_IFIPV6_MULTICAST_HOPSIPV6_MULTICAST_LOOP	inet_atonrG   r>   
IPPROTO_IPIP_MULTICAST_IFIP_MULTICAST_TTLIP_MULTICAST_LOOPhoptimesleepsort)
r/   rB   r$   zslr)   bipr'   bgrpdevr   s
             r   rs   zMCast.setup_socket   s   gg66zz377<<>*,33CFFCGGSI1Mgg $&&v;"%

3s#$
  #ww$))BC6#+%#tyy!SWW56 ##FOOTYY?Dsww'CczCHww&+++v22F4L4LcRv22F4N4NPSTv22F4N4NPQR zz)00A1E""366*C!DJJsOGGNN3"ww$))BC*#+%#tyy)* ##DII.D 77f/// eV../%%cff- 
 czCHww&+++v00&2H2H#Nv00&2I2I3Ov00&2J2JAN 88CHHCQGJJsOdT"T"s6"diiCGG45jA*"dii)jAs2   :9R/ AS  -S; AT  /+S S8;T T9c                    |j                   }|j                  }d|j                  v rc|s1	 |j                  t        j
                  t        j                  |       y|j                  t        j
                  t        j                  |       y|s1	 |j                  t        j                  t        j                  |       y|j                  t        j                  t        j                  |       y#  Y yxY w#  Y yxY w)z=rejoin to keepalive on routers/switches without igmp-snoopingr#   TF)r$   r(   r)   rj   rd   r   IPV6_LEAVE_GROUPIPV6_JOIN_GROUPr   IP_DROP_MEMBERSHIPIP_ADD_MEMBERSHIP)r/   rB   r<   r$   reqs        r   r   z	MCast.hop5  s    gghh#&&=!NN6#6#68O8OQTU v22F4J4JCP  !NN6#4#4f6O6OQTU v00&2J2JCP!! ! s   /C- /C4 -C14C8c                    | j                   j                  r| j                  rt        j                  | j                   j                         | j                  sy | j
                  j                         D ]  }| j                  |d        t        j                  d       | j                  sy | j
                  j                         D ]  }| j                  |d        | j                   j                  r| j                  ry y y y )NFr   T)r8   mc_hoprJ   r   r   rB   rn   r   )r/   rB   s     r   rw   zMCast.hopperP  s    ii4<<JJtyy''(<<xx( %e$% JJsO<<xx( $d#$ ii4<<<r   c                 D    	  j                   |   S #  Y nxY wd }d|v }|rt        |      n
t        |      }|r j                  n j                  D ]Q  } j
                  |   }t        |j                  j                         D cg c]	  }||v s| nc c}w c}      sO|} n |s*|dv r&t         j                  j                               d   }|s@|j                  d      r/ fd j                  j                         D        }t        |d       }|r:d} j                  |j                  |j                  |j                   |      d       n#d} j                  |j                  |      d	       t#         j                         d
kD  ri  _         | j                   |<   |S )Nr#   )rV   rU   r   z169.254c              3   `   K   | ]%  }t        fd |j                  D        d      r| ' yw)c              3   @   K   | ]  }|j                   v s|  y w)N)rE   ).0yr/   s     r   	<genexpr>z-MCast.map_client.<locals>.<genexpr>.<genexpr>z  s     =qQ$**_=s   N)nextr+   )r   ry   r/   s     r   r   z#MCast.map_client.<locals>.<genexpr>w  s-      =AEE=tD s   +.znew client on {} ({}): {}r   zNcould not map client {} to known subnet; maybe forwarded from another network?rW   i(#  )rI   r   r   rH   rG   rF   anyr+   rn   r]   rB   rb   r   r:   rc   r&   r*   len)	r/   cipretr,   ciry   rB   llsr   s	   `        r   
map_clientzMCast.map_clienta  sf   	<<$$	CZ!#[S)9DGG 	A**Q-Csww~~/;!27A;;<		 s22txx()!,Cs~~i0*C
 sD/C+AHHQXXchh5q9`AHHQXXc]A&t||t#DLS
s    	B
B
N)r   )
r   r   r   r1   r:   r   rs   r   rw   r   r   r   r   r4   r4   7   s*     D+IVK#Z6$"(r   r4   ) 
__future__r   r   rd   r   rp   r   r   r   r   r	   r
   r1   r   r   utilr   r   r   r   r   r   r   svchubr   hasattrsetattrr   r   objectr!   r4   r   r   r   <module>r      sk    7     + M M Mv~&FNB'	I 	V 0RF Rr   