
    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    zz~~23HH~%<%<%<%<	
 	
 BJJNN#6EFBJJNN#6EFBJJNN#6EFBJJNN#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ConfigG   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     	zz~~&>@abiijmnq!5!5 6l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 'It'5)K)".d.%(J('It'&Hd&U+M4+'It''It'&Hd&%(J(#FC#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~/::<yy{ts++s$s+#kkm11#6<<SAyy{ = 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$ )?zBuild 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!    zz~~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CG'-3359MMH)2.I5kG9$}4J""$I %%d5kL&@AG&/I\DUN[["4nF\2.J,BE JK+S-@AJ3SR5HIN/X?\1]^L 7B 	 $ s#A4HI  /4  & " 394@A  S!=sCD!" S!=sCD#$ S!=tDE%& U'( U)* U+, U-. /0 12 23 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09<M%///AGGI#   ##& =D =D =D@<{   M s   AB 2B B)(B)