/opt/cloudlinux/venv/lib/python3.11/site-packages/ssa/__pycache__
NameSizeModeActions
agent.cpython-311.pyc38350644editdlrm
clos_ssa_ini.cpython-311.pyc19290644editdlrm
db.cpython-311.pyc186390644editdlrm
manager.cpython-311.pyc384570644editdlrm
website_isolation.cpython-311.pyc241280644editdlrm
__init__.cpython-311.pyc1760644editdlrm
Edit: /opt/cloudlinux/venv/lib/python3.11/site-packages/ssa/__pycache__/db.cpython-311.pyc (18639B)
§ b˜j0ãó‚—ddlZddlZddlZddlZddlmZmZddlmZmZm Z m Z m Z m Z m Z mZmZmZddlmZddlmZddlmZddlmZddlmZd Zed zZd Ze¦«Zejd ¦«Z Gd „de¦«Z!d!d„Z"d„Z#d„Z$d„Z%d„Z&d„Z'd„Z(d„Z)d„Z*d„Z+d"d„Z,d„Z-d„Z.d„Z/ej0defd „¦«Z1dS)#éN)ÚdatetimeÚ timedelta) ÚColumnÚBooleanÚDateTimeÚIndexÚIntegerÚStringÚ create_engineÚeventÚfuncÚtext)Údeclarative_base)Ú Inspector)ÚSession)Úclose_all_sessions)Ú DatabaseErrorz/var/lve/ssa.dbz.oldéÚcleanup_old_datacóä—eZdZdZdZeddd¦«fZeed¬¦«Z ee d¬ ¦«Z ee d¬ ¦«Z eed¬ ¦«Z eed¬ ¦«Zeed¬ ¦«Zeed¬ ¦«Zeed¬ ¦«Zeed¬ ¦«Zeed¬ ¦«Zeed¬ ¦«ej¦«d¬ ¦«Zeed¬ ¦«ej¦«ej¦«¬ ¦«Zd S)Ú RequestResultay Describes processed request stored in database file. E.g. { "timestamp": "1650008727", "url": "http://mydomain.com/index.php", "duration": 162077, "hitting_limits": false, "throttled_time": 0, "io_throttled_time": 0, "wordpress": true } Note: created_at, updated_at is saved in local TZ format Ú scrape_resultÚix_scrape_result_domain_pathÚdomainÚpathT)Ú primary_keyF)Únullable)Útimezone)Úserver_defaultÚindex)ÚonupdaterN)Ú__name__Ú __module__Ú __qualname__Ú__doc__Ú __tablename__rÚ__table_args__rr Úidr rrÚ timestampÚdurationrÚis_slow_requestÚhitting_limitsÚthrottled_timeÚio_throttled_timeÚ wordpressrr ÚnowÚ created_atÚ updated_at©óú=/opt/cloudlinux/venv/lib64/python3.11/site-packages/ssa/db.pyrr sg€€€€€ððð"$€Mð�eÐ:¸HÀfÑMÔMÐO€Nà ˆ� TÐ *Ñ *Ô *€Bà ˆV�F UÐ +Ñ +Ô +€FØ ˆ6�& 5Ð )Ñ )Ô )€Dà��w¨Ð/Ñ/Ô/€Iàˆv�g¨Ð.Ñ.Ô.€HØ�f˜W¨uÐ5Ñ5Ô5€OØ�V˜G¨eÐ4Ñ4Ô4€NØ�V˜G¨eÐ4Ñ4Ô4€Nؘ˜w°Ð7Ñ7Ô7ÐØ��w¨Ð/Ñ/Ô/€Ið�˜˜¨$Ð/Ñ/Ô/ÀÀÄÁ Ä ÐRVÐWÑWÔW€JØ�˜˜¨$Ð/Ñ/Ô/¸(¸$¼(¹*¼*ÐU]ÐUYÔU]ÑU_ÔU_Ð`Ñ`Ô`€J€J€Jr4ré'cóŽ—tj¦«tt¬¦«z }d} t |¦«5}| t d¦«||dœ¦«}|j}||z }|dkr ddd¦«n ddd¦«n #1swxYwYŒnt  d|¦«t|¦«dS)a Removes outdated records from database, saving disk space. Deletions are batched to avoid loading the entire database into the cgroup's page cache, which causes OOM on large databases. Runs VACUUM after deletion to reclaim disk space. )ÚdaysrTzrDELETE FROM scrape_result WHERE rowid IN (SELECT rowid FROM scrape_result WHERE created_at < :cutoff LIMIT :batch))ÚcutoffÚbatchNzCleanup deleted %d old records) rÚtodayrÚRETENTION_TIME_DAYSÚ session_scopeÚexecuterÚrowcountÚloggerÚinfoÚvacuum_database)ÚengineÚ batch_sizeÚ n_days_agoÚ total_deletedÚsessionÚresultÚdeleteds r5rrSs6€õ”Ñ!Ô!¥IÕ3FÐ$GÑ$GÔ$GÑG€JØ€Mð Ý ˜6Ñ "Ô "ð  gØ—_’_Ýð`ñôð&° Ð;Ð;ñ ôˆFð”oˆGØ ˜WÑ $ˆMؘ!Š|ˆ|Øð ð ð ñ ô ð ð ðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð õ ‡K‚KÐ0°-Ñ@Ô@Ð@Ý�FÑÔÐÐÐs¼:BÂBÂBcój—tj tj t¦«¦«}tj|tj¦«r6| d|›d�¦«t  d|¦«dSt  d||¦«dS)u¹ Point SQLite's temp store at the database directory (on disk) for the given operation. SQLite spills large sorts / temp B-trees and VACUUM copies to the system temp directory, which can be tmpfs (RAM-backed). When it is, the spill is charged against the MemoryMax=1G cgroup and OOM-kills the agent on large databases — the same hazard for VACUUM and for index builds / ORDER BY sorts (CLPRO-2819, CLPRO-3077). úPRAGMA temp_store_directory = 'ú'z&Set SQLite temp_store_directory to: %szJDirectory %s not writable. %s will fall back to the default temp location.N) ÚosrÚdirnameÚabspathÚSSA_DBÚaccessÚW_OKr>r@rAÚwarning)ÚcursorÚ operationÚdb_dirs r5Ú_redirect_temp_store_to_diskrWms”€õŒW�_Š_�RœWŸ_š_­VÑ4Ô4Ñ 5Ô 5€FÝ „y��œÑ!Ô!ðxØ�ŠÐB¸ÐBÐBÐBÑCÔCÐCÝ� Š Ð<¸fÑEÔEÐEÐEÐEå�ŠÐcÐekÐmvÑwÔwÐwÐwÐwr4cóH—| ¦«}|j} d|_| ¦«}t|d¦«t d¦«| d¦«t d¦«| ¦«nA#t$r4}t  dt|¦«›�¦«Yd}~nd}~wwxYw||_| ¦«dS#||_| ¦«wxYw)zŽ Run VACUUM command to reclaim disk space after deletions. VACUUM must be run outside of a transaction, so we use raw connection. NÚVACUUMzStarting VACUUM operation...zVACUUM completed successfully.zVACUUM failed: ) Úraw_connectionÚisolation_levelrTrWr@rAr>ÚcloseÚ ExceptionÚerrorÚstr)rCÚraw_connÚoriginal_isolation_levelrTÚes r5rBrB~s!€ð ×$Ò$Ñ&Ô&€HØ'Ô7ÐðØ#'ˆÔ Ø—’Ñ"Ô"ˆå$ V¨XÑ6Ô6Ð6å� Š Ð2Ñ3Ô3Ð3Ø�Š�xÑ Ô Ð Ý� Š Ð4Ñ5Ô5Ð5à� Š ‰ŒˆˆøÝ ð1ð1ð1Ý� Š Ð/¥s¨1¡v¤vÐ/Ð/Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøð$<ˆÔ Ø�ŠÑÔÐÐÐøð$<ˆÔ Ø�ŠÑÔÐÐøøøs0�BB&Â%DÂ& C$Â0*CÃDÃC$Ã$DÄD!có4—| ¦«} | ¦«}t|d¦«t d¦«| d¦«| ¦«t d¦«| ¦«n?#t$r2}t  dt|¦«¦«Yd}~nd}~wwxYw| ¦«dS#| ¦«wxYw)u– Create the composite (domain, path) index on existing databases. The schema is only materialised by ``create_all()`` in ``create_db_if_not_exist()``, which runs solely when the DB file does not yet exist — there are no migrations. So a model-level index reaches new installs only, while the multi-GB databases that actually OOM never get it. This explicit ``CREATE INDEX IF NOT EXISTS`` closes that gap; it is idempotent and a cheap no-op once the index exists (CLPRO-3077). Building the index on a large table sorts it, so we first redirect the temp store to disk to avoid the very tmpfs spill we are trying to fix. z CREATE INDEXz/Ensuring ix_scrape_result_domain_path exists...zVCREATE INDEX IF NOT EXISTS ix_scrape_result_domain_path ON scrape_result(domain, path)z.Index ix_scrape_result_domain_path is present.zFailed to ensure indexes: %sN) rZrTrWr@rAr>Úcommitr\r]r^r_)rCr`rTrbs r5Úensure_indexesre™s€ð×$Ò$Ñ&Ô&€Hð Ø—’Ñ"Ô"ˆÝ$ V¨^Ñ<Ô<Ð<Ý� Š ÐEÑFÔFÐFØ�ŠÐoÑpÔpÐpØ�ŠÑÔÐÝ� Š ÐDÑEÔEÐEØ� Š ‰ŒˆˆøÝ ð=ð=ð=Ý� Š Ð3µS¸±V´VÑ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<øøøøð=øøøð �ŠÑÔÐÐÐøˆ�ŠÑÔÐÐøøøs0–BB,Â+DÂ, C(Â6(C#ÃDÃ#C(Ã(DÄDcóf—t|¦«s!tj |¦«dSdS©N)Ú is_db_presentÚBaseÚmetadataÚ create_all)rCs r5Úcreate_db_if_not_existrl¶s8€Ý ˜Ñ Ô ð)Ý Œ × Ò  Ñ(Ô(Ð(Ð(Ð(ð)ð)r4cóØ—tj t¦«sdSt j|¦«}d„| ¦«D¦«}t|¦«dkS)NFcó—g|]}|‘ŒSr3r3)Ú.0Útables r5ú z!is_db_present..¿s€Ð GÐ GÐ G˜ˆeÐ GÐ GÐ Gr4r)rMrÚisfilerPrÚ from_engineÚget_table_namesÚlen)rCÚdatabase_inspectionÚtabless r5rhrh»s^€Ý Œ7�>Š>�&Ñ !Ô !ð؈uÝ#Ô/°Ñ7Ô7ÐØ GÐ GÐ!4×!DÒ!DÑ!FÔ!FÐ GÑ GÔ G€FÝ ˆv‰;Œ;˜Š?Ðr4có0—| d¦«dS)NzPRAGMA journal_mode = WAL)r>)Ú dbapi_conÚ con_records r5Úsetup_wal_moder{Ãs€Ø ×ÒÐ1Ñ2Ô2Ð2Ð2Ð2r4cóp—tj tj t¦«¦«}tj|tj¦«sdS | d|›d�¦«dS#tj $r'}t  d||¦«Yd}~dSd}~wwxYw)uZ Keep SQLite's temp spills (sort / GROUP BY temp B-trees) on disk rather than the default temp dir, which may be tmpfs (RAM-backed) and thus charged against the MemoryMax=1G cgroup. ``temp_store_directory`` is a process-wide setting, but applying it on every connect is cheap and guarantees it is in force before the daily routine runs (CLPRO-3077). Complements the (domain, path) index: the index removes the per-domain ORDER BY sort entirely, this catches whatever spill remains (e.g. the GROUP BY on the computed hour). Best-effort — never block a connection. NrKrLz,Could not set temp_store_directory to %s: %s) rMrrNrOrPrQrRr>Úsqlite3ÚErrorr@rS)ryrzrVrbs r5Úsetup_temp_store_dirrÇsº€õŒW�_Š_�RœWŸ_š_­VÑ4Ô4Ñ 5Ô 5€FÝ Œ9�V�RœWÑ %Ô %ð؈ðRØ×ÒÐE¸FÐEÐEÐEÑFÔFÐFÐFÐFøÝ Œ=ðRðRðRÝ�ŠÐEÀvÈqÑQÔQÐQÐQÐQÐQÐQÐQÐQøøøøðRøøøsÁ$A?Á?B5ÂB0Â0B5có¨—ttdztdzfD]6}tj |¦«rtj|d¦«Œ7dS)a¸ Restrict ssa.db and its WAL/SHM sidecars to owner-only (0600). The DB holds every tenant's domains and request paths; sqlite3.connect creates the file under the agent's umask (0022 -> world-readable 0644) in the world-searchable /var/lve, leaking data across the shared-hosting trust boundary. chmod 0600 is idempotent, so this is a safe no-op for an already-tightened file; each path is guarded on existence. ú-walú-shmi€N)rPrMrÚexistsÚchmod)rs r5Ú_secure_db_filesr…ÜsU€õ� &™­&°6©/Ð:ð"ð"ˆÝ Œ7�>Š>˜$Ñ Ô ð "Ý ŒH�T˜5Ñ !Ô !Ð !øð"ð"r4cóþ‡—dt›�Š|r‰›d�Šˆfd„}td|d¬¦«}tj|dt¦«tj|dt ¦«t |¦«t¦«|S)Nzfile:z?mode=rocó0•—tj‰d¬¦«S)NT)Úuri)r}Úconnect)Úconnection_strings€r5Úcreatorz _setup_database..creatorðsø€ÝŒÐ0°dÐ;Ñ;Ô;Ð;r4ú sqlite:////F)r‹Úechor‰)rPr r Úlistenr{rrlr…)Úreadonlyr‹rCrŠs @r5Ú_setup_databaser�ësªø€Ø(¥Ð(Ð(ÐØð;Ø0Ð:Ð:Ð:Ðð<ð<ð<ð<ð<õØØØ ðñô€Fõ  „L�˜¥NÑ3Ô3Ð3Ý „L�˜Õ$8Ñ9Ô9Ð9ݘ6Ñ"Ô"Ð"ÝÑÔÐØ €Mr4Fcó —t|¦«Srg)r�)r�s r5Úsetup_databaser’ÿs€Ý ˜8Ñ $Ô $Ð$r4cóò—tj t¦«r-t ¦«tjtt ¦«t¦«}| ¦«tdt ›�¦«} t|¦«5}t|¦«5}|  t¦«  ¦«t||¦«ddd¦«n #1swxYwYddd¦«n #1swxYwYn#t$rYnwxYwt tdztdzfD]5}tj |¦«rtj|¦«Œ6dS)z‡ Restore database by establish connections to old and new databases, merge data to new one if possible and delete old one. rŒNr�r‚)rMrrƒrPrÚreplaceÚ OLD_SSA_DBr’Údisposer r=ÚqueryrÚfirstÚ!merge_unharmed_data_from_databaserÚremove)rCÚ new_engineÚ old_engineÚ session_oldÚ session_newrs r5Úrestore_databaserŸsï€õ  „w‡~‚~•fÑÔð'åÑÔÐÝ Œ •6�:Ñ&Ô&Ð&åÑ!Ô!€Jà ‡N‚NÑÔÐÝÐ9­ZÐ9Ð9Ñ:Ô:€Jð Ý ˜:Ñ &Ô &ð H¨+µ}ÀZÑ7PÔ7Pð HÐT_à × Ò �mÑ ,Ô ,× 2Ò 2Ñ 4Ô 4Ð 4Ý -¨k¸;Ñ GÔ GÐ Gð Hð Hð Hñ Hô Hð Hð Hð Hð Hð Hð Høøøð Hð Hð Hð Hð Hð Hð Hñ Hô Hð Hð Hð Hð Hð Hð Høøøð Hð Hð Hð Høøõ ð ð ð Ø ˆð øøøõ�V f™_­f°v©oÐ>ððˆÝ Œ7�>Š>˜$Ñ Ô ð Ý ŒI�d‰OŒOˆOøððsZ DÂD Â+=C4Ã( D Ã4C8 Ã8D Ã;C8 Ã<D Ã? DÄ DÄDÄDÄDÄ D$Ä#D$có—d}d} | t¦« |¦« |¦«} | ¦«}|sdS|D]}| |¦«Œnv#t $rit|¦«D]V} | ||z¦« ¦«}|sn&| |¦«ŒG#t $rYŒSwxYwYnwxYw|  ¦«||z }�Œ)z_ Scrape all unharmed records from malformed database and merge them into new database. ré TN) r—rÚoffsetÚlimitÚallÚmergerÚranger˜rd) r�ržr¢rDr—Úrecords_to_saveÚrecordÚ pos_in_batchÚrecord_to_saves r5r™r™sN€ð€FØ€JðØ×!Ò!¥-Ñ0Ô0×7Ò7¸Ñ?Ô?×EÒEÀjÑQÔQˆð Ø#Ÿiši™kœkˆOØ"ð Ø�Ø)ð *ð *�Ø×!Ò! &Ñ)Ô)Ð)Ð)ð *øåð ð ð Ý % jÑ 1Ô 1ð ð � ðØ%*§\¢\°&¸<Ñ2GÑ%HÔ%H×%NÒ%NÑ%PÔ%P�NØ)ðØ˜Ø×%Ò% nÑ5Ô5Ð5Ð5øÝ$ðððØ�Dðøøøøøð øøøð ×ÒÑÔÐØ�*шñ%sHÁA:ÁA:Á:C-Â,CÃC-ÃCÃC-à C'Ã$C-Ã&C'Ã'C-Ã,C-cóÊ—tj t¦«r=tj t¦«rtjt¦« t |¦«5}| td¦«¦«}|  ¦«}|dddkcddd¦«S#1swxYwYdS#t$rYdSwxYw)z� Try integrity check of database file to see if it is malformed. If database unable to execute it, will also count as malformed. zPRAGMA integrity_checkrÚokNT) rMrrƒr•rPršr=r>rÚfetchallr)rCÚdbrHÚerrorss r5Úis_malformed_databaser°:s€õ  „w‡~‚~•jÑ!Ô!ð¥b¤g§n¢nµVÑ&<Ô&<ðÝ Œ •*ÑÔÐðÝ ˜6Ñ "Ô "ð ( bØ—Z’Z¥Ð%=Ñ >Ô >Ñ?Ô?ˆFØ—_’_Ñ&Ô&ˆFؘ!”9˜Q”< 4Ò'ð (ð (ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (øõ ððð؈tˆtðøøøs7Á#CÁ2ACÂ: CÃC à CÃC ÃCà C"Ã!C"Úreturnc#óîK—t|¬¦«} |V—| ¦«n#| ¦«‚xYw | ¦«dS#| ¦«wxYw)zF Provide a transactional scope around a series of operations. )ÚbindN)rrdÚrollbackr\)rCrGs r5r=r=Js�èè€õ ˜6Ð"Ñ"Ô"€GðØˆ ˆ ˆ Ø�ŠÑÔÐÐøðØ×ÒÑÔÐØ øøøð ð � Š ‰Œˆˆˆøˆ� Š ‰Œˆˆøøøs”-¬A­AÁAÁA4)r6)F)2rMÚ contextlibr}ÚloggingrrÚ sqlalchemyrrrrr r r r r rÚsqlalchemy.ext.declarativerÚsqlalchemy.engine.reflectionrÚsqlalchemy.ormrÚsqlalchemy.orm.sessionrÚsqlalchemy.excrrPr•r<riÚ getLoggerr@rrrWrBrerlrhr{rr…r�r’rŸr™r°Úcontextmanagerr=r3r4r5úr¿sgðð € € € ØÐÐÐØ€€€Ø€€€à(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjÐjØ7Ð7Ð7Ð7Ð7Ð7Ø2Ð2Ð2Ð2Ð2Ð2Ø"Ð"Ð"Ð"Ð"Ð"Ø5Ð5Ð5Ð5Ð5Ð5Ø(Ð(Ð(Ð(Ð(Ð(à €Ø �f‰_€ ØÐàÐÑÔ€à ˆÔ Ð-Ñ .Ô .€ð0að0að0að0að0a�Dñ0aô0að0aðfðððð4xðxðxð"ððð6ððð:)ð)ð)ð ððð3ð3ð3ðRðRðRð* "ð "ð "ðððð(%ð%ð%ð%ðððð8ððð6 ð ð ð  Ôð ˜Wð ð ð ñÔð ð ð r4