
    ]SjC"                    t   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ZddlZddl	Z	ddl
Z
ddlmZ ddlmZ  ej                    Zedz  Zedz  dz  Zed	z  Zed
z  dz  Zedz  dz  ZdZdZedz  dz  Zh dZddddd4dZd5d$Zd6d&Zd7d)Zd8d*Zd9d,Zd:d.Zd;d1Z d<d2Z!e"d3k    r e# e!                      dS )=a'  Weekly encrypted backup for JARVIS/Hermes health system.

Creates a local backup bundle containing:
- health SQLite DB (consistent sqlite .backup copy)
- SQLite schema dump and integrity report
- health scripts (no PDFs/raw documents)
- Hermes official quick backup (config, .env, auth, cron, state)
- Hermes skills and user scripts

Then encrypts the tarball with GPG symmetric AES256 and uploads only the
encrypted `.tar.gz.gpg` plus a small non-sensitive manifest to Google Drive.

This script is quiet unless it creates/uploads a backup or fails.
    )annotationsN)datetime)Pathz.hermesassets
Gesundheithealth_data.dbbackupsweekly_health_drivebackup_keysz health_weekly_gpg_passphrase.txtz!1dlFpkKYXOCKaausFfVVnBK-qk3hFHA8Tzfriday.uplink@gmail.comsecretszgog_keyring.env>   .git.mypy_cache.pytest_cache__pycache__,  )envtimeoutcwdcmd	list[str]r   dict[str, str] | Noner   intr   Path | Nonereturnsubprocess.CompletedProcessc          	     Z    t          j        | |rt          |          nd |dd|d          S )NT)r   r   textcapture_outputr   check)
subprocessrunstr)r   r   r   r   s       9/home/agent/.hermes/scripts/weekly_health_drive_backup.pyr!   r!   +   sC    >#s#<3s888#Daeov  C  D  D  D  D    srcr   dstNonec                h    d	d}|                                  rt          j        | ||           d S d S )
Ndirpathr"   namesr   r   set[str]c                    t                      }|D ]\}|t          v r|                    |           |                                                    d          r|                    |           ]|S )N)z.pdfz.pngz.jpgz.jpegz.webpz.zip.gpg)setEXCLUDESaddlowerendswith)r)   r*   ignoredns       r#   ignorez!copytree_filtered.<locals>.ignore0   sf    %% 	 	AH}}Awwyy!!"\]] Ar$   )r5   )r)   r"   r*   r   r   r+   )existsshutilcopytree)r%   r&   r5   s      r#   copytree_filteredr9   /   sO        zz|| 1S0000001 1r$   r"   c                   t          j        |           }	 |                    d                                          d         }|dk    rt	          d|           t          j        |          }	 |                    |           |                                 n# |                                 w xY w||                                 S # |                                 w xY w)NzPRAGMA integrity_checkr   okzSQLite integrity_check failed: )sqlite3connectexecutefetchoneRuntimeErrorbackupclose)r%   r&   src_con	integritydst_cons        r#   sqlite_backuprF   =   s    oc""GOO$<==FFHHK	LLLMMM/#&&	NN7###MMOOOOGMMOOOOs$   AC	 0B C	 B00C	 	Cdboutc                   t          j        |           }	 |                    d                    |                                          dz   d           |                                 d S # |                                 w xY w)N
utf-8encoding)r<   r=   
write_textjoiniterdumprB   )rG   rH   cons      r#   schema_dumprR   M   sj     /"

Ctyy0047'JJJ				s   ?A+ +Bc                    t           j                            dd                                          } | r| S t                                          st          dt                     t                                          j        dz  rt          dt                     t          	                    d          
                                D ]}|                                }|r|                    d          r.|                    d	          r|d
d                                          }|                    d          \  }}}|ro|                                dk    rW|                                                    d                              d          }|r|c S t          dt                     t          dt                     )NGOG_KEYRING_PASSWORD z-Missing gog keyring secret environment file: ?   z/Unsafe permissions on gog keyring secret file: rK   rL   #zexport    ="'zGOG_KEYRING_PASSWORD empty in z GOG_KEYRING_PASSWORD missing in )osenvirongetstripGOG_SECRET_ENVis_filer@   statst_mode	read_text
splitlines
startswith	partition)valueraw_linelinekeysep	raw_valuesecrets          r#   load_gog_keyring_passwordro   W   s   JNN1266<<>>E !!## ][>[[\\\$u, _]^]]^^^",,g,>>IIKK R R~~ 	ts++ 	??9%% 	$8>>##D"nnS11S) 	R399;;"888__&&,,S1177<<F PPPQQQ
J.JJ
K
KKr$   tuple[Path, dict]c                    t          j                                        d          } t                              dd           t          t          j        d|  dt          t                                        }|dz  }|                                 t          j                    	                                t          j                    j        dg g d	d
}|dz  dz  }|j                            dd           t          t          |          }t!          t          |dz  dz             ||d<   t                                          j        |d<   |d                             ddg           t)          t*          dz  |dz  dz             dD ]Y}t*          |z  }|                                r9|dz  |z  }|j                            dd           t/          j        ||           Z|d                             d           |dz  }	t5          ddddddt          |	          gd           |d                             d           t)          t6          dz  |dz  dz             t)          t6          dz  |dz  dz             |d                             d d!g           |d"z  }
t8          d#z  d$z  d%z  t6          d&z  t8          d'z  fD ]}|                                r|
|                    t8                    z  }|j                            dd           t/          j        ||           |d                             d(|                    t8                                |d)z                      t?          j         |d*d+,          d-.           t          d/|  d0z  }tC          j"        |d1          5 }|#                    |d23           d d d            n# 1 swxY w Y   t/          j$        |           ||fS )4Nz%Y%m%d_%H%M%ST)parentsexist_okhealth_backup__)prefixdirbundleweekly_health_drive_encrypted)PDFsimageszraw documentszunencrypted external upload)
created_athostbackup_typecontentsexcludeshealthr   z
schema.sqlsqlite_integrity_checkhealth_db_bytesr   zhealth/health_data.dbzhealth/schema.sqlscripts)z'reports/health_intelligence_workflow.mdz#reports/arztbericht_drive_link.jsonzhealth/scriptszhermes_quick_backup.ziphermesrA   z--quickz--labelzweekly-health--outputr   r   skillszhermes/skillszhermes/scriptsexternal_credentialsz.configgogclizcredentials.jsonzgoogle_credentials.jsonz.todoist_tokenzexternal_credentials/zbackup_manifest.jsonF   ensure_asciiindentrK   rL   health_hermes_backup_z.tar.gzzw:gz.)arcname)%r   nowstrftimeBACKUP_ROOTmkdirr   tempfilemkdtempr"   	isoformatr\   unamenodenameparentrF   DBrR   rb   st_sizeextendr9   HEALTHr6   r7   copy2appendr!   HERMESHOMErelative_torN   jsondumpstarfileopenr0   rmtree)tsworkstagemanifestdb_outrD   relr%   r&   
hermes_zipexternaltar_pathtars                r#   create_bundler   n   sL   		 	 	1	1BdT222 (>(>(>(>CDTDTUUUVVD8OE	KKMMM lnn..00

#6VVV H X 00F
Mt444b&))IEH$|3444)2H%&"$''))"3HZ!8:M NOOO fy(%(*:Y*FGGGa # #sl::<< 	#("S(CJTD999Lc"""Z 0111 22J8Y	?JPST^P_P_`jmnnnnZ 9::: fx')9H)DEEEfy(%(*:Y*FGGGZ2B CDDD --Hy8#&88** 	Y 	Y
 ::<< 	YS__T222CJTD999Lc"""Z ''(WPT@U@U(W(WXXX
##//
8RW`a0b0b0bmt/uuu@R@@@@H	h	'	' $3s###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $
M$Xs   7OO"Or   c                   t                                           st          dt                      |                     | j        dz             }t          ddddddt          t                     d	d
ddt          |          t          |           gd           |                    d           |                     d           |S )NzMissing GPG passphrase file: r-   gpgz--batchz--yesz--pinentry-modeloopbackz--passphrase-filez--symmetricz--cipher-algoAES256r   X  r     T)
missing_ok)	KEYFILEr6   r@   with_suffixsuffixr!   r"   chmodunlink)r   rH   s     r#   encryptr      s    >> FD7DDEEE


x7
8
8Cy'#4jS\\=/8CHHc(mm	 	   
 IIeOOtO$$$Jr$   pathdictc                    t           j                                        }t                      |d<   t	          ddt
          ddt          |           dt          dg	|d	          }t          j	        |j
                  S )
NrT   gogz-adriveuploadz--parentz--jsonr   )r   r   )r\   r]   copyro   r!   ACCOUNTr"   DRIVE_FOLDER_IDr   loadsstdout)r   r   ress      r#   r   r      so    
*//

C";"="=C
udGWhD		:`hior|  A  A  AC:cj!!!r$   c                    	 t                      \  } }t          |           }t          |          }|                    |j        dz             }t          |          |d<   |                                j        |d<   ||d<   |                    t          j
        |dd          d	           |                    d
           |                    di                               d          p|                    d          pd}t          d|j         d|            dS # t          $ r)}t          d| t           j                   Y d }~dS d }~ww xY w)Nz.manifest.jsonencrypted_fileencrypted_bytesdrive_uploadFr   r   rK   rL   r   filewebViewLinkrU   uS   Wöchentliches Gesundheits-/Hermes-Backup erstellt und verschlüsselt hochgeladen: z
Drive: r   u   Wöchentliches Backup FEHLER: )r      )r   r   r   r   r   r"   rb   r   rN   r   r   r   r^   printname	Exceptionsysstderr)r   r   	encryptedupload_resultmanifest_pathlinkes          r#   mainr      s   *__(H%%	y))!--i.>AQ.QRR%(^^!"&/nn&6&6&>"##0   H5QR!S!S!S^e fffE"""  ,,00??i=CTCTUbCcCcigi  Ddmdr  D  D  ~B  D  D  	E  	E  	Eq   2q22DDDDqqqqqs   DD 
E(EE__main__)
r   r   r   r   r   r   r   r   r   r   )r%   r   r&   r   r   r'   )r%   r   r&   r   r   r"   )rG   r   rH   r   r   r'   )r   r"   )r   rp   )r   r   r   r   )r   r   r   r   )r   r   )$__doc__
__future__r   r   r\   r7   r<   r    r   r   r   r   pathlibr   homer   r   r   r   r   r   r   r   r`   r/   r!   r9   rF   rR   ro   r   r   r   r   __name__
SystemExit r$   r#   <module>r      s    # " " " " "  				       



              ty{{				(	\	)y #88
=
 #E
E5
#)#&77  
 9=Sei D D D D D D1 1 1 1       L L L L.@ @ @ @F   " " " "   ( z
*TTVV

 r$   