i'dWc@sdZddkZddkZddkZddkZddkZddklZddkl Z ddk l Z l Z l Z lZddklZddklZlZlZlZddklZdd klZdd klZdd klZdd kl Z l!Z!l"Z"l#Z#dd k$l%Z%ddk&l'Z'l(Z(ddk)l*Z*l+Z+l,Z,l-Z-l.Z.dZ/dZ0dZ1de2fdYZ3de2fdYZ4defdYZ5dei6fdYZ7dS(s>Transfer ARCHIVE checkpoint. Sub-class of the checkpoint classiN(t LooseVersion(tsleep(tApplicationDatatPopentCalledProcessErrortrun(tUnifiedArchive(ttrusted_enabledtpkg_get_publisherst SystemInfotcurl_build_credential_opts(tBootMods(t InstallEngine(tAbstractCheckpoint(tTarget(t ArchiveSpectFiletSoftwaretSource(tALT_POOL_DATASET(tbe_listtbe_mount(tBE_NAMEt BE_MOUNTPOINTtBOOT_ENVIRONMENTt FilesystemtZpools /usr/bin/pkgs /usr/sbin/zfss/usr/sbin/zpooltArchiveTransferErrorcBseZdZddZRS(s>Exception raised when Archive Transfer fails unexpectedly cCstt|id|dS(NsArchive Transfer Error: %s(tsuperRt__init__(tselftmsg((s ../archive.pyR>sN(t__name__t __module__t__doc__tNoneR(((s ../archive.pyR:stArchiveTransformErrorcBseZdZddZRS(sFException raised when Archive Transform is invalid or unsupported cCstt|id|dS(Ns!Archive Transform unsupported: %s(RR$R(RR((s ../archive.pyRGsN(R R!R"R#R(((s ../archive.pyR$CstTransferArchivecBs eZdZhdd6ed6ZdZdZdZdZ dZ dZ ee e e gZ d Z d Zd Zd Zd ZdZddZdZdZedZdZdZdZdZdZdZdZdZdZdZ dZ!RS( sfARCHIVE Transfer class to take input from the DOC. It implements the checkpoint interface. tzonenamet show_stdouttgzipstransform-typesglobal-to-globalsglobal-to-nonglobalsnonglobal-to-globalsnonglobal-to-nonglobalsorg.opensolaris.libbe:activesorg.opensolaris.libbe:parentbesorg.opensolaris.libbe:uuidscom.oracle.libbe:nbe_handletzonedscom.oracle:boot-pools/acCs tt|i|||_d|_d|_d|_d|_d|_ g|_ d|_ d|_ t |_d|_t|_t |_t |_tii|_|iidt|_|iid|idtdtd|_d|_d|_d|_ dS(Nit class_typetnametnot_found_is_err(!RR%Rt_be_mountpointR#tarchivettransformationt_deployable_objt_deployable_obj_namet _active_be_dst _transfer_opstsrct _app_datatFalset give_progresst _progress_pcttdictt_pool_space_usetdry_runt _cancel_eventR t get_instancetdata_object_cachet_doctget_descendantsRt soft_listR+tTruet soft_nodetalt_pool_datasett root_poolt _origin_rpool(RR+t be_mountpoint((s ../archive.pyRks.                cCs t|_dS(sCancel the transfer in progressN(RBR<(R((s ../archive.pytcancelscCs|io|indS(sCheck to see if a cancel event of the transfer is requested. If so, cleanup changes made to the system and raise an exception. N(R<t_cleanup(R((s ../archive.pytcheck_cancel_events cCs|iid|iz\|io|iiddn||_|i|iid|i|iWd|i XdS(sExecute method for the ARCHIVE transfer checkpoint module. Will read the input parameters and perform the specified transfer. s=== Executing %s Checkpoint ===sBeginning archive transferisTransfer archiveN( tloggertdebugR+R7treport_progressR;t _parse_inputt _transferRJRI(RR;((s ../archive.pytexecutes    cCst|_d}|S(sNReturns an estimate of the time this checkpoint will take. i,(RBR7(Rtprogress_estimate((s ../archive.pytget_progress_estimates cCs2|iidx|iD]}|iqWdS(s/Method to perform any necessary cleanup needed.s Cleaning upN(RKRLR3tcleanup(Rttransfer((s ../archive.pyRIs cCs|iid|iiidt|_|iiiti}|pt dn|i dt dddt }g}|D]}|i o ||qq~}|pt dn|d|_|io|iiit|_n|i|i|id S( scMethod to read the parameters from the DOC and place them into the local lists. sParsing the Data Object CacheR*s#No desired target tree found in DOCt max_depthiR,sNo root Zpool specified in DOCiN(RKRLR?t persistenttget_first_childRR5RtDESIREDt RuntimeErrorR@RRBtis_rootREt data_dicttgetRRDt _parse_srct_parse_transfer_nodet_parse_unified_archives(Rttargettzpoolst_[1]tpooltrpools((s ../archive.pyRNs$ /     cCsm|iidt}|djotdn|idjotd|in|id|_dS(sParse the DOC for the attributes that are specific for each transfer specified. Create a list with the attributes for each transfer. R*s'No Archived deployable system specifiedtinstalls/'%s' is not a valid action for unified archivesiN(RCRWRR#t ValueErrortactiontcontentsR1(RRT((s ../archive.pyR^s cCs|iid|iitit}|djotdn|iti t}|djotdn|i |_ dS(s$Parse the DOC Source object sReading the ARCHIVE sources*One ARCHIVE image source must be specifieds%An ARCHIVE file URI must be specifiedN( RKRLRCRWRt SOURCE_LABELR#RfRt FILE_LABELtfile_uriR4(Rtsourcetua_file((s ../archive.pyR]s  c!Cs:|iid|iidt}x/|D]'}|i|ijo||_Pq,q,W|iptd|inx|ii D]*}|i i |i jo||_ PqqW|i djoPt|ii djpt|ii d|_ |ii di i |_ ntd|i |if|i iitijo,td|i i i |i iifn|i i}|iid tg}|D]}||iq~td |D}t}|i d jo0|id joti|_qti|_ny|id jo6|i i id joti|_qti |_n3|i i id joti|_n ti!|_|i|i"i#ti$<|iti!tigjoQt%d i&i'} |i ii&i'} t(| t(| jotd qn|i ii)o\|ititi gjotdn|i i i* ot+ otdqn|i i idjo#|iti jotdn|iti jo9x6|i,D]} | i-djoPqqWtdn|ii.i/t0i1} g} | idt2dddt3D]}|i4o | |q@q@~ d|_5|iti!tigjo||i"i#d}x|D]]}||i5i joqn|i6|}|d jotd|n|i7|qWn9g}|D]$}||i5i jp ||qq~}|ii.i/t0i8}|idt2dddt3}g}|D]}|i4p||i q|q|~}x/|D]'}||jotd|qqWx^|D]V}|i9d ti:gjo td|i9|ifn|i;|i5i jo|i<i }n<|iti!tigjo|i6|i;}n |i;}|i=i6|d jod|i=|7:s tglobals solaris-kzsAArchive and host versions incompatible: archive version is highers6Transforms of Trusted Solaris archives are not allowedsJDeploying labeled zone failed: Trusted Solaris must be enabled in the hostt solaris10s9Transforms of 'solaris10' brand zone archives not allowedtIPSsoIPS publishers are required for nonglobal-to-global transform deployments. Please provide an IPS specification.RUiR,t delegationss;Could not identify required delegated dataset for pool '%s'sGUnified archive stream can not be received. Missing required zpool '%s'sKUnexpected archive stream compresssion type type '%s' in archive stream: %stssl_keytssl_certtca_certthttp_auth_tokenR;N(HRKRLR?R@RtpathR4R.RYtarchive_objectstzoneR+R1R0tlentAssertionErrortsystemtarchtplatformt processorRft zfs_streamststrtsnapshottsetRDR#R%t TRANSFORM_G2GR/tTRANSFORM_G2NGtbrandtTRANSFORM_NG2GtTRANSFORM_NG2NGR5R[tTRANSFORM_TYPER t os_versiontbranchRttrustedt is_globalRRAt tran_typeRVRWRtORIGINRRBRZRFR\taddRXt compressiontCOMPRESSION_GZIPRoRER:tspacetTransferArchiveStreamt credentialstkeytcerttcacertRyR;R3tappend(Rt uarchivestuarchivetarch_objt stream_listRbRqt stream_poolstrequired_poolsthost_ost archive_ostswtorigint_[2]RcRut pool_nametdelegated_datasett_[3]R`Rat_[4]tavailable_poolst required_poolttarget_pool_nameRT((s ../archive.pyR_ s          +        %  '2      cCs|iidt}t}d}d}|i o{|ioqxn|iiD]Y\}}tdddddd|g}t|}t |i }|||<||7}qSWnt } x(|i D]} | i | i| qWt} d} xp| oh|io t} n| } x| D]} | oPn| ipx| i| | idjoW|iid | ii| i|iid | i|iid t} | } Pqq q W| o'x| D]} t| _qWt } n|i od|ioZx|iiD]\}}tdddddd|g}t|}t |i }|||}d ||}|d joqn|i| p|||jo(|||<|iid|||qqWd}x/|iiD]\}}||||7}qW||}d |jo |ijno |iid|||_qXntdqW| o.|ii d| ot!| iqn|ii d|i"dS(s1Execute and monitor the Archive transfer sTransferring Archive inputiR\s-Hs-ps-otvaluetuseds.Stream '%s' transfer from archive '%s' failed.s Reason: %ssTerminating all other transfersidicsProgress of %s: %d%%sTransferring contentsisArchive transfer canceledsArchive transfer completedN(#RKRLR9R;R7R:titemstZFSRtlongtstdouttlistR3tstartRR6R#R<RBtis_alivetremovet returncodeterrorRqRturitstderrtkillR\R8RMRtinfoRt_setup_bootenv(Rt initial_usedt received_pctt total_spacet target_nameRtcmdtused_cmdRtactive_transfersRTtcancel_transferst bad_transfert transferstaddedtpercenttweighted_pct_multpt weighted_pct((s ../archive.pyROs                         ! c Csd}|iid|ii}|ii|iijoH|idjo|iid}n|id}||ii}||ii|_ |ii djo,t i d|i }|dj oPt t|idd}|id||_ tii|i }nMt i d|i o|i d 7_ |d 7}n|i d 7_ |d 7}|iid t}|p)ttig}|iii|n|didjo||d_qn|i |iid } | dt-jo't)| d} | i.t&i/}PqqWt$dt,d|i}d}|i%t&i'jofxc|D]>}|d|jo't)|d}|i.t&i0}PqQqQWt$d||ifnx|D]}t)|d}|i1t&i/|i| p||i.t&i0jo|i*t&i0||in|i.t&i0|joK|d|jo|i*t&i2d|iq|i*t&i2d|iqqWn|ipK|iot)|i}nt)|ii}|i1t&i3|i|i%t&i4jo|i5n|idj ot6||i7d|int6||i7d|ii|i%t&i4t&i8gjo:t)|ii}|i.ddjo|i9qn|i%t&i4jo|i:q|i%t&i(jo|i;qnh|t<6|i7t=6|iit>  -     !   c  2RcBskeZdZdZdZdZdZd d d d edZ dZ dZ dZ d Z d ZRS( sArchive dataset stream transfer class. Handles transferring and receiving an archive stream from local file and remote http[s] paths onto a local ZFS dataset. Runs specified transfer in a separate thread. s /usr/bin/curls/usr/bin/gzcats /usr/sbin/zfsic Cs*tt|i| |_||_t|_||_||_||_ ||_ | |_ ||_ ||_ ||_d|_t|_d|_|id|_d|_t|_t|_|itijotd|ing|_g|_g|_|io|in |idS(sClass constructoris+'%s' is not a valid archive transform valueN( RRRR;RR6t _completedt_loggert_ssl_keyt _ssl_certt_ca_certt_http_auth_tokentrecipient_datasetRqRR#tcreated_snapnamet_clone_transfert_clone_stagingt_check_clone_transferRRRtrunningR%RRft _recv_cmdt _curl_cmdt_uncompress_cmdt_init_clone_cmdst_init_archive_cmds( RRRRqRRKRvRwRxRyR;((s ../archive.pyRs:                       cCsT|iitdg|ititigjo$|iid|iidn=|ititi gjo|iidn t d|ii|i |i it i|i idti|iidjp|idj o/|i it|i|i|i|in|iitijo|iit indS(sNInitialize the set of command lines used for Unified Archive transfer treceives-Fs-ds$unable to determine transform actions-sSthttpsN(R%textendRRR%RRRRRR$RR&RtCURLturlparseRtschemeRR#R RRRRqRRR'tGZCAT(R((s ../archive.pyR)s*     cCs#|iitdd|igdS(sIInitialize the ZFS command line used for direct clone deployment R*s-FN(R%R,RR(R((s ../archive.pyR(scCs|tii}xf|idtD]R}|iidjo6t|_|idt dddtdi |_ Pq"q"WdS(s:Check for direct clone transfer, initialize state if foundR*tCLONERUiR,iN( R R=tdocR@RRtupperRBR!Rt _staging_dirR"(RR2R((s ../archive.pyR#s c Cs|ipdS|iiiddd}|id|}|iid||ipti i }|i dt dddd}|o|d i id }|dj oYt|}t|id }|io*|iid |i|id tq q ntdd|g}yt|Wqtj o} tddddd|g} xtdD]x} |iid|y>t| |iid||iid|t|Wntj otdqhXPqhW| qXndS(sRecursively deletes the archive stream snapshots that get created as a result of successfully receiving the snapshot stream Nt@is'Destroying received snapshots under: %sR*RUit max_countiRtrollbacks Destroying rollback snapshot: %sR;tdestroys-rRs-Hs-oR+s -tsnapshoti s!Checking for received snapshot %ssLocated snapshot %ssDestroying received snapshot %s(RRqRRRRRLR;R R=R2R@RR[R\R#RtsnapnameRt full_nameR8R6RRRRR( Rt snaplabeltcreated_snapshotR2tapp_datatactive_datasettbe_dstrb_snapt destroy_cmdtcpetcheck_snapshotR((s ../archive.pyRSsP              c CsL|iid|ii|id}d}|i oE|io;t|ii djpt zt i i |i|ii di}t i|t i}ti|id|dti}|iid|ii|i|i|iidWd|dj oN|idjo:|idjo'|iid |ii|iqVnX|iid |ii|idSz|ipOt|idtidti}t|idtid |idti}nxqt|ii D]]\}}|i}|i|id}d ||f} |i } | i!| |ig|iid |dt|ii |i|i|||ipt| d |idti} xW| idjoC|i"o+|iid|i|i| idSt#dqW| idjo| i$i%} | it&i'jo|idj oL|idjo8|ii(d|i|i|_|i$i%|_$qq|idj oL|idjo8|ii(d|i|i|_|i$i%|_$qqn| |_$| i|_|iid|i|idS|iid|i|iqqW|iid|ii|it)|_*Wd|dj o[|ii+|idjo:|idjo'|iid|ii|iqn|dj o[|ii+|idjo:|idjo'|iid |ii|iqGnXdS(s4Executes the dataset stream transfer in a new threads'Commencing transfer of stream: %s to %siitstdinRsStreaming %s to %ssStream completeNsKilling stream receiver for %ss1Completed transfer of direct stream: '%s' from %sRs-r %s-%ss?Transferring stream file [%d/%d]: '%s' from %s (range: %d - %d)s0Terminating transfer of stream file '%s' from %ss#Error receiving ZFS stream file: %ss'Error decompressing ZFS stream file: %ss,Failed transfer of stream file: '%s' from %ss/Completed transfer of stream file: '%s' from %ss*Completed transfer of stream: '%s' from %ss"Killing stream uncompressor for %s(,RRRqR+RR#R;R!R}tfilesR~RRzRR"topentO_RDONLYRt check_callR%tPIPERLtwaitRtpollt terminateRR'RDt enumeratetoffsettsizeR&R,RRRtreadRtCURL_WRITE_ERRRRBRtclose( Rtreceivert uncompressort stream_fifotfdtindext streamfiletlothit range_argtcurl_cmdtcurlert curler_err((s ../archive.pyR8s      #                             #    #  N(R R!R"R-R0RRQR#R6RR)R(R#RSR(((s ../archive.pyRs ' )  >(8R"RRRt threadingR.tdistutils.versionRttimeRtsolaris_installRRRRtsolaris_install.archiveRtsolaris_install.archive.utilRRR R tsolaris_install.boot.boot_specR tsolaris_install.engineR t!solaris_install.engine.checkpointR t Checkpointtsolaris_install.targetRtsolaris_install.transfer.infoRRRRt)solaris_install.target.instantiation_zoneRtsolaris_install.target.libbeRRtsolaris_install.target.logicalRRRRRR RRt ExceptionRR$R%tThreadR(((s ../archive.pyts8     """(  B