a ����r´£h*_��ã�������������������@���sŠ���d�dl�m��mZ�d�dlmZ�d�dlZd�dlmZ�d�dl Z d�dl Zd�dlZd�dl Zd�dlZd�dlZG�dd„�dejƒZG�dd„�dejƒZdS�)é����N)Úlint_fmri_successorc�����������������������s’���e�Zd�ZdZdZ‡�fdd„Zdd„�Zddd „Zd d„�Zdd „�Z dd„�Z dd„�Zddd„Ze dƒe_d dd„Ze dƒe_d!dd„Ze dƒe_‡��ZS�)"ÚUserlandActionCheckerz3An opensolaris.org-specific class to check actions.zuserland.actionc��������������������sº���t�dƒ|�_t d¡}|d�kr(| ¡�|�_nd�|�_g�d¢|�_g�d¢|�_t d¡t d¡t d¡g|�_ t d¡t d ¡t d ¡t d¡t d¡g|�_t d ¡|�_i�|�_ i�|�_tt|�ƒ |¡�d�S�)Nz2checks Userland packages for common content errorsZ PROTO_PATH)Zi86Zsparcv7Z32zi86pc-solaris-64intzsun4-solaris-64int)Úamd64Zsparcv9Ú64zi86pc-solaris-thread-multi-64zsun4-solaris-thread-multi-64z^/lib(/.*)?$z^/usr/z ^\$ORIGIN/z ^.*/64(/.*)?$z^.*/amd64(/.*)?$z^.*/sparcv9(/.*)?$z(^.*/i86pc-solaris-thread-multi-64(/.*)?$z'^.*/sun4-solaris-thread-multi-64(/.*)?$z^etc/(rc.|init)\.d)Ú_ÚdescriptionÚosÚgetenvÚsplitÚ proto_pathÚ pathlist32Ú pathlist64ÚreÚcompileÚ runpath_reÚ runpath_64_reÚ initscript_reÚ lint_pathsÚ ref_pathsÚsuperr���Ú__init__)ÚselfÚconfigÚpath©Ú __class__©�úD/jenkins/jobs/oi-userland/workspace/tools/python/pkglint/userland.pyr���-���s.����ÿ ýûzUserlandActionChecker.__init__c��������������������sD��ddd„}i�}|j�|j|j|jdD�]}| |j ¡�g�¡ |j¡�q$|jD�]}| |j ¡�g�¡ |j¡�qJ|j tdƒ¡�|j�|j|jdD�]6‰�t ‡�fdd „| ˆ�j ¡�g�¡D�ƒƒsŒ|ˆ�d |�jƒ�qŒ|j tdƒ¡�|j�|j|j|jdD�]‰�|ˆ�d |�jƒ�qê|j tdƒ¡�|jD�]‰�|ˆ�d |�jƒ�q|�j|�j|�j|jd �dS�)zèInitialize the checker with a dictionary of paths, so that we can do link resolution. This is copied from the core pkglint code, but should eventually be made common. NFc����������� ������S���sž���|� �¡�}|r"dd„�|� |¡D�ƒ}ndd„�|� ¡�D�ƒ}|D�]`}|rL|j|krLq8||jvrXq8| ¡�}| |¡�|j |¡�|j|�} | | g�¡ |�j |f¡�q8dS�)zâUpdates a dictionary of { attr: [(fmri, action), ..]} where attr is the value of that attribute from actions of a given type atype, in the given manifest.c�����������������s���s���|�] }|V��qd�S�©Nr���©Ú.0Úar���r���r���Ú <genexpr>k���ó����zCUserlandActionChecker.startup.<locals>.seed_dict.<locals>.<genexpr>c�����������������s���s���|�] }|V��qd�S�r���r���r���r���r���r���r"���m���r#���N)Úget_all_variantsÚgen_actions_by_typeÚgen_actionsÚnameÚattrsÚget_variant_templateÚ merge_unknownÚupdateÚ setdefaultÚappendÚfmri) ÚmfÚattrÚdicÚatypeÚverboseÚpkg_varsZmfgÚactionÚvariantsÚpr���r���r���Ú seed_dictb���s���� z0UserlandActionChecker.startup.<locals>.seed_dict)ÚreleaseÚpatternz+Seeding reference action path dictionaries.)r9���c�����������������3���s���|�]}t�|ˆ�jƒV��qd�S�r���)r���r.���)r ���r.���©Úmanifestr���r���r"������s���ÿz0UserlandActionChecker.startup.<locals>.<genexpr>r���z&Seeding lint action path dictionaries.z'Seeding local action path dictionaries.©Úignore_pubs)NF)Ú gen_manifestsÚ lint_api_instr9���r:���r,���r.���Úget_namer-���Úlint_manifestsÚloggerÚdebugr���Úref_api_instÚanyÚgetr���r���Ú"_UserlandActionChecker__merge_dictr>���)r���Úenginer8���Ú lint_fmrisÚmr���r;���r���ÚstartupZ���sB���� ÿ ÿÿ ýÿÿ ÿ ÿzUserlandActionChecker.startupTc�����������������C���sÀ���|D�]¶}||vr||�||<�qdd„�}|||�ƒ}|||�ƒ}|D�]:}| �¡�D�],} | ¡�} | ¡�}t|| |drN| | ¡�qNqB| |¡�g�}|D�] } || �D�]}| | |f¡�qœq|||<�qdS�)aP��Merges the given src dictionary into the target dictionary, giving us the target content as it would appear, were the packages in src to get published to the repositories that made up target. We need to only merge packages at the same or successive version from the src dictionary into the target dictionary. If the src dictionary contains a package with no version information, it is assumed to be more recent than the same package with no version in the target.c�����������������S���s8���i�}|�D�]*\}}||v�r(||� �|¡�q|g||<�q|S�)z*Builds a dictionary of fmri:action entries)r-���)Úarrr1���Úpfmrir5���r���r���r���Ú build_dic·���s����z5UserlandActionChecker.__merge_dict.<locals>.build_dicr=���N)ÚcopyrA���r���Úpopr+���r-���)r���ÚsrcÚtargetr>���r7���rO���Úsrc_dicÚtarg_dicÚ src_pfmriÚ targ_pfmriÚsnameÚtnameÚlrN���r5���r���r���r���Z__merge_dict¦���s,���� þ z"UserlandActionChecker.__merge_dictc�����������������C���sP���t�j |¡}| t�j¡D�]2}|dkr2t�j |¡}q|dkr<qt�j ||¡}q|S�)z-Combine path and target to get the real path.z..Ú.)r���r���Údirnamer ���ÚsepÚjoin)r���r���rS���ÚresultÚfragr���r���r���Z __realpathÕ���s����z UserlandActionChecker.__realpathc����������� ������C���s°���d�}t� |¡}| d¡}|dkr$|S�tjd|�dtjtjd}| ¡�\}}|jdkrx|jt dƒ|�d|�j d f�d �|S�t d|¡d�urŒ|S�|j t dƒ|�d |�j d f�d �|S�)NÚtypeÚexez'/usr/bin/elfedit -r -e 'dyn:sunw_aslr' T)ÚshellÚstdoutÚstderrr���z'%s' is not tagged for aslrz%s%s.5Ú001©ÚmsgidZENABLEz'%s' does not have aslr enabledz%s%s.6)ÚelfÚget_inforG���Ú subprocessÚPopenÚPIPEÚcommunicateÚ returncodeÚerrorr���r'���r���ÚsearchÚwarning) r���r���rI���r_���Úeira���Zaslr_tag_processZaslr_tag_stringÚerrr���r���r���Z__elf_aslr_checkä���s4���� ÿý þ þz&UserlandActionChecker.__elf_aslr_checkc�����������������C���sL��d�}g�}t� |¡}t� |¡}| d¡}| dd¡ d¡D�]î}|d�ks8|dkrNq8d} |�jD�]} | |¡rXd} �qpqX|dv�r‚| |¡�| dkr”| |¡�|dkrØ|�jD�]2} | |¡r¢|j td ƒ||f�d |�jdf�d�q¢q8d} |�jD�]} | |¡râd} �qúqâ| dkr8|j td ƒ||f�d |�jdf�d�q8t |ƒdkrHtdd |¡�ƒ}|S�)NÚbitsZrunpathÚ�ú:FT)z/libz/lib/64z /lib/amd64z/lib/sparcv9z/usr/libz/usr/lib/64z/usr/lib/amd64z/usr/lib/sparcv9é ���z364-bit runpath in 32-bit binary, '%s' includes '%s'ú%s%s.3rf���rg���z332-bit runpath in 64-bit binary, '%s' includes '%s'r���z bad RUNPATH, '%%s' includes '%s')ri���Úget_dynamicrj���rG���r ���r���Úmatchr-���r���rq���rr���r���r'���Úlenr^���)r���r���rI���r_���ÚlistZedrs���ru���Údirr{���Úexprr���r���r���Z__elf_runpath_check��sN���� þ þÿz)UserlandActionChecker.__elf_runpath_checkc����������� ������C���s¾���d�}t� |¡}| d¡}| d¡}tj |¡ d¡}d}|�jD�]}||v�r>d}q>d} |�jD�]}||v�rZd} qZ|dkr|dkr| dkr|dkr|S�|dkr¦|r¦t d ƒ}n|dkrº|sºt d ƒ}|S�)Nru���ra���ú/FTrb���é@���rx���z!32-bit object '%s' in 64-bit pathz!64-bit object '%s' in 32-bit path) ri���rj���rG���r���r���r\���r ���r ���r���r���) r���r���r_���rs���ru���ra���ZelemsZpath64r7���Zpath32r���r���r���Z__elf_wrong_location_check7��s(���� z0UserlandActionChecker.__elf_wrong_location_checkrf���c����������� ������C���sâ��|j�dvrdS�|j}|dks$|dkr.|jd�}d|jv�r†|jd�}t|dƒd@�dkr„d |jvr„|jtd ƒ||dœ�d|�j�|f�d �n€d |jv�rd|jv�rà|jd�}t|dƒd@�dkrÞ|jtdƒ||dœ�d|�j�|f�d �n&|jtdƒ||dœ�d|�j�|f�d �|�jdurÞ|�jD�]&}|d�|�}tj |¡r�q@qtj |¡sp|j tdƒ|�d|�j�|f�d �nnt |¡rÞ|� |¡} | dkr¬|j| |�d|�j�|f�d �|� ||¡} | dkrÞ|j| |�d|�j�|f�d �dS�)z'Checks for existence in the proto area.)ÚfileNÚNOHASHr���Úmodeé���é’���r���ÚpreservezA%(path)s is writable (%(mode)s), but missing a preserve attribute)r���r„���ú%s%s.0rg���z>%(path)s has a preserve action, but is not writable (%(mode)s)z%s%s.4z+%(path)s has a preserve action, but no modery���r€���z3%s missing from proto area, skipping content checksú%s%s.1ú%s%s.2)r'���Úhashr(���Úintrp���r���r���r���r���ÚexistsÚinfori���Ú is_elf_objectÚ0_UserlandActionChecker__elf_wrong_location_checkÚ)_UserlandActionChecker__elf_runpath_check) r���r5���r<���rI���Ú pkglint_idr���r„���Ú directoryÚfullpathr_���r���r���r���Úfile_actionT��sb���� ÿý þþ ÿý ÿ ÿz!UserlandActionChecker.file_actionz%Paths should exist in the proto area.Ú002c����������� ������C���s���|j�dvrdS�|jd�}|jd�}|� ||¡}|�j |d¡r@dS�|d7�}|�jD�]}| |¡rN�dS�qN|jtdƒ|j�||f�d|�j�|f�d�dS�) zChecks for link resolution.)ÚlinkÚhardlinkNr���rS���r€���z"%s %s has unresolvable target '%s'rˆ���rg���)r'���r(���Ú _UserlandActionChecker__realpathr���rG���Ú startswithrp���r���) r���r5���r<���rI���r’���r���rS���Z realtargetÚkeyr���r���r���Ú link_resolves��s ���� ÿþz#UserlandActionChecker.link_resolveszlinks should resolve.Ú003c�����������������C���sH���|j�dvrdS�|jd�}|�j |¡rD|jtdƒ|�d|�j�|f�d�dS�)z Checks for SVR4 startup scripts.)r‚���r~���r—���r˜���Nr���z.SVR4 startup '%s', deliver SMF service insteadrˆ���rg���)r'���r(���r���r{���rr���r���)r���r5���r<���rI���r’���r���r���r���r���Úinit_script²��s���� ÿýz!UserlandActionChecker.init_scriptz-SVR4 startup scripts should not be delivered.)T)rf���)r–���)r���)Ú__name__Ú __module__Ú__qualname__Ú__doc__r'���r���rL���rH���r™���Z&_UserlandActionChecker__elf_aslr_checkr‘���r���r•���r���Úpkglint_descrœ���rž���Ú __classcell__r���r���r���r���r���(���s"���-L /!2 9 ! ÿr���c�����������������������s`���e�Zd�ZdZdZ‡�fdd„Zddd„Zedƒe_dd d„Z edƒe _ddd„Z edƒe _‡��ZS�)ÚUserlandManifestCheckerz5An opensolaris.org-specific class to check manifests.zuserland.manifestc��������������������s���t�t|�ƒ |¡�d�S�r���)r���r¥���r���)r���r���r���r���r���r���Ç��s����z UserlandManifestChecker.__init__Ú1001c����������� ��� ���C���s$��t�j d¡s | d¡D�]}| d¡D�]ô}tj |¡j}tj j jjtj j jj ttj j jjgƒB��}tj j ¡�}tj j dtj j j|dd„�d�d�¡} | |gd|¡} | tj j jj�r(| d|�j�¡ d ¡d dg�}| tj j jj�D�]:}|j|vrà|jtdƒ|j||jd œ�d|�j|f�d�qàq(qd�S�)NZ ENCUMBEREDÚdependr.���r€���c�����������������S���s���dS�)NFr���)Úxr���r���r���Ú<lambda>Ó��r#���z=UserlandManifestChecker.forbidden_publisher.<locals>.<lambda>Tú%s.allowed_pubsú zopenindiana.orgz on-nightlyzWpackage %(pkg)s depends on %(name)s, which comes from forbidden publisher %(publisher)s)Úpkgr'���Ú publisherr‰���rg���)r���ÚenvironrG���r%���Úattrlistr¬���r.���ÚPkgFmriÚpkg_nameÚclientÚapiÚPackageInfoÚALL_OPTIONSÚACTION_OPTIONSÚ frozensetÚLICENSESÚprogressÚNullProgressTrackerÚImageInterfaceÚCURRENT_API_VERSIONrŽ���Ú INFO_FOUNDÚ get_paramr'���r ���r���rp���r���) r���r<���rI���r’���r5���Úfr±���Úinfo_neededZprogtrackerZ interfaceÚretÚallowed_pubsÚir���r���r���Úforbidden_publisherÊ��s*���� ÿÿ" ÿÿz+UserlandManifestChecker.forbidden_publisherz1Dependencies should come from standard publishersrf���c�����������������C���s˜���g�}d}d}| �d¡D�]}d}�q$q|dkr0d�S�| �d¡D�]4}|jd�sf|jtdƒd|�j|f�d�q:d}�qpq:|dkr”|jtdƒd|�j|f�d�d�S�) NFr‚���TÚlicensezNmissing vaue for action license attribute 'license' like 'CDDL','MIT','GPL'...rˆ���rg���zmissing license action)r%���r(���rp���r���r'���)r���r<���rI���r’���Zmanifest_pathsÚfilesrÅ���r5���r���r���r���Úcomponent_checkß��s&���� ÿ ÿz'UserlandManifestChecker.component_checkzFlicense actions and ARC information are required if you deliver files.r–���c�����������������C���sR���| �d|�j�¡ d¡}|j}|jrN|j|vrN|jtdƒ|j�d|�j|f�d�d�S�)Nrª���r«���zpackage %s has a publisher set!rŠ���rg���)r¾���r'���r ���r.���r���rp���r���)r���r<���rI���r’���rÂ���r.���r���r���r���Úpublisher_in_fmriþ��s����ÿÿ ÿþz)UserlandManifestChecker.publisher_in_fmrizextra publisher set)r¦���)rf���)r–���)rŸ���r ���r¡���r¢���r'���r���rÄ���r���r£���rÇ���rÈ���r¤���r���r���r���r���r¥���Â��s��� ÿ ÿ ÿr¥���)Ú pkg.lint.baseÚlintÚbaseÚpkg.lint.enginer���Úpkg.fmrir¬���Úpkg.elfri���r���Zos.pathr���rk���Úpkg.client.apiÚpkg.client.api_errorsÚpkg.client.progressÚ ActionCheckerr���ÚManifestCheckerr¥���r���r���r���r���Ú<module>���s������