§
    &†i4  ã                   óÚ   — d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 dZ
ddededz  fd„Z G d	„ d
¦  «        Z	 ddee         dedz  dedz  fd„Zdedz  defd„Zdedefd„ZdS )é    N)ÚPath)Úurlopen)zhttps://api.ipify.orgzhttps://icanhazip.comzhttps://ifconfig.me/ipç      @Útimeout_secÚreturnc                 ó&  — t           D ]ˆ}	 t          || ¬¦  «        5 }|                     ¦   «                              d¦  «                             ¦   «         }|r|cd d d ¦  «         c S 	 d d d ¦  «         n# 1 swxY w Y   Œy# t
          $ r Y Œ…w xY wd S )N)Útimeoutzutf-8)Ú_IP_SERVICESr   ÚreadÚdecodeÚstripÚ	Exception)r   ÚurlÚrespÚips       ú3/var/www/html/ScheduledJobs/PythonScripts/wg_vpn.pyÚfetch_public_ipr      s  € Ýð ð ˆð	Ý˜ kÐ2Ñ2Ô2ð °dØ—Y’Y‘[”[×'Ò'¨Ñ0Ô0×6Ò6Ñ8Ô8�Øð Øðð ð ð ñ ô ð ð ð ð ððð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøõ ð 	ð 	ð 	ØˆHð	øøøàˆ4s:   ‹Bœ=A5ÁBÁ)BÁ5A9	Á9BÁ<A9	Á=BÂ
BÂBc                   óè   — e Zd Zdddddœdeez  dededed	ed
dfd„Zded
ee         fd„Z	dee         d
dfd„Z
ded
dfd„Zded
dfd„Zd
efd„Zd
efd„Zddedz  d
efd„Zdded
edz  fd„Zdd„ZdS )ÚWireGuardRotatorg       @Tzwg-quick)Úcooldown_secÚshuffleÚuse_sudoÚwg_quickÚ
config_dirr   r   r   r   r   Nc                óª   — t          |¦  «        | _        || _        || _        || _        |                      |¬¦  «        | _        d| _        d | _        d S )N)r   éÿÿÿÿ)	r   r   r   r   r   Ú_load_configsÚ_configsÚ_indexÚcurrent_config)Úselfr   r   r   r   r   s         r   Ú__init__zWireGuardRotator.__init__   sV   € õ ˜zÑ*Ô*ˆŒØ(ˆÔØ ˆŒØ ˆŒØ×*Ò*°7Ð*Ñ;Ô;ˆŒØˆŒØ+/ˆÔÐÐó    c                ó  — | j                              ¦   «         st          d| j         › �¦  «        ‚t          | j                              d¦  «        ¦  «        }|st          d| j         › �¦  «        ‚|rt          j        |¦  «         |S )NzWG config dir not found: z*.confzNo .conf files found in )r   ÚexistsÚFileNotFoundErrorÚsortedÚglobÚrandomr   )r!   r   Úconfigss      r   r   zWireGuardRotator._load_configs/   sŽ   € ØŒ×%Ò%Ñ'Ô'ð 	SÝ#Ð$QÀÄÐ$QÐ$QÑRÔRÐRÝ˜œ×-Ò-¨hÑ7Ô7Ñ8Ô8ˆØð 	RÝ#Ð$P¸t¼Ð$PÐ$PÑQÔQÐQØð 	$ÝŒN˜7Ñ#Ô#Ð#Øˆr#   Úargsc                 óÚ   — | j         g|z   }| j        rdg|z   }t          j        dd                     |¦  «        ¦  «         t          j        |d¬¦  «         |                      ¦   «          d S )NÚsudoz
WG cmd: %sÚ T)Úcheck)r   r   ÚloggingÚinfoÚjoinÚ
subprocessÚrunÚlog_public_ip)r!   r+   Úcmds      r   Ú_runzWireGuardRotator._run9   sn   € ØŒ}ˆo Ñ$ˆØŒ=ð 	!Ø�(˜S‘.ˆCÝŒ�\ 3§8¢8¨C¡=¤=Ñ1Ô1Ð1ÝŒ�s $Ð'Ñ'Ô'Ð'Ø×ÒÑÔÐÐÐr#   Úconfig_pathc                 ó    — |                       dt          |¦  «        g¦  «         || _        | j        rt	          j        | j        ¦  «         d S d S )NÚup)r7   Ústrr    r   ÚtimeÚsleep©r!   r8   s     r   r:   zWireGuardRotator.upA   sW   € Ø�	Š	�4�˜[Ñ)Ô)Ð*Ñ+Ô+Ð+Ø)ˆÔØÔð 	*ÝŒJ�tÔ(Ñ)Ô)Ð)Ð)Ð)ð	*ð 	*r#   c                 óà   — 	 |                       dt          |¦  «        g¦  «         n%# t          $ r t          j        d|¦  «         Y nw xY w| j        rt          j        | j        ¦  «         d S d S )NÚdownz!WG down failed for %s; continuing)r7   r;   r   r0   Úwarningr   r<   r=   r>   s     r   r@   zWireGuardRotator.downG   s�   € ð	NØ�IŠI�v�s ;Ñ/Ô/Ð0Ñ1Ô1Ð1Ð1øÝð 	Nð 	Nð 	NÝŒOÐ?ÀÑMÔMÐMÐMÐMð	NøøøàÔð 	*ÝŒJ�tÔ(Ñ)Ô)Ð)Ð)Ð)ð	*ð 	*s   ‚$' §A	ÁA	c                 ón   — | j         dz   t          | j        ¦  «        z  | _         | j        | j                  S )Né   )r   Úlenr   ©r!   s    r   Únext_configzWireGuardRotator.next_configO   s-   € Ø”{ Q‘­#¨d¬mÑ*<Ô*<Ñ<ˆŒØŒ}˜Tœ[Ô)Ð)r#   c                 ót   — | j         �| j         S |                      ¦   «         }|                      |¦  «         |S ©N)r    rF   r:   )r!   Úconfigs     r   Ú	ensure_upzWireGuardRotator.ensure_upS   s9   € ØÔÐ*ØÔ&Ð&Ø×!Ò!Ñ#Ô#ˆØ�Š�‰ŒˆØˆr#   Úreasonc                 óÈ   — |rt          j        d|¦  «         | j        �|                      | j        ¦  «         |                      ¦   «         }|                      |¦  «         |S )NzRotating VPN: %s)r0   rA   r    r@   rF   r:   )r!   rK   rI   s      r   ÚrotatezWireGuardRotator.rotateZ   s`   € Øð 	8ÝŒOÐ.°Ñ7Ô7Ð7ØÔÐ*Ø�IŠI�dÔ)Ñ*Ô*Ð*Ø×!Ò!Ñ#Ô#ˆØ�Š�‰ŒˆØˆr#   úVPN IPÚlabelc                 ó~   — t          ¦   «         }|rt          j        d||¦  «         nt          j        d|¦  «         |S )Nz%s: %sz%s: unavailable)r   r0   r1   rA   )r!   rO   r   s      r   r5   zWireGuardRotator.log_public_ipc   sD   € ÝÑÔˆØð 	6ÝŒL˜ 5¨"Ñ-Ô-Ð-Ð-åŒOÐ-¨uÑ5Ô5Ð5Øˆ	r#   c                 óZ   — | j         �#|                      | j         ¦  «         d | _         d S d S rH   )r    r@   rE   s    r   ÚshutdownzWireGuardRotator.shutdownk   s6   € ØÔÐ*Ø�IŠI�dÔ)Ñ*Ô*Ð*Ø"&ˆDÔÐÐð +Ð*r#   rH   )rN   )r   N)Ú__name__Ú
__module__Ú__qualname__r;   r   ÚfloatÚboolr"   Úlistr   r7   r:   r@   rF   rJ   rM   r5   rR   © r#   r   r   r      s®  € € € € € ð
 "ØØØ"ð0ð 0ð 0à˜$‘Jð0ð ð	0ð
 ð0ð ð0ð ð0ð 
ð0ð 0ð 0ð 0ð"¨ð °°d´ð ð ð ð ð˜˜cœð  tð ð ð ð ð*˜dð * tð *ð *ð *ð *ð* ð *¨ð *ð *ð *ð *ð*˜Tð *ð *ð *ð *ð˜4ð ð ð ð ðð ˜S 4™Zð °4ð ð ð ð ðð  3ð °c¸D±jð ð ð ð ð'ð 'ð 'ð 'ð 'ð 'r#   r   ÚlogsÚ
target_urlc                 óT  — d }| D �]!}	 t          j        |                     dd¦  «        ¦  «                             di ¦  «        }|                     d¦  «        dk    rŒZ|                     di ¦  «        }|                     d¦  «        dk    rŒŠ|                     di ¦  «        }|                     d	¦  «        }|r+t          |t          ¦  «        r|                     |¦  «        sŒâ|                     d
¦  «        }t          |t          ¦  «        r|c S �Œ# t          $ r Y �Œw xY w|S )NÚmessagez{}ÚmethodzNetwork.responseReceivedÚparamsÚtypeÚDocumentÚresponser   Ústatus)ÚjsonÚloadsÚgetÚ
isinstancer;   Ú
startswithÚintr   )rZ   r[   rc   Úentryr]   r_   rb   r   s           r   Ú+parse_document_status_from_performance_logsrk   q   s;  € ð €FØð ñ ˆð	Ý”j §¢¨9°dÑ!;Ô!;Ñ<Ô<×@Ò@ÀÈBÑOÔOˆGØ�{Š{˜8Ñ$Ô$Ð(BÒBÐBØØ—[’[ ¨2Ñ.Ô.ˆFØ�zŠz˜&Ñ!Ô! ZÒ/Ð/ØØ—z’z *¨bÑ1Ô1ˆHØ—,’,˜uÑ%Ô%ˆCØð �j¨­cÑ2Ô2ð ¸3¿>º>È*Ñ;UÔ;Uð ØØ—\’\ (Ñ+Ô+ˆFÝ˜&¥#Ñ&Ô&ð Ø���ñøåð 	ð 	ð 	Ø‰Hð	øøøà€Ms%   ‰ADÁ/DÂADÃ'+DÄ
D%Ä$D%Ústatus_codec                 ó   — | d uo| dk    S )NéÈ   rY   )rl   s    r   Úshould_rotate_on_statusro   Š   s   € Ø˜dÐ"Ð9 {°cÒ'9Ð9r#   Úhtmlc                 óF   ‡ — ‰ sdS d}t          ˆ fd„|D ¦   «         ¦  «        S )NF)ÚERR_NAME_NOT_RESOLVEDÚDNS_PROBE_POSSIBLEÚDNS_PROBE_FINISHED_NXDOMAINÚdnsDefinitionu   Ð�Ð´Ñ€ÐµÑ�Ñƒ DNSu   IP-Ð°Ð´Ñ€ÐµÑ�Ñƒ Ñ�ÐµÑ€Ð²ÐµÑ€Ð°c              3   ó    •K  — | ]}|‰v V — Œ	d S rH   rY   )Ú.0Úmrp   s     €r   ú	<genexpr>z$is_dns_error_html.<locals>.<genexpr>™   s'   øè è € Ð*Ð*˜Qˆq�DˆyÐ*Ð*Ð*Ð*Ð*Ð*r#   )Úany)rp   Úmarkerss   ` r   Úis_dns_error_htmlr|   Ž   s<   ø€ Øð Øˆuð€Gõ Ð*Ð*Ð*Ð* 'Ð*Ñ*Ô*Ñ*Ô*Ð*r#   )r   rH   )rd   r0   Úosr)   r3   r<   Úpathlibr   Úurllib.requestr   r
   rV   r;   r   r   rX   Údictri   rk   rW   ro   r|   rY   r#   r   ú<module>r�      s[  ðØ €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "ð€ð	ð 	 ð 	°°t±ð 	ð 	ð 	ð 	ðQ'ð Q'ð Q'ð Q'ð Q'ñ Q'ô Q'ð Q'ðl "ðð Ø
ˆtŒ*ðà�d‘
ðð 	ˆ4�Zðð ð ð ð2:¨¨t©ð :¸ð :ð :ð :ð :ð+˜Cð + Dð +ð +ð +ð +ð +ð +r#   