ó eRc@srddlZddlZddlZddlZddlZddlZddlZddlZddlj Z ddl j Z ddl j Z ddlZddljZddljZyddljZeZWnek réeZnXdefd„ƒYZdefd„ƒYZdefd„ƒYZdefd „ƒYZd efd „ƒYZd e fd „ƒYZ!dS(iÿÿÿÿNtTransactionErrorcBs)eZdZd„Zd„Zd„ZRS(s4Base exception class for all Transaction exceptions.cGs3tj||Œ|r&|d|_n d|_dS(Ni(t Exceptiont__init__tdatatNone(tselftargs((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR4scCs t|ƒS(N(tstr(R((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyt __unicode__;scCs t|jƒS(N(RR(R((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyt__str__As(t__name__t __module__t__doc__RRR (((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR1s  tTransactionContentErrorcBseZdZd„ZRS(sxUsed to indicate that an unexpected error was encountered while processing the payload content for an operation.cCstdƒ|jS(Ns:Unrecognized or malformed data in operation payload: '%s'.(t_R(R((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR Is (R R R R (((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR EstTransactionOperationErrorcBs eZdZd„Zd„ZRS(slUsed to indicate that a Transaction operation failed. Data should be provided as keyword arguments.cOs2tj||Œ|dkr%i}n||_dS(N(RRRt_args(RRtkwargs((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyRSs  cCs&d|jkr,tdƒ|jjddƒSd|jkrXtdƒ|jjddƒSd|jkr„td ƒ|jjddƒSd |jkr°td ƒ|jjddƒSd |jkrÜtd ƒ|jjddƒSd|jkrõtdƒSd|jkrtdƒ|jdSt|jƒS(Ntclient_releases-The specified client_release is invalid: '%s'tmsgtt fmri_versions2'The specified FMRI, '%s', has an invalid version.tpfmritvalid_new_fmris@The specified FMRI, '%s', already exists or has been restricted.tpublisher_requireds¬The specified FMRI, '%s', must include the publisher prefix as the repository contains package data for more than one publisher or a default publisher has not been defined.t missing_fmris8Need an existing instance of %s to exist to append to ittnon_sigs7Only a signature can be appended to an existing packages%The specified FMRI, '%s', is invalid.(RRtgetRR(R((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR Ys,         (R R R RR (((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyRNs tTransactionUnknownIDErrorcBseZdZd„ZRS(s>Used to indicate that the specified transaction ID is unknown.cCstdƒ|jS(Ns/No Transaction matching ID '%s' could be found.(RR(R((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR ys (R R R R (((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyRvstTransactionAlreadyOpenErrorcBseZdZd„ZRS(s<Used to indicate that a Transaction is already open for use.cCstdƒ|jS(Ns$Transaction ID '%s' is already open.(RR(R((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR s(R R R R (((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR~st TransactioncBs†eZdZd„Zd„Zd„Zd„Zd„Zed„Z d„Z d„Z d d „Z ed „Zed „Zd „ZRS(sûA Transaction is a server-side object used to represent the set of incoming changes to a package. Manipulation of Transaction objects in the repository server is generally initiated by a package publisher, such as pkgsend(1M).cCs|d|_d|_d|_d|_d|_d|_d|_t|_ t|_ t|_ t ƒ|_ t|_d|_dS(NRi(Rt open_timetpkg_namet esc_pkg_nametrstoreRtfmritdirtFalsetobsoletetrenamedt has_reqdepstsett types_foundt append_transtremaining_payload_cnt(R((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR‹s            cCsD|jst‚dtj|jjƒƒtjt|jƒdƒfS(Ns%d_%sR( RtAssertionErrortcalendarttimegmt utctimetupleturllibtquoteRR#(R((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyt get_basename›sc CsZ||_|dkr-tddd|ƒ‚n|dkrKtddƒ‚nt|tƒsit|ƒ}n||_||_tj |dƒ|_ yt j |j|jƒ|_ Wn"t j k rÓ}t|ƒ‚nX|j jdkrþtddd|ƒ‚n|j jsŸ|j}|s1tdtd|ƒ‚n||j _|j}d|}|jdƒsl||}n|jd|ƒ}||_tj |dƒ|_ n|j jƒ|_|jrôdj|jdƒd ƒ|_tj |jdƒ|_ nWxTtjjƒ|_|j j|jƒ|j}|j|j ƒs;Pntjd ƒq÷|jj|j ƒsxtd td|ƒ‚n|j ƒ} t!j"j|jj#| ƒ|_$yt!j%|j$t&j'ƒWn@t(k rþ}|j)t)j*krït+| ƒ‚nt|ƒ‚nXt!j"j|j$d ƒ} t,| d ƒ} t-j.d|j ƒ} | t| ƒIJ| j/ƒdS(NRRRRRs pkg://%s/spkg:/t:iÿÿÿÿgÐ?Rtmanifestsab+sset name=pkg.fmri value=%s(0R"RRt isinstancet basestringRRR R1R2R!R#tPkgFmrit FmriErrortversiont publishertTruet startswithtreplacet get_timestampRtjointsplittdatetimetutcnowt set_timestamptcatalogt get_entryttimetsleepRR%R3tostpatht trans_rootR$tmakedirstmisct PKG_DIR_MODEtEnvironmentErrorterrnotEEXISTRtfiletactionstfromstrtclose( RR"RRtet default_pubR t pub_stringtcatttrans_basenamettfpathttfiletfact((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pytopen¢sx                       c Cs||_t|_|dkr6tddd|ƒ‚n|dkrTtddƒ‚nt|tƒsrt|ƒ}n||_||_ t j |dƒ|_ yt j|j |jƒ|_ Wn"t jk rÜ}t|ƒ‚nX|j jdksÿ|j jƒ rtddd|ƒ‚n|j js¸|j}|sJtdtd|ƒ‚n||j _|j }d|}|jdƒs…||}n|jd|ƒ}||_ t j |dƒ|_ n|j jƒ|_dj|jdƒd ƒ|_ t j |j dƒ|_ |j|j ƒs.td td|j ƒ‚n|jƒ}tjj|j|ƒ|_ytj|jtj ƒWn@t!k r±}|j"t"j#kr¢t$|ƒ‚nt|ƒ‚nXt%tjj|jd ƒd ƒ} WdQXt&j'|j(|j ƒtjj|jd ƒƒdS(NRRRRRs pkg://%s/spkg:/R4iÿÿÿÿRtappendtwbR5()R"R<R+RRR6R7RRR R1R2R!R#R8R9R:R?R;R=R>RR@RAtvalid_append_fmriR3RIRJRKR$RLRMRNRORPRQRR^tportabletcopyfileR5( RR"RRRVRWR RXRZtfh((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR_sh         "            $c Cs7||_y+tjj|ƒjddƒ\}|_Wn)tk r_ttjj|ƒƒ‚nXtjj t |ƒƒ|_ t j |jƒ|_tj|jdƒ|_tjj|j|jƒƒ|_tjj|jƒsót|jƒƒ‚nd}|js|d7}ny+tjj|jdƒ}t||ƒ}Wn,tk rh}|jtjkrbdS‚nXtjjƒ}|jd|j ƒƒ|j!ƒtjjtjj|jdƒƒrÈt"|_#n|j$d d ƒ|_%|j$d d ƒ|_&t'd „|j(ƒDƒƒ|_)t*d „|j+dƒDƒƒ|_,dS(sdThe reopen() method is invoked by the repository as needed to load Transaction data.Ritrbt+R5NtcontentR_s pkg.obsoletetfalses pkg.renamedcss|]}|jVqdS(N(tname(t.0taction((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pys “scss"|]}|jddkVqdS(ttypetrequireN(tattrs(Rjta((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pys –stdepend(-R"RIRJtbasenameRAR!t ValueErrorRRBtutcfromtimestamptintRR1tunquoteR R#R8RR@RKR3R$texistst read_onlyRRtIOErrorRPtENOENTtpkgR5tManifestt set_contenttreadRUR<R+tgetboolR&R'R)t gen_actionsR*tanytgen_actions_by_typeR(( RR"t trans_dirt open_time_strttmodeR[R\RVtm((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pytreopencsD +  !   $ cCs¢d„}|jƒ}||ƒd}d}|jrL|j|ƒ\}}n|j|ƒ\}}ytj|jƒWn tk r—}tj |ƒnX||fS(sžCloses an open transaction, returning the published FMRI for the corresponding package, and its current state in the catalog. cSs7tjd|ƒ}|jdƒtj|jdƒƒfS(Ns (\d+)_(.*)ii(tretmatchtgroupR1Ru(ttidR…((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pytsplit_trans_idžsit SUBMITTED( R3R+t accept_appendtaccept_publishtshutiltrmtreeR$RORMtemsg(Rtadd_to_catalogR‹ttrans_idtpkg_fmrit pkg_stateRV((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyRUšs   cCsXytj|jƒWn=tk rS}|j|jkrT|jtjkrT‚qTnXdS(Nt ABANDONED(RRR$ROtfilenameRPRy(RRV((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pytabandon¹s $ c Cs¶y|jƒWn"tjk r2}t|ƒ‚nX|jr]|jdkr]tdtƒ‚nt|jj ddƒƒ}|j rœ|dkrœd„|_ n|j d,k rYt j|j ƒd|dtdtjd tjƒ\}}|jd d,ƒ|_|jj|ƒtj|ƒ\}}}|} tr¡|d d kr¡tjj|jd | ƒ} t| dƒ} | j|ƒ| jƒytj| ƒ} Wn"tj k r¶}t!|ƒ‚nXy›d} d}| tj"krÞt}nt#}|tj"krüt}nt#}tj$| d|d|ƒ}|r7|||j|Ôstlengthtreturn_contentt hash_attrst hash_algsthashisELFs.temp-%sR`spkg.content-type.sha256telfhashtsha1tsha256tbitstelfbitstarchtelfarchRRs pkg.csizes chain.sizesR)Ris pkg.obsoletetvaluettruesLAn obsolete package cannot contain actions other than 'set' and 'signature'.s pkg.renamedRpsUA renamed package cannot contain actions other than 'set', 'depend', and 'signature'.RlRms>A package may not be marked for both obsoletion and renaming.sHA '%(type)s' action cannot be present in an obsolete package: %(action)sRksFA '%(type)s' action cannot be present in a renamed package: %(action)sR5sab+N(ssetR™(sdependssetR™(ssetR™(sdependssetR™(8tvalidateRSt ActionErrorRR+RiR<RtRnRt has_payloadRRRMtget_data_digesttdigesttDEFAULT_HASH_ATTRSt HASH_ALGStpopR tupdatetget_least_preferred_hashthaveelfRIRJR@R$R^twriteRUtelftget_infotElfErrorR tDEFAULT_CONTENT_HASH_ATTRSR%t get_dynamicRtunlinkR"RRRtgetattrtcompute_compressed_attrst hexdigesttlenRAR,R&R*t differenceR)RR'R(tadd(RRkRVtsizethashesRt hash_attrthash_valt hash_functfnametelf_nametelf_filetelf_infotelf256telf1t get_sha256tget_sha1tdyntdst_pathtcsizetchashestattrtchashR[R\((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyt add_contentÂsÆ               $            c Cstj|d|dtdtjdtjƒ\}}|d krNt|ƒ}ny3tjd ƒd}||}|j j |ƒ}Wn7t k rº}t |ddƒ|kr±‚nd }nXtj |||||jdtjd tjƒ\} } d } d }|jd 8_d S( s!Adds the file to the Transaction.RœRRžRŸiRRt chash_attrst chash_algsiN(RMR­R<R®R¯R°RR¿R³R"RRRR¼R½R$tDEFAULT_CHASH_ATTRSt CHASH_ALGSR,( RtfRÂRÃRtdefault_hash_attrRÇRÐRVRÑRÒ((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pytadd_filees*      cCsa|jr(|j r(ttdƒƒ‚n|jƒ|rN|jj|jƒnt|jƒdfS(szTransaction meets consistency criteria, and can be published. Publish, making appropriate catalog entries.s<A renamed package must contain at least one 'depend' action.t PUBLISHED( R'R(RRtpublish_packageR"t add_packageR#R(RR’((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyRŽ…s  cCs…|jr(|j r(ttdƒƒ‚n|jdkrLttdƒƒ‚n|jƒ|rr|jj|jƒnt |jƒdfS(sTransaction meets consistency criteria, and can be published. Publish, making appropriate catalog replacements.s<A renamed package must contain at least one 'depend' action.isIAt least one certificate has not been delivered for the signature action.RÝ( R'R(RRR,RÞR"treplace_packageR#R(RR’((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR˜s cCsÃ|jj}tjj|jdƒ}|jj|jƒ}tj tjj |ƒƒt j ||ƒxZtj |jƒD]F}|dkrquntjj|j|ƒ}|jjj||ƒquWdS(sIThis method is called by the server to publish a package. It moves the files associated with the transaction into the appropriate position in the server repository. Callers shall supply a fmri, repo store, and transaction in fmri, rstore, and trans, respectively.R5R_N(R#R RIRJR@R$R"R5RMRLtdirnameRbtrenametlistdirt cache_storetinsert(RR t src_mpatht dest_mpathRÚtsrc_path((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyRÞ±s  N(R R R RR3R^R_R†R<RUR˜RÕRRÜRŽRRÞ(((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyR…s   q P 7  £  ("R.RBRPRIR‡RRGR1t pkg.actionsRSt pkg.digestR®tpkg.fmriR#t pkg.manifestRztpkg.miscRMt pkg.portableRbtpkg.elfR¶R<R´t ImportErrorR%RRR RRRtobjectR(((s</usr/lib/python2.7/vendor-packages/pkg/server/transaction.pyts0             (