
    7ji                        d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZ  ed      Ze G d	 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y)a^  Update check foundation.

v1 only DETECTS and REPORTS whether a newer version is available on the
configured channel. It does NOT download, swap, or restart anything. The
production update pipeline is sketched below as no-op stubs with TODOs so the
structure is ready: download -> verify checksum -> stage -> atomic swap ->
health check -> rollback.
    )annotations)	dataclass)Any)	ApiClientApiError)Config)
get_loggerupdatec                  H    e Zd ZU ded<   ded<   ded<   dZded<   dZded	<   y)

UpdateInfostrcurrentlatestboolupdate_availableNz
str | Noneurlsha256)__name__
__module____qualname____annotations__r   r        @/var/www/downloads.wolfpanel.net/public_html/agent/src/update.pyr   r      s&    LKCFJr   r   c                    | j                  dd      d   }g }|j                  d      D ]  }	 |j                  t        |              t	        |      S # t        $ r |j                  d       Y Gw xY w)z;Turn '0.1.1' / '0.1.0-dev' into a comparable numeric tuple.-   r   .)splitappendint
ValueErrortuple)versioncorepartstokens       r   
_normalizer(      sp    ==a #DEC 	LLU$
 <  	LLO	s   AA10A1c           	     
   	 |j                  | j                        }|j                  dd      }t        |      t        | j                        kD  }t        | j                  |||j                  d      |j                  d            }|r-t        j                  d|j                  |j                         |S t        j                  d	|j                         |S # t        $ r }t        j	                  d|       Y d}~yd}~ww xY w)
zCFetch the channel manifest and compare against the running version.zupdate check failed: %sNr$    r   r   )r   r   r   r   r   zupdate available: %s -> %szagent is up to date (%s))fetch_manifestmanifest_urlr   logwarninggetr(   agent_versionr   infor   r   )config
api_clientmanifestexcr   	availabler1   s          r   checkr7   +   s    #-#<#<V=P=P#Q
 \\)R(F6"Z0D0D%EEI$$"LL||H%D -t||T[[I K 	+T\\:K#  -s3s   C 	D"C==Dc                    t        d      )Nz2TODO(prod): download release package to a temp dirNotImplementedErrorr1   s    r   	_downloadr<   G   s    
R
SSr   c                    t        d      )Nz3TODO(prod): verify SHA-256 (+ signature) before user9   r;   s    r   _verify_checksumr>   K       
S
TTr   c                    t        d      )Nz6TODO(prod): extract into /opt/wolfpanel/versions/<ver>r9   r;   s    r   _stagerA   O       
V
WWr   c                    t        d      )Nz3TODO(prod): flip 'current' symlink, restart servicer9   r;   s    r   _atomic_swaprD   S   r?   r   c                     t        d      )Nz1TODO(prod): verify heartbeat + version after swapr9   r   r   r   _health_checkrF   W   s    
Q
RRr   c                     t        d      )Nz6TODO(prod): flip symlink back to previous good versionr9   r   r   r   	_rollbackrH   [   rB   r   N)r$   r   returnztuple[int, ...])r2   r   r3   r   rI   zUpdateInfo | None)r1   r   rI   None)rI   r   )rI   rJ   )__doc__
__future__r   dataclassesr   typingr   r3   r   r   r2   r   loggerr	   r-   r   r(   r7   r<   r>   rA   rD   rF   rH   r   r   r   <module>rP      so    # !  *     	8TUXUSXr   