Ë
    À7jS  ã                  óB  — d Z ddlmZ ddlZddlmZmZ ddlmZ 	  ee	«      j                  j                  dz  Zej                  «       r!ej                  d¬«      j                  «       Znd	Zd
ZdZdZdZdZdd„Ze G d„ d«      «       Zdd„Zdd„Zy# e$ r d	ZY Œ/w xY w)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            	     óæ  — t         j                  j                  d«      } | rt        | «      }|dz  |dz  |dz  |dz  dœS t        t         j                  j                  dt        «      «      t        t         j                  j                  dt
        «      «      t        t         j                  j                  d	t        «      «      t        t         j                  j                  d
t        «      «      dœ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     ú@/var/www/downloads.wolfpanel.net/public_html/agent/src/config.pyÚ_resolve_dirsr)   2   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                  óü  — e Zd ZU dZded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   ded<    ed¬«      Zded<    ed¬«      Zded<    ed¬«      Zded<    ed¬«      Z	ded<    ed¬«      Z
ded<    ed¬«      Zded<    ed¬«      Zded<    ed¬«      Zded<    ed¬«      Zded<    ed¬«      Zded<    ed¬«      Zded<    ed¬«      Zded<    ed¬«      Zded <   d$d!„Zed%d"„«       Zy#)&ÚConfigz3Resolved agent configuration and all derived paths.ÚstrÚapi_urlÚrelease_channelÚ	server_idÚagent_versionÚintÚheartbeat_intervalÚboolÚapi_mockr   Úetc_dirÚopt_dirÚvar_dirÚlog_dirF)ÚinitÚ	conf_fileÚsecrets_dirÚagent_token_fileÚagent_key_fileÚ	spool_dirÚjobs_dirÚdiscovery_dirÚ	cache_dirÚ	agent_logÚjobs_logÚ
update_logÚ )ÚdefaultÚstatusÚ
last_errorc                ó¼  — | j                   dz  | _        | j                   dz  | _        | j                  dz  | _        | j                  dz  | _        | j
                  dz  | _        | j
                  dz  | _        | j
                  dz  | _        | j
                  dz  | _	        | j                  d	z  | _        | j                  d
z  | _        | j                  dz  | _        y )Nú
agent.confÚsecretsúagent.tokenz	agent.keyÚspoolÚjobsÚ	discoveryÚcachez	agent.logzjobs.logz
update.log)r6   r;   r<   r=   r>   r8   r?   r@   rA   rB   r9   rC   rD   rE   ©Úselfs    r(   Ú__post_init__zConfig.__post_init__e   sº   € ØŸ™¨Ñ4ˆŒØŸ<™<¨)Ñ3ˆÔØ $× 0Ñ 0°=Ñ @ˆÔØ"×.Ñ.°Ñ<ˆÔàŸ™¨Ñ/ˆŒØŸ™ vÑ-ˆŒØ!Ÿ\™\¨KÑ7ˆÔØŸ™¨Ñ/ˆŒàŸ™¨Ñ3ˆŒØŸ™ zÑ1ˆŒØŸ,™,¨Ñ5ˆ�r*   c                ó"   — d| j                   › d�S )z<URL of the channel's latest-version manifest (update check).z&https://downloads.wolfpanel.net/agent/z/latest.json)r/   rR   s    r(   Úmanifest_urlzConfig.manifest_urlt   s   € ð 8¸×8LÑ8LÐ7MÈ\ÐZÐZr*   N)ÚreturnÚNone)rW   r-   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rH   rI   rT   ÚpropertyrV   © r*   r(   r,   r,   E   s  … á=àƒLØÓØƒNØÓØÓØƒNàƒMØƒMØƒMØƒMñ  Ô'€IˆtÓ'Ù 5Ô)€K�Ó)Ù"¨Ô.Ð�dÓ.Ù  eÔ,€N�DÓ,Ù Ô'€IˆtÓ'Ù Ô&€HˆdÓ&Ù UÔ+€M�4Ó+Ù Ô'€IˆtÓ'Ù Ô'€IˆtÓ'Ù Ô&€HˆdÓ&Ù %Ô(€J�Ó(á Ô#€FˆCÓ#Ù BÔ'€J�Ó'ó6ð ò[ó ñ[r*   r,   c                óp  — i }| j                  «       s|S | j                  d¬«      j                  «       D ]~  }|j                  «       }|r|j	                  d«      sd|vrŒ+|j                  d«      \  }}}|j                  «       j                  d«      j                  d«      ||j                  «       <   Œ€ |S )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_filerr   z   s£   € à€FØ�<‰<Œ>ØˆØ�~‰~ wˆ~Ó/×:Ñ:Ó<ò BˆØ�y‰y‹{ˆÙ�t—‘ sÔ+¨s¸$©ØØŸ™ sÓ+‰ˆˆQ�Ø#Ÿk™k›m×1Ñ1°#Ó6×<Ñ<¸SÓAˆˆs�y‰y‹{ÒðBð €Mr*   c                 ó�  ‡
— t        «       } t        | d   dz  «      Š
dˆ
fd„} |dd«      } |dd«      j                  «       dv } |d	d
«      }| d   }|dz  dz  }|j                  «       } |d|r|rdnd«      } |dd
«      }	t	        | |dd«      | |dt
        «      t         |dd«      «      || d   | d   | d   | d   ||	¬«      S )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   rK   c                ód   •— t         j                  j                  | ‰j                  | |«      «      S )N)r   r    r!   )ro   rG   Úfile_valuess     €r(   r!   z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_IDrF   rL   rM   ÚWOLFPANEL_STATUSr   r   ÚWOLFPANEL_LAST_ERRORÚWOLFPANEL_RELEASE_CHANNELÚstableÚWOLFPANEL_AGENT_VERSIONÚWOLFPANEL_HEARTBEAT_INTERVALÚ60r   r   r   )r.   r/   r0   r1   r3   r5   r6   r7   r8   r9   rH   rI   )ro   r-   rG   r-   rW   r-   )r)   rr   Úlowerre   r,   ÚAGENT_VERSIONr2   )Údirsr!   r.   r5   r0   r6   Ú
token_fileÚ	has_tokenrH   rI   ru   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áÐ#±iÁI¡\ÐTeÓf€FÙÐ+¨RÓ0€JäØÙÐ7¸ÓBàÙÐ3´]ÓCÜ™sÐ#AÀ4ÓHÓIØØ�U‘Ø�U‘Ø�U‘Ø�U‘ØØôð r*   )rW   zdict[str, Path])rk   r   rW   zdict[str, str])rW   r,   )r\   Ú
__future__r   r   Údataclassesr   r   Úpathlibr   Ú__file__ÚparentÚ_version_filere   rf   rh   r…   Ú	ExceptionÚLIFECYCLE_STATESr"   r#   r$   r%   r)   r,   rr   r‰   r_   r*   r(   ú<module>r’      sÅ   ðñõ #ã 	ß (Ý ð Ù˜“N×)Ñ)×0Ñ0°9Ñ<€MØ×ÑÔØ%×/Ñ/¸Ð/ÓA×GÑGÓI‰à#ˆðÐ ð  €Ø€Ø#€Ø#€óð& ÷1[ð 1[ó ð1[óhô%øðc ò  Ø‚Mð ús   œAB ÂBÂB