ó
    ¸�JjS  ã                  óX  • S r SSKJr  SSKrSSKJrJr  SSKJr  SSK	r
 \" \5      R                  R                  S-  r\R                  5       (       a  \R                  SS9R!                  5       rOS	r S
rSrSrSrSrSS jr\ " S S5      5       rSS jrSS jrg! \ a    S	r N3f = f)a~  Configuration loading and path management for the WolfPanel Agent.

Every filesystem location and runtime setting lives here so the rest of the
codebase never hard-codes a path. Production defaults follow the Linux layout
documented in the README. For local development (including non-Linux machines)
set WOLFPANEL_DEV_HOME to rebase every directory under a single writable folder.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚPathÚVERSIONúutf-8©Úencodingz	0.1.0-dev)
Úpending_installÚpairing_waitingÚ
registeredÚonlineÚofflineÚupdatingÚrollbackÚdegradedÚrevokedÚuninstalledz/etc/wolfpanelz/opt/wolfpanelz/var/lib/wolfpanelz/var/log/wolfpanelc            	     óð  • [         R                  R                  S5      n U (       a  [        U 5      nUS-  US-  US-  US-  S.$ [        [         R                  R                  S[        5      5      [        [         R                  R                  S[
        5      5      [        [         R                  R                  S	[        5      5      [        [         R                  R                  S
[        5      5      S.$ )z;Resolve the four base directories, honouring dev overrides.ÚWOLFPANEL_DEV_HOMEÚetcÚoptÚvarÚlog)r   r   r   r   ÚWOLFPANEL_ETC_DIRÚWOLFPANEL_OPT_DIRÚWOLFPANEL_VAR_DIRÚWOLFPANEL_LOG_DIR)ÚosÚenvironÚgetr   Ú_DEFAULT_ETCÚ_DEFAULT_OPTÚ_DEFAULT_VARÚ_DEFAULT_LOG)Údev_homeÚbases     Ú0D:\Programs\laragon\www\wolf\agent\src\config.pyÚ_resolve_dirsr)   4   s³   € ä�z‰z�~‰~Ð2Ó3€HÞÜ�H‹~ˆà˜%‘<Ø˜%‘<Ø˜%‘<Ø˜%‘<ñ	
ð 	
ô ”B—J‘J—N‘NÐ#6¼ÓEÓFÜ”B—J‘J—N‘NÐ#6¼ÓEÓFÜ”B—J‘J—N‘NÐ#6¼ÓEÓFÜ”B—J‘J—N‘NÐ#6¼ÓEÓFñ	ð ó    c                  ó   • \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   S\S'   \" SS9rS\S'   \" SS9rS\S'   \" SS9r	S\S'   \" SS9r
S\S'   \" SS9rS\S'   \" SS9rS\S '   \" SS9rS\S!'   \" SS9rS\S"'   \" SS9rS\S#'   \" SS9rS\S$'   \" SS9rS\S%'   \" S&S'9rS\S('   \" S&S'9rS\S)'   \" SS'9rS
\S*'   S/S+ jr\S0S, j5       rS-rg.)1ÚConfigéG   z3Resolved agent configuration and all derived paths.ÚstrÚapi_urlÚrelease_channelÚ	server_idÚagent_versionÚintÚheartbeat_intervalÚboolÚapi_mockÚconnect_urlÚ
mysql_userÚmysql_passwordÚmysql_socketÚupdate_timeoutÚbackup_retentionÚupdate_retentionÚdownload_timeoutr   Úetc_dirÚopt_dirÚvar_dirÚlog_dirF)ÚinitÚ	conf_fileÚsecrets_dirÚagent_token_fileÚ
state_fileÚ	spool_dirÚjobs_dirÚdiscovery_dirÚ	cache_dirÚ	agent_logÚjobs_logÚ
update_logÚ )ÚdefaultÚstatusÚ
last_errorÚregistration_pendingc                ó¼  • U R                   S-  U l        U R                   S-  U l        U R                  S-  U l        U R                  S-  U l        U R                  S-  U l        U R                  S-  U l        U R                  S-  U l        U R                  S-  U l	        U R                  S	-  U l        U R                  S
-  U l        U R                  S-  U l        g )Nú
agent.confÚsecretsúagent.tokenÚspoolÚjobsÚ	discoveryÚcacheú
state.jsonz	agent.logzjobs.logz
update.log)r?   rD   rE   rF   rA   rH   rI   rJ   rK   rG   rB   rL   rM   rN   )Úselfs    r(   Ú__post_init__ÚConfig.__post_init__p   s·   € ØŸ™¨Ñ4ˆŒØŸ<™<¨)Ñ3ˆÔØ $× 0Ñ 0°=Ñ @ˆÔàŸ™¨Ñ/ˆŒØŸ™ vÑ-ˆŒØ!Ÿ\™\¨KÑ7ˆÔØŸ™¨Ñ/ˆŒàŸ,™,¨Ñ5ˆŒàŸ™¨Ñ3ˆŒØŸ™ zÑ1ˆŒØŸ,™,¨Ñ5ˆ�r*   c                ó„   • SSK nUR                  R                  SS5      R                  S5      nU SU R                   S3$ )z<URL of the channel's latest-version manifest (update check).r   NÚWOLFPANEL_RELEASE_BASEzhttps://downloads.wolfpanel.netÚ/z/latest.json)r   r    r!   Úrstripr0   )r]   r   Úrelease_bases      r(   Úmanifest_urlÚConfig.manifest_url€   sC   € ó 	Ø—z‘z—~‘~Ð&>Ð@aÓb×iÑiÐjmÓnˆØ�˜q ×!5Ñ!5Ð 6°lÐCÐCr*   )rL   rF   rK   rD   rJ   rI   rM   rE   rH   rG   rN   N)ÚreturnÚNone)rg   r.   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__annotations__r   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rQ   rR   rS   r^   Úpropertyre   Ú__static_attributes__© r*   r(   r,   r,   G   sZ  ‡ á=àƒLØÓØƒNØÓØÓØƒNØÓØƒOØÓØÓØÓØÓØÓØÓàƒMØƒMØƒMØƒMñ  Ñ'€IˆtÓ'Ù 5Ñ)€K�Ó)Ù"¨Ñ.Ð�dÓ.Ù %Ñ(€J�Ó(Ù Ñ'€IˆtÓ'Ù Ñ&€HˆdÓ&Ù UÑ+€M�4Ó+Ù Ñ'€IˆtÓ'Ù Ñ'€IˆtÓ'Ù Ñ&€HˆdÓ&Ù %Ñ(€J�Ó(á Ñ#€FˆCÓ#Ù BÑ'€J�Ó'Ù!&¨uÑ!5Ð˜$Ó5ô6ð  óDó óDr*   r,   c                óŽ  • 0 nU R                  5       (       d  U$ U R                  SS9R                  5        HŠ  nUR                  5       nU(       a  UR	                  S5      (       d  SU;  a  M8  UR                  S5      u  pEnUR                  5       R                  S5      R                  S5      XR                  5       '   MŒ     U$ )zDParse a simple KEY=VALUE env-style file. Missing file -> empty dict.r   r	   Ú#Ú=Ú"Ú')Úis_fileÚ	read_textÚ
splitlinesÚstripÚ
startswithÚ	partition)ÚpathÚvaluesÚrawÚlineÚkeyÚ_Úvalues          r(   Ú_parse_conf_filer„   ˆ   s�   € à€FØ�<‰<�>‰>ØˆØ�~‰~ wˆ~Ð/×:Ñ:Ö<ˆØ�y‰y‹{ˆÞ�t—‘ s×+Ñ+¨s¸$«ÙØŸ™ sÓ+‰ˆ�Ø#Ÿk™k›m×1Ñ1°#Ó6×<Ñ<¸SÓAˆ�y‰y‹{Óñ =ð €Mr*   c                 ó’  ^• [        5       n [        U S   S-  5      mS=U4S jjnU" SS5      nU" SS5      R                  5       S;   nU" S	S
5      nU S   nUS-  S-  nUR                  5       n[        R
                  " U S   S-  5      nU(       a	  U(       a  SOSn	UR                  S5      =(       d    U	n
UR                  SS
5      n[        UR                  SS5      5      nU" SU" SS5      5      nU" SU" SS
5      5      nU" SU" SS5      5      n[        S>0 SU_SU" SS 5      _S!U_S"[        _S#[        U" S$S%5      5      _S&U_S'U" S(S
5      _S)U_S*U_S+U_S,[        U" S-S%5      5      _S.[        U" S/S05      5      _S1[        U" S2S35      5      _S4[        U" S5S65      5      _S7U S   _S8U S9   _S:U S   _S;U S<   _SU
_SU_SU_6$ )?z½Build a Config from (in priority order) env vars, then the conf file.

Environment variables always win so operators and tests can override the
on-disk configuration without editing files.
r   rU   c                ób   >• [         R                  R                  U TR                  X5      5      $ )N)r   r    r!   )r�   rP   Úfile_valuess     €r(   r!   Úload_config.<locals>.getŸ   s!   ø€ Ü�z‰z�~‰~˜c ;§?¡?°3Ó#@ÓAÐAr*   ÚWOLFPANEL_API_URLzhttps://api.wolfpanel.netÚWOLFPANEL_API_MOCKÚ0)Ú1ÚtrueÚyesÚWOLFPANEL_SERVER_IDrO   rV   rW   r   r\   r   r   rQ   rR   rS   FÚWOLFPANEL_MYSQL_USERÚuserÚrootÚWOLFPANEL_MYSQL_PASSWORDÚpasswordÚWOLFPANEL_MYSQL_SOCKETÚsocketz/var/run/mysqld/mysqld.sockr/   r0   ÚWOLFPANEL_RELEASE_CHANNELÚstabler1   r2   r4   ÚWOLFPANEL_HEARTBEAT_INTERVALÚ60r6   r7   ÚWOLFPANEL_CONNECT_URLr8   r9   r:   r;   ÚWOLFPANEL_UPDATE_TIMEOUTr<   ÚWOLFPANEL_BACKUP_RETENTIONÚ5r=   ÚWOLFPANEL_UPDATE_RETENTIONÚ3r>   ÚWOLFPANEL_DOWNLOAD_TIMEOUTÚ30r?   r@   r   rA   rB   r   )r�   r.   rP   r.   rg   r.   rq   )r)   r„   Úlowerrw   Ústate_moduleÚ
load_stater!   r5   r,   ÚAGENT_VERSIONr3   )Údirsr!   r/   r6   r1   r?   Ú
token_fileÚ	has_tokenÚruntimeÚdefault_statusrQ   rR   rS   r8   r9   r:   r‡   s                   @r(   Úload_configr¬   –   s^  ø€ ô ‹?€DÜ" 4¨¡;°Ñ#=Ó>€K÷Bñ Ð%Ð'BÓC€GÙÐ'¨Ó-×3Ñ3Ó5Ð9MÑM€HÙÐ)¨2Ó.€Ià�5‰k€GØ˜9Ñ$ }Ñ4€JØ×"Ñ"Ó$€Iô ×%Ò% d¨5¡k°LÑ&@ÓA€GÞ&/¶I‘\ÐDU€NØ�[‰[˜Ó"×4 n€FØ—‘˜\¨2Ó.€JÜ §¡Ð,BÀEÓ JÓKÐáÐ+©S°¸Ó-@ÓA€JÙÐ3±S¸ÀRÓ5HÓI€NÙÐ/±°XÐ?\Ó1]Ó^€Läò ÙðáÐ7¸ÔBðñ ð	õ $ðô ™sÐ#AÀ4ÓHÔIðñ ðñ Ð/°Ô4ðñ ðñ &ðñ "ðô ™3Ð9¸4Ó@ÔAðô  ™SÐ!=¸sÓCÔDð!ô" ™SÐ!=¸sÓCÔDð#ô$ ™SÐ!=¸tÓDÔEð%ð& �U’ð'ð( �U’ð)ð* �U’ð+ð, �U’ð-ñ. ð/ñ0 ð1ñ2 2ð3ð r*   )rg   zdict[str, Path])r}   r   rg   zdict[str, str])rg   r,   )rm   Ú
__future__r   r   Údataclassesr   r   Úpathlibr   Ústater¤   Ú__file__ÚparentÚ_version_filerw   rx   rz   r¦   Ú	ExceptionÚLIFECYCLE_STATESr"   r#   r$   r%   r)   r,   r„   r¬   rq   r*   r(   Ú<module>r¶      sË   ðñõ #ã 	ß (Ý ã ð Ù˜“N×)Ñ)×0Ñ0°9Ñ<€MØ×Ñ×ÑØ%×/Ñ/¸Ð/ÐA×GÑGÓI‰à#‰ðÐ ð  €Ø€Ø#€Ø#€ôð& ÷=Dð =Dó ð=Dô@õ<øð{ ó  Ø‚Mð ús    AB Á2B ÂB)Â(B)