Ë
    À7jÒ  ã                  ó  — d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	 ddl
mZmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZmZ ddlmZ  ed«      Zdd„Zdd„Z dd„Z!dd„Z"dd„Z#dd„Z$dd„Z%dd„Z&e%ee e!e"e#e$dœZ'ddd„Z(y)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Úclic                óš  — |j                   }|s-t        d«       t        d«       t        d«       t        d«       yt        | «       t        | «      }t        j
                  j                  «       }|| j                  t        j
                  j                  «       |j                  d«      xs |j                  d«      |j                  d«      xs |j                  d	«      t        j
                  j                  «       t        j
                  j                  «       d
œ}	 |j                  |«      }|j                  d«      }|j                  d«      }	|r|	€t        j                  d«       yt!        | t#        |	«      |«       t        d|	› d|j                  d«      › �«       y# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)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:
  https://app.wolfpanel.net/connect
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Úprintr   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
             ú=/var/www/downloads.wolfpanel.net/public_html/agent/src/cli.pyÚcmd_registerr4   &   s„  € ð —J‘J€MÙô 	Ð.Ô/ÜÐ<Ô=ÜÐ+Ô,ÜÐ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   ÄF! Æ!	G
Æ*GÇG
c                ó8   — t        | «      }t        | |«      rdS dS )Nr   r   )r   r
   )r-   r.   r/   s      r3   Úcmd_heartbeatr6   Z   s    € Ü Ó'€JÜ˜& *Ô-ˆ1Ð4°1Ð4ó    c                óT  — |j                   rF|j                  s:t        j                  «       }t	        t        j                  |dt        ¬«      «       yt        | «      }t        j                  | ||j                   ¬«      }t	        t        j                  |d   dt        ¬«      «       y)Né   )ÚindentÚdefaultr   ©ÚuploadÚ	discovery)r	   r   r$   Úcollectr#   ÚjsonÚdumpsr,   r   Úfull_discoveryÚrunÚ	no_upload)r-   r.   Úsnapshotr/   s       r3   Úcmd_discoverrF   _   sw   € Ø‡z‚z˜$Ÿ)š)Ü"×*Ñ*Ó,ˆÜŒd�j‰j˜¨!´SÔ9Ô:Øä Ó'€JÜ×!Ñ! &¨*ÀÇÁÐ=OÔP€HÜ	Œ$�*‰*�X˜kÑ*°1¼cÔ
BÔCØr7   c                óâ   — t        | «      }t        | |«      }|€t        d«       y|j                  r&t        d|j                  › d|j
                  › �«       yt        d|j                  › �«       y)NzUpdate check failed (see logs).r   zUpdate available: z -> zUp to date: r   )r   Úupdate_checkr#   Úupdate_availableÚcurrentÚlatest)r-   r.   r/   Úinfos       r3   Úcmd_update_checkrM   k   sm   € Ü Ó'€JÜ˜ 
Ó+€DØ€|ÜÐ/Ô0ØØ×ÒÜÐ" 4§<¡< .°°T·[±[°MÐBÔCð ô 	�˜TŸ\™\˜NÐ+Ô,Ør7   c                óv  — t        | «      }| j                  r|rdnd}t        d| j                  xs d› �«       t        d| j                  › �«       t        d| j                  › �«       t        d| j
                  › �«       t        d| j                  › �«       t        d	|rd
nd› �«       t        d|› �«       y)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)r-   r.   r"   Ústates       r3   Ú
cmd_statusrW   x   s´   € Ü˜VÓ$€EØ#×-Ò-±%‰LÐ>O€EÜ	ˆL˜×)Ñ)Ò=Ð-=Ð>Ð
?Ô@Ü	ˆL˜×-Ñ-Ð.Ð
/Ô0Ü	ˆL˜×/Ñ/Ð0Ð
1Ô2Ü	ˆL˜Ÿ™Ð(Ð
)Ô*Ü	ˆL˜Ÿ™Ð)Ð
*Ô+Ü	ˆL¡e™°Ð;Ð
<Ô=Ü	ˆL˜˜Ð
 Ô!Ør7   c                ó"   — t        t        «       y)Nr   )r#   r   )r-   r.   s     r3   Úcmd_versionrY   …   s   € Ü	Œ-ÔØr7   c                ó<  — t        | «       t        | «      }t        j                  d| j                  | j
                  «       	 t        j                  | |d¬«       	 t        j                  | |d¬«       	 	 t        | |«       t        j                  | j
                  «       Œ,# t        $ r }t        j                  d|«       Y d}~Œkd}~ww xY w# t        $ r }t        j                  d|«       Y d}~Œ~d}~ww xY w# t        $ r t        j                  d«       Y yw xY w)	zEService mode: one initial discovery, then a resilient heartbeat loop.z)agent starting (version=%s, interval=%ss)Tr<   zinitial quick scan failed: %sNzinitial discovery failed: %szagent stopping (interrupt)r   )r   r   r*   rL   r   Úheartbeat_intervalr$   rC   Ú	ExceptionÚwarningrB   r
   ÚtimeÚsleepÚKeyboardInterrupt)r-   r.   r/   r2   s       r3   Úcmd_runra   Š   sò   € ä�ÔÜ Ó'€JÜ‡H�HÐ8¸&×:NÑ:NØ×&Ñ&ô(ð
:Ü×Ñ˜F J°tÕ<ð9Ü×Ñ˜6 :°dÕ;ðØÜ�f˜jÔ)Ü�J‰J�v×0Ñ0Ô1ð øô ò :Ü�‰Ð3°S×9Ñ9ûð:ûô ò 9Ü�‰Ð2°C×8Ñ8ûð9ûô ò Ü�‰Ð-Ô.ÙðúsB   ÁB" ÁC Á5-C: Â"	CÂ+CÃCÃ	C7ÃC2Ã2C7Ã:DÄDc                 ó*  — t        j                  dd¬«      } | j                  ddd¬«       | j                  dd	¬
«      }|j	                  dd¬«       |j	                  dd¬«      }|j                  dd¬«       |j	                  dd¬«       |j	                  dd¬«      }|j                  ddd¬«       |j                  ddd¬«       |j                  ddd¬«       |j	                  dd¬«       |j	                  dd¬«       |j	                  d d!¬«       | S )"Nzwolfpanel-agentzWolfPanel Agent)ÚprogÚdescriptionz	--verboseÚ
store_truezdebug-level logging)ÚactionÚhelpÚcommandT)ÚdestÚrequiredrC   z!run as a service (heartbeat loop))rg   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 updatesr!   zprint local agent statusÚversionzprint the agent version)ÚargparseÚArgumentParserÚadd_argumentÚadd_subparsersÚ
add_parser)ÚparserÚsubÚ
p_registerÚ
p_discovers       r3   Úbuild_parserrx   §   s  € Ü×$Ñ$Ð*;Ð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Ø‡N�N�8Ð"<€NÔ=Ø‡N�N�9Ð#<€NÔ=Ø€Mr7   )rC   r)   rk   rl   rm   r!   rn   c                óü   — t        «       j                  | «      }t        «       }t        |j                  |j
                  rt        j                  nt        j                  ¬«       t        |j                     ||«      S )N)Úlevel)rx   Ú
parse_argsr   r   Ú	agent_logÚverboseÚloggingÚDEBUGÚINFOÚ	_HANDLERSrh   )Úargvr.   r-   s      r3   Úmainrƒ   É   sQ   € Ü‹>×$Ñ$ TÓ*€DÜ‹]€FÜ�&×"Ñ"¸4¿<º<¬'¯-ª-ÌWÏ\É\ÕZÜ�T—\‘\Ñ" 6¨4Ó0Ð0r7   )ÚreturnÚint)r„   zargparse.ArgumentParser)N)r‚   zlist[str] | Noner„   r…   ))Ú__doc__Ú
__future__r   ro   r@   r~   r^   r/   r   r   r-   r   r   r>   r   rB   r	   r$   rk   r
   Úidentityr   r   r   Úloggerr   r   Úupdater   rH   r*   r4   r6   rF   rM   rW   rY   ra   rx   r�   rƒ   © r7   r3   ú<module>rŒ      s’   ðñ
õ #ã Û Û Û ç /ß -Ý ,Ý .Ý ÷ñ ÷
 -Ý (á�Ó€ó
1óh5ó
	ó
ó
óó
ó:ð0 ØØØØ$ØØñ€	õ1r7   