Ë
    À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ˆÓØ€FˆJÔ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“ò ˆð	Ø�L‰Lœ˜U›Õ$ðô
 �‹<Ðøô ò 	Ø�L‰L˜Ž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°×0DÑ0DÓ%EÑE€IÜØ×$Ñ$ØØ"Ø�L‰L˜ÓØ�|‰|˜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   