HEX
Server: Apache
System: Linux eisbus 6.8.12-9-pve #1 SMP PREEMPT_DYNAMIC PMX 6.8.12-9 (2025-03-16T19:18Z) x86_64
User: www-data (33)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: //proc/863910/root/usr/lib/tklbam/hub.pyc
�
+��dc@s�dZddlZddlZddlZddlmZddlZddlmZddl	m
Z
defd��YZdeejfd	��YZ
d
efd��YZdefd
��YZdefd��YZde
fd��YZde
fd��YZddd��YZddd��YZdd d��YZddlmZejjd�s�ejjejjejd��r�ddlmZndS(!s�TurnKey Hub API - Backup

Notes:
    - Default URL: https://hub.turnkeylinux.org/api/backup/
    - REST compliant (GET, POST, PUT)
    - Responses are returned in application/json format
    - API subkey must be sent in the header for all calls (except subkey/)

subkey/
    method: GET
    fields: apikey
    return: subkey

credentials/
    method: GET
    fields:
    return: accesskey, secretkey, usertoken, producttoken

record/create/
    method: POST
    fields: key, turnkey_version, [server_id]
    return: backuprecord

record/update/
    method: PUT
    fields: address
    return: <response_code>

record/<backup_id>/
    method: GET
    fields:
    return: backuprecord

record/<backup_id>/
    method: PUT
    fields: key
    return: backuprecord

records/
    method: GET
    fields:
    return: [ backuprecord, ... ]

archive/
    method: GET
    fields: turnkey_version
    return: archive_content

archive/timestamp/
    method: GET
    fields: turnkey_version
    return: archive_timestamp

Exceptions::

    400 Request.MissingHeader
    400 Request.MissingArgument
    401 HubAccount.Forbidden
    400 HubAccount.InvalidApiKey
    400 BackupAccount.InvalidSubKey
    401 BackupAccount.MalformedSubKey
    404 BackupAccount.NotFound
    401 BackupAccount.NotSubscribed
    404 BackupRecord.NotFound
    401 BackupRecord.LimitExceeded
    400 BackupRecord.ServerIDNotFound
    404 BackupArchive.NotFound
i����N(tdatetime(tAPI(tAttrDicttErrorcBseZd�Zd�ZRS(cGs tj|||�||_dS(N(t	Exceptiont__init__tdescription(tselfRtargs((s/usr/lib/tklbam/hub.pyR\scCs|jS(N(R(R((s/usr/lib/tklbam/hub.pyt__str__`s(t__name__t
__module__RR	(((s/usr/lib/tklbam/hub.pyR[s	tAPIErrorcBseZd�ZRS(cCstjj||||�dS(N(t_APIRR(RtcodetnameR((s/usr/lib/tklbam/hub.pyRds(R
RR(((s/usr/lib/tklbam/hub.pyRcst
NotSubscribedcBseZdZed�ZRS(s|Backups are not yet enabled for your TurnKey Hub account. Log
into the Hub and go to the "Backups" section for instructions.cCstj||�dS(N(RR(Rtdesc((s/usr/lib/tklbam/hub.pyRls(R
RtDESCR(((s/usr/lib/tklbam/hub.pyRgstInvalidBackupErrorcBseZRS((R
R(((s/usr/lib/tklbam/hub.pyRosRcBseZiid�ZRS(cCs�ytj|||||�SWnm|jk
r�}|jdkrSt|j��n|jdkrnt��nt|j|j|j��nXdS(NsBackupRecord.NotFoundsBackupAccount.NotSubscribedsBackupAccount.NotFound(sBackupAccount.NotSubscribedsBackupAccount.NotFound(	R
trequestRRRRRRR(Rtmethodturltattrstheaderste((s/usr/lib/tklbam/hub.pyRss	(R
RR(((s/usr/lib/tklbam/hub.pyRrstBackupRecordcBs eZed��Zd�ZRS(cCs|s
dStj|d�S(Ns%Y-%m-%d %H:%M:%S(tNoneRtstrptime(ts((s/usr/lib/tklbam/hub.pyt_parse_datetime�scCs�|d|_|d|_|d|_|d|_|d|_|j|d�|_|j|d�|_t|d�|_	|d	|_
g|_tj
|�dS(
Ntkeytaddresst	backup_idt	server_idtturnkey_versiontdate_createdtdate_updatedtsizeR(RR R!R"t
profile_idRtcreatedtupdatedtintR&tlabeltsessionsRR(Rtresponse((s/usr/lib/tklbam/hub.pyR�s





	(R
RtstaticmethodRR(((s/usr/lib/tklbam/hub.pyR�stBaseCredentialscBseZd�ZRS(cCs|jjj�|_dS(N(t	__class__R
tlowerttype(R((s/usr/lib/tklbam/hub.pyR�s(R
RR(((s/usr/lib/tklbam/hub.pyR/�stCredentialscBsYeZdefd��YZdefd��YZdefd��YZed��ZRS(tIAMRolecBseZd�ZRS(cCs5||_||_||_||_tj|�dS(N(t	accesskeyt	secretkeytsessiontokent
expirationR/R(RR5R6R7R8((s/usr/lib/tklbam/hub.pyR�s
				(R
RR(((s/usr/lib/tklbam/hub.pyR4�stIAMUsercBseZd�ZRS(cCs,||_||_||_tj|�dS(N(R5R6R7R/R(RR5R6R7((s/usr/lib/tklbam/hub.pyR�s			(R
RR(((s/usr/lib/tklbam/hub.pyR9�stDevPaycBseZd�ZRS(cCs5||_||_||_||_tj|�dS(N(R5R6t	usertokentproducttokenR/R(RR5R6R;R<((s/usr/lib/tklbam/hub.pyR�s
				(R
RR(((s/usr/lib/tklbam/hub.pyR:�scCs�td�|jj�D��}|jd�}|j�}y|d=Wntk
rXnX|sl|j|�S||kr�td|��n|||�S(NcssB|]8}t|t�rt|t�r|jj�|fVqdS(N(t
isinstanceR2t
issubclassR/R
R1(t.0tsubcls((s/usr/lib/tklbam/hub.pys	<genexpr>�sR2sunknown credentials type "%s"(tdictt__dict__tvaluestgettcopytKeyErrorR:R(tclstdtcreds_typest
creds_typetkwargs((s/usr/lib/tklbam/hub.pyt	from_dict�s	

(R
RR/R4R9R:tclassmethodRL(((s/usr/lib/tklbam/hub.pyR3�s		tBackupscBs�eZejdd�ZeZdefd��YZdd�Zid�Z	e
d��Zd�Zd�Z
dd	�Zd
�Zd�Zd�Zd
�Zd�ZRS(t
TKLBAM_APIURLs(https://hub.turnkeylinux.org/api/backup/tNotInitializedcBseZRS((R
R(((s/usr/lib/tklbam/hub.pyRP�scCs7|dkr|jd��n||_t�|_dS(Ns(no APIKEY - tklbam not linked to the Hub(RRPtsubkeyRtapi(RRQ((s/usr/lib/tklbam/hub.pyR�s	cCs6it|j�d6}|jj||j|||�S(NRQ(tstrRQRRRtAPI_URL(RRturiRR((s/usr/lib/tklbam/hub.pyt_api�scCs.t�jd|jdi|d6�}|dS(NtGETssubkey/tapikeyRQ(RRRT(RGRXR-((s/usr/lib/tklbam/hub.pytget_sub_apikey�s&cCs|jdd�}tj|�S(NRWscredentials/(RVR3RL(RR-((s/usr/lib/tklbam/hub.pytget_credentials�sc
Cs�i|d6}|jdd|�}t|d�}|rH||krHd
S|jdd|�}tjt|d��}tjdd�\}}tj	|d	�}	|	j
|�|	j�t|||�S(s
        Gets a profile for <profile_id> that is newer than <profile_timestamp>.

        If there's a new profile, returns a ProfileArchive instance.
        Otherwise returns None.

        Raises an exception if no profile exists for profile_id.
        R#RWsarchive/timestamp/tarchive_timestampsarchive/tarchive_contenttprefixsarchive.twN(
RVR*Rtbase64turlsafe_b64decodeRSttempfiletmkstemptostfdopentwritetclosetProfileArchive(
RR'tprofile_timestampRR-R[tcontenttfdtarchive_pathtfh((s/usr/lib/tklbam/hub.pytget_new_profile�s



cCsFi|d6|d6}|r'||d<n|jdd|�}t|�S(NRR#R"tPOSTsrecord/create/(RVR(RRR'R"RR-((s/usr/lib/tklbam/hub.pytnew_backup_record	s

cCs |jdd|�}t|�S(NRWs
record/%s/(RVR(RR!R-((s/usr/lib/tklbam/hub.pytget_backup_recordscCs$|jdd|i|d6�}|S(NtPUTsrecord/%s/inprogress/tbool(RV(RR!RrR-((s/usr/lib/tklbam/hub.pytset_backup_inprogressscCs*|jdd|i|d6�}t|�S(NRqs
record/%s/R(RVR(RR!RR-((s/usr/lib/tklbam/hub.pyt
update_keys cCs |jddi|d6�}|S(NRqsrecord/update/R (RV(RR R-((s/usr/lib/tklbam/hub.pytupdated_backupscCs"|jdd�}td�|�S(NRWsrecords/cSs
t|�S(N(R(tr((s/usr/lib/tklbam/hub.pyt<lambda>%t(RVtmap(RR-((s/usr/lib/tklbam/hub.pytlist_backups#sN(R
RRctgetenvRTRRPRRRVRMRYRZRmRoRpRsRtRuRz(((s/usr/lib/tklbam/hub.pyRN�s						RgcBs#eZd�Zd�Zd�ZRS(cCs||_||_||_dS(N(tpath_archivet	timestampR'(RR'tarchiveR}((s/usr/lib/tklbam/hub.pyR(s		cCstjd|j|f�dS(Nstar -zxf %s -C %s(texecutiltsystemR|(Rtpath((s/usr/lib/tklbam/hub.pytextract-scCs,tjj|j�r(tj|j�ndS(N(RcR�texistsR|tremove(R((s/usr/lib/tklbam/hub.pyt__del__0s(R
RRR�R�(((s/usr/lib/tklbam/hub.pyRg's		(tConftTKLBAM_DUMMYHUBtdummyhub(RN((((t__doc__RcR_RaRRtpycurl_wrapperRR
tutilsRRRRRRRR/R3RNRgtconfR�tenvironRDR�R�tjointDEFAULT_PATHR�(((s/usr/lib/tklbam/hub.pyt<module>Os(4T
6