FTc@sddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl ZddljZddljZddljjZddljjZddljjZddljZddljZddl j!j"Z"ddl#j!j$Z$ddl%j&Z&ddl'j(Z(ddl)j*Z*ddl+Z,ddl-j.Z.ddl/j0Z0ddl1j2Z2ddl3Z,ddl4j5Z6ddl7j8Z9ddl:j;jZ<ddl=j;j8Z>ddl?j;j@ZAddlBjCZDddlEZ,dZFdZGdZHdZIdZJdZKdZLdZMd ZNd ZOd ZPdZQdZRdd lSmTZTd eUfdYZVdeVfdYZWdeVfdYZXdeVfdYZYdeVfdYZZdeVfdYZ[deVfdYZ\deVfdYZ]deVfdYZ^deVfd YZ_d!eVfd"YZ`d#eVfd$YZad%eVfd&YZbd'eVfd(YZcd)eVfd*YZdd+eVfd,YZed-eVfd.YZfd/eVfd0YZgd1eVfd2YZhd3eVfd4YZid5eVfd6YZjd7eVfd8YZkd9elfd:YZmd;elfd<YZnd=elfd>YZoe2jpeqd?ZrdS(@iNispkg5-quarantineiiiiiiiic(t PkgGzipFiletRepositoryErrorcBs)eZdZdZdZdZRS(s3Base exception class for all Repository exceptions.cGs*tj|||r&|d|_ndS(Ni(t Exceptiont__init__tdata(tselftargs((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRWscCs t|S(N(tstr(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __unicode__\scCs t|jS(N(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__str__bs(t__name__t __module__t__doc__RRR (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTs  tRepositoryExistsErrorcBseZdZdZRS(s]Used to indicate that a repository already exists at the specified location. cCstd|jS(NsJA package repository (or a directory with content) already exists at '%s'.(t_R(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR ks (R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR fstRepositoryFileNotFoundErrorcBseZdZdZRS(s[Used to indicate that the hash name provided for the requested file does not exist.cCstd|jS(Ns9No file could be found for the specified hash name: '%s'.(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR ts (R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRpstRepositoryInvalidErrorcBseZdZdZRS(s^Used to indicate that a valid repository could not be found at the specified location.cCs$|jstdStd|jS(Ns?The specified path does not contain a valid package repository.s:The path '%s' does not contain a valid package repository.(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR }s   (R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRystRepositoryInvalidFMRIErrorcBseZdZRS(s3Used to indicate that the FMRI provided is invalid.(R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRstRepositoryUnqualifiedFMRIErrorcBseZdZdZRS(s_Used to indicate that the FMRI provided is valid, but is missing publisher information.cCstd|jS(NspThis operation requires that a default publisher has been set or that a publisher be specified in the FMRI '%s'.(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s (R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRst#RepositoryInvalidTransactionIDErrorcBseZdZdZRS(s=Used to indicate that an invalid Transaction ID was supplied.cCstd|jS(Ns,No transaction matching '%s' could be found.(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s (R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRstRepositoryLockedErrorcBs&eZdZdddZdZRS(suUsed to indicate that the repository is currently locked by another thread or process and cannot be modified.cCs#tj|||_||_dS(N(RRthostnametpid(RRR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRs  cCs;|jdk r1tdi|jd6|jd6StdS(NshThe repository cannot be modified as it is currently in use by another process: pid %(pid)s on %(host)s.RthostsOThe repository cannot be modified as it is currently in use by another process.(RtNoneRR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s  N(R R R RRR (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRstRepositoryManifestNotFoundErrorcBseZdZdZRS(s@Used to indicate that the requested manifest could not be found.cCstd|jS(Ns.No manifest could be found for the FMRI: '%s'.(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s (R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRstRepositoryMirrorErrorcBseZdZdZRS(sqUsed to indicate that the requested operation could not be performed as the repository is in mirror mode.cCs tdS(NsWThe requested operation cannot be performed when the repository is used in mirror mode.(R(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s(R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRstRepositoryNoPublisherErrorcBseZdZdZRS(sUsed to indicate that the requested repository operation could not be completed as not default publisher has been set and one was not specified. cCs tdS(Ns^The requested operation could not be completed as a default publisher has not been configured.(R(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s(R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRstRepositoryNoSuchFileErrorcBseZdZdZRS(s7Used to indicate that the file provided does not exist.cCstd|jS(NsNo such file '%s'.(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s(R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRstRepositoryReadOnlyErrorcBseZdZdZRS(svUsed to indicate that the requested operation could not be performed as the repository is currently read-only.cCs tdS(Ns3The repository is read-only and cannot be modified.(R(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s(R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRstRepositorySearchTokenErrorcBseZdZdZRS(sXUsed to indicate that the token(s) provided to search were undefined or invalid.cCs1|jdkr td|jStd|jS(Ns No token was provided to search.s+The specified search token '%s' is invalid.(RRR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s (R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRst RepositorySearchUnavailableErrorcBseZdZdZRS(s8Used to indicate that search is not currently available.cCs tdS(Ns0Search functionality is temporarily unavailable.(R(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s(R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRstRepositoryDuplicatePublishercBseZdZdZRS(ssRaised when the publisher specified for an operation already exists, and so cannot be added again. cCstd|jS(NsPublisher '%s' already exists.(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s(R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR stRepositoryUnknownPublishercBseZdZdZRS(scRaised when the publisher specified for an operation is unknown to the repository. cCs$|jstdStd|jS(NsZNo publisher was specified or no default publisher has been configured for the repository.s*No publisher matching '%s' could be found.(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s   (R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR!stRepositoryVersionErrorcBs eZdZdZdZRS(snRaised when the repository specified uses a format greater than the current format (version). cCs,tj|||_||_||_dS(N(RRtlocationtversiontcurrent_version(RR#R$R%((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRs   cCs d|jS(NsqThe repository at '%(location)s' is version '%(version)s'; only versions up to %(current_version)s are supported.(t__dict__(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s(R R R RR (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR"s tRepositoryInvalidVersionErrorcBs eZdZdZdZRS(s\Raised when the repository specified uses an unsupported format. (version). cCs,tj|||_||_||_dS(N(RRR#R$t supported(RR#R$R(((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRs   cCs d|jS(NsqThe repository at '%(location)s' is version '%(version)s'; only version %(supported)s repositories are supported.(R&(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s(R R R RR (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR's t#RepositoryUnsupportedOperationErrorcBseZdZdZRS(stRaised when the repository is unable to support an operation, based upon its current configuration. cCsdS(Ns/Operation not supported for this configuration.((R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR +s(R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR)&st$RepositoryQuarantinedPathExistsErrorcBseZdZdZRS(sRaised when the repository is unable to quarantine a file because a file of that name is already in quarantine. cCs tdS(Ns Quarantined path already exists.(R(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR 4s(R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR*/st"RepositorySigNoTrustAnchorDirErrorcBseZdZdZRS(svRaised when the repository trust anchor directory could not be found while performing repository verification.cCstd|jS(Ns(Unable to find trust anchor directory %s(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR <s(R R R R (((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR+8st _RepoStorec BsbeZdZedJdJdJedJedJejdJd ZdZdZ dJdZ dJdZ dZ dZ edZed Zd Zd Zd Zd ZdZeedZdejdZdZeedJedZdZedZedZdJdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(ed Z)dJd!Z*d"Z+d#Z,e-d$Z.d%Z/d&Z0d'Z1ed(Z2d)Z3d*Z4d+Z5e-d,Z6e-d-Z7d.Z8d/Z9d0Z:d1Z;dJd2Z<eed3Z=d4Z>d5Z?e-d6Z@d7ZAd8ZBd9ZCd:ZDeEjFd;ZGd<ZHd=ZId>ZJd?ZKdJdJdJdJed@ZLdJdJdJdJdJedAZMdBZNdCZOe-dDZPe-dEZQe-dFZRe-dGeZSe-dHZTe-dIZURS(KsThe _RepoStore object provides an interface for performing operations on a set of package data contained within a repository. This class is intended only for use by the Repository class. c Cszd |_d |_||_d |_i|_||_d |_| |_d |_ d |_ d |_ d|_ d |_ d |_||_||_||_|r|j|n|j||j| t|_t|_tjj|_|j r;tjtjj |j ddtj!dtj"dt#dt|_$n d |_$|j%dt&z|j'd|Wd |j(Xd S( sPrepare the repository for use.itlockt set_lockstrt get_lockstrt failure_exct provide_mutextblockingt allow_invalidN()Rt_RepoStore__catalogt_RepoStore__catalog_roott_RepoStore__file_layoutt_RepoStore__file_roott_RepoStore__in_flight_transt_RepoStore__read_onlyt_RepoStore__roott_RepoStore__sort_file_max_sizet_RepoStore__tmp_roott_RepoStore__writable_roott cache_storetcatalog_versiont manifest_roott trans_roottlog_objtmirrort publishert_RepoStore__set_file_roott_RepoStore__set_roott_RepoStore__set_writable_roottFalset_RepoStore__search_availablet_RepoStore__refresh_againtpkgtnrlocktNRLockt_RepoStore__locktlockfiletLockFiletostpathtjointgeneric_lock_set_strtgeneric_lock_get_strRt_RepoStore__lockfilet_RepoStore__lock_rstoretTruet_RepoStore__init_statet_RepoStore__unlock_rstore( RR3t file_layoutt file_rootRBRCtpubt read_onlytroottsort_file_max_sizet writable_root((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyREsH                         cCs|j}||_|jr*||j_n|jrB||j_n|r|j r|jdtz|jWd|jXndS(NR2( R9R4R^R>treadonlyRWRXRYRZ(Rtvaluetold_ro((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__set_read_onlys    cCs|js dS|jr"|j}n |j}tjjtjj|d}tj|ytj d|SWndt k r}|j t j krt j|jn|j t jkrt j|jnnXdS(sXCreate a temp directory under repository directory for various purposes.Nttmptdir(R_RaRQRRtnormpathRStmisctmakedirsttempfiletmkdtemptEnvironmentErrorterrnotEACCEStapxtPermissionsExceptiontfilenametEROFStReadOnlyFileSystemException(RR_ttempdirte((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __mkdtemps"    ! cCs>|s|j|dt}n|j}|j|d|dS(sKPrivate version; caller responsible for repository locking.tsigtmanifestN(t _get_manifestRXtcatalogt add_package(RtpfmriRytc((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __add_packages cCsK|s|j|dt}n|j}|j||j|d|dS(sKPrivate version; caller responsible for repository locking.RxRyN(RzRXR{tremove_packageR|(RR}RyR~((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__replace_packages   cCs|js dStj|j|j|jd|jd|j}t}y|j}Wnt j k rinX|r|j s|jd|j nt |_ n,|j r|jd|j nt|_ dS(NtlogR`sSearch AvailablesSearch Unavailable(t index_roottindexertIndexerRzRyt_RepoStore__index_logR;RHtcheck_index_existencetsetInconsistentIndexExceptionRIt reset_searchRX(Rtindtcie((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__check_searchs(           cCs>d|_|jr:tjj|jr:tj|jndS(sDestroy the catalog.N(RR4t catalog_rootRQRRtexiststshutiltrmtree(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__destroy_catalogs cCsOtjjtj|d}tjtjtj j |}||_|S(sHelper method that takes the full path to the package directory and the name of the manifest file, and returns an FMRI constructed from the information in those components.N( RKR$tVersionturllibtunquoteRtfmritPkgFmriRQRRtbasename(tpkgpathtvertvtf((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__fmri_from_paths$ cCs||j|}tjj|}y|jd|d|Wn:tk rw}|jtjkrqt|jnnX|S(siThis function should be private; but is protected instead due to its usage as a callback.tpathnamet signatures( RyRKtManifestt set_contentRmRntENOENTRRr(RR}RxtmpathtmRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRzscCs|j|dS(NtINDEX(t_RepoStore__log(Rtmsg((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __index_logscCs|jst|ny|j|SWnwtk rtj}y|j||Wn tjk ryt|nX|st|n||j|<|SXdS(sMReturn the in-flight transaction with the matching trans_id. N(RARR8tKeyErrorttranst TransactiontreopentTransactionUnknownIDError(Rttrans_idtt((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__get_transactions       cCs|jj|ddS(s7Discard any state information cached for a Transaction.N(R8tpopR(RR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__discard_transactionscCs t}y|jWntk r-t}nn X|jt}|jrtjj|jr|j su|j rzkyDt j |j|j |jd|jd|j}|jdtWn tjk rt}nnXWd|r| r|jnXn||fS(shReturns a tuple of booleans of the form (storage_locked, index_locked). RR`R2N(RHRWRRXRZRRQRRRR^RaRRRzRyRR;R-RtIndexLockedExceptiontunlock(Rtstorage_lockedt index_lockedR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytget_lock_statuss2        cCsy1|j}|j}|j}tj|j}Wnd}d}d}nX|j\}}|rnd}n|r}d}nd}i|d6|d6|d6|d 6S( soReturn a dictionary of status information about the repository storage object. itt processingtindexingtonlines package-countspackage-version-countslast-catalog-updatetstatus(R{t package_counttpackage_version_counttdatetime_to_basic_tst last_modifiedR(Rtcatt pkg_countt pkg_ver_countt lcat_updateRRtrstatus((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt get_status?s*      cCsQ|jjd|s!tn| sZ|jr;|j sZ|joVtjj|j r^dSy|j j d|Wnt k r6}|j t j kr|jjtj|jn|j t jkr|jjtj|jn|j t jkr#|jjtj|jn|jjn|jjnXdS(sgLocks the repository preventing multiple consumers from modifying it during operations.R2N(RNtacquireRR^RaR<RQRRRRVR-RmRnRotreleaseRpRqRrRsRttEINVALtInvalidLockException(RR2tprocessRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __lock_rstore_s4      RcCs/|jr+|jjd|d|d|ndS(NRtcontexttseverity(RBR(RRRR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__logs cCs*|j s tjj|j r$dStj|j|j|jd|jd|j }|j dt |j t j|j|jdytj|jdWnytk r}|jtjkrtj|jn|jtjkrtj|jn|jtjkrqnX|jdS(s7Private helper function to dump repository search data.NRR`R2s.old(RRQRRRRRRzRyRR;R-RHRtportabletrenameRRRmRnRoRpRqRrRsRtRR(RRRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__purge_search_indexs,       c s|p | sj rdS|r|s4jnjjrUtj_ntj_|j_fd}xt j jD]}|djkrqnxt j |dD]}y$j |d|}||Wqt jtjtjtjjfk r]} t jj|d|} jtdi| d6| d6qt jk r~} |sqqXqWqWtj_tj_jj_jjjd|n|sjn|rjn jdS(sKPrivate version; caller responsible for repository locking.Ncs}j|dt}d|kr7tj|d}nrS|j rS|_nj|d|jt|dS(NRxspkg.fmriRy(RzRXRRRDt_RepoStore__add_packageRR(RR(t default_pubR(s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR|s  is.Skipping %(name)s; invalid manifest: %(error)stnameterrortlm( R@t_RepoStore__destroy_catalogRDR^RHR{RXt batch_modet log_updatesRQtwalktlistdirt_RepoStore__fmri_from_pathRptInvalidPackageErrorstactionst ActionErrorRt FmriErrorRKR$t VersionErrorRRRSRRtDuplicateCatalogEntrytfinalizet_RepoStore__save_catalogt_RepoStore__purge_search_indext_RepoStore__refresh_indext_RepoStore__check_search( Rt build_catalogt build_indexRt incrementalR|RtfnameRRvR((RRs;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __rebuildsR            cCs|js dS|jr,|j r,tn|j}|jdtjj|j|}|rj|j Stj|j|j |j d|jd|j }|j |js|jdnt|_dS(sKPrivate version; caller responsible for repository locking.Ns"Checking for updated package data.RR`sSearch Available(RR^RaRR{RRRtcheck_for_updatest_RepoStore__run_update_indexRzRyR;tsetupRIRX(RRtfmris_to_indexR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__refresh_indexs&            cCskd|_|jd||j|jr0dS|j r]|jr]|jj r]|j n|j dS(sKPrivate version; caller responsible for repository locking.R3N( RR4t_RepoStore__init_catalogRRCR^RR{RRR(RR3((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __init_state$s     c Csd|_|j s|jr dSd}t}tjj|jd}d}d}|jrtjj|jd}t j d|dt }nd}tjj |r||}| s|j s||j krt }qn|r0|j r0tj|t d}tjj |rU|j j rUt }qUn%|rU|rU|jrU|j|n|jrgt}n|r|jr|j rt}n|rN|j j|jtd|jd ||j rN|jrNtjj|jdd}x6||fD](} tjj | rtj| qqWtjtjj|jd t qNntjj |rd}|jr|jrtjj|jd}t j d|dt }n|r|j rd |_|j|jqXd |_nvy|j j rd |_nWnWtjk rW} |sn|jt| t j d|j|_d |_dSX|jd kr|j rt d |j j!D} | r| d |_qndS(sVPrivate function to determine version and location of catalog data. This will also perform any necessary transformations of existing catalog data if the repository is read-only and a writable_root has been provided. 'allow_invalid', if True, will assume the catalog is version 1 and use an empty, in-memory catalog if the existing, on-disk catalog is invalid (i.e. corrupted). This assumes that the caller intends to use the repository as part of a rebuild operation.iNcSsUytj|j}Wn,tk rD}|jtjkr>dSnXtjj|S(N( RQtstattst_mtimeRmRnRRtdatetimetutcfromtimestamp(Rtmod_timeRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt get_file_lmSstattrsR{t meta_rootR^sBTransforming repository catalog; this process will take some time.Rt updatelogiicss|] }|VqdS(N((t.0tp((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pys s("R?RRCRHRQRRRSRRaR{tCatalogRXRRR^RRt_RepoStore__set_catalog_roottdestroyRRt_RepoStore__rebuildR_RtremoveRRpt CatalogErrorRR4tcatalog_verisonRDtlistt publishers( RR3Rtneed_transformtv0_attrstv1_catt writ_cat_roottv0_lmtv0_catRRvtpubs((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__init_catalogAs                    c CsE|j}|j}yItjj|rJtj|tj||ntj |tj Wnt k rs}t |tj r t|jdtkr d}xW|jD]L}xC|D];}t|tkr|d|d7}q|d|7}qWqWtj|n`|jtjks1|jtjkrFtj|jn'|jtjkrmtj|jnnX|j||r||j_n|jjd}tjj|rtjj tjj!|dtjj"|}tj#||ntj#|||j||r2tj|n|jj$|_%dS(s_Private helper function that attempts to save the catalog in an atomic fashion.iRs%s isold.N(&Rt_RepoStore__mkdtempRQRRRRRRitcopytreetchmodt PKG_DIR_MODERmt isinstancetErrorttypeRRttupleRpt UnknownErrorsRnRotEPERMRqRrRsRtRR{RtsaveRRStdirnameRtmoveR$R?( RRt old_cat_roott tmp_cat_rootRvRtelisttentryt orig_cat_root((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__save_catalogsP    $    cCs%||_|jr!||j_ndS(N(R5R4R{R(RR_((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__set_catalog_root s  cCs|rtjj|}||_tjj|d|_|jtjj|dtjj|d|_tjj|d|_tjj|d|_ |j s|j tjj|dqn1d|_|jdd|_d|_d|_ dS(NRfR{tindexRKRtfile( RQRRtabspathR:RSR<RRR@RAR\RER(RR_((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __set_root's  "    cCsA||_|sd|_dStj||jd|j|_dS(Ntlayouts(R7RR>t file_managert FileManagerR^R6(RR_((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__set_file_root9s    cCs|rKtjj|}tjj|d|_tjj|d|_nT|jrtjj|jd|_tjj|jd|_nd|_d|_||_dS(NRfR%( RQRRR'RSR<RR_RR=(RR_((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__set_writable_rootBs   cCs2z|jr|jjnWd|jjXdS(s8Unlocks the repository so other consumers may modify it.N(RVRRNR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__unlock_rstorePs cCs{|jst|rwtj|j|j|jd|jd|j}|j||j sk|jdnt |_ ndS(sCreates an indexer then hands it fmris; it assumes that all needed locking has already occurred. RR`sSearch AvailableN( RtAssertionErrorRRRzRyRR;tserver_update_indexRIRX(Rtfmrist index_inst((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__update_searchdb_unlockedYs     cCs|jrtn|jr*tn|js?tn|j|}y!|j}|j||SWn"t j k r}t |nXdS(sjAborts a transaction with the specified Transaction ID. Returns the current package state.N( RCRR^RRAR)t_RepoStore__get_transactiontabandont_RepoStore__discard_transactionRtTransactionErrorR(RRRtpstateRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR5is        cCs|jrtn|jr*tn|js?tn|j|}y|j|Wn"tj k r}t |nXdS(sbAdds an action and its content to a transaction with the specified Transaction ID.N( RCRR^RRAR)R4t add_contentRR7R(RRtactionRRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytadd|s      cCsv|jrtn|j s.|jdkr:tn|jz |jdtd|dtWd|jXdS(sLooks for packages added to the repository that are not in the catalog and adds them. 'refresh_index' is an optional boolean value indicating whether search indexes should be updated. iRRRN( RCRRR?R)RWRRXRZ(Rt refresh_index((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR9s    cCs|jrtn|jr*tn|js?tn|j|}y|j||Wn"tj k r}t |nXdS(sAdds a file to an in-flight transaction. 'trans_id' is the identifier of a transaction that the file should be added to. 'data' is the string object containing the payload of the file to add. 'size' is an optional integer value indicating the size of the provided payload. N( RCRR^RRAR)R4tadd_fileRR7R(RRRtsizeRRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR=s      cCs|jrtn|jr*tn|j sC|jdkrOtn|jdtz|j ||j Wd|j XdS(s4Adds the specified FMRI to the repository's catalog.iR2N( RCRR^RRR?R)RWRXRRRZ(RR}((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR|s      cCs|jrtn|jr*tn|j sC|jdkrOtn|jdtz|j ||j Wd|j XdS(s\Replaces the information for the specified FMRI in the repository's catalog.iR2N( RCRR^RRR?R)RWRXt_RepoStore__replace_packageRRZ(RR}((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytreplace_packages      cCs|jr|jS|jr%tn|js:tn|jdkrhtj|jdtd|j St j d|jdtd|j |_|jS(s8Returns the Catalog object for the repository's catalog.iR^RDRR( R4RCRRR)R?t old_catalogt ServerCatalogRXRDR{RR^(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR{s     ccs |j s|jdkr%tn|jdkr|jsItntj|jdtd|j}tj}|j ||j dx|D] }|VqWdS|j }d|j j VdVd|jVx,|jD]\}}}d||fVqWdS( sReturns a generator object for the full version of the catalog contents. Incremental updates are not provided as the v0 updatelog does not support renames, obsoletion, package removal, etc.iR^RDNsS Last-Modified: %s sS prefix: CRSV s S npkgs: %s s V pkg:/%s@%s (RR?R)RDRARBRXt cStringIOtStringIOtsendtseekR{Rt isoformatRttuples(RR~toutputtlR]tstemR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt catalog_0s&          cCsh|jrtn|j s.|jdkr:tn|sFttjjtjj |j|S(s8Returns the absolute pathname of the named catalog file.i( RCRRR?R)R/RQRRRhRS(RR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt catalog_1s     cCs$|js dStjj|jdS(sDiscards currenty loaded search data so that it will be reloaded the next a search is performed. N(Rtsqpt TermQueryt clear_cache(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR&s cCs|jrtn|js*tn|j|}y3|jd|\}}|j|||fSWn+tjt j fk r}t |nXdS(sCloses the transaction specified by 'trans_id'. Returns a tuple containing the package FMRI and the current package state in the catalog.tadd_to_catalogN( RCRRAR)R4tcloseR6RpRRR7R(RRRQRR}R8Rv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRR/s      cCsb|jstn|dkr0t|n|jj|}|dk rR|St|dS(sReturns the absolute pathname of the file specified by the provided SHA-n hash name. (At present, the repository format always uses the least-preferred hash to content in order to remain backwards compatible with older clients. Actions may be published that have additional hashes set, but those do not influence where the content is stored in the repository.)N(R\R)RRR>tlookup(Rtfhashtfp((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR&Gs    cCs|jstn|jrrtjj|jd}tjj|rrtjd|}|ro|ddSqrntj |jS(snReturn the Publisher object for this storage object or None if not available. spub.p5iR#i( RDR)R_RQRRRSRtp5itparset Publisher(Rtp5ipathR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt get_publisherZs   cCs.y|j|tSWntk r)tSXdS(svReturns a boolean value indicating whether the given in-flight Transaction ID exists. N(R4RXRRH(RR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pythas_transactionqs   cCs t|jS(s/The number of transactions awaiting completion.(tlenR8(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytin_flight_transactions|scCs|jo|jjS(sMA boolean value indicating whether the repository is locked. (RVtlocked(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR^scCsF|jrtn|js*tntjj|j|jS(sZReturns the absolute pathname of the manifest file for the specified FMRI.(RCRR@R)RQRRRSt get_dir_path(RR}((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRys     cCs|jrtn|jr*tn|js?tny@tj}|j|||||j |j <|j SWn"tj k r}t |nXdS(sStarts a transaction for the specified client release and FMRI. Returns the Transaction ID for the new transaction.N( RCRR^RRAR)RRtopenR8t get_basenameR7R(Rtclient_releaseR}RRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR`s       cCs|jrtn|jr*tn|js?tny@tj}|j|||||j |j <|j SWn"tj k r}t |nXdS(sStarts an append transaction for the specified client release and FMRI. Returns the Transaction ID for the new transaction.N( RCRR^RRAR)RRtappendR8RaR7R(RRbR}RRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRcs       cCsy|jrtn|js*tn|jdtz-yy|jWntjk r}t d|j }|j |dy|j dtdt Wqtjk r}|j t|dqXn,tjk r}|j t|dnXWndtk re}|jtjtjfkr_|jrJtt dntt dnnXWd|jXdS( sfThis function refreshes the search indexes if there any new packages. RsaIndex corrupted or out of date. Removing old index directory (%s) and rebuilding search indexes.RRRs7writable root not writable by current user id or group.s#unable to write to index directory.N(RCRRR)RWRHRRRRtcauseRRRXtIndexingExceptionRRmRnRoRsRaRRZ(RRvts((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR<s:          cs}jrtnjr*tnj sCjdkrOtnjsdtn|sytj }nfd}j j }zy|j |j |j|j j|j|j |j|j |j |jt|_t}xO|D]G}|j|jy|j|Wntjk rQqnXt}qW|j|jt|_|r|jd||jn|j|jt}|j |jdt|x1|D])}|j|||j|jqW|j|j|rtjj}t fd|D} |j |j!d| x)|D]!} yt"j#| } Wnt$k rqbnXtj%j&j| } xtj| D]} |s|j|j!qnt"j#| }y+t'j(dj&| |fdj)}Wn$t$k r<|j|j!qnX||kr_|j|j!qn|||8}|j|j!qWqbW|j|j!n|j |j*dt|x:|D]2}j+|}t,j-||j|j*qW|j|j*|j |j.dt|xL|D]D}j/j0|}|d k r&t,j-||j|j.q&q&W|j|j.d}x:td |DD]"} |tj%j&j| qWj2r;y=x6tjj2D]"}|tj%j&j2|qWWq;t3k r7}|j4t4j5kr8q8q;XnWn"t3k r`}tj6|nXWd t|_j7Xd S( s$Removes the specified packages from the repository store. No other modifying operations may be performed until complete. 'packages' is a list of FMRIs of packages to remove. 'progtrack' is an optional ProgressTracker object. icsj|}t}x|jD]v}|js:q%ntj|\}}}|j||jdkr%x*|jdt D]}|j|qWq%q%W|S(sGiven an FMRI, return a set of tuples containing all of the hashes of the files its manifest references. Each tuple is of the form (hash value, hash function)t signaturetleast_preferred( Rztsett gen_actionst has_payloadtdigesttget_least_preferred_hashR;Rtget_chain_certsRX(R}RthashestathattrthvalthfuncR~(R(s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt get_hashess     tpfmristgoalc3s=|]3}tjtjjj|D] }dVq(qdS(iN(RQRRRRSR@(RRfR(R(s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pys Sst@RDcSsLytj|Wn4tk rG}|jtjtjfkrHqHnXdS(s)rmdir; but ignores non-empty directories.N(RQtrmdirtOSErrorRnt ENOTEMPTYtEEXIST(tdRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRxscss!|]}|jdtVqdS(tstemonlyN(R_RX(RR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pys sN(8RCRR^RRR?R)R@tprogresstNullProgressTrackerRWR{t job_starttJOB_REPO_DELSEARCHtjob_add_progressRtjob_donetJOB_REPO_UPDATE_CATRXRRHRRptUnknownCatalogEntryRRRitJOB_REPO_ANALYZE_RMR\tupdateRQRtsumtJOB_REPO_ANALYZE_REPORRRRRRSRRRDtJOB_REPO_RM_MFSTRyRRtJOB_REPO_RM_FILESR>RSRR\RmRnRt_convert_errorRZ(Rtpackagest progtrackRtR~t save_catalogR}tpfilestslistt remainingRtpnametpdirRtpverRthtfpathRxR!Rv((Rs;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytremove_packagess                                          cCs|jrtn|jr*tn|j sC|jdkrOtn|jz|jd|d|Wd|j XdS(sRebuilds the repository catalog and search indexes using the package manifests currently in the repository. 'build_catalog' is an optional boolean value indicating whether package catalogs should be rebuilt. If True, existing search data will be discarded. 'build_index' is an optional boolean value indicating whether search indexes should be built. iRRN( RCRR^RRR?R)RWRRZ(RRR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytrebuilds       cCs|jrtn|j s.|jdkr:tn|j}tjj|j|}|r~|j d|j |n\tj|j|j |j d|j d|j }|j|js|j dnt|_dS(sM Determines which fmris need to be indexed and passes them to the indexer. Note: Only one instance of this method should be running. External locking is expected to ensure this behavior. Calling refresh index is the preferred method to use to reindex. isUpdating search indexesRR`sSearch AvailableN(RCRRR?R)R{RRRRt$_RepoStore__update_searchdb_unlockedRzRyR;RRIRX(RR~RR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__run_update_indexs$           csjrtnj s)j r5tnjjsTtnfd}g}yPxI|D]A}t|t j s|j t j j |qs|j |qsWWn"t jk r}t|nXg|D]}||^qS(sSearches the index for each query in the list of queries. Each entry should be the output of str(Query), or a Query object.c sjsttj}|jtj|}|j|j}|jd|j d|j djdj d|j |j tjjkr|jn|jjjS(Nt num_to_returnt start_pointt index_dirtget_manifest_pathtcase_sensitive(RR/RNt QueryLexertbuildt QueryParserRWttexttset_infoRRRyRt return_typetQuerytRETURN_PACKAGEStpropagate_pkg_returntsearchR{R1(tqRJtqqptquery(R(s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt_searchs       (RCRRRR)Rtsearch_availableRRtqpRRcRNtfromstrtQueryExceptionR(RtqueriesRt query_lstRfRvR((Rs;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRs$       cCs1|jr'|jr'tjj|jp0|jS(N(RIRRQRRRR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR-sc CsI|jrtn|jr*tn|js?tntjj|jd}d}zyQtjj |}t j d|\}}d}ytj |}Wn+tk r}|jtjkrqnX|rDtj|t j|jytj||j|jWqWtk r@}|jtjkrAqAqWXntj|tjtj|d5}tj|d} tj| |gWdQXWdQXtj ||Wndt!k r}|jtj"krt#j$|j%n'|jtj&krt#j'|j%nnXWd|rDtjj(|rDtj)|nXdS(sUpdates the configuration information for the publisher defined by the provided Publisher object. spub.p5iRgtwbsutf-8N(*RCRR^RR_R)RQRRRSRRRktmkstempRRyRnRtfchmodtS_IMODEtst_modeRtchowntst_uidtst_gidRRit PKG_FILE_MODEtfdopentcodecst EncodedFileRVtwriteRRmRoRpRqRrRsRtRtunlink( RR]RYtfnRtfdtstRvRtef((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytupdate_publisher2sN         c CsP|jd}|jd}|r|r|j|}x|jtjjD]}xQtjD]F}|jj||krb|jjd} | r| |dd}zyrtdt|d}|}|j|j|j}||krzt|i|d6|d6|d6fSWnttj fk r}t |i|d6|d6fSt k r!}|j t j t jgkrt|it|d6|d6|d6fSt |i|d6|d6fSnXWd|r9|jnXdS(s0Perform hash verification on the given gzip file. 'path' is the full path to the file in the repository. 'pfmri' is the package that we're verifying. 'h' is the expected hash of the path. 'alg' is the hash function used to compute the hash.tfileobjtrbtactualRRKRN(RRR`Rtreadt hexdigestRt ValueErrortzlibRRtIOErrorRnRoRRRRR( RRRR}RtalgtgzfRTRRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __verify_hashs.    cCsy5tj|}tj|jr4tj|nWntk r}|jtjtjgkr|st |it |d6fSt |i|d6t |d6|d6fSt |i|d6t |d6|d6fSnXdS(sbCheck that we don't get any permissions errors when trying to stat the given path.RRRKN( RQRtS_ISDIRRRRyRnRRoRRRR(RRRR}RRRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __verify_perm s"c Cs|j|}g}x|jdD]} y&| j|j|||d|Wq%tjk r} |jt|it| d6|d6fq%tj k r} |jt|it| d6|d6fq%tj k r} |jt|it| d6|d6fq%Xq%W|S(s"Verify signatures on a given FMRI.Rgtrequired_namesRRK( Rztgen_actions_by_typet verify_sigRjRptUnverifiedSignatureRcRRtCertificateExceptiontTransportError( RRRR}R]t trust_anchorstsig_required_namestuse_crlsRRRxRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__verify_signatures"   ! ! &c stjjdddtjjdddfd}d}|jjd}d}x[|D]S}|s|qjnd||f}tj|}||p||sjt |fSqjWxtj |jD]\}}}t |krqntj|}||p||s&t |fSxT|D]L} tj j || } tj| }||pl||s-t | fSq-WqWtdfS( sSDetermine if any of the files or directories in the repository are not readable by either the pkg5srv user or group, or are not world readable. We return as soon as we find one inaccessible file, returning the name of that file or directory. We also walk up the directory path from the repository to '/' checking that the repository would be accessible. We only return the first file found because for large repositories with many files affected, we'd be flooding the user with information. This check exists as well as verify_perm() since it causes a warning to be emitted if non-world readable files are found, whereas verify_perm() will emit an error. tpkg5srvs/etccstj|jr{|jkrE|jtj@rE|jtj@rEtS|jkr|jtj@r|jtj @rtSnF|jkr|jtj@rtS|jkr|jtj @rtSt S(sOReturns true if the pkg5srv user can read this file/dir( RRRRtS_IXUSRtS_IRUSRRXRtS_IXGRPtS_IRGRPRH(R(t pkg5srv_gidt pkg5srv_uid(s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytpkg5srv_readableJs cSsQtj|jr9|jtj@rM|jtj@rMtSn|jtj@rMtStS(sFReturns true if anyone can read this file/dir.(RRRtS_IROTHtS_IXOTHRXRH(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytworld_readable_st/Rs%s/%sN(RKRtget_user_by_nameRtget_group_by_nameR:RRQRRHRtREPO_QUARANTINE_DIRRRRSRX( RRR t componentsRRtcompRtdirnamest filenamesRtpth((RRs;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__verify_permissions3s8    "       c cstjj|jsdS|j|jdd}|rI|j|VdStj|j}t|}xu|D]m} yNtjj |j| } ttj| } | dkr|| d7}nWqnt k r} qnqnXqnW|d7}|j ||j ddt |j\} }| sI|jtdi|d6|jd6Vn|jdx|D]{} tjj |j| }|j|dd}|r|j|Vq]nytj| }Wn\tk r|j d|jd|jt|it| d6V|jdq]nXxtj|D]}tjj ||}tj|}yPtjdj ||fd|j}tjj|std |nWn^tk r} |j d|jd|jt|it| d6V|jdq,nX|j ||j||}|rM|j|V|jdq,n|j||\}}x|D]}|j|VqlW|j||||||}x|D]}|j|VqWg}x|D]\}}}y|jj |d t!}WnIt"j#k rD} |j$t%|i|d 6t&d d |d6fqnX|j|||}|rs|j$|qn|j'|||d|}|r|j$|qqWx|D]}|j|VqW|jtq,Wq]W|j(|j)dS(svA generator that produces verify errors, each a tuple of the form (error_code, path, message, details)Nitrepository_scantpermissionspathR]RRwRDs%s is not a filetcheck_existenceRsPermission denied.RRR(*RQRRRR@t_RepoStore__verify_permRt_RepoStore__build_verify_errorRR\RSRytrepo_verify_starttrepo_verify_start_pkgRXt_RepoStore__verify_permissionsRtprefixtrepo_verify_end_pkgRRRtrepo_verify_add_progressRRRRRDtisfilet_RepoStore__verify_manifestt_RepoStore__get_hashest_RepoStore__verify_signatureR>RSRHRpRqRcRRt_RepoStore__verify_hashRtJOB_REPO_VERIFY_REPO(RRR]RRRRtmflistRvRtmfdirtversRvt valid_permsRRRRRRR}RoRterrsRRR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __gen_verifys                            ccs|j s|jdkr%tn|js:tn|sO|j}ntjdd}||_i}tj j |st |nxtj |D]x}tj j ||} tj j| rqntjj| } | jj} |j| g|| j| qW|jzwy/x(|j|||||D] } | VqIWWnAttfk r} ddl}|j| tj| nXWd|jtj |XdS(sA generator which verifies the contents of the repository store, checking for several different types of errors. No modifying operations may be performed until complete. 'progtrack' is an optional ProgressTracker object. 'trust_anchor_dir' is set in the repository configuration and corresponds to the image property of the same name. 'sig_required_names' is set in the repository configuration and corresponds to the image property of the same name. 'use_crls' is set in the repository configuration and corresponds to the image property of the same name. The generator yields tuples of the form: (error_code, path, message, reason) where 'error_code' an integer error, correponding to REPO_VERIFY_* 'path' the path to the broken file in the repository 'message' a human-readable summary of the error 'reason' a dictionary of strings containing more detail about the nature of the error. iRspkgrepo-verify.iN(!RR?R)R@RRkRlRRQRRtisdirR+RRStislinktm2tX509t load_certt get_subjecttas_hasht setdefaultRcRWt_RepoStore__gen_verifyRRmt tracebackt print_excRpRRZRR(RR]Rttrust_anchor_dirRRt tmp_metarootRRRt trusted_caRfRRvR6((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytverify s@          c #sjrtn|s*tj}nt}xjd|d|d|d|d|D]h\}} } } |r|||| | | fn|tkrq^n| jd} |j| | fq^Wd} fd}xZ|j D]L\} } | sqnj | }| |kr%qn|j|| fqW|j |j dt|t}x|D]\} } |j|j | |krqhntjj| st| td | i| d6fVqhntjj| }tjj| }|jjd d jd }| s'|} ntjj| |}ytj|Wn+tk rz}|jtjkr{q{nXtjj||}tjj|rtntd i| d6|d6} t}i|d6| d6} z_y!t j!| ||j| Wn7t"k rC}t#}tdi| d6|d6} nXWd|| | | fVXqhW|j$|j |rj%ndS(s(Verify, then quarantine any packages in the repository that were found to be faulty, according to self.verify(..). This method yields tuples of the form: (status_code, fmri, message, reason) where 'status_code' an int status code, corresponding to REPO_FIX_* 'path' the path that was fixed 'message' a summary of the operation performed 'reason' a dictionary of strings describing the operation Note, the 'fmri' value may not be a valid FMRI if the manifest being fixed was corrupt, in which case a path to the corrupted manifest in the repository is used instead. If any object referred to by a manifest is quarantined, then the manifest for that package is also quarantined, however other files referenced by the manifest are not moved to quarantine in case they are referenced by other packages. R]RR8RRRKcsVtjjjt}tjj|s:tj|ntjddd|}|S(s1Make a directory where we can quarantine content.Rsfix.Rg( RQRRRSR_RRtmkdirRkRl(tquarantine_basetqroot(R(s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt_make_quarantine_root s  Rvs:Missing file %s must be fixed by republishing the package.RiR sMoving %(src)s to %(dest)stsrctdests&Unable to quarantine %(path)s: %(err)sRRRN(&R^RR~RRiR;RRR;RtcopyRyRtJOB_REPO_FIX_REPOR\RRQRRRt REPO_FIX_ITEMRRRtreplaceR_tlstripRSRjRyRnR{R*RRRtREPO_FIX_FAILEDRR(RR]Rtverify_callbackR8RRt broken_itemsRRRRRRtquarantine_rootR?Rt fixed_pathsRRgtqdirRvRAR((Rs;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytfixb s           !     cCsr|jrtn|js*tntj|jsCtS|jsPtS|j }|j |}|dkS(sCheck that the FMRI supplied as an argument would be valid to add to the repository catalog. This checks to make sure that any past catalog operations (such as a rename or freeze) would not prohibit the caller from adding this FMRI.N( RCRRR)Rtis_valid_pkg_nametget_nameRHR$R{t get_entryR(RR}R~R!((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytvalid_new_fmri s      cCs|jrtn|js*tntj|jsCtS|jsPtS|jj s`tS|j }|j |}|dk S(N( RCRRR)RRNRORHR$ttimestrR{RPR(RR}R~R!((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytvalid_append_fmri s       cCs|jS(N(R5(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt scCs|jS(N(R6(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRT scCs|jS(N(R7(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRT scCs|jS(N(R9(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRT scCs|jS(N(R:(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRT scCs|jS(N(R=(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRT sN(VR R R RHRRtSORT_FILE_MAX_SIZERt_RepoStore__set_read_onlyRRR?RRt staticmethodRRzRR4R6RRRXRWtloggingtINFORRRRRYRRRRFRERGRZRR5R;R9R=R|R@tpropertyR{RLRMRRRR&RZR[R]R^RyR`RcR<RRRRRRRR#R"RltDEFAULT_HASH_FUNCR%RR$RR5R;RMRQRSRR[R\R^R_Ra(((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR,?s =         % ( &  S   H           (       -   ) 2 H 5    V F |  t Repositoryc BsPeZdZedCedCdCeejedCejdCd Z eeej dZ eeejdZ dZ dejdZdZdZd Zd Zd Zd Zed ZdZdZdZedZdZdZdCdZdCdZdCdZ e!dZ"dCdZ#dCdZ$dCdZ%dZ&dZ'dZ(dZ)dZ*e+d Z,d!Z-d"Z.d#Z/e+d$Z0dCd%Z1dCd&Z2ej d'Z3e+d(Z4dCd)Z5dCdCd*Z6dCed+Z7dCd,Z8e!edCd-Z9d.Z:d/Z;dCd0Z<dCd1Z=d2Z>d3Z?dCdCd4Z@dCdCdCd5ZAd6ZBd7ZCe+d8ZDe+d9ZEe+d:ZFe+d;ZGe+d<ZHe+d=eZIe+d>ZJe+d?eZKe+d@ZLe+dAZMe+dBZNRS(DsA Repository object is a representation of data contained within a pkg(5) repository and an interface to manipulate it.c Cs tjj|_tjj|_||_d|_d|_d|_ d|_ |j | |j | d|_ d|_d|_||_d|_||_||_d|_| |_||_d|_|jz |jd|d|d|Wd|jXdS(sPrepare the repository for use.iiR3tcreatet propertiesN(RKRLRMt_Repository__lockt_Repository__prop_lockt_Repository__file_rootRt_Repository__pub_roott_Repository__roott_Repository__tmp_roott_Repository__writable_roott_Repository__set_roott_Repository__set_writable_roott_Repository__catalog_requestst_Repository__file_requestst_Repository__manifest_requestst_Repository__cfgpathnamet_Repository__cfgt_Repository__mirrort_Repository__read_onlyt_Repository__rstorest_Repository__sort_file_max_sizeRBR$t_Repository__lock_repositoryt_Repository__init_statet_Repository__unlock_repository( RR3t cfgpathnameR]R\RBRCR^R^R_R`Ra((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s2                    cCsy;| r:|jr:tjj|jr:t|jnWn"tk r_}tj|nXd}|j r{|j }n$|jrtjj |jd}n|jrtjj |jd}|rtjj | stjj|r|}qnt d|d||_ y"t|jjdd|_Wn#tjtfk rVd|_nX|jdkr|jrtjj |jd }tjj |jd }tjj |s|jjd krtjj | rd |_n|jritjj |rWtjj tjj |d r*d|_n d |_t d|d|d|j|_ qrt|jn t|jjdd|jn$|jdkr|jrd |_n|jr|j rtjj |jd} |j rtjj | r| |_qn|jtkr2t|j|jtn|jd kr|jrr|j rrtjj |jd |_n| r|rtjj | rtjj |jptjj tjj |jdottjtjj |jdjddd k rt|jqn|jjd d} |jd kr-|j} | shtjj |jd} ntdtjd| d|jd|j d|j!} | |j"| j#<|jrtjj |jrx0tj$|jD]} |j%| d|qWn| r| |j"kr|j%| d|qn[td|d|jd|jd| d|j d|j!d|jd|j&} | |j"| j#<|jsdSytj'|j} Wnat(k r}|j)t)j*krtj+|j,n$|j)t)j-krt|jnnXt'j.t'j/| j0s<t|jn|jd kr|j! rtjj |jd}x=d D]2}ytj1||Wqtt(k rqtqtXqtWndS(!sePrivate helper function to determine repository format and validity. t cfg_cachespkg5.repositoryttargett overridest repositoryR$iiRDR{iiRiR&s pkg5.imagetimageRR[R\RBRCR^R3R]R_RaNRs.pags.dir(s.pags.dir(2R_RQRRR!RRmRpRRRkRSRtRepositoryConfigRltinttcfgt get_propertyR$tPropertyConfigErrorRt set_propertyR\RatCURRENT_REPO_VERSIONR"tpub_rootRbt FileConfigR,tlayouttV1LayoutRBRCR^RoRDRt_Repository__new_rstoreRaRRyRnRoRqRrRRtS_IFMTRR(RR3R]R^RvRttcfgpathRtcat_roottfroottdef_pubtrstoreR]tfst searchdb_filetext((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __init_format= s                                cCs3i|_|jd|d|d||jdS(s,Private helper function to initialize state.R3R]R^N(Rot_Repository__init_formatt_Repository__write_config(RR3R]R^((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s cCs|jjdS(sgLocks the repository preventing multiple consumers from modifying it during operations.N(R_R(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__lock_repository sRcCs/|jr+|jjd|d|d|ndS(NRRR(RBR(RRRR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s cCsL|jjz*||_x|jD]}||_q#WWd|jjXdS(N(R`RRmtrstoresRCR(RRcR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __set_mirror s   cCsL|jjz*||_x|jD]}||_q#WWd|jjXdS(N(R`RRnRR^R(RRcR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRe s   cCsk|jjzI|rLtjj|}||_tjj|d|_n d|_Wd|jj XdS(NRf( R`RRQRRR'RcRSRdRR(RR_((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR(% s   cCs|jjzp|rCtjj|}tjj|d|_n0|jrjtjj|jd|_n d|_||_ Wd|jj XdS(NRf( R`RRQRRR'RSRdR_RReR(RR_((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR-1 s    cCs|jjdS(s8Unlocks the repository so other consumers may modify it.N(R_R(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__unlock_repository@ scCs_|jr dSy|jjWn:tk rZ}|jtjtjtjfkr[q[nXdS(s1Save the repository's current configuration data.N(R^R|RRmRnRRoRs(RRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__write_configF s cCs=|s t||jkr*t|n|jrNtjj|j|}n |j}d}|j rtjj|j d|}n|j }|jr|r|j |jrd}nd}|j dkrt j}ntd|d|d|d|jd|jd|d |jd |d |jd | }||j|<|S( NRDiR3R[R\RBRCR]R^R_R`Ra(R/RoR RRQRRRSR_RRaR\t startswithR$RRR,RBRCR^Rp(RR]R3R_t writ_rootRR[R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __new_rstoreX s2           cCs|j|}|j|S(s{Aborts a transaction with the specified Transaction ID. Returns the current package state. (tget_trans_rstoreR5(RRR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR5 scCs|j|}|j||S(ssAdds an action and its content to a transaction with the specified Transaction ID. (RR;(RRR:R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR; scCs|jrtn|jr*tn|j sC|jdkrOtn|j|j}y|j |Wn@t j \}}}zt j |jWd|d|XnXdS(sCreates a repository storage area for the publisher defined by the provided Publisher object and then stores the publisher's configuration information. Only supported for version 4 and later repositories. iN(RCRR^RRR$R)RRRtsystexc_infoRRR_R(RR]Rtexc_typet exc_valuetexc_tb((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt add_publisher s     c Cs|jrtn|jr*tn|j sC|jdkrOtng}|jzyxy|D]q}|j|}|j |t j j |d|}t j j |rlt j j |rltj||qlqlWWndtk rH}|jtjkrtj|jn|jtjkrBtj|jnnXWd|jXtt jd} ddj |} |sd| } ntj| dtd | d | } |r| jndS( sRemoves a repository storage area and configuration information for the publisher defined by the provided publisher prefix. pfxs must be an iterable. iRDNtws/usr/bin/rm -rf t s/usr/bin/nohup tshelltstdouttstderr(RCRR^RRR$R)Rqt_Repository__mkdtemppubRcRQRRRSRRRRmRnRoRpRqRrRsRtRsR`tdevnullt subprocesstPopenRXtwait( Rtpfxst repo_pathtsyncht tmp_pathstpfxt repo_tmp_pathtpub_pathRvtnullfRtsubp((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytremove_publisher sH             cCs|js dS|jr"|j}n |j}tjjtjj|d}y/tj|tj dd|dd|SWndt k r}|j t j krt j|jn|j t jkrt j|jnnXdS(sCreate a temp directory under repository directory and corresponding temp pub folder with format rm.pubname.xxxxxx under this folder NRfRsrm.t.Rg(R_RaRQRRRhRSRiRjRkRlRmRnRoRpRqRrRsRt(RRR_RuRv((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt __mkdtemppub s$    !  cCs|j|j}|j|S(s4Adds the specified FMRI to the repository's catalog.(tget_pub_rstoreRDR|(RR}R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR| scCsy+t|tjs*tj||}nWn"tjk rO}t|nX|rl|j rl||_ny|j|j}Wn.tk r}|jst|nnX|j ||S(sStarts an append transaction for the specified client release and FMRI. Returns the Transaction ID for the new transaction.( RRRRRRDRR!RRc(RRbR}R]RvR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRc s  cCs#|j|j|}|jS(sReturns a generator object for the full version of the catalog contents. Incremental updates are not provided as the v0 updatelog does not support renames, obsoletion, package removal, etc. 'pub' is the prefix of the publisher to return catalog data for. If not specified, the default publisher will be used. If no default publisher has been configured, an AssertionError will be raised. (t inc_catalogRRL(RR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRL s cCs&|j|j|}|j|S(sQReturns the absolute pathname of the named catalog file. 'pub' is the prefix of the publisher to return catalog data for. If not specified, the default publisher will be used. If no default publisher has been configured, an AssertionError will be raised. (RRRM(RRR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRM- s cCs,|j|j|}|j|d|S(sCloses the transaction specified by 'trans_id'. Returns a tuple containing the package FMRI and the current package state in the catalog. RQ(RRRR(RRRQR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRR: s cCsu|j|r,|j|}|j|Sx6|jD]+}y|j|SWq6tk r`q6Xq6Wt|dS(s|Returns the absolute pathname of the file specified by the provided SHA1-hash name. 'pub' is the prefix of the publisher to return catalog data for. If not specified, the default publisher will be used. If no default publisher has been configured, an AssertionError will be raised. N(tinc_fileRR&RR(RRTR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR&E s   cCsGy|j|}|jSWn&tk rB|r6ntnXdS(sReturn the catalog object for the given publisher. 'pub' is the optional name of the publisher to return the catalog for. If not provided, the default publisher's catalog will be returned. N(RR{R!R)(RR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt get_cataloga s  cCsn|dkr$|jjdd}n|s9t|ny|j|}Wntk rit|nX|S(sdReturn a repository storage object matching the given publisher (if provided). If not provided, a repository storage object for the default publisher will be returned. A RepositoryUnknownPublisher exception will be raised if no storage object for the given publisher exists. RDRN(RR|R}R!RoR(RR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRt s  c Cs|jdkst|jjdd}i}x'dD]}|jjd ||| s(RR(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR] scCs|jd7_dS(Ni(Rh(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR scCs|jd7_dS(Ni(Ri(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR scCs|jd7_dS(Ni(Rj(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt inc_manifest scCs|jo|jjS(sMA boolean value indicating whether the repository is locked. (R_R^(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR^ scCs@|jy(t|tjs1tj|}nWn"tjk rV}t|nX| rs|jrs|j}n|r|j r||_n|ry|j|}Wntk r}t |nX|j |Sd}xP|j D]E}|jsqn|j |}| st jj| r+qn|SWt |dS(skReturns the absolute pathname of the manifest file for the specified FMRI. N(RRRRRRRDRR!RRyRRRQRRR(RR}R]RvRR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRy s2     cCsy+t|tjs*tj||}nWn"tjk rO}t|nX|rl|j rl||_ny|j|j}Wn=tk r}|jst|n|j |j}nX|j ||S(sStarts a transaction for the specified client release and FMRI. Returns the Transaction ID for the new transaction. ( RRRRRRDRR!RRR`(RRbR}R]RvR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR`! s  c Csd}i}i}d}x|jD]}|j s%|j rEq%n|r`|j|kr`q%n|jj|\}} } ||||| ||dkr| }n |j| ~~ ~ q%W|rtjd|n|stjd|n||fS(sGiven a user-specified list of FMRI pattern strings, return a tuple of ('matching', 'references'), where matching is a dict of matching fmris and references is a dict of the patterns indexed by matching FMRI respectively: { pkgname: [fmri1, fmri2, ...], pkgname: [fmri1, fmri2, ...], ... } { fmri1: [pat1, pat2, ...], fmri2: [pat1, pat2, ...], ... } 'patterns' is the list of package patterns to match. 'pubs' is an optional set of publisher prefixes to restrict the results to. Constraint used is always AUTO as per expected UI behavior when determining successor versions. Note that patterns starting w/ pkg:/ require an exact match; patterns containing '*' will using fnmatch rules; the default trailing match rules are used for remaining patterns. Exactly duplicated patterns are ignored. Routine raises PackageMatchErrors if errors occur: it is illegal to specify multiple different patterns that match the same package name. Only patterns that contain wildcards are allowed to match multiple packages. cSsKxD|jD]6\}}||kr9||j|q ||||j|jq>q>W|S(sPA set containing the list of publishers known to the repository.RDR(RiR|R}R;RRD(RRR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s  cCsUxN|jD]C}|jsq n|rC|jrC|j|krCq n|jq WdS(sg This function refreshes the search indexes if there any new packages. N(RRDR<(RR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR< s  c Cst}t}x|D]}ys|}t|tjsLtj|}n|rh|j rh||_n|jr|j|jn|j|Wqtjk r}t|qXqWt|dkrt n| r|rt |d}ny|j |} Wn?t k rM}x&|D]}|js%t |q%q%WnXx&|D]}|jsU| j|_qUqUW| j|d|dS(s Removes the specified packages from the repository. 'packages' is a list of FMRIs of packages to remove. 'progtrack' is an optional ProgressTracker object. 'pub' is an optional publisher prefix to limit the operation to. iiRN(RiRRRRDR;RRR\R)RRR!RR( RRRR]tplistRRR}RvR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s<           cCs[xT|jD]I}|jsq n|rC|jrC|j|krCq n|jd|q WdS(sLooks for packages added to the repository that are not in the catalog, adds them, and then updates search data by default. R<N(RRDR9(RR]R<R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR9 s  cCs(|j|}|j|d|d|S(sOAdds a file to a transaction with the specified Transaction ID.RR>(RR=(RRRR>R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR= scCsaxZ|jD]O}|jsq n|rC|jrC|j|krCq n|jd|d|q WdS(sRebuilds the repository catalog and search indexes using the package manifests currently in the repository. 'build_catalog' is an optional boolean value indicating whether package catalogs should be rebuilt. If True, existing search data will be discarded. 'build_index' is an optional boolean value indicating whether search indexes should be built. RRN(RRDR(RRRR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR s  cCs"|j|j|jdS(s)Reloads the repository state information.N(RqRrRs(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytreloads  cCs|j|j}|j|S(s\Replaces the information for the specified FMRI in the repository's catalog.(RRDR@(RR}R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR@scCsFx?|jD]4}|r4|jr4|j|kr4q n|jq WdS(sDiscards currenty loaded search data so that it will be reloaded for the next search operation. N(RRDR(RR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRscCs|j|}|j|S(sSearches the index for each query in the list of queries. Each entry should be the output of str(Query), or a Query object. (RR(RRR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRscCs`|dkr|jrtS|dkr\|dkr\x$|jD]}|jdkr;tSq;WtStS(sReturns a boolean value indicating whether the specified operation is supported at the given version. RR{ii(R_RXRR?RH(RtopRR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytsupports(scCsr|jrtn|jr*tn|j sC|jdkrOtn|j|j}|j |dS(sUpdates the configuration information for the publisher defined by the provided Publisher object. Only supported for version 4 and later repositories. iN( RCRR^RRR$R)RRR(RR]R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR9s     c Cs|jjdddkrBt|j|jjdddn|j|j}|jjdd}t|jjdd}|jjdd}|jd|d|d |d |d |S( sA generator that verifies that repository content matches expected state for all or specified publishers. 'progtrack' is an optional ProgressTracker object. 'pub' is an optional publisher prefix to limit the operation to. The generator yields tuples of the form: (error_code, path, message, details) where 'error_code' an integer error, correponding to REPO_VERIFY_* 'path' the path to the broken file in the repository 'message' a summary of the error 'details' a dictionary of strings containing more detail about the nature of the error. RxR$istrust-anchor-directoryssignature-required-namesscheck-certificate-revocationRR]R8RR(R|R}R'R_RRRiR;(RRR]RR8RR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR;Ls      c Cs|jjdddkrBt|j|jjdddn|j|j}|jjdd}t|jjdd}|jjdd}|jd|d|d |d |d |d |S( sjA generator that corrects any problems in the repository. 'progtrack' is an optional ProgressTracker object. 'pub' is an optional publisher prefix to limit the operation to. During the operation, we emit progress, printing the details using 'verify_callback', a method which requires the following arguments, progtrack, error_code, message, reason, which correspond exactly to the tuple generated by self.verify(..) This method yields tuples of the form: (status_code, message, details) where 'status_code' an integerstatus code, corresponding to REPO_FIX* 'message' a summary of the operation performed 'details' a dictionary of strings describing the operation RxR$istrust-anchor-directoryssignature-required-namesscheck-certificate-revocationRR]RHR8RR(R|R}R'R_RRRiRM(RRR]RHRR8RR((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRMps      cCs|j|j}|j|S(sCheck that the FMRI supplied as an argument would be valid to add to the repository catalog. This checks to make sure that any past catalog operations (such as a rename or freeze) would not prohibit the caller from adding this FMRI.(RRDRQ(RR}R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRQscCs*|jz|jWd|jXdS(s1Save the repository's current configuration data.N(RqRRs(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt write_configs cCs|jS(N(Rh(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTscCs|jS(N(Rl(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTscCs|jS(N(Ri(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTscCs|jS(N(Ra(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTscCs|jS(N(Rj(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTscCs|jS(N(Rm(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTscCs|jS(N(Rb(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTscCs|jS(N(Rn(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTscCs|jS(N(Rc(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTscCs |jjS(N(Rotvalues(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTscCs|jS(N(Re(R((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRTsN(OR R R RHRRit EmptyDictRRURtEmptyIRRrRqRXRYt_Repository__logt_Repository__set_mirrort_Repository__set_read_onlyRfRgRsRRR5R;RRRR|RcRLRMRXRRR&RRRRRZRRRZR]RRRR^RyR`RRR<RR9R=RRR@RRRRR;RMRQRRR|RR\RRCRR^R_RRa(((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyR\ s   ,     )   0              ( R 9     $( RzcBsteZdZiejdejdejdgejdejdddgddejd ejd ejd ejd ejd ejdejdddejdej dddejdejdg ejdej dejdddejd ejddddgddejddddgddej d dd!ggd"6ejdejdejdgejdejdddgddejd ejd ejd ejd ejd ejdejdddejdej dddejdejdg ejdej dejdddejd ejddddgddejddddgddej d dd!ggd#6ejdejdgejdej d$ej d%dd&ej d'ej d(deggd)6Zd+ejd+d*ZRS(,sReturns an object representing a configuration interface for a a pkg(5) repository. The class of the object returned will depend upon the specified configuration target (which is used as to retrieve and store configuration data). 'target' is the optional location to retrieve existing configuration data or store the configuration data when requested. The location can be the pathname of a file or an SMF FMRI. If a pathname is provided, and does not exist, it will be created. 'overrides' is a dictionary of property values indexed by section name and property name. If provided, it will override any values read from an existing file or any defaults initially assigned. 'version' is an integer value specifying the set of configuration data to use for the operation. If not provided, the version will be based on the target if supported. If a version cannot be determined, the newest version will be assumed. RDRRRxRtcoret supplementaltdefaultRt detailed_urlRt maintainertmaintainer_urlRRspackage repositoryRRi@8RRtfeedtidspackage repository feedticontallowedRs sweb/_themes/pkg-block-icon.pngtlogosweb/_themes/pkg-block-logo.pngtwindowiiiR$strust-anchor-directorys/etc/certs/CA/ssignature-required-namesscheck-certificate-revocationicCsx|s%tjd|jd|d|S|jdrVtj|d|jd|d|Stj|d|jd|d|S(Nt definitionsRwR$ssvc:(R|tConfigt_RepositoryConfig__defsRt SMFConfigR(tclsRvRwR$((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyt__new__!s  N(R R R R|tPropertySectiont PropPublishert PropDefinedt PropPubURItPropSimplePubURIListtPropInttPropUUIDtPropertytPropListtPropBoolRHRRRiRR(((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyRzs                                       "c Cst|tr*tjtj|}n|j}|sQtt|n|d k r|dksu|t krt nyt j |tjWntk r}|j|kr|jtjkst jj|jrt j|j}|r|dgk rt|jqq|jtjkrDtj|jq|jtjkrktj|jq|jtjks|j|krqnX|dkrx*dD]"}tj t jj||qWy8tt jj|d d }|jd Wd QXWqtk r}|jtjkr@tj|jn|jtjkrgtj|jq|jtjkrqqXntd t dt!d|d|S(s'Create a repository at given location and return the Repository object for the new repository. If a repository (or directory at the given location) already exists, a RepositoryExistsError will be raised. Other errors can raise exceptions of class ApiException. is.zfsR{R&R%RKRRfRuRs NR]R^R^R_(scatalogsfilesindexspkgstransstmp("Rt basestringRDt RepositoryURIRit parse_urit get_pathnameRRRRR)RQRjRRmRrRnR{RRRRR RoRpRqRsRtRSR&RR\RXRH(trepo_uriR^R$RRRvtentriesR|tcf((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pytrepository_create,sN   !!    ! (sRCRRRnRXRQtos.pathRRRRkRRtM2CryptoR/t pkg.actionsRt pkg.catalogR{tpkg.client.api_errorstclientt api_errorsRptpkg.client.progressR~tpkg.client.publisherRDt pkg.configtconfigR|t pkg.digestRltpkg.file_layout.file_managerR[R*tpkg.file_layout.layoutRtpkg.fmriRt pkg.indexerRt pkg.lockfileROt pkg.manifestRKtpkg.p5iRVt pkg.portableRtpkg.miscRit pkg.nrlocktpkg.search_errorst search_errorsRtpkg.query_parsert query_parserRtpkg.server.catalogtserverRAtpkg.server.query_parserRNtpkg.server.transactiont transactionRtpkg.pkgsubprocesst pkgsubprocessRt pkg.versionRRRRRRRRRRRRDRGt pkg.pkggzipRRRR RRRRRRRRRRRRRR R!R"R'R)R*R+tobjectR,R\RzRRR(((s;/usr/lib/python2.7/vendor-packages/pkg/server/repository.pyts                            u