§
    ÔŸ’j  ã                  ó¸   — U d Z ddlm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
Z
ddlmZ  ej        d¦  «        Z G d„ d¦  «        Zdad	ed
<   dd„Zdd„ZdS )zJService to automatically monitor, start, and keep alive Cloudflare Tunnel.é    )ÚannotationsN)ÚPath)Úget_settingszdscons.cloudflared_managerc                  óR   — e Zd ZdZdd„Zdd„Zdd„Zdd
„Zdd„Zdd„Z	dd„Z
dd„ZdS )ÚCloudflaredManagerz<Manages the lifecycle of the local Cloudflare Tunnel daemon.ÚreturnÚNonec                ól   — t          ¦   «         | _        d | _        |                      ¦   «         | _        d S )N)r   ÚsettingsÚ_processÚ_resolve_config_pathÚconfig_path)Úselfs    ú6C:\Projects\DSCons\app\services\cloudflared_manager.pyÚ__init__zCloudflaredManager.__init__   s.   € Ý$™œˆŒØ;?ˆŒØ×4Ò4Ñ6Ô6ˆÔÐÐó    r   c                ó¨   — t           j                             d¦  «        pt           j                             d¦  «        }t          |¦  «        dz  dz  S )NÚUSERPROFILEÚ~z.cloudflaredz
config.yml)ÚosÚenvironÚgetÚpathÚ
expanduserr   )r   Úuser_profiles     r   r   z'CloudflaredManager._resolve_config_path   sB   € Ý”z—~’~ mÑ4Ô4ÐO½¼×8JÒ8JÈ3Ñ8OÔ8OˆÝ�LÑ!Ô! NÑ2°\ÑAÐAr   ú
str | Nonec                ó*  — t          j        d¦  «        }|r|S t          d¦  «        t          d¦  «        t          t          j                             dd¦  «        ¦  «        dz  dz  g}|D ]'}|                     ¦   «         rt          |¦  «        c S Œ(d S )NÚcloudflaredz2C:/Program Files (x86)/cloudflared/cloudflared.exez,C:/Program Files/cloudflared/cloudflared.exer   Ú Úbinúcloudflared.exe)ÚshutilÚwhichr   r   r   r   ÚexistsÚstr)r   Úbin_pathÚcommon_pathsÚps       r   Ú_find_binaryzCloudflaredManager._find_binary   sŸ   € Ý”< Ñ.Ô.ˆØð 	ØˆOõ ÐEÑFÔFÝÐ?Ñ@Ô@Ý•”—’ ¨rÑ2Ô2Ñ3Ô3°eÑ;Ð>OÑOð
ˆð
 ð 	ð 	ˆAØ�xŠx‰zŒzð Ý˜1‘v”v���ðàˆtr   Úboolc                ól   — 	 t          j        g d¢ddd¬¦  «        }d|j        v S # t          $ r Y dS w xY w)zXChecks whether cloudflared is already running as a system service or background process.)Útasklistz/FIzIMAGENAME eq cloudflared.exeTé   )Úcapture_outputÚtextÚtimeoutr!   F)Ú
subprocessÚrunÚstdoutÚ	Exception)r   Úress     r   Ú_is_system_process_runningz-CloudflaredManager._is_system_process_running.   s`   € ð		Ý”.ØCÐCÐCØ#ØØð	ñ ô ˆCð %¨¬
Ð2Ð2øÝð 	ð 	ð 	Ø�5�5ð	øøøs   ‚"% ¥
3²3c              ƒ  ó`  K  — dD ]’}	 t          j        d¬¦  «        4 ƒd{V —†}|                     d|› d�¦  «        ƒ d{V —†}|j        dk    r	 ddd¦  «        ƒd{V —†  dS 	 ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   Œƒ# t          $ r Y Œ�w xY wg d	¢}|D ]�}	 t          j        d
d¬¦  «        4 ƒd{V —†}|                     |¦  «        ƒ d{V —†}|j        dk    r	 ddd¦  «        ƒd{V —†  dS 	 ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   Œ€# t          $ r Y ŒŒw xY wdS )zCVerifies if the local tunnel daemon and edge connection are active.)iO  iO  iO  g      ð?©r0   Nzhttp://127.0.0.1:z/readyéÈ   T)z*https://dinhsonconstruction.com/api/healthz.https://erp.dinhsonconstruction.com/api/healthz&https://dinhsonconstruction.com/healthz*https://erp.dinhsonconstruction.com/healthç      @F)r0   Úverify)ÚhttpxÚAsyncClientr   Ústatus_coder4   )r   ÚportÚclientr5   Ú	test_urlsÚurls         r   Úis_tunnel_healthyz$CloudflaredManager.is_tunnel_healthy;   s  è è € ð *ð 	ð 	ˆDðÝ Ô,°SÐ9Ñ9Ô9ð $ð $ð $ð $ð $ð $ð $¸VØ &§
¢
Ð+K¸tÐ+KÐ+KÐ+KÑ LÔ LÐLÐLÐLÐLÐLÐL�CØ”¨#Ò-Ð-Ø#ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $à-ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $øøõ ð ð ð Ø�ðøøøð
ð 
ð 
ˆ	ð ð 	ð 	ˆCðÝ Ô,°SÀÐGÑGÔGð $ð $ð $ð $ð $ð $ð $È6Ø &§
¢
¨3¡¤Ð/Ð/Ð/Ð/Ð/Ð/�CØ”¨#Ò-Ð-Ø#ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $à-ð$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $øøõ ð ð ð Ø�ðøøøð ˆusv   ˆB£,A6ÁBÁ$BÁ6
B 	Â BÂB 	ÂBÂ
BÂBÂ!DÂ=(DÃ%DÃ:DÄ
D	ÄDÄD	ÄDÄ
D+Ä*D+c           	   ƒ  óÌ  K  — |                       ¦   «         }|st                               d¦  «         dS | j                             ¦   «         s"t                               d| j        ¦  «         dS t                               d| j        ¦  «         	 ddl}d}|j        dk    r	d}d	}||z  }t          j	        |d
dt          | j        ¦  «        dgt          j        t          j        t          j        ||j        dk    rdnd¬¦  «        | _        t                               d| j        j        ¦  «         dS # t          $ r&}t                               d|¦  «         Y d}~dS d}~ww xY w)z&Starts the cloudflared tunnel process.z,cloudflared binary not found on system PATH.Fz'cloudflared config file not found at %sz-Starting Cloudflare Tunnel using config %s...r   NÚwin32é   i   Útunnelz--configr2   T)r3   ÚstderrÚstdinÚcreationflagsÚ	close_fdsz.Cloudflare Tunnel process started with PID %s.z,Error starting Cloudflare Tunnel process: %s)r)   ÚloggerÚerrorr   r$   ÚinfoÚsysÚplatformr1   ÚPopenr%   ÚDEVNULLr   Úpidr4   )r   ÚbinaryrO   rJ   ÚDETACHED_PROCESSÚCREATE_NEW_PROCESS_GROUPÚes          r   Ústart_tunnelzCloudflaredManager.start_tunnelY   s†  è è € à×"Ò"Ñ$Ô$ˆØð 	Ý�LŠLÐGÑHÔHÐHØ�5àÔ×&Ò&Ñ(Ô(ð 	Ý�LŠLÐBÀDÔDTÑUÔUÐUØ�5å�ŠÐCÀTÔEUÑVÔVÐVð	ØˆJˆJˆJàˆMØŒ|˜wÒ&Ð&Ø#-Ð Ø+5Ð(Ø 0Ð3KÑ K�Ý&Ô,àØØÝ˜Ô(Ñ)Ô)Øðõ "Ô)Ý!Ô)Ý Ô(Ø+Ø"%¤,°'Ò"9Ð"9˜$˜$¸uðñ ô ˆDŒMõ �KŠKØ@À$Ä-ÔBSñô ð ð �4øÝð 	ð 	ð 	Ý�LŠLÐGÈÑKÔKÐKØ�5�5�5�5�5øøøøð	øøøs   ÂB D3 Ä3
E#Ä=EÅE#c              ƒ  óª  K  — t          | j        dd¦  «        sdS |                      ¦   «         ƒ d{V —†}|�s|                      ¦   «         sÑt                               d¦  «         |                      ¦   «         ƒ d{V —†}|rt          d¦  «        D ]S}t          j	        d¦  «        ƒ d{V —† |                      ¦   «         ƒ d{V —†rt           
                    d¦  «          dS ŒTt                               d¦  «         dS t                               d	¦  «         dS t                               d
¦  «         dS t                               d¦  «         dS )z4Checks if tunnel is healthy, and restarts it if not.Úcloudflared_enabledTNz:Cloudflare Tunnel is not running. Initiating auto-start...é
   é   z4Cloudflare Tunnel successfully recovered and online.z;Cloudflare Tunnel process spawned, waiting for edge sync...z"Failed to start Cloudflare Tunnel.z?Cloudflare Tunnel process is running, awaiting edge connection.z(Cloudflare Tunnel is online and healthy.)Úgetattrr   rC   r6   rL   ÚwarningrX   ÚrangeÚasyncioÚsleeprN   rM   Údebug)r   Ú
is_healthyÚstartedÚ_s       r   Úcheck_and_recoverz$CloudflaredManager.check_and_recoverƒ   s«  è è € å�t”}Ð&;¸TÑBÔBð 	ØˆFà×1Ò1Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3ˆ
Øñ 	Eà×2Ò2Ñ4Ô4ð Ý—’ØPñô ð ð !%× 1Ò 1Ñ 3Ô 3Ð3Ð3Ð3Ð3Ð3Ð3�Øð Gå" 2™YœYð #ð #˜Ý%œm¨AÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ø!%×!7Ò!7Ñ!9Ô!9Ð9Ð9Ð9Ð9Ð9Ð9ð #Ý"ŸKšKØ Vñô ð ð #˜F˜Fð	#õ
 —N’NØUñô ð ð ð õ —L’LÐ!EÑFÔFÐFÐFÐFå—’ØUñô ð ð ð õ �LŠLÐCÑDÔDÐDÐDÐDr   c              ƒ  ó4  K  — | j         �rd}t          | j         d¦  «        r| j                              ¦   «         du }nt          | j         dd¦  «        €d}|rÀt                               dt          | j         dd¦  «        ¦  «         	 | j                              ¦   «          t          | j         d	¦  «        r| j                              d
¬¦  «         n;# t          $ r. 	 | j          	                    ¦   «          n# t          $ r Y nw xY wY nw xY wd| _         dS dS dS )z,Stops the managed tunnel process gracefully.FÚpollNÚ
returncodeTz&Stopping Cloudflare Tunnel (PID %s)...rS   zN/AÚwaitr:   r8   )
r   Úhasattrrh   r]   rL   rN   Ú	terminaterj   r4   Úkill)r   Ú
is_runnings     r   ÚstopzCloudflaredManager.stop¥   sO  è è € àŒ=ñ 	%ØˆJÝ�t”} fÑ-Ô-ð "Ø!œ]×/Ò/Ñ1Ô1°TÐ9�
�
Ý˜œ¨°dÑ;Ô;ÐCØ!�
àð %Ý—’Ø<Ý˜DœM¨5°%Ñ8Ô8ñô ð ðØ”M×+Ò+Ñ-Ô-Ð-Ý˜tœ}¨fÑ5Ô5ð 8Øœ×*Ò*°3Ð*Ñ7Ô7Ð7øøÝ ð ð ð ðØœ×*Ò*Ñ,Ô,Ð,Ð,øÝ$ð ð ð Ø˜ðøøøøøðøøøð
 !%�”��ð+	%ð 	%ð%ð %s7   ÂA	C Ã
D
ÃC7Ã6D
Ã7
DÄD
ÄDÄD
Ä	D
N©r   r	   )r   r   )r   r   )r   r*   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r)   r6   rC   rX   rf   ro   © r   r   r   r      sÄ   € € € € € ØFÐFð7ð 7ð 7ð 7ð
Bð Bð Bð Bðð ð ð ðð ð ð ðð ð ð ð<(ð (ð (ð (ðT Eð  Eð  Eð  EðD%ð %ð %ð %ð %ð %r   r   zCloudflaredManager | NoneÚ_global_cf_managerr   c                 ó:   — t           €t          ¦   «         a t           S )z2Returns the singleton CloudflaredManager instance.)rv   r   ru   r   r   Úget_cloudflared_managerrx   Â   s   € õ Ð!Ý/Ñ1Ô1ÐÝÐr   r	   c               ƒ  óö   K  — t          ¦   «         } 	 	 |                      ¦   «         ƒ d{V —† n2# t          $ r%}t                               d|¦  «         Y d}~nd}~ww xY wt          j        d¦  «        ƒ d{V —† Œi)zOBackground monitor loop that runs indefinitely to keep Cloudflare Tunnel alive.TNz+Error in Cloudflare Tunnel monitor loop: %sé   )rx   rf   r4   rL   rM   r`   ra   )ÚmanagerrW   s     r   Ústart_cloudflared_monitor_loopr|   Ê   s±   è è € å%Ñ'Ô'€Gð ð	KØ×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-øÝð 	Kð 	Kð 	KÝ�LŠLÐFÈÑJÔJÐJÐJÐJÐJÐJÐJøøøøð	KøøøåŒm˜BÑÔÐÐÐÐÐÐÐð s   “. ®
A¸AÁA)r   r   rp   )rt   Ú
__future__r   r`   Úloggingr   r"   r1   Úpathlibr   r<   Úapp.core.settingsr   Ú	getLoggerrL   r   rv   Ú__annotations__rx   r|   ru   r   r   ú<module>rƒ      s  ðØ PÐ PÐ Pà "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€à *Ð *Ð *Ð *Ð *Ð *à	ˆÔ	Ð7Ñ	8Ô	8€ði%ð i%ð i%ð i%ð i%ñ i%ô i%ð i%ðX 15Ð Ð 4Ð 4Ð 4Ñ 4ðð ð ð ð ð  ð  ð  ð  ð  r   