ó
    s;Ij…)  ã            	      ó:  • S r SSKJr  SSKrSSKrSSKrSSKrSSKJrJ	r	  SSK
JrJr  SSKJr  SSKJr  SSKJr  SS	KJrJrJr  SS
KJrJr  SSKJrJr  \" S5      rSS jr SS jr!SS jr"SS jr#SS jr$SS jr%SS jr&SS jr'SS jr(\'\ \!\"\#\$\%\&S.r)SSS jjr*g)a   Command-line interface and command handlers for the WolfPanel Agent.

Commands:
  run                     run as a service (heartbeat loop + initial discovery)
  register --token X      register with the Central API using an install token
  heartbeat               send a single heartbeat
  discover --quick|--full run discovery (read-only)
  update-check            report whether a newer version is available
  status                  print local agent status
  version                 print the agent version
é    )ÚannotationsN)ÚApiErrorÚget_api_client)ÚAGENT_VERSIONÚload_config)Úfull)Úquick)Ú	send_once)Úensure_dirsÚload_agent_tokenÚstore_credentials)Ú
get_loggerÚsetup_logging)ÚcheckÚself_updateÚclic                ó  • UR                   nU(       dX  [        S5        U R                  (       a  [        SU R                   S35        O[        S5        [        S5        [        S5        g[        U 5        [	        U 5      n[
        R                  R                  5       nUU R                  [
        R                  R                  5       UR                  S5      =(       d    UR                  S	5      UR                  S
5      =(       d    UR                  S5      [
        R                  R                  5       [
        R                  R                  5       S.n UR                  U5      nUR                  S5      nUR                  S5      n	U(       a  U	c  [        R!                  S5        g[#        U [%        U	5      U5        [        SU	 SUR                  S5       35        g! [         a   n[        R!                  SU5         SnAgSnAff = f)zÄExchange an install token for long-lived agent credentials.

SECURITY: the install token is used in-memory only and is never written to
disk. Only the returned agent/refresh tokens are persisted.
z
No install token provided.
zOpen:
  Ú
z>Open: <pairing URL not configured; set WOLFPANEL_CONNECT_URL>
zPairing Code:
  DEV-XXXX
uH   (Browser pairing is not implemented in v1 â€” pass --token to register.)é   Ú	distro_idÚsystemÚdistro_versionÚrelease)Úinstall_tokenÚagent_versionÚhostnameÚos_nameÚ
os_versionÚ	cpu_coresÚmemory_totalzregistration failed: %sNÚagent_tokenÚ	server_idz-registration response missing required fieldsz#Registered successfully. server_id=z status=Ústatusr   )ÚtokenÚprintÚconnect_urlr   r   Úquick_discoveryr   Úos_infor   r   ÚgetÚ	cpu_countÚmemory_total_bytesÚregisterr   ÚlogÚerrorr   Ústr)
ÚconfigÚargsr   Ú
api_clientr(   ÚpayloadÚresponseÚexcr!   r"   s
             Ú-D:\Programs\laragon\www\wolf\agent\src\cli.pyÚcmd_registerr7   &   s¥  € ð —J‘J€MÞô
 	Ð.Ô/Ø××Ü�I˜f×0Ñ0Ð1°Ð4Õ5äÐSÔTÜÐ+Ô,ÜÐXÔYØä�ÔÜ Ó'€Jä×$Ñ$×,Ñ,Ó.€Gð 'Ø×-Ñ-Ü#×*Ñ*×3Ñ3Ó5Ø—;‘;˜{Ó+×D¨w¯{©{¸8Ó/DØ—k‘kÐ"2Ó3×M°w·{±{À9Ó7MÜ$×+Ñ+×5Ñ5Ó7Ü'×.Ñ.×AÑAÓCñ€GðØ×&Ñ& wÓ/ˆð —,‘,˜}Ó-€KØ—‘˜[Ó)€IÞ˜IÑ1Ü�	‰	ÐAÔBØä�fœc )›n¨kÔ:ô 
Ð/°	¨{¸(À8Ç<Á<ÐPXÓCYÐBZÐ
[Ô\Øøô! ó Ü�	‰	Ð+¨SÔ1Üûðús   ÅG! Ç!
HÇ+HÈHc                ó@   • [        U 5      n[        X5      (       a  S$ S$ )Nr   r   )r   r
   )r0   r1   r2   s      r6   Úcmd_heartbeatr9   _   s!   € Ü Ó'€JÜ˜&×-Ñ-ˆ1Ð4°1Ð4ó    c                ód  • UR                   (       aJ  UR                  (       d9  [        R                  " 5       n[	        [
        R                  " US[        S95        g[        U 5      n[        R                  " XUR                  (       + S9n[	        [
        R                  " US   S[        S95        g)Né   )ÚindentÚdefaultr   ©ÚuploadÚ	discovery)r	   r   r'   Úcollectr%   ÚjsonÚdumpsr/   r   Úfull_discoveryÚrunÚ	no_upload)r0   r1   Úsnapshotr2   s       r6   Úcmd_discoverrI   d   su   € Ø‡z‡z˜$Ÿ)Ÿ)Ü"×*Ò*Ó,ˆÜŒd�jŠj˜¨!´SÑ9Ô:Øä Ó'€JÜ×!Ò! &ÀÇÁÔ=OÑP€HÜ	Œ$�*Š*�X˜kÑ*°1¼cÑ
BÔCØr:   c                óì   • [        U 5      n[        X5      nUc  [        S5        gUR                  (       a&  [        SUR                   SUR
                   35        g[        SUR                   35        g)NzUpdate check failed (see logs).r   zUpdate available: z -> zUp to date: r   )r   Úupdate_checkr%   Úupdate_availableÚcurrentÚlatest)r0   r1   r2   Úinfos       r6   Úcmd_update_checkrP   p   sk   € Ü Ó'€JÜ˜Ó+€DØ�|ÜÐ/Ô0ØØ××ÜÐ" 4§<¡< .°°T·[±[°MÐBÔCð ô 	�˜TŸ\™\˜NÐ+Ô,Ør:   c                ó¼  • UR                   (       a  [        U R                  5        g[        U 5      n[	        X5      nUc  UR
                  (       d  [        S5        gUR
                  (       aE  [        SUR                   35        [        SUR                   35        UR                  (       a  S$ S$ [        SUR                   35        UR                  (       d  [        S	UR                   S
35        g[        SUR                   SUR                   35        UR                  (       d;   [        S5      R                  5       R                  5       nUS;  a  [        S5        g [        S5         [        X5        [        SUR                   35        g! [        [        4 a    [        S5         gf = f! [          a  n[        SU 35         SnAgSnAff = f)z)Check for update and perform self-update.r   NzUpdate check failed.r   z	current: zlatest: r<   zCurrent version: vzAgent is up to date (vÚ)zUpdate available: vz -> vzProceed with update? [y/N]: )ÚyÚyeszUpdate cancelled.z
Update cancelled.zInitiating agent update...zAgent updated to vzUpdate failed: )Úversionr%   r   r   rK   r   rM   rN   rL   rT   ÚinputÚstripÚlowerÚKeyboardInterruptÚEOFErrorr   Ú	Exception)r0   r1   r2   rO   Úchoicer5   s         r6   Ú
cmd_updater]   }   s�  € à‡|‡|Üˆf×"Ñ"Ô#Øä Ó'€JÜ˜Ó+€DØ�|Ø�z�zÜÐ(Ô)Øà‡z‡zÜ�	˜$Ÿ,™,˜Ð(Ô)Ü�˜Ÿ™˜Ð&Ô'Ø×)×)ˆqÐ0¨qÐ0ä	Ð˜tŸ|™|˜nÐ
-Ô.à× × ÜÐ& t§|¡| n°AÐ6Ô7Øä	Ð §¡˜~¨U°4·;±;°-Ð
@ÔAà�8�8ð	ÜÐ9Ó:×@Ñ@ÓB×HÑHÓJˆFØ˜\Ó)ÜÐ)Ô*Øð *ô 
Ð
&Ô'ðÜ�FÔ!ÜÐ" 4§;¡; -Ð0Ô1Øøô "¤8Ð,ó 	ÜÐ'Ô(Ùð	ûô ó Ü� ˜uÐ%Ô&Üûðús*   Ä.8F Å4#F9 ÆF6Æ5F6Æ9
GÇGÇGc                óž  • [        U 5      nU R                  (       a	  U(       a  SOSn[        SU R                  =(       d    S 35        [        SU R                   35        [        SU R                   35        [        SU R
                   35        [        SU R                   35        [        S	U(       a  S
OS 35        [        SU 35        g)NÚ
registeredÚpending_installzserver_id:  z<unregistered>zversion:    zchannel:    zapi_url:    zapi_mock:   ztoken:      ÚpresentÚmissingzstate:      r   )r   r"   r%   r   Úrelease_channelÚapi_urlÚapi_mock)r0   r1   r$   Ústates       r6   Ú
cmd_statusrg   «   s´   € Ü˜VÓ$€EØ#×-×-¶%‰LÐ>O€EÜ	ˆL˜×)Ñ)×=Ð-=Ð>Ð
?Ô@Ü	ˆL˜×-Ñ-Ð.Ð
/Ô0Ü	ˆL˜×/Ñ/Ð0Ð
1Ô2Ü	ˆL˜Ÿ™Ð(Ð
)Ô*Ü	ˆL˜Ÿ™Ð)Ð
*Ô+Ü	ˆL¦e™°Ð;Ð
<Ô=Ü	ˆL˜˜Ð
 Ô!Ør:   c                ó"   • [        [        5        g)Nr   )r%   r   )r0   r1   s     r6   Úcmd_versionri   ¸   s   € Ü	Œ-ÔØr:   c                óX  • [        U 5        [        U 5      n[        R                  SU R                  U R
                  5        [        U 5      nU R                  (       d  U R                  (       a  U(       d   [        R                  SU R                  5         [        R                  " XSS9   [        R                  " XSS9   SS	KJn   [!        X5         U" X5        ["        R$                  " U R
                  5        M6  ! [         a   n[        R                  SU5         SnANySnAff = f! [         a   n[        R                  SU5         SnAN�SnAff = f! [         a   n[        R                  S
U5         SnAN¡SnAff = f! [&         a    [        R                  S5         gf = f)a  Service mode: one initial discovery, then a resilient heartbeat loop.

The service must never exit just because registration has not happened yet.
If credentials are missing/pending it keeps running and retries on each
interval instead of crash-looping (systemd Restart=always).
z)agent starting (version=%s, interval=%ss)z‰agent not registered yet (pending=%s); running in degraded mode and retrying. Re-run 'register --token <TOKEN>' to complete registration.Tr?   zinitial quick scan failed: %sNzinitial discovery failed: %sr   )Úprocess_commandszcommand processor failed: %szagent stopping (interrupt))r   r   r-   rO   r   Úheartbeat_intervalr   Úregistration_pendingr"   Úwarningr'   rF   r[   rE   Úcommand_runnerrk   r
   ÚtimeÚsleeprY   )r0   r1   r2   r$   r5   rk   s         r6   Úcmd_runrr   ½   s`  € ô �ÔÜ Ó'€JÜ‡H�HÐ8¸&×:NÑ:NØ×&Ñ&ô(ô ˜VÓ$€EØ×"×"¨6×+;×+;ÆÜ�‰ðTà×'Ñ'ô	
ð:Ü×Ò˜F°tÒ<ð9Ü×Ò˜6°dÒ;ðÝ3ØÜ�fÔ)ðAÙ  Ô4ô �JŠJ�v×0Ñ0Ô1ñ øô ó :Ü�‰Ð3°S×9Ñ9ûð:ûô ó 9Ü�‰Ð2°C×8Ñ8ûð9ûô ó AÜ—‘Ð:¸C×@Ñ@ûðAûô ó Ü�‰Ð-Ô.Ùðúsl   ÂD  Â-D- ÃF ÃE Ã"F Ä 
D*Ä
D%Ä%D*Ä-
EÄ7EÅEÅ
FÅ$E?Å:F Å?FÆF ÆF)Æ(F)c                 ó^  • [         R                  " SSS9n U R                  SSSS9  U R                  SS	S
9nUR	                  SSS9  UR	                  SSS9nUR                  SSS9  UR	                  SSS9  UR	                  SSS9nUR                  SSSS9  UR                  SSSS9  UR                  SSSS9  UR	                  SSS9  UR	                  SSS9nUR                  S SS!S9  UR                  S"SS#S9  UR                  S$SS%S9  UR	                  S&S'S9  UR	                  S(S)S9  U $ )*Nzwolfpanel-agentzWolfPanel Agent)ÚprogÚdescriptionz	--verboseÚ
store_truezdebug-level logging)ÚactionÚhelpÚcommandT)ÚdestÚrequiredrF   z!run as a service (heartbeat loop))rx   r,   zregister with the Central APIz--tokenz/install token (omit to see pairing placeholder)Ú	heartbeatzsend a single heartbeatÚdiscoverzrun read-only discoveryz--quickzquick baseline snapshotz--fullzfull inventory (default)z--no-uploadzdo not upload snapshotúupdate-checkz%check the release channel for updatesÚupdatezself-update the agentz--yeszskip confirmationz--checkz
check onlyz	--versionzprint current versionr#   zprint local agent statusrU   zprint the agent version)ÚargparseÚArgumentParserÚadd_argumentÚadd_subparsersÚ
add_parser)ÚparserÚsubÚ
p_registerÚ
p_discoverÚp_updates        r6   Úbuild_parserrŠ   ì   sk  € Ü×$Ò$Ð*;ÐIZÑ[€FØ
×Ñ˜¨LÐ?TÐÑUØ
×
Ñ
 Y¸Ð
Ð
>€Cà‡N�N�5ÐB€NÑCà—‘ 
Ð1P�ÐQ€JØ×Ñ˜IÐ,]ÐÑ^à‡N�N�;Ð%>€NÑ?à—‘ 
Ð1J�ÐK€JØ×Ñ˜I¨lÐAZÐÑ[Ø×Ñ˜H¨\Ð@ZÐÑ[Ø×Ñ˜M°,ÐE]ÐÑ^à‡N�N�>Ð(O€NÑPà�~‰~˜hÐ-Dˆ~ÐE€HØ×Ñ˜'¨,Ð=PÐÑQØ×Ñ˜)¨L¸|ÐÑLØ×Ñ˜+¨lÐAXÐÑYà‡N�N�8Ð"<€NÑ=Ø‡N�N�9Ð#<€NÑ=Ø€Mr:   )rF   r,   r|   r}   r~   r   r#   rU   c                ó   • [        5       R                  U 5      n[        5       n[        UR                  UR
                  (       a  [        R                  O[        R                  S9  [        UR                     " X!5      $ )N)Úlevel)rŠ   Ú
parse_argsr   r   Ú	agent_logÚverboseÚloggingÚDEBUGÚINFOÚ	_HANDLERSry   )Úargvr1   r0   s      r6   Úmainr•     sO   € Ü‹>×$Ñ$ TÓ*€DÜ‹]€FÜ�&×"Ñ"¸4¿<¿<¬'¯-ª-ÌWÏ\É\ÒZÜ�T—\‘\Ò" 6Ó0Ð0r:   )ÚreturnÚint)r–   zargparse.ArgumentParser)N)r”   zlist[str] | Noner–   r—   )+Ú__doc__Ú
__future__r   r€   rC   r�   rp   r2   r   r   r0   r   r   rA   r   rE   r	   r'   r|   r
   Úidentityr   r   r   Úloggerr   r   r   r   rK   r   r-   r7   r9   rI   rP   r]   rg   ri   rr   rŠ   r“   r•   © r:   r6   Ú<module>r�      sœ   ðñ
õ #ã Û Û Û ç /ß -Ý ,Ý .Ý ÷ñ ÷
 -ß 5á�Ó€ô
6ôr5ô
	ô
ô+ô\
ôô
*ô^ð< ØØØØ$ØØØñ	€	÷1r:   