ó ÒR4Sc@s ddlZddlZddlZddlmZejZddljjZddl j Z ddl j Z ddl jZyddlZWn5ek rÃyddlZWnek r¿nXnXdefd„ƒYZdefd„ƒYZdeƒkreZndS(iÿÿÿÿN(tglobal_settingstBootEnvcBsLeZdZdd„Zdd„Zd„Zed„Zd„Z e d„ƒZ e d„ƒZ e d„ƒZ e d „ƒZe d „ƒZe d „ƒZe d „ƒZe ed „ƒZe d„ƒZe d„ƒZe d„ƒZe d„ƒZdd„Zdd„Zd„Zed„Zd„Zd„Zd„Zd„ZRS(s¡A BootEnv object is an object containing the logic for managing the recovery of image-modifying operations such as install, uninstall, and update. Recovery is only enabled for ZFS filesystems. Any operation attempted on UFS will not be handled by BootEnv. This class makes use of usr/lib/python*/vendor-packages/libbe.py as the python wrapper for interfacing with libbe. Both libraries are delivered by the install/beadm package. This package is not required for pkg(1) to operate successfully. It is soft required, meaning if it exists the bootenv class will attempt to provide recovery support.c CsÏd|_d|_d|_d|_d|_||_t|_t|_ d|_ ||_ |jj ƒ|_ d}|j dks‡t‚|jdtƒ|_x,t|jƒD]\}}|jdƒ}| s¬|jdƒ räq¬n|j dkr|jdƒsq¬q2t|_n|jdƒ|j kr2q¬n||_|jdƒ|_tj|jƒ\}}tjƒ|_|dkr˜||_ ||j_ntjtd ƒƒtd ‚t|_ Pq¬Wtd ‚dS( Nit raise_errort orig_be_nametmountedt/tactivet mountpointtdatasetsApkg: unable to create an auto snapshot. pkg recovery is disabled.trecoveryDisabled(tNonetbe_nameRt be_name_clonetbe_name_clone_uuidt clone_dirtimgtFalset is_live_BEtis_validt snapshot_nametprogress_trackertget_roottroottAssertionErrort get_be_listtTruetbeListt enumeratetgettbetbeCreateSnapshotttempfiletmkdtempthistorytoperation_snapshottloggerterrort_t RuntimeError( tselfRRtrctitbeValsR terrR((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyt__init__BsH                 c Csv|j}|r||7}n|jdƒ\}}}|rà|jƒràt|ƒ}|}x‘|jD]w}|jddƒ}|s†qbn|jdƒ\} }} | sb| |ksb| jƒ rÄqbntt| ƒ|ƒ}qbWn |}d}t} |} xw| sqdj |t | ƒfƒ}xE|jD]4}|jddƒ}|sJq&n||kr&Pq&q&Wt } | d7} qûW|S(s#Create a new boot environment name.t-RiiN( R t rpartitiontisdigittintRRR tmaxRtjointstrR( R'tsuffixt new_benametbasetseptrevtmaxrevtdtobentnbasetnrevtgoodtnum((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyt__get_new_be_name•s>      cCs|jjjƒdS(s§Internal function used to preserve current image information and history state to be restored later with __reset_image_state if needed.N(RR!tcreate_snapshot(R'((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyt__store_image_stateÆscCsu|js dS|j|jjkra|r;|jjjƒn|jjjƒ|jj|jƒn|jjjƒdS(s§Internal function intended to be used to reset the image state, if needed, after the failure or success of boot environment operations.N(RRR!trestore_snapshottdiscard_snapshott find_root(R'tfailure((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyt__reset_image_stateÐs cCs|jS(s1Return true if this object represents a valid BE.(R(R'((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pytexistsîscCstS(N(R(((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyt libbe_existsôscCs ttdƒS(NtbeVerifyBEName(thasattrR(((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyt check_verifyøscCsF|jdƒ}||jdƒ|jdƒ|jdƒ|jdƒfS(NRRt active_boott space_usedtdate(R(tbeetname((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pytsplit_be_entryüscCstj||ƒS(N(RtbeRename(t orig_nametnew_name((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyt rename_bescCstj|dtƒS(Ni(Rt beDestroyR(R ((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyt destroy_bescCs tj|ƒS(N(Rt beActivate(R ((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pytset_default_be scCs–yo|dkrdStj|ƒdkr:tj|ƒ‚ntjƒ}|d„|Dƒkrntj|ƒ‚nWn tk r‘tj |ƒ‚nXdS(Nicss|]}|jdƒVqdS(RN(R(t.0R((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pys s( R RRJt api_errorstInvalidBENameExceptionRRtDuplicateBENametAttributeErrortBENamingNotSupported(R R((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyt check_be_names   cCs…dtjkrtjƒSd}tjƒ}t|dtƒrM|\}}n|}| sf|dkr|rxtd‚ng}n|S(NtPKG_NO_LIVE_ROOTitnobootenvironments( tostenviront BootEnvNullRRRt isinstanceR0R&(RR(R*R((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyR s    cCs£tjƒ}x|D]ˆ}|jdƒ}|jdƒ}| s|jdƒ rTqn|dkr||jdƒr›||fSq|jdƒ|kr||fSqWdS( ssLooks for the name of the boot environment corresponding to an image root, returning name and uuid Rtuuid_strRRRRN(NN(RRRR (tpathRRR tbe_uuid((s8/usr/lib/python2.7/vendor-packages/pkg/client/bootenv.pyt get_be_name:s    cCsCtjƒ}i}x*|D]"}|jdƒ||jdƒs*      ÿÿ~^