ó
    ¥Jje?  ã                  ó–  • S r SSKJr  SSKrSSKJs  Jr  SSK	r	SSK
r
SSKrSSKJr  \
R                  R                  S\" \" \5      R%                  5       R&                  S   S-  5      5        SS jrS rS	 rS
 rS rS rS rS rS rS rS rS rS r S r!S r"S r#S r$\%S:X  aÒ  SSK&r&\'" \(" 5       RS                  5       5       V Vs/ sH  u  pU RU                  S5      (       d  M  UPM!     snn r+Sr,\+ Hc  r- S\-R\                  R^                  ;   a)  \R`                  " 5        r1\-" \" \15      5        SSS5        O\-" 5         \2" S\-RJ                   35        Me     \
Rj                  " \,(       a  SOS5        ggs  snn f ! , (       d  f       NJ= f! \3 a/    \,S-  r,\2" S\-RJ                   35        \&Rh                  " 5          MÏ  f = f)a  Basic smoke tests for the WolfPanel Agent v1 foundation.

Run with:  python -m pytest tests/   (or: python tests/test_basic.py)

These tests use a temporary WOLFPANEL_DEV_HOME so nothing touches real system
paths, and the mock API so no network is required.
é    )ÚannotationsN)ÚPathé   Úsrcc                ó    • U [         R                  S'   S[         R                  S'   SS KnSS KnUR	                  U5        UR                  5       $ )NÚWOLFPANEL_DEV_HOMEÚ1ÚWOLFPANEL_API_MOCKr   )ÚosÚenvironÚ	importlibÚconfigÚreloadÚload_config)Útmpr   Úconfig_modules      Ú6D:\Programs\laragon\www\wolf\agent\tests\test_basic.pyÚ_fresh_configr      sC   € Ø'*„B‡J�JÐ#Ñ$Ø'*„B‡J�JÐ#Ñ$Ûã"à×Ñ�]Ô#Ø×$Ñ$Ó&Ð&ó    c                 óJ  • [         R                  " 5        n [        U 5      nUR                  n[	        U5      o3R
                  oD" U 5      oU(       Gdb  SS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n=n=pEUR                  owR                  nSoHU:H  o™(       dÏ  [        R                  " SU	4SX„45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S	.-  n
S
SU
0-  n[        [        R                  " U5      5      eS =n=n=p”UR                   nSo7U:H  oˆ(       dº  [        R                  " SU4SXs45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n
[        [        R                  " U
5      5      eS =n=pƒS S S 5        g ! , (       d  f       g = f)Nz‹assert %(py10)s
{%(py10)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.conf_file
})
}.startswith
}(%(py8)s)
}ÚstrÚcfgr   )Úpy0Úpy1Úpy3Úpy5Úpy7Úpy8Úpy10Úsecrets©ú==)zM%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.secrets_dir
}.name
} == %(py7)s©r   Úpy2Úpy4r   úassert %(py9)sÚpy9é<   )z:%(py2)s
{%(py2)s = %(py0)s.heartbeat_interval
} == %(py5)s©r   r$   r   úassert %(py7)sr   )ÚtempfileÚTemporaryDirectoryr   Ú	conf_filer   Ú
startswithÚ@py_builtinsÚlocalsÚ
@pytest_arÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚsecrets_dirÚnameÚ_call_reprcompareÚheartbeat_interval)r   r   Ú@py_assert2Ú@py_assert4Ú@py_assert6Ú@py_assert9Ú@py_format11Ú@py_assert1Ú@py_assert3Ú@py_assert5Ú@py_format8Ú@py_format10Ú@py_format6s                r   Ú test_config_paths_under_dev_homerE      sð  € Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆØ—=‘=Ð1Œs�=Ó!Ð1×,Ñ,Ð1Ð,¨SÓ1Ð1Ö1×1×1×1×1×1Ñ1Œs×1×1×1Ñ1Œs×1×1×1×1×1Ö1�3×1×1×1Ñ1�3×1×1Õ1�=×1×1Ó1Ð!×1×1Ó1Ð,×1×1×1×1×1Ô1¨S×1×1×1Ñ1¨S×1×1Õ1Ð1×1×1×1×1×1Ö1Ø�‰Ð0×#Ñ#Ð0 yÐ0 yÑ0×0×0×0Ò0Ð#×0×0×0×0×0Õ0ˆs×0×0×0Ñ0ˆs×0×0Õ0ˆ×0×0Ó0Ð#×0×0Ó0 y×0×0×0×0×0×0Õ0Ø×%Ñ%Ð+¨Ð+¨Ñ+×+×+×+Ò+Ð%×+×+×+×+×+Õ+ˆs×+×+×+Ñ+ˆs×+×+Õ+Ð%×+×+Ó+¨×+×+×+×+×+×+Ó+÷	 
'×	&Ö	&ús   –M5NÎ
N"c                 ó˜  • SSK Jn   U " 5       nU " 5       nX:H  o3(       dÛ  [        R                  " SU4SX45      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSS	U0-  n[        [        R                  " U5      5      eS nUR                  nS
oc" U5      ow(       d¯  SS[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n=pgg )Nr   )Úgenerate_fingerprintr!   )z%(py0)s == %(py2)sÚfp1Úfp2©r   r$   úassert %(py4)sr%   Úfp_zLassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.startswith
}(%(py4)s)
}©r   r$   r%   Úpy6)ÚidentityrG   r1   r8   r/   r0   r2   r3   r4   r5   r.   )	rG   rH   rI   r?   Ú@py_format3Ú@py_format5r@   rA   Ú@py_format7s	            r   Ú%test_fingerprint_is_stable_and_opaquerS   &   só   € Ý-á
Ó
 €CÙ
Ó
 €CØ‰:×××Òˆ3×××××Õˆ3×××Ñˆ3×××××Ö�#×××Ñ�#××××××ÒØ�>‰>Ð ˜%Ð ˆ>˜%Ó Ð Õ × × × × × Ñ ˆ3× × × Ñ ˆ3× × Õ ˆ>× × Ó ˜%× × Ó Ð × × × × × Õ r   c                 óî  • [         R                  " 5        n [        U 5      nSSKJn  SSKJnJnJn  U" U5        U" U5      R                  SSS.5      nU" U[        US   5      US   5        UR                  owR                  oˆ" 5       o™R                  oª" 5       o»R                  nS	oÜ" U5      oî(       Gd  S
S[        R                   " 5       ;   d  ["        R$                  " U5      (       a  ["        R&                  " U5      OS["        R&                  " U5      ["        R&                  " U5      ["        R&                  " U	5      ["        R&                  " U
5      ["        R&                  " U5      ["        R&                  " U5      ["        R&                  " U5      ["        R&                  " U5      S.	-  n[)        ["        R*                  " U5      5      eS =n=n=n	=n
=n=n=pÞU" U5      nSn	UU	:H  nU(       Gd  ["        R,                  " SU4SUU	45      S[        R                   " 5       ;   d  ["        R$                  " U5      (       a  ["        R&                  " U5      OSS[        R                   " 5       ;   d  ["        R$                  " U5      (       a  ["        R&                  " U5      OS["        R&                  " U5      ["        R&                  " U	5      S.-  nSSU0-  n[)        ["        R*                  " U5      5      eS =n=nn	[/        U 5      R1                  S5       GH>  nUR3                  5       (       d  M  UUR                  :X  a  M-  SnUR                  nSnU" US9nUU;  nU(       då  ["        R,                  " SU4SUU45      ["        R&                  " U5      S[        R                   " 5       ;   d  ["        R$                  " U5      (       a  ["        R&                  " U5      OS["        R&                  " U5      ["        R&                  " U5      ["        R&                  " U5      S.-  nSSU0-  n[)        ["        R*                  " U5      5      eS =n=n=n=nnGMA     S S S 5        g ! , (       d  f       g = f)Nr   ©Úget_api_client)Úensure_dirsÚload_agent_tokenÚstore_credentialsÚtÚfp_x)ÚhostnameÚfingerprintÚ	server_idÚagent_tokenzwp_enc:záassert %(py16)s
{%(py16)s = %(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.agent_token_file
}.read_text
}()
}.strip
}()
}.startswith
}(%(py14)s)
}r   )	r   r$   r%   rN   r   r   Úpy12Úpy14Úpy16Úwp_agent_dev_tokenr!   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srX   ©r   r   r   rN   úassert %(py8)sr   Ú*Úinstall_tokenÚignore)Úerrors©únot in)zZ%(py1)s not in %(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.read_text
}(errors=%(py7)s)
}Úpath)r   r   r   r   r'   úassert %(py11)sÚpy11)r+   r,   r   Ú
api_clientrV   rO   rW   rX   rY   Úregisterr   Úagent_token_fileÚ	read_textÚstripr.   r/   r0   r1   r2   r3   r4   r5   r8   r   ÚrglobÚis_file)r   r   rV   rW   rX   rY   Úrespr?   r@   rA   Ú@py_assert7r=   Ú@py_assert11Ú@py_assert13Ú@py_assert15Ú@py_format17r:   r;   rR   Ú@py_format9rm   Ú@py_assert0r<   Ú@py_assert8rC   Ú@py_format12s                             r   Ú6test_register_stores_credentials_and_not_install_tokenr�   /   sÀ  € Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆÝ-ßMÑMá�CÔÙ˜cÓ"×+Ñ+¸ÈVÑ,TÓUˆá˜#œs 4¨Ñ#4Ó5°t¸MÑ7JÔKð ×#Ñ#ÐM×-Ñ-ÐMÐ-Ó/ÐM×5Ñ5ÐMÐ5Ó7ÐM×BÑBÐMÀ9ÐMÐBÀ9ÓMÐMÖM×M×M×M×M×MÑMˆs×M×M×MÑMˆs×M×MÕMÐ#×M×MÓMÐ-×M×MÓMÐ/×M×MÓMÐ5×M×MÓMÐ7×M×MÓMÐB×M×MÓMÀ9×M×MÓMÐM×M×M×M×M×M×MÖMÙ Ó$Ð<Ð(<Ð<Ð$Ð(<Ñ<×<×<×<Ô<Ð$Ð(<×<×<×<×<×<Õ<Ð×<×<×<Ñ<Ð×<×<×<×<×<Ö< ×<×<×<Ñ< ×<×<Õ<Ð$×<×<Ó<Ð(<×<×<×<×<×<×<Ô<ä˜“I—O‘O C×(ˆDØ�|‰|�~‹~Ø˜3×/Ñ/Ó/ÙØ&ÐM¨d¯n©nÐMÀHÐM©nÀHÑ.MÐM�Ð.MÑM×M×M×MÓM�Ð.M×M×MÔM�×M×M×M×M×MÔM¨d×M×M×MÑM¨d×M×MÕM¨n×M×MÓMÀH×M×MÓMÐ.M×M×M×M×M×M×M×MÓMñ	 )÷ 
'×	&Ö	&ús   –LQ&Ì5D(Q&Ñ&
Q4c                 ó  • SSK Jn   U R                  5       nS Hê  nX!;   o3(       dÛ  [        R                  " SU4SX!45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nS	S
U0-  n[        [        R                  " U5      5      eS nMì     g )Nr   )Úquick)r\   r   ÚarchitectureÚ	cpu_countÚprivate_ips©Úin)z%(py0)s in %(py2)sÚkeyÚsnapshotrJ   rK   r%   )Ú	discoveryrƒ   Úcollectr1   r8   r/   r0   r2   r3   r4   r5   )rƒ   rŠ   r‰   r?   rP   rQ   s         r   Ú*test_quick_discovery_returns_expected_keysr�   E   s‡   € Ýà�}‰}‹€HÛMˆØ‰×××Òˆs×××××Õˆs×××Ñˆs×××××Ö�h×××Ñ�h××××××Ôò Nr   c                 óÂ  • SSK Jn   SnU " U5      nSnUU:H  oD(       dÐ  [        R                  " SU4SUU45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=pCSo" U5      nSo2U:H  oD(       dÏ  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=pCg )Nr   )Úsanitize_remotez*https://user:ghp_secret@github.com/a/b.gitzhttps://github.com/a/b.gitr!   ©z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sr�   r#   r&   r'   zgit@github.com:a/b.git)
Údiscovery.gitr�   r1   r8   r/   r0   r2   r3   r4   r5   )r�   r?   r@   r<   rA   rB   rC   s          r   Útest_git_remote_sanitizationr’   M   sv  € Ý-ð EðÙÐDÓEðà'ðØEØ'ñ	(÷ó ïé ôØEØ'÷ò ïé ÷õ ïé ðØ÷ö ïé ðØ÷ò ïé ðØD÷ð ïé ðØE÷ð ïé ðà'÷÷ ÷ ñ ïé ÷÷ ñ ð 4ÐPˆ?Ð3Ó4ÐPÐ8PÐPÐ8PÑP×P×P×PÒPÐ4×P×P×P×P×PÕPˆ?×P×P×PÑPˆ?×P×PÕPÐ3×P×PÓPÐ4×P×PÓPÐ8P×P×P×P×P×P×PÖPr   c                óv  • SSK Jn  U S-  R                  S5        U S-  R                  S5        U" U 5      S   nSo2U:H  oD(       do  [        R                  " S	U4S
X#45      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCg )Nr   )ÚclassifyÚartisanÚ zcomposer.jsonz{}ÚtypeÚlaravelr!   ©z%(py1)s == %(py4)s©r   r%   úassert %(py6)srN   )Údiscovery.projectsr”   Ú
write_textr1   r8   r3   r4   r5   )Útmp_pathr”   r~   r@   r:   rQ   rR   s          r   Útest_project_classificationrŸ   W   s€   € Ý+à�	Ñ×%Ñ% bÔ)Ø�Ñ×+Ñ+¨DÔ1Ù�HÓ˜fÑ%Ð2¨Ð2¨Ñ2×2×2×2Ò2Ð%×2×2Ô2Ð%×2×2Ó2¨×2×2×2×2×2×2Ô2r   c                 ó(  • [         R                  " 5        n [        U 5      nSSKJn  SSKJn  U" X" U5      5      n/ nS odULowo‡(       a  UR                  n	So©U
L o»nU(       Gd‰  [        R                  " SU4SXF45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nS	S
U0-  oÕR                  U5        U(       a¬  [        R                  " SW4SW	W
45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      [        R                  " U
5      S.-  nSSU0-  oõR                  U5        [        R                  " US5      0 -  nSSU0-  n[!        [        R"                  " U5      5      eS =n=n=n=n=n	=pºS S S 5        g ! , (       d  f       g = f)Nr   rU   )ÚcheckT)úis not)z%(py2)s is not %(py5)sÚinfo)r$   r   z%(py7)sr   ©Úis)z;%(py11)s
{%(py11)s = %(py9)s.update_available
} is %(py14)s)r'   ro   ra   z%(py16)srb   zassert %(py19)sÚpy19)r+   r,   r   rp   rV   Úupdater¡   Úupdate_availabler1   r8   r/   r0   r2   r3   ÚappendÚ_format_boolopr4   r5   )r   r   rV   r¡   r£   r?   r;   r@   r~   Ú@py_assert10rz   Ú@py_assert12rD   rB   Ú@py_format15r|   Ú@py_format18Ú@py_format20s                     r   Útest_update_version_comparisonr°   _   s  € Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆÝ-Ý á�S˜.¨Ó-Ó.ˆáA˜4ÐA˜4Ð×A D×$9Ñ$9ÐA¸TÐA¸TÐ$A×A×A×AÕAˆt×A×A×A×A×AÕAˆt×A×A×AÑAˆt×A×AÕA˜4×A×A×A×A×A×A×AÒAÐ$9¸T×A×A×A×A×AÕA D×A×A×AÑA D×A×AÕAÐ$9×A×AÓA¸T×A×A×A×A×A×A×A×A×A×A×A×A×AÔA÷ 
'×	&Ö	&ús   –G$HÈ
Hc                 ó  • SSK Jn   U R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  nSo!" U5      nSoCUL oU(       dä  [        R                  " SU4SX445      S[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  n[        [        R                  " U5      5      eS =n=n=n=pTU R                  5        GH  nU R                  o" U5      o™(       då  SS[
        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      S.-  n
[        [        R                  " U
5      5      eS =pGM     g )Nr   )Úsystemz10.0.0.5Tr¤   )zV%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s._is_private_ipv4
}(%(py4)s)
} is %(py9)sr²   )r   r$   r%   rN   r'   rn   ro   z192.168.1.10z
172.16.4.4z	127.0.0.1z169.254.1.1z8.8.8.8Fz
172.32.0.1z	not-an-ipzRassert %(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s._is_private_ipv4
}(%(py3)s)
}Úip)r   r$   r   r   )r‹   r²   Ú_is_private_ipv4r1   r8   r/   r0   r2   r3   r4   r5   r†   )r²   r?   r@   rA   r   rx   rC   r€   r³   r;   rD   s              r   Ú*test_private_ips_excludes_public_addressesrµ   j   sp  € Ý à×"Ñ"Ð6 :Ð6Ð" :Ó.Ð6°$Ð6°$Ð6×6×6×6Ò6Ð.×6×6×6×6×6Õ6ˆ6×6×6×6Ñ6ˆ6×6×6Õ6Ð"×6×6Ó6 :×6×6Ó6Ð.×6×6Ó6°$×6×6×6×6×6×6×6Ø×"Ñ"Ð: >Ð:Ð" >Ó2Ð:°dÐ:°dÐ:×:×:×:Ò:Ð2×:×:×:×:×:Õ:ˆ6×:×:×:Ñ:ˆ6×:×:Õ:Ð"×:×:Ó: >×:×:Ó:Ð2×:×:Ó:°d×:×:×:×:×:×:×:Ø×"Ñ"Ð8 <Ð8Ð" <Ó0Ð8°DÐ8°DÐ8×8×8×8Ò8Ð0×8×8×8×8×8Õ8ˆ6×8×8×8Ñ8ˆ6×8×8Õ8Ð"×8×8Ó8 <×8×8Ó8Ð0×8×8Ó8°D×8×8×8×8×8×8×8Ø×"Ñ"Ð7 ;Ð7Ð" ;Ó/Ð7°4Ð7°4Ð7×7×7×7Ò7Ð/×7×7×7×7×7Õ7ˆ6×7×7×7Ñ7ˆ6×7×7Õ7Ð"×7×7Ó7 ;×7×7Ó7Ð/×7×7Ó7°4×7×7×7×7×7×7×7Ø×"Ñ"Ð9 =Ð9Ð" =Ó1Ð9°TÐ9°TÐ9×9×9×9Ò9Ð1×9×9×9×9×9Õ9ˆ6×9×9×9Ñ9ˆ6×9×9Õ9Ð"×9×9Ó9 =×9×9Ó9Ð1×9×9Ó9°T×9×9×9×9×9×9×9à×"Ñ"Ð6 9Ð6Ð" 9Ó-Ð6°Ð6°Ð6×6×6×6Ò6Ð-×6×6×6×6×6Õ6ˆ6×6×6×6Ñ6ˆ6×6×6Õ6Ð"×6×6Ó6 9×6×6Ó6Ð-×6×6Ó6°×6×6×6×6×6×6×6Ø×"Ñ"Ð9 <Ð9Ð" <Ó0Ð9°EÐ9°EÐ9×9×9×9Ò9Ð0×9×9×9×9×9Õ9ˆ6×9×9×9Ñ9ˆ6×9×9Õ9Ð"×9×9Ó9 <×9×9Ó9Ð0×9×9Ó9°E×9×9×9×9×9×9×9Ø×"Ñ"Ð8 ;Ð8Ð" ;Ó/Ð8°5Ð8°5Ð8×8×8×8Ò8Ð/×8×8×8×8×8Õ8ˆ6×8×8×8Ñ8ˆ6×8×8Õ8Ð"×8×8Ó8 ;×8×8Ó8Ð/×8×8Ó8°5×8×8×8×8×8×8×8à× Ñ ×"ˆØ×&Ñ&Ð*Ð& rÓ*Ð*Õ*×*×*×*×*×*Ñ*ˆv×*×*×*Ñ*ˆv×*×*Õ*Ð&×*×*×*×*×*Ô* r×*×*×*Ñ* r×*×*Õ*Ð*×*×*×*×*×*Õ*ò #r   c                 ó¶  • [         R                  " 5        n [        U 5      nSSKJnJnJn  U" U5        U" US5        U" US5        UR                  oUR                  of" 5       ow(       d¯  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n[        [        R                  " U5      5      eS =n=pgUR                  R!                  5       n	SoªU	;   o»(       d¥  [        R"                  " SU4S	X©45      [        R                  " U
5      S
[        R                  " 5       ;   d  [        R                  " U	5      (       a  [        R                  " U	5      OS
S.-  nSSU0-  n[        [        R                  " U5      5      eS =p«SoªU	;   o»(       d¥  [        R"                  " SU4S	X©45      [        R                  " U
5      S
[        R                  " 5       ;   d  [        R                  " U	5      (       a  [        R                  " U	5      OS
S.-  nSSU0-  n[        [        R                  " U5      5      eS =p«UR$                  R                  5       (       Ga‚  UR$                  R!                  5       nSoªU;  o»(       d¥  [        R"                  " SU4SX®45      [        R                  " U
5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =p«SoªU;  o»(       d¥  [        R"                  " SU4SX®45      [        R                  " U
5      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nSSU0-  n[        [        R                  " U5      5      eS =p«S S S 5        g ! , (       d  f       g = f)Nr   )rW   Úsave_last_errorÚsave_statusÚrevokedzline1
line2zbassert %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.state_file
}.is_file
}()
}r   rM   r‡   )z%(py1)s in %(py3)sÚ
state_text)r   r   úassert %(py5)sr   zline1 line2ÚWOLFPANEL_STATUSrk   )z%(py1)s not in %(py3)sÚ	conf_textÚWOLFPANEL_LAST_ERROR)r+   r,   r   rO   rW   r·   r¸   Ú
state_filerv   r/   r0   r1   r2   r3   r4   r5   rs   r8   r-   )r   r   rW   r·   r¸   r?   r@   rA   rR   rº   r~   r:   Ú@py_format4rD   r½   s                  r   Ú,test_runtime_state_not_written_to_agent_confrÁ   {   sg  € Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆßFÑFá�CÔÙ�C˜Ô#Ù˜˜^Ô,ð �~‰~Ð'×%Ñ%Ð'Ð%Ó'Ð'Õ'×'×'×'×'×'Ñ'ˆs×'×'×'Ñ'ˆs×'×'Õ'ˆ~×'×'Ó'Ð%×'×'Ó'Ð'×'×'×'×'×'Ô'Ø—^‘^×-Ñ-Ó/ˆ
ØÐ&˜JÑ&×&×&×&Ò&ˆy×&×&Ô&ˆy×&×&×&×&×&Ô&˜J×&×&×&Ñ&˜J×&×&×&×&×&×&Ó&àÐ* 
Ñ*×*×*×*Ò*ˆ}×*×*Ô*ˆ}×*×*×*×*×*Ô* 
×*×*×*Ñ* 
×*×*×*×*×*×*Ó*Ø�=‰=× Ñ ×"Ò"ØŸ™×/Ñ/Ó1ˆIØ%Ð6¨YÑ6×6×6×6Ò6Ð%×6×6Ô6Ð%×6×6×6×6×6Ô6¨Y×6×6×6Ñ6¨Y×6×6×6×6×6×6Ó6Ø)Ð:°Ñ:×:×:×:Ò:Ð)×:×:Ô:Ð)×:×:×:×:×:Ô:°×:×:×:Ñ:°×:×:×:×:×:×:Ó:÷# 
'×	&Ö	&ús   –P+Q
Ñ

Qc                 ó$  ^• [         R                  " 5        n [        U 5      nSSKJnJm  SSKJn  SSKJ	n  U" U5         " U4S jSU5      nU" 5       nU" X5      nSo‡UL o™(       d¥  [        R                  " SU	4S	Xx45      S
[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS
[        R                  " U5      S.-  n
SSU
0-  n[!        [        R"                  " U5      5      eS =p˜UR$                  n	SoÉU:H  oÝ(       dº  [        R                  " SU4SXœ45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      [        R                  " U5      S.-  nSSU0-  n[!        [        R"                  " U5      5      eS =n	=pÜUR&                  n	SoÉU:H  oÝ(       dº  [        R                  " SU4SXœ45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      [        R                  " U5      S.-  nSSU0-  n[!        [        R"                  " U5      5      eS =n	=pÜU" X5      nSo�UL o™(       d¥  [        R                  " SU	4S	Xø45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  n
SSU
0-  n[!        [        R"                  " U5      5      eS =p˜S S S 5        g ! , (       d  f       g = f)Nr   )Ú	ApiClientÚApiError©Ú	send_once©rW   c                  ó"   >• \ rS rSrU 4S jrSrg)Ú4test_heartbeat_revoked_on_401.<locals>.Mock401Clienté™   c                ó   >• T" SSS9e)NÚUnauthorizedi‘  )Ústatus_code© )ÚselfÚpayloadÚtokenrÄ   s      €r   Ú	heartbeatÚ>test_heartbeat_revoked_on_401.<locals>.Mock401Client.heartbeatš   s   ø€ Ù˜~¸3Ñ?Ð?r   rÎ   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rÒ   Ú__static_attributes__)rÄ   s   €r   ÚMock401ClientrÉ   ™   s   ø† ÷@ð @r   rÙ   Fr¤   ©z%(py0)s is %(py3)sÚsuccess©r   r   r»   r   r¹   r!   )z.%(py2)s
{%(py2)s = %(py0)s.status
} == %(py5)sr   r)   r*   r   rÌ   )z2%(py2)s
{%(py2)s = %(py0)s.last_error
} == %(py5)sÚsuccess2)r+   r,   r   rp   rÃ   rÄ   rÒ   rÆ   rO   rW   r1   r8   r/   r0   r2   r3   r4   r5   ÚstatusÚ
last_error)r   r   rÃ   rÆ   rW   rÙ   ÚclientrÛ   r:   r?   rÀ   rD   r;   r@   rB   rÝ   rÄ   s                   @r   Útest_heartbeat_revoked_on_401rá   �   sù  ø€ Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆß2Ý'Ý(á�CÔ÷	@˜Iô 	@ñ “ˆÙ˜CÓ(ˆØÐ˜%Ð×××Òˆw×××××Õˆw×××Ñˆw××Õ˜%××××××ÑØ�z‰zÐ&˜YÐ&˜YÑ&×&×&×&Ò&ˆz×&×&×&×&×&Õ&ˆs×&×&×&Ñ&ˆs×&×&Õ&ˆz×&×&Ó&˜Y×&×&×&×&×&×&Ó&Ø�~‰~Ð/ Ð/ Ñ/×/×/×/Ò/ˆ~×/×/×/×/×/Õ/ˆs×/×/×/Ñ/ˆs×/×/Õ/ˆ~×/×/Ó/ ×/×/×/×/×/×/Ó/ñ ˜SÓ)ˆØ Ð ˜5Ð × × × Ò ˆx× × × × × Õ ˆx× × × Ñ ˆx× × Õ ˜5× × × × × × Ñ ÷) 
'×	&Ö	&ús   —M!NÎ
Nc                 ó4  ^^• [         R                  " 5        n [        U 5      nSSKJn  SSKJn  SSKJn  U" U5        / m/ m " UU4S jSU5      nU" 5       nSUl	        SS KnSUl
        S Ul        S	Ul        U" X5      nS
o˜U	L oª(       d¥  [        R                  " SU
4SX‰45      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS[        R$                  " U	5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =p©[+        T5      n	SoÙU:H  oî(       Gd  [        R                  " SU4SX�45      S[        R                   " 5       ;   d  [        R"                  " [*        5      (       a  [        R$                  " [*        5      OSS[        R                   " 5       ;   d  [        R"                  " T5      (       a  [        R$                  " T5      OS[        R$                  " U	5      [        R$                  " U5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =n	=píTS   S   nUR,                  nUU:H  o™(       d»  [        R                  " SU	4SUU45      [        R$                  " U5      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS[        R$                  " U5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =n=pžTS   S   nS nUU:H  o™(       dp  [        R                  " SU	4S!UU45      [        R$                  " U5      [        R$                  " U5      S".-  nS#S$U0-  n['        [        R(                  " U5      5      eS =n=n	nTS   S%   nS
nUUL o™(       dp  [        R                  " SU	4S&UU45      [        R$                  " U5      [        R$                  " U5      S".-  nS#S$U0-  n['        [        R(                  " U5      5      eS =n=n	n[+        T5      n	SoÙU:H  oî(       Gd  [        R                  " SU4SX�45      S[        R                   " 5       ;   d  [        R"                  " [*        5      (       a  [        R$                  " [*        5      OSS'[        R                   " 5       ;   d  [        R"                  " T5      (       a  [        R$                  " T5      OS'[        R$                  " U	5      [        R$                  " U5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =n	=píU" X5      nS
n	UU	L oª(       d¦  [        R                  " SU
4SUU	45      S([        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS([        R$                  " U	5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =p©[+        T5      n	S)oÙU:H  oî(       Gd  [        R                  " SU4SX�45      S[        R                   " 5       ;   d  [        R"                  " [*        5      (       a  [        R$                  " [*        5      OSS[        R                   " 5       ;   d  [        R"                  " T5      (       a  [        R$                  " T5      OS[        R$                  " U	5      [        R$                  " U5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =n	=píTS   S   nUR,                  nUU:H  o™(       d»  [        R                  " SU	4SUU45      [        R$                  " U5      S[        R                   " 5       ;   d  [        R"                  " U5      (       a  [        R$                  " U5      OS[        R$                  " U5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =n=pžTS   S   nS nUU:H  o™(       dp  [        R                  " SU	4S!UU45      [        R$                  " U5      [        R$                  " U5      S".-  nS#S$U0-  n['        [        R(                  " U5      5      eS =n=n	nTS   S%   nS
nUUL o™(       dp  [        R                  " SU	4S&UU45      [        R$                  " U5      [        R$                  " U5      S".-  nS#S$U0-  n['        [        R(                  " U5      5      eS =n=n	n[+        T5      n	SoÙU:H  oî(       Gd  [        R                  " SU4SX�45      S[        R                   " 5       ;   d  [        R"                  " [*        5      (       a  [        R$                  " [*        5      OSS'[        R                   " 5       ;   d  [        R"                  " T5      (       a  [        R$                  " T5      OS'[        R$                  " U	5      [        R$                  " U5      S.-  nSSU0-  n['        [        R(                  " U5      5      eS =n	=píS S S 5        g ! , (       d  f       g = f)*Nr   ©rÃ   rÅ   rÇ   c                  ó.   >• \ rS rSrU4S jrU 4S jrSrg)Ú;test_heartbeat_payload_has_version_info.<locals>.MockClienté´   c                ó(   >• TR                  U5        g )N©r©   )rÏ   rÐ   rÑ   Úpayloadss      €r   rÒ   ÚEtest_heartbeat_payload_has_version_info.<locals>.MockClient.heartbeatµ   s   ø€ Ø—‘ Õ(r   c           	     ó<   >• TR                  U5        SSSSSSSSS	.$ ©
Nr   Ústableú0.1.2zwolfpanel-agent-0.1.2.tar.gzÚ@0000000000000000000000000000000000000000000000000000000000000000r–   r   z2026-07-04T00:00:00Z)Úmanifest_versionÚchannelÚversionÚfileÚsha256Ú	signatureÚ
size_bytesÚpublished_atrè   )rÏ   ÚurlÚfetch_manifest_callss     €r   Úfetch_manifestÚJtest_heartbeat_payload_has_version_info.<locals>.MockClient.fetch_manifest¸   s3   ø€ Ø$×+Ñ+¨CÔ0à()Ø'Ø&Ø:Ø&Ø!#Ø"#Ø$:ñ	ð 	r   rÎ   N)rÔ   rÕ   rÖ   r×   rÒ   rú   rØ   )rù   ré   s   €€r   Ú
MockClientrå   ´   s   ø† õ)÷ð r   rü   é
   g        FTr¤   rÚ   rÛ   rÜ   r»   r   r   r!   rd   Úlenré   re   rf   r   Úagent_version)z5%(py1)s == %(py5)s
{%(py5)s = %(py3)s.agent_version
}r   )r   r   r   r*   r   Úlatest_versionrî   r™   rš   r›   rN   r¨   ©z%(py1)s is %(py4)srù   rÝ   é   )r+   r,   r   rp   rÃ   rÒ   rÆ   rO   rW   r9   Ú_last_fetch_timeÚ_cached_latest_versionÚ_cached_update_availabler1   r8   r/   r0   r2   r3   r4   r5   rþ   rÿ   )r   r   rÃ   rÆ   rW   rü   rà   rÒ   rÛ   r:   r?   rÀ   rD   rA   r;   rR   r}   r~   rB   r@   rQ   rÝ   rù   ré   s                         @@r   Ú'test_heartbeat_payload_has_version_infor  ¨   s  ù€ Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆÝ(Ý'Ý(á�CÔàˆØ!Ð÷	ð 	˜ô 	ñ" “ˆØ!#ˆÔó 	Ø%(ˆ	Ô"Ø+/ˆ	Ô(Ø-2ˆ	Ô*ñ ˜CÓ(ˆØÐ˜$ˆ×××Òˆw×××××Õˆw×××Ñˆw××Õ˜$××××××ÑÜ�8‹}Ð! Ð! Ñ!×!×!×!Ó!ˆ}×!×!×!×!×!Õ!Œs×!×!×!Ñ!Œs×!×!×!×!×!Ö!�8×!×!×!Ñ!�8×!×!Õ!ˆ}×!×!Ó! ×!×!×!×!×!×!Ó!Ø˜‰{˜?Ñ+Ð@¨s×/@Ñ/@Ð@Ð+Ð/@Ñ@×@×@×@Ò@Ð+Ð/@×@×@Ô@Ð+×@×@×@×@×@Ô@¨s×@×@×@Ñ@¨s×@×@Õ@Ð/@×@×@×@×@×@×@Ó@Ø˜‰{Ð+Ñ,Ð7°Ð7Ð,°Ñ7×7×7×7Ò7Ð,°×7×7Ô7Ð,×7×7Ó7°×7×7×7×7×7×7Ô7Ø˜‰{Ð-Ñ.Ð6°$Ð6Ð.°$Ð6×6×6×6Ò6Ð.°$×6×6Ô6Ð.×6×6Ó6°$×6×6×6×6×6×6Ô6ÜÐ'Ó(Ð-¨AÐ-¨AÑ-×-×-×-Ó-Ð(×-×-×-×-×-Õ-Œs×-×-×-Ñ-Œs×-×-×-×-×-Ö-Ð'×-×-×-Ñ-Ð'×-×-Õ-Ð(×-×-Ó-¨A×-×-×-×-×-×-Ó-ñ ˜SÓ)ˆØÐˆx˜4Ð×××Òˆx˜4×××××Õˆx×××Ñˆx××Õ˜4××××××ÑÜ�8‹}Ð! Ð! Ñ!×!×!×!Ó!ˆ}×!×!×!×!×!Õ!Œs×!×!×!Ñ!Œs×!×!×!×!×!Ö!�8×!×!×!Ñ!�8×!×!Õ!ˆ}×!×!Ó! ×!×!×!×!×!×!Ó!Ø˜‰{˜?Ñ+Ð@¨s×/@Ñ/@Ð@Ð+Ð/@Ñ@×@×@×@Ò@Ð+Ð/@×@×@Ô@Ð+×@×@×@×@×@Ô@¨s×@×@×@Ñ@¨s×@×@Õ@Ð/@×@×@×@×@×@×@Ó@Ø˜‰{Ð+Ñ,Ð7°Ð7Ð,°Ñ7×7×7×7Ò7Ð,°×7×7Ô7Ð,×7×7Ó7°×7×7×7×7×7×7Ô7Ø˜‰{Ð-Ñ.Ð6°$Ð6Ð.°$Ð6×6×6×6Ò6Ð.°$×6×6Ô6Ð.×6×6Ó6°$×6×6×6×6×6×6Ô6äÐ'Ó(Ð-¨AÐ-¨AÑ-×-×-×-Ó-Ð(×-×-×-×-×-Õ-Œs×-×-×-Ñ-Œs×-×-×-×-×-Ö-Ð'×-×-×-Ñ-Ð'×-×-Õ-Ð(×-×-Ó-¨A×-×-×-×-×-×-Ó-÷m 
'×	&Ö	&ús   ˜i(j	ê	
jc                 óŽ
  • SS K n U R                  " 5        n[        U5      nSSKJn  SS KnU" UR                  UR                  S9  SSKJ	n  SSK
Jn  SSKJnJn  U" U5        U" USS5        [        U5      nUR                  S	-  UR                   -  n	U	R#                  S
S
S9  U	S-  R#                  S
S
S9  U	S-  S-  R%                  SSS9  U	S-  R%                  UR                   SS9  UR                  S-  n
U
R'                  5       (       d  U
R)                  5       (       a;  U
R)                  5       (       a  U
R+                  5         OSS KnUR/                  U
5         [0        R2                  " Xš5         " S SU5      nU" 5       nSSKJn  U" S5       nU" X-5        S S S 5        U
R)                  5       (       aí  U
R=                  5       nUR>                  nSnUU:H  nU(       d»  [@        RB                  " SU4SUU45      S[D        RF                  " 5       ;   d  [@        RH                  " U5      (       a  [@        RJ                  " U5      OS[@        RJ                  " U5      [@        RJ                  " U5      S.-  nSSU0-  n[M        [@        RN                  " U5      5      eS =n=nnGOûU
S-  nURP                  nU" 5       nU(       dš  SS[D        RF                  " 5       ;   d  [@        RH                  " U5      (       a  [@        RJ                  " U5      OS[@        RJ                  " U5      [@        RJ                  " U5      S .-  n[M        [@        RN                  " U5      5      eS =nnURS                  SS9RU                  5       nUS:w  ac  [W        S!5        UR                  RQ                  5       (       a#  [W        UR                  RS                  SS95        O[W        S"5        [W        S#5        SnUU:H  nU(       d¦  [@        RB                  " SU4S$UU45      S%[D        RF                  " 5       ;   d  [@        RH                  " U5      (       a  [@        RJ                  " U5      OS%[@        RJ                  " U5      S&.-  nS'S(U0-  n[M        [@        RN                  " U5      5      eS =nnSS KnURY                  5         UR[                  S)5      n[]        UR^                  5       H  nURa                  U5        M     S S S 5        g ! [4         a    SS KnUR7                  Xš5         GN«f = f! , (       d  f       GN�= f! , (       d  f       g = f)*Nr   )Úsetup_logging)Úlevelrã   )Úprocess_commands)rW   rY   Ú
server_123rc   ÚversionsT©ÚparentsÚexist_okr   zmain.pyzprint('running')zutf-8)ÚencodingÚVERSIONÚcurrentc                  ó&   • \ rS rSrS rS rS rSrg)Ú2test_agent_self_update_command.<locals>.MockClienti	  c                ó   • SS0 S./$ )Nr   zagent.update)ÚidÚcommand_typerÐ   rÎ   )rÏ   rÑ   s     r   Úget_pending_commandsÚGtest_agent_self_update_command.<locals>.MockClient.get_pending_commands
  s   € àØ$2Ø!ñð ð r   c           	     ó   • SSSSSSSSS	.$ rì   rÎ   )rÏ   rø   s     r   rú   ÚAtest_agent_self_update_command.<locals>.MockClient.fetch_manifest  s$   € à()Ø'Ø&Ø:Ø&Ø!#Ø"#Ø$:ñ	ð 	r   c                óv  • SoAU:H  oU(       d¥  [         R                  " SU4SX45      S[        R                  " 5       ;   d  [         R                  " U5      (       a  [         R
                  " U5      OS[         R
                  " U5      S.-  nSSU0-  n[        [         R                  " U5      5      eS =pTUS   nS	o˜U	:H  oD(       do  [         R                  " SU4S
X‰45      [         R
                  " U5      [         R
                  " U	5      S.-  n
SSU
0-  n[        [         R                  " U5      5      eS =n=pIg )Nr   r!   ©z%(py0)s == %(py3)sÚ
command_idrÜ   r»   r   rÞ   Ú	succeededr™   rš   r›   rN   )r1   r8   r/   r0   r2   r3   r4   r5   )rÏ   r  Úresult_dictrÑ   r:   r?   rÀ   rD   r~   r@   rQ   rR   s               r   Úpost_command_resultÚFtest_agent_self_update_command.<locals>.MockClient.post_command_result  s¬   € Ø%&Ð& Q‘×&×&×&Ò&�z×&×&×&×&×&Õ&�z×&×&×&Ñ&�z×&×&Õ& Q×&×&×&×&×&×&Ñ&Ø" 8Ñ,Ð;°Ð;°Ñ;×;×;×;Ò;Ð,×;×;Ô;Ð,×;×;Ó;°×;×;×;×;×;×;Ô;r   rÎ   N)rÔ   rÕ   rÖ   r×   r  rú   r!  rØ   rÎ   r   r   rü   r  	  s   † òò
õ<r   rü   )Úpatchzsubprocess.Popenrî   r!   )z,%(py2)s
{%(py2)s = %(py0)s.name
} == %(py5)sÚtargetr)   r*   r   zBassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.is_file
}()
}Úversion_file)r   r$   r%   z--- AGENT LOG ---zAgent log file does not exist!z--- END AGENT LOG ---r  Úversion_valrÜ   r»   r   Ú	wolfpanel)1r+   r,   r   Úloggerr  ÚloggingÚ	agent_logÚDEBUGrp   rÃ   Úcommand_runnerr
  rO   rW   rY   Úopt_dirrÿ   Úmkdirr�   ÚexistsÚ
is_symlinkÚunlinkÚshutilÚrmtreer   ÚsymlinkÚOSErrorÚcopytreeÚunittest.mockr#  Úreadlinkr7   r1   r8   r/   r0   r2   r3   r4   r5   rv   rs   rt   ÚprintÚshutdownÚ	getLoggerÚlistÚhandlersÚremoveHandler)r+   r   r   r  r)  rÃ   r
  rW   rY   Úcurrent_version_dirÚcurrent_linkr2  rü   rà   r#  Ú
mock_popenr$  r?   r;   r@   rD   rB   r%  rQ   r&  r:   rÀ   Úroot_loggerÚhandlers                                r   Útest_agent_self_update_commandrD  â   sÈ  € ÛØ	×	$Ò	$Ô	&¨#Ü˜CÓ ˆÝ(ÛÙ�c—m‘m¨7¯=©=Ò9å(Ý3ß;á�CÔÙ˜#˜|Ð-AÔBô ˜CÓ ˆð "Ÿk™k¨JÑ6¸×9JÑ9JÑJÐØ×!Ñ!¨$¸Ð!Ñ>Ø	˜uÑ	$×+Ñ+°DÀ4Ð+ÑHØ	˜uÑ	$ yÑ	0×<Ñ<Ð=OÐZaÐ<ÑbØ	˜yÑ	(×4Ñ4°S×5FÑ5FÐQXÐ4ÑYà—{‘{ YÑ.ˆØ×Ñ× Ñ  L×$;Ñ$;×$=Ñ$=Ø×&Ñ&×(Ñ(Ø×#Ñ#Õ%ãØ—‘˜lÔ+ð	?Ü�JŠJÐ*Ô9ô
	<˜ô 	<ñ0 “ˆÝ'ÙÐ%Ô&¨*Ù˜SÔ)÷ 'ð ×"Ñ"×$Ñ$Ø!×*Ñ*Ó,ˆFØ—;‘;Ð) 'Ð)�; 'Ñ)×)×)×)Ó)�; '×)×)×)×)×)Õ)�6×)×)×)Ñ)�6×)×)Õ)�;×)×)Ó) '×)×)×)×)×)×)Ö)à'¨)Ñ3ˆLØ×'Ñ'Ð)Ñ'Ó)Ð)Ö)×)×)×)×)×)Ñ)�<×)×)×)Ñ)�<×)×)Õ)Ð'×)×)Ó)Ð)×)×)×)×)×)Ó)Ø&×0Ñ0¸'Ð0ÐB×HÑHÓJˆKØ˜gÓ%ÜÐ)Ô*Ø—=‘=×(Ñ(×*Ñ*Ü˜#Ÿ-™-×1Ñ1¸7Ð1ÐCÕDäÐ:Ô;ÜÐ-Ô.Ø")Ð)�; 'Ñ)×)×)×)Ó)�; '×)×)×)×)×)Õ)�;×)×)×)Ñ)�;×)×)Õ) '×)×)×)×)×)×)Ò)ó 	Ø×ÑÔØ×'Ñ'¨Ó4ˆÜ˜K×0Ñ0Ö1ˆGØ×%Ñ% gÖ.ñ 2÷o 
'Ð	&øôB ó 	?ÛØ�O‰OÐ/×>ð	?ú÷< 'Ö&ú÷ 
'Õ	&úsI   –ET6ÅS>Å5 T6Æ	T$ÆMT6Ó>T!ÔT6Ô T!Ô!T6Ô$
T3	Ô.T6Ô6
Uc                 óh  • SSK Jn   So" U5      nSo2U:H  oD(       dÏ  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=n=pCS
o" U5      nSo2U:H  oD(       dÏ  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=n=pCSo" U5      nSo2U:H  oD(       dÏ  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=n=pCSo" U5      nSo2U:H  oD(       dÏ  [        R                  " SU4SX#45      S[        R
                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n=n=pCg )Nr   )Úescape_mysql_stringÚmy_passr!   r�   rF  r#   r&   r'   zmy'passzmy''passzmy\passzmy\\passzmy\'passz
my\\''pass)
Úactions.databaserF  r1   r8   r/   r0   r2   r3   r4   r5   )rF  r?   r@   r<   rA   rB   rC   s          r   Útest_escape_mysql_stringrI  ?  s  € Ý4Ø(Ð6Ð˜yÓ)Ð6¨YÐ6¨YÑ6×6×6×6Ò6Ð)×6×6×6×6×6Õ6Ð×6×6×6Ñ6Ð×6×6Õ6˜y×6×6Ó6Ð)×6×6Ó6¨Y×6×6×6×6×6×6Õ6Ø(Ð7Ð˜yÓ)Ð7¨ZÐ7¨ZÑ7×7×7×7Ò7Ð)×7×7×7×7×7Õ7Ð×7×7×7Ñ7Ð×7×7Õ7˜y×7×7Ó7Ð)×7×7Ó7¨Z×7×7×7×7×7×7Õ7Ø)Ð:Ð˜zÓ*Ð:¨lÐ:¨lÑ:×:×:×:Ò:Ð*×:×:×:×:×:Õ:Ð×:×:×:Ñ:Ð×:×:Õ:˜z×:×:Ó:Ð*×:×:Ó:¨l×:×:×:×:×:×:Õ:Ø*Ð=Ð˜{Ó+Ð=¨~Ð=¨~Ñ=×=×=×=Ò=Ð+×=×=×=×=×=Õ=Ð×=×=×=Ñ=Ð×=×=Õ=˜{×=×=Ó=Ð+×=×=Ó=¨~×=×=×=×=×=×=Ö=r   c                 ó®  • SSK Jn   SS Kn[        R                  " 5        nU[
        R                  S'   [        U5      S-  S-  S-  nUR                  SSS9  [        U5      o@" U5      n[        U5      oeU:H  ow(       Gd  [        R                  " S	U4S
XV45      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OSS[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  n	[!        [        R"                  " U	5      5      eS =n=n=pv[        U5      S-  n
UR%                  [&        5         U " [        U
5      5        S S S 5        [        U5      S-  S-  S-  S-  S-  S-  nUR%                  [&        5         U " [        U5      5        S S S 5        S S S 5        g ! , (       d  f       Nc= f! , (       d  f       N(= f! , (       d  f       g = f)Nr   )Ú_verify_safe_pathr   ÚvarÚwwwÚsite1Tr  r!   )zn%(py6)s
{%(py6)s = %(py0)s(%(py4)s
{%(py4)s = %(py1)s(%(py2)s)
})
} == %(py11)s
{%(py11)s = %(py8)s(%(py9)s)
}rK  r   Ú
valid_path)r   r   r$   r%   rN   r   r'   ro   zassert %(py13)sÚpy13Úetcz..)Úactions.sftprK  Úpytestr+   r,   r   r   r   r.  r   r1   r8   r/   r0   r2   r3   r4   r5   ÚraisesÚPermissionError)rK  rS  r   rO  r@   rA   r«   rx   r€   Ú@py_format14Úinvalid_pathÚtraversal_paths               r   Útest_sftp_directory_validationrY  G  sÿ  € Ý.ÛÜ	×	$Ò	$Ô	&¨#Ø+.Œ�
‰
Ð'Ñ(ô ˜#“Y Ñ&¨Ñ.°Ñ8ˆ
Ø×Ñ °ÐÑ5Ü!$ Z£ÐDÐ  Ó1ÐD´S¸³_ÐD°_ÑD×D×D×DÓDÐ1×D×D×D×D×DÕDÐ ×D×D×DÑDÐ ×D×D×D×D×DÖD¤×D×D×DÑD¤×D×D×D×D×DÖD Z×D×D×DÑD Z×D×DÕD ×D×DÓDÐ1×D×D×D×D×DÔD´S×D×D×DÑD´S×D×D×D×D×DÖD¸×D×D×DÑD¸×D×DÕD°_×D×D×D×D×D×DÕDô ˜C“y 5Ñ(ˆØ�]‰]œ?Õ+Ùœc ,Ó/Ô0÷ ,ô ˜c› UÑ*¨UÑ2°WÑ<¸tÑCÀdÑJÈUÑRˆØ�]‰]œ?Õ+Ùœc .Ó1Ô2÷ ,÷ 
'Ð	&÷ ,Õ+ú÷
 ,Õ+ú÷ 
'Õ	&ús<    JMÊ5L$Ë:MÌL5ÌMÌ$
L2	Ì.MÌ5
M	Ì?MÍ
Mc                 ó0  • [         R                  " 5        n [        U 5      nUR                  nSo2U:H  oD(       dº  [        R
                  " SU4SX#45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCUR                  nSo2U:H  oD(       dº  [        R
                  " SU4S	X#45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCUR                  nS
o2U:H  oD(       dº  [        R
                  " SU4SX#45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCUR                  nSo2U:H  oD(       dº  [        R
                  " SU4SX#45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCS S S 5        g ! , (       d  f       g = f)Nr(   r!   )z6%(py2)s
{%(py2)s = %(py0)s.update_timeout
} == %(py5)sr   r)   r*   r   é   )z8%(py2)s
{%(py2)s = %(py0)s.backup_retention
} == %(py5)sé   )z8%(py2)s
{%(py2)s = %(py0)s.update_retention
} == %(py5)sé   )z8%(py2)s
{%(py2)s = %(py0)s.download_timeout
} == %(py5)s)r+   r,   r   Úupdate_timeoutr1   r8   r/   r0   r2   r3   r4   r5   Úbackup_retentionÚupdate_retentionÚdownload_timeout)r   r   r?   r;   r@   rD   rB   s          r   Útest_update_configurationsrb  ]  sò  € Ü	×	$Ò	$Ô	&¨#Ü˜CÓ ˆØ×!Ñ!Ð' RÐ' RÑ'×'×'×'Ò'Ð!×'×'×'×'×'Õ'ˆs×'×'×'Ñ'ˆs×'×'Õ'Ð!×'×'Ó' R×'×'×'×'×'×'Ó'Ø×#Ñ#Ð( qÐ( qÑ(×(×(×(Ò(Ð#×(×(×(×(×(Õ(ˆs×(×(×(Ñ(ˆs×(×(Õ(Ð#×(×(Ó( q×(×(×(×(×(×(Ó(Ø×#Ñ#Ð( qÐ( qÑ(×(×(×(Ò(Ð#×(×(×(×(×(Õ(ˆs×(×(×(Ñ(ˆs×(×(Õ(Ð#×(×(Ó( q×(×(×(×(×(×(Ó(Ø×#Ñ#Ð) rÐ) rÑ)×)×)×)Ò)Ð#×)×)×)×)×)Õ)ˆs×)×)×)Ñ)ˆs×)×)Õ)Ð#×)×)Ó) r×)×)×)×)×)×)Ó)÷ 
'×	&Ö	&ús   –M(NÎ
Nc            	     ó,  • SSK Jn   SS K nSS Kn[        R                  " 5        nUR
                  R                  nUR
                  R                  nX1R
                  l        [        R                  R                  [        R                  R                  USSS5      5      UR
                  l        U[        R                  S'   [        U5      n[        U5      S-  S-  S-  nUR                  S	S	S
9  US-  R!                  S5        S[        R                  S'   [        U5      n SS KnU " S[%        U5      S	SS.5      n	U	S   n
S	oºUL oÌ(       do  [&        R(                  " SU4SX«45      [&        R*                  " U
5      [&        R*                  " U5      S.-  nSSU0-  n[-        [&        R.                  " U5      5      eS =n
=pËUR1                  S5        U " S[%        U5      S	SS.5      nUS   n
S	oºUL oÌ(       do  [&        R(                  " SU4SX«45      [&        R*                  " U
5      [&        R*                  " U5      S.-  nSSU0-  n[-        [&        R.                  " U5      5      eS =n
=pËUR1                  S5        U " S[%        U5      S	SS.5      nUS   n
S	oºUL oÌ(       do  [&        R(                  " SU4SX«45      [&        R*                  " U
5      [&        R*                  " U5      S.-  nSSU0-  n[-        [&        R.                  " U5      5      eS =n
=pË[        U5      S-  S-  S-  S-  nUR3                  5        Vs/ sH'  nUR4                  R7                  S5      (       d  M%  UPM)     nn[9        U5      nSnUU:H  nU(       Gd  [&        R(                  " SU4SUU45      S[:        R<                  " 5       ;   d  [&        R>                  " [8        5      (       a  [&        R*                  " [8        5      OSS[:        R<                  " 5       ;   d  [&        R>                  " U5      (       a  [&        R*                  " U5      OS[&        R*                  " U5      [&        R*                  " U5      S.-  nS S!U0-  n[-        [&        R.                  " U5      5      eS =n=nn[        R                  nUR@                  o¹S"   nU" U5      nU(       + nU(       dÌ  S#S$[:        R<                  " 5       ;   d  [&        R>                  " [        5      (       a  [&        R*                  " [        5      OS$[&        R*                  " U5      [&        R*                  " U5      [&        R*                  " U5      [&        R*                  " U5      S%.-  n[-        [&        R.                  " U5      5      eS =n=n=n=nn[        R                  nUR@                  o¿S"   nU" U5      nU(       dÌ  S&S$[:        R<                  " 5       ;   d  [&        R>                  " [        5      (       a  [&        R*                  " [        5      OS$[&        R*                  " U5      [&        R*                  " U5      [&        R*                  " U5      [&        R*                  " U5      S%.-  n[-        [&        R.                  " U5      5      eS =n=n=nn[        R                  nUR@                  nUS"   nU" U5      nU(       dÌ  S&S$[:        R<                  " 5       ;   d  [&        R>                  " [        5      (       a  [&        R*                  " [        5      OS$[&        R*                  " U5      [&        R*                  " U5      [&        R*                  " U5      [&        R*                  " U5      S%.-  n[-        [&        R.                  " U5      5      eS =n=n=nnXAR
                  l        XQR
                  l         S S S 5        g s  snf ! XAR
                  l        XQR
                  l        f = f! , (       d  f       g = f)'Nr   )Úhandle_backup_createrL  Úbackupsr'  r   rM  ÚmysiteTr  z
index.htmlÚcontentÚ2ÚWOLFPANEL_BACKUP_RETENTIONz
mysite.comF)ÚdomainÚdocrootÚinclude_filesÚ
include_dbrÛ   r¤   r  rš   r›   rN   gÍÌÌÌÌÌð?z.tar.gzr  r!   rd   rþ   Úfilesre   rf   r   Úbackup_pathzfassert not %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py6)s)
}r   )r   r$   r%   rN   r   zbassert %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.path
}.exists
}(%(py6)s)
})!Úactions.backuprd  r2  r+   r,   ÚbackupÚDEV_HOMEÚBACKUP_BASE_DIRr   rm   ÚrealpathÚjoinr   r   r   r.  r�   Útimer   r1   r8   r3   r4   r5   ÚsleepÚiterdirr7   Úendswithrþ   r/   r0   r2   r/  )rd  Úactionsr2  r   Úoriginal_dev_homeÚoriginal_baser   rk  rv  Úres1r~   r@   r:   rQ   rR   Úres2Úres3Ú
backup_dirÚprn  rA   r;   r}   r?   rx   r=   rC   s                              r   Útest_backup_retention_limitr‚  f  s0  € Ý3ÛÛÜ	×	$Ò	$Ô	&¨#à#ŸN™N×3Ñ3ÐØŸ™×6Ñ6ˆð #&�‰ÔÜ)+¯©×)9Ñ)9¼"¿'¹'¿,¹,ÀsÈEÐS\Ð^iÓ:jÓ)kˆ�‰Ô&à+.Œ�
‰
Ð'Ñ(Ü˜CÓ ˆô �s“)˜eÑ# eÑ+¨hÑ6ˆØ�‰˜d¨TˆÑ2Ø	�<Ñ	×+Ñ+¨IÔ6ð 47Œ�
‰
Ð/Ñ0Ü˜CÓ ˆð	;ãÙ'°<ÌCÐPWËLÐkoð  @Eñ  )Fó  GˆDØ˜	‘?Ð* dÐ* dÐ*×*×*×*Ò*�?×*×*Ô*�?×*×*Ó* d×*×*×*×*×*×*Ó*à�J‰J�tÔÙ'°<ÌCÐPWËLÐkoð  @Eñ  )Fó  GˆDØ˜	‘?Ð* dÐ* dÐ*×*×*×*Ò*�?×*×*Ô*�?×*×*Ó* d×*×*×*×*×*×*Ó*à�J‰J�tÔÙ'°<ÌCÐPWËLÐkoð  @Eñ  )Fó  GˆDØ˜	‘?Ð* dÐ* dÐ*×*×*×*Ò*�?×*×*Ô*�?×*×*Ó* d×*×*×*×*×*×*Ó*ô ˜c› UÑ*¨YÑ6¸ÑDÀ|ÑSˆJØ *× 2Ñ 2Ô 4ÓSÑ 4˜1¸¿¹¿¹È	×8R—QÑ 4ˆEÐSô �u“:Ð" Ð"�: ‘?×"×"×"Ô"�: ×"×"×"×"×"Õ"”3×"×"×"Ñ"”3×"×"×"×"×"Ö"�u×"×"×"Ñ"�u×"×"Õ"�:×"×"Ó" ×"×"×"×"×"×"Ô"ä—w‘wÐ:�w—~‘~Ð:¨=Ñ&9Ð:‘~Ð&9Ó:Ð:Ð:Ô:Ð:Ö:×:×:×:×:×:Ñ:”r×:×:×:Ñ:”r×:×:Õ:�w×:×:Ó:�~×:×:Ó:Ð&9×:×:Ó:Ð:×:×:×:×:×:×:Ñ:Ü—7‘7Ð6�7—>‘>Ð6 }Ñ"5Ð6‘>Ð"5Ó6Ð6Ö6×6×6×6×6×6Ñ6”2×6×6×6Ñ6”2×6×6Õ6�7×6×6Ó6�>×6×6Ó6Ð"5×6×6Ó6Ð6×6×6×6×6×6×6Ü—7‘7Ð6�7—>‘>Ð6 $ }Ñ"5Ð6‘>Ð"5Ó6Ð6Ö6×6×6×6×6×6Ñ6”2×6×6×6Ñ6”2×6×6Õ6�7×6×6Ó6�>×6×6Ó6Ð"5×6×6Ó6Ð6×6×6×6×6×6×6à&7�N‰NÔ#Ø-:�N‰NÕ*÷_ 
'Ð	&ùòJ Tøð '8�N‰NÔ#Ø-:�N‰NÕ*ú÷_ 
'Õ	&ús>   ¤C?`Ä$H_ Í#_Í(_Í.Q_ Þ1 `ß_ ß "`à`à
`Ú__main__Útest_rž   zPASS zFAIL )r   r   )6Ú__doc__Ú
__future__r   Úbuiltinsr/   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter1   r   Úsysr+   Úpathlibr   rm   Úinsertr   Ú__file__Úresolver  r   rE   rS   r�   r�   r’   rŸ   r°   rµ   rÁ   rá   r  rD  rI  rY  rb  r‚  rÔ   Ú	tracebackÚsortedÚglobalsÚitemsr.   ÚfuncsÚfailuresÚfuncÚ__code__Úco_varnamesr,   r   r9  Ú	ExceptionÚ	print_excÚexit)ÚkÚvs   00r   Ú<module>rž     s¬  ðñõ #ç  „ ƒ	Û 
Û Ý à ‡�‡��‘3‘t˜H“~×-Ñ-Ó/×7Ñ7¸Ñ:¸UÑBÓCÔ Dô'ò,ò!òNò,òQò3òBò+ò";ò*!ò07.òtZ/òz>ò3ò,*ò3;ðl ˆzÓÛá!¡'£)§/¡/Ó"3Ô4ÔNÑ4‘4�1¸¿¹ÀW×8M�QÑ4ÒN€EØ€HÛˆð	"à˜TŸ]™]×6Ñ6Ó6Ø×0Ò0Ô2°cÙ™˜c›”O÷ 3Ð2ñ ”Ù�E˜$Ÿ-™-˜Ð)Ö*ñ ð ‡H‚H–(‰Q Õ"ð% ùó O÷ 3Õ2ûð
 ó 	"Ø˜‰MˆHÙ�E˜$Ÿ-™-˜Ð)Ô*Ø×Ò×!ð	"ús6   ÃE<Ã*E<Ã<+FÄ'FÄ6%FÆ
F	ÆFÆ1GÇG