a "e@sddlmZddlmZedvrddlmZddlmZddl m Z ddl m Z dd l mZmZdd lmZdd lZdd lZdd lZGd d d eZd S))absolute_import)System)ZfedoraZrhelZcentoszcentos-7ZmageiaZol)listdir)IPackageManager)Package)PackagesCollection)LockedDatabaseDatabasePermissions)PY3Nc@steZdZdZddZeddZddZdd Zd d Z d d Z ddZ ddZ ddZ ddZddZddZdS)Rpmz! Package manager class - RPM cKs ||_dSN)opts)selfkwargsr>/usr/lib/python3.9/site-packages/tracer/packageManagers/rpm.py__init__*sz Rpm.__init__cCstSr )NotImplemented)rrrr history_path-szRpm.history_pathc Cstj|jstgS|jdr(d}nd}zbt}|}t |}tj |_ | }| ||g|D]}|t|d|dql|WStjy}z$t|dkrtntWYd}~n d}~00dS)zp Returns list of packages which were modified between unix_time and present Requires root permissions. modern_swdbz SELECT DISTINCT rpm.name, trans.dt_end AS end FROM trans JOIN trans_item JOIN rpm ON trans.id=trans_item.trans_id AND trans_item.item_id=rpm.item_id WHERE trans.dt_begin > ? ORDER BY rpm.name aJ SELECT DISTINCT pkgtups.name, trans_end.timestamp AS end FROM trans_beg JOIN trans_end JOIN trans_data_pkgs JOIN pkgtups ON trans_beg.tid=trans_end.tid AND trans_data_pkgs.tid=trans_beg.tid AND trans_data_pkgs.pkgtupid=pkgtups.pkgtupid WHERE trans_beg.timestamp > ? ORDER BY pkgtups.name nameendzdatabase is lockedN)ospathexistsrrrget_database_filesqlite3ZconnectZRowZ row_factorycursorZexecuteZfetchallappendrZOperationalErrorstrr r ) rZ unix_timeZsqlpackagesZsqliteZconnrresulterrrpackages_newer_than0s"     zRpm.packages_newer_thancCsdt}|d|}t|}|s$gStrDt|d}dd|DSt|d}dd|DSdS)z Returns list of files provided by package See also: http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch04s02s03.html rrcSsg|] }|jqSr)r).0xrrr qz%Rpm.package_files..cSsg|] }|dqS)rr)r&frrrr(tr)N)rpmTransactionSetdbMatchlistr filesfi)rpkg_nametsmir"r/rrr package_filesbs zRpm.package_filescCs||}t}|d|}|D]h}|tj|dkr"|tj|dkr"|tj|dkr"|tj|dkr"t|}| |||Sq"dS)Nrrr) _splitEvrar+r,r- RPMTAG_EPOCHRPMTAG_VERSIONRPMTAG_RELEASEZ RPMTAG_ARCHr_load_package_info_from_hdr)rrevrar2r3hdrpackagerrr find_packagevs  H  zRpm.find_packagec Cs|sdSt}|d|j}d}|D]r}|dur8|}q&tt|tjt|tjt|tjft|tjt|tjt|tjf}|dkr&|}q&|durdS| ||dS)zFFrom database load informations about given package and set them to itNr) r+r,r-r labelComparer!r8r9r:r;)rr>r2r3Zlatestr=Zcomparerrrload_package_infos *&zRpm.load_package_infocCs<tt|jt|jt|jft|jt|jt|jfS)zf labelCompare returns: 0 if the EVR matches 1 if EVR(1) > EVR(2) -1 if EVR(2) > EVR(1) )r+rAr!epochversionrelease)rZp1Zp2rrrcompare_packagesszRpm.compare_packagescCsh|jd}||j}|rd|jdkr`|ddD]*}tj|r4||}|rV|ndSq4|SdS)z8Returns name of package which provides given applicationrzDevelopment/LanguagesrN)Z instances_file_provided_byZexecategoryZcmdlinerrisfile)rZappZprocessr>argrrr provided_bys     zRpm.provided_byc Cs|d}||dd}|d|d}||d|}|d|d}||d|}|d}|dkrvd} n |d|} | |||fS)z Derived from rpmUtils.miscutils.splitFilename https://github.com/rpm-software-management/yum/blob/master/rpmUtils/miscutils.py Given: 9-123a.ia64 Return: (9, 123a, 1, ia64) .rN-:r@)rfindfind) rr<Z archIndexZarchZrelIndexrelZverIndexZverZ epochIndexrCrrrr7s   zRpm._splitEvracCsH|tj|_|tj|_|tj}|r,||_|tj|_|tj |_ dSr ) r+ZRPMTAG_SUMMARY description RPMTAG_GROUPrHr8rCr9rDr:rE)rr>r=rCrrrr;s    zRpm._load_package_info_from_hdrcCsJt}|d|}|dkr$dSt|}t|tj}|tj|_|S)z1Returns name of package which provides given fileZ basenamesrN) r+r,r-countnextrZ RPMTAG_NAMErSrH)rfiler2ZdbpkgprrrrGs   zRpm._file_provided_bycCsP|jdr|jStt|jddD]&}|dr$|dr$|j|Sq$dS)z)Returns path to yum history database filerT)reversezhistory-z.sqliteN)rrrsortedr startswithendswith)rrVrrrrs  zRpm._database_fileN)__name__ __module__ __qualname____doc__rpropertyrr%r4r?rBrFrKr7r;rGrrrrrr #s 2   r )Z __future__rZtracer.resources.systemrZ distributionrrZipackageManagerrZtracer.resources.packagerZtracer.resources.collectionsrZtracer.resources.exceptionsr r Ztracer.resources.pycompr rr+r rrrrs