
    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)zExchange 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    JJM
 	./If00145ST+,XY'J$$,,.G '--#**335;;{+Dw{{8/Dkk"23Mw{{97M$++557'..AACG&&w/ ,,}-K[)II1		ABfc)nk: 
/	{(8<<PXCYBZ
[\!  		+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41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    zz$))"**,djj!S9:'J!!&=OPH	$**Xk*1c
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|zz()zz	$,,()&'))q0q0	t||n
-.  &t||nA67	~U4;;-
@A88	9:@@BHHJF\))* * 

&'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>OE	L))=-=>
?@	L--.
/0	L//0
12	L(
)*	L)
*+	Le;
<=	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NSnAff = f! [         a   n[        R                  S
U5         SnANS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)zagent 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HH8&:N:N&&( V$E""6+;+;T''	
:Ft<96d;3f)A 4 JJv001   :3S99:  92C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NN5BNC
1PQJI,]^NN;%>N?
1JKJIlAZ[H\@Z[M,E]^NN>(ONP~~h-D~EH',=PQ)L|L+lAXYNN8"<N=NN9#<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:   