
    h0                         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 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)DaemonNetdevfind_prefixmin_exspack)SvcHubIPPROTO_IPV6)   c                       e Zd Zy)NoIPsN)__name__
__module____qualname__     H/jellyfin/media/venv/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__r/   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-   r4   r5   r:   r;   mc_grp_4mc_grp_6r>   r?   s	            r   r/   zMCast.__init__8   s     HH	HH				
U	e

r   c                 *    | j                  d||       y )N	multicast)r9   )r-   msgcs      r   r8   z	MCast.logZ   s    k3*r   c           
         g }| j                   j                  j                  }| 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'                  d      s| }}|s
t)               |D ]J  }d|v }||   }|j                  s4d	}| j*                  s&|d
vr"| j-                  |j/                  ||      d       |rt0        j2                  nt0        j4                  }t1        j0                  |t0        j6                  t0        j8                        }|j;                  d        |j=                  t0        j>                  t0        j@                  d       	 |j=                  t0        j>                  t0        jB                  d       t%               }|rh|jE                         D ]U  }|j                  |j                  k(  s|jF                  |v s,d|jF                  v s;|jI                  |jF                         W tK        j                  |d      }|j                  d      d   }| jM                  ||d|v r| j"                  n| j                   ||      }|D ]7  }tK        j                  |d      |jN                  |j                  d      d   <   9 |jN                  j                         D ci c]  \  }}|j'                  d      s|| }}}|jN                  j                         D ci c]  \  }}||vs|| }}}| jP                  jR                  s|s$| jT                  jW                  t	        |             | jP                  jR                  s|xs ||_'        |jN                  s$| j-                  dj/                  ||      d       	 | jY                  |       || j*                  |<   |j                  |       M | jP                  j^                  r| j*                  jE                         D ]w  }| j*                  jE                         D ]X  }|j                  |j                  k7  r|jF                  |jN                  vs6|j`                  |jN                  |jF                  <   Z y | jP                  jb                  r| j*                  jE                         D ]  }| j*                  jE                         D ]s  }t	        |jN                  j                               D ]K  \  }} t	        |jN                  j                               D ]   \  }!}"| |"k(  s||!k7  s|"|jN                  |!<   " M u  t%        |D cg c]  }|j                  d      d    c}      | _2        | j*                  jE                         D ]  }|jF                  | jd                  v rJ  tg        | jh                  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 rxY wc c}}w c c}}w #  d}| j-                  |j/                  ||t[                     d       |j]                          Y xY wc c}w )Nr   ::r!   /0.0.0.0)::1	127.0.0.1Ffe80z)using INADDR_ANY for ip [{}], netdev [{}])rP   rR      r   )169.254rU   zno IPs on {}; skipping [{}]zannounce failed on {} [{}]:
{}zmc-hop)5r4   tcpsrvnetdevsboundlistsplitappendr   r:   r;   r
   itemsr	   strr#   r$   r<   r=   rA   
startswithr   r@   r8   formatsocketAF_INET6AF_INET
SOCK_DGRAMIPPROTO_UDP
settimeout
setsockopt
SOL_SOCKETSO_REUSEADDRSO_REUSEPORTvaluesr'   add	ipaddressr5   r)   r6   llrC   updatesetup_socketr   closezm_msubr(   zm_mnicrB   r   hopper)#r-   rZ   rY   xr)   r:   r;   lstavarg_netsksvnet_ipall_selectedr'   r*   netdevtipvr"   	other_ipsr.   r(   r@   oth_ipkvro   rts1s2ip1net1ip2net2s#                                      r   create_serverszMCast.create_servers]   s>   ((//))!XX__223qt33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==?X41aallCV6W!Q$XBX#&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 4 0>
 5B @#"G .2 / 3 G(" YB 5&"fh7;		& @s   _,
_1&_15	_6
?_6
7
_;_;	` 
` 
>	```
;	``	``2	`<`	`#`#?`(`(/`-&`5 `5%`;2`;1a4b
`-`2?b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/routersrV   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*   r?   r[   r)   keysr8   ra   r'   r#   rb   	inet_ptonrc   rD   rF   r]   r=   r   	Exceptionbindr>   r   r&   
INADDR_ANYrh   r   IPV6_MULTICAST_IFIPV6_MULTICAST_HOPSIPV6_MULTICAST_LOOP	inet_atonrE   r<   
IPPROTO_IPIP_MULTICAST_IFIP_MULTICAST_TTLIP_MULTICAST_LOOPhoptimesleepsort)
r-   r@   r"   zslr'   bipr%   bgrpdevr   s
             r   rq   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'   rh   rb   r   IPV6_LEAVE_GROUPIPV6_JOIN_GROUPr   IP_DROP_MEMBERSHIPIP_ADD_MEMBERSHIP)r-   r@   r:   r"   reqs        r   r   z	MCast.hop2  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)r6   mc_hoprH   r   r   r@   rl   r   )r-   r@   s     r   ru   zMCast.hopperM  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!   )rT   rS   r   rW   c              3   `   K   | ]%  }t        fd |j                  D        d      r| ' yw)c              3   @   K   | ]  }|j                   v s|  y w)N)rC   ).0yr-   s     r   	<genexpr>z-MCast.map_client.<locals>.<genexpr>.<genexpr>w  s     =qQ$**_=s   N)nextr)   )r   rv   r-   s     r   r   z#MCast.map_client.<locals>.<genexpr>t  s-      =AEE=tD s   +.znew client on {} ({}): {}r   zNcould not map client {} to known subnet; maybe forwarded from another network?rV   i(#  )rG   r   r   rF   rE   rD   anyr)   rl   r[   r@   r`   r   r8   ra   r$   r(   len)	r-   cipretr*   cirv   r@   llsr   s	   `        r   
map_clientzMCast.map_client^  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   r/   r8   r   rq   r   ru   r   r   r   r   r2   r2   7   s*     D+FPK#Z6$"(r   r2   )
__future__r   r   rb   r   rn   r   r   r   r   r	   r
   r/   r   r   utilr   r   r   r   r   svchubr   hasattrsetattrr   r   objectr   r2   r   r   r   <module>r      sh    7     + < <v~&FNB'	I 	V 0OF Or   