Ñò i'dWc@sadZddkZddkZddkZddkZddkZddkZddkZddki Z ddk l Z ddk l Z lZlZlZlZlZlZlZlZlZlZlZlZddklZddklZlZddkl Z ddk!l"Z"dd k#l$Z$dd k%l&Z'dd k(l)Z)l*Z*dd k+l,Z,dd k-l.Z.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7de8fd„ƒYZ9de8fd„ƒYZ:de:fd„ƒYZ;de:fd„ƒYZ<de:fd „ƒYZ=d!e=fd"„ƒYZ>d#„Z?d$„Z@d%„ZAd&„ZBd'„ZCd(„ZDdS()s archiveadm create-media iÿÿÿÿN(t OptionGroup( t_tApplicationDatatCalledProcessErrortrunt DC_PERS_LABELtDC_LABELt SetUIDasEUIDt with_spinnertSYSTEM_TEMP_DIRtPopentLockfilet LockfileErrortsystem_temp_path(tUnifiedArchive(t spinwritetverify_credentials(tDataObjectDict(tDistro(t InstallEngine(tINSTALL_LOGGER_NAME(t FilesystemtZpool(tSize(tTransferCPIOAttrs/usr/sbin/lofiadms/usr/sbin/mkfiles/usr/sbin/mounts/usr/sbin/newfss/usr/lib/fs/pcfs/mkfss /usr/bin/pkgs/usr/sbin/umounts/usr/sbin/zonenames archive.locktArchiveMediaCreatorcBs•eZdZddgZd„Zd„Zd„Zd„Zd„Zd„Z d „Z d „Z d „Z d „Z d „Zd„Zed„ƒZRS(s4 Class responsible for creating media from archives tisotusbcCs titƒ}|idƒ|itii|ƒƒ|_|i ƒ|i |_ |i ƒ|i |i|i |i |i|iƒ|_ |iƒ|ipd|_|iƒ|io|iiƒ|_n d|_|iƒ|ioOtii|iƒotii|idƒ}qUtii|iƒd}ntiitiƒdƒ}tiid||ifƒ|_|iƒttgƒiiƒdjoey6t dƒt d ƒt!i"ƒd jo t#ƒnWqt$j o}|i%t&|ƒƒqXndS( Ns(archiveadm: ArchiveMediaCreator:__init__trpoolRt AI_Archiveis%s.%stglobaltpcfstufsti386('tloggingt getLoggertILNtdebugt init_archivetostpathtabspathtuat validate_uatzonet validate_zonetinit_ai_sourcetsourcetkeytcerttvalidate_sourcetdatasettvalidate_datasett media_formattlowertvalidate_media_formatt media_pathtisdirtjointsplitexttgetcwdtvalidate_media_pathRtZONENAMEtstdouttstriptverify_fs_requirementstplatformt processort verify_grubt RuntimeErrort exit_errortstr(tselft archive_pathtoptionstloggerR8te((s ../media.pyt__init__Gs>             cCsttd|ƒƒdS(s Displays a spinwrite message. s%s N(RR(RHtmessage((s ../media.pyt show_infotscCs4tiitd|ƒƒttd|ƒƒ‚dS(s+ Displays an error and exits create-media. sarchiveadm create-media: %s sarchiveadm create-media: %sN(tsyststderrtwriteRRE(RHRN((s ../media.pyRFxscCsÍ|iidiitiƒjo|id|iiƒng}|iiD]!}|ii o||iqOqO~}t |ƒp|id|iiƒn|ii p|id|iiƒndS(s. Validates the archive passed to this object. isEThe architecture of %s does not match the architecture of this systems%No global zones found in archive '%s's]%s contains non-root data. Media can only be created from archives containing root-only data.N( R*tarchive_objectstsystemtarchRBRCRFR(R,t is_globaltanyt root_only(RHt_[1]tobjt global_zones((s ../media.pyR+}s# $    cCs"g}|iiD]$}|iio||iiqq~}|ioD|i|jo0|id|i|iidi|ƒfƒqn“d|jo d|_nyt|ƒdjo|d|_nUt|ƒdjo|id|iiƒn'|id|iidi|ƒfƒdS( s+ Validates the zone passed to this object. s9Zone '%s' is not a global zone in %s. Valid zones are: %ss, RiisNo global zones exist in %ss‰No host global zone exists in %s and more than one other global zone is present. Must use -g to select a global zone. Valid zones are: %sN( R*RSR,RVtnameRFR(R:tlen(RHRYRZtglobal_zone_names((s ../media.pyR-‘s$'      cCs:y|iiƒWn"tj o}|i|ƒnXdS(s- Validates the source passed to this object. N(R/tvalidateRERF(RHRL((s ../media.pyR2²scCs/t|iƒip|id|iƒndS(s. Validates the dataset passed to this object. s ZFS dataset '%s' does not exist.N(RR3texistsRF(RH((s ../media.pyR4¹s cCss|itijo|id|iƒn|idjo4tii|iiƒd jo|idƒqondS( s3 Validates the media_format passed to this object. sInvalid media format: %sRiis.Archives larger than 4GB cannot use ISO formatNii@l(R5Rt MEDIA_FORMATSRFR'R(tgetsizeR*(RH((s ../media.pyR7Às cCsttii|iƒƒdjo|idƒntii|iƒ}tii|ƒp|id|ƒntii|ƒo|id|ƒnt ƒi i ƒz/ti |ti ƒp|id|ƒnWdQXtii|iƒo|id|iƒndS(s1 Validates the media_path passed to this object. i s(Media name must be 32 characters or lesss$Output directory '%s' does not exists'%s' is a files'%s' is not writeableNs'%s' already exists(R]R'R(tbasenameR8RFtdirnameR`tisfileRt__exit__t __enter__taccesstW_OK(RHt media_dir((s ../media.pyR=Ìs"cCstii|ƒp|id|ƒntii|ƒo|id|ƒnti|tiƒp|id|ƒntiƒ}|i dƒ|i dddd|gƒt ƒi i ƒz|iƒ\}}WdQX|tijot|ƒn|iiid tƒS( sL Instantiates and returns a UnifiedArchive object from archive_path sArchive '%s' does not exists'%s' is a directorys'%s' is not readablesInitiating media creation...tInstantiateUnifiedArchives#solaris_install/archive/checkpointstargsNt class_type(R'R(R`RFR9RhtR_OKRt get_instanceROtregister_checkpointRRfRgtexecute_checkpointst EXEC_SUCCESSt fail_and_exittdoctvolatiletget_first_childR(RHRItengtstatust failed_cps((s ../media.pyR&às"    c CsÃg}|iD]I}|ii|jo0|di|iiiiddƒdd!ƒqq~}t|ƒdjo|d} n|i d|ƒ|oÐ|i dƒou| o|o|i dƒn| o|o|i dƒn| o| o|i d ƒnt || ||ƒS|p|o|i d ƒn|i d ƒot || ƒSt |ƒSnW|p|o|i d ƒn|i||ƒ} | ot| |iƒSt d | ƒSd S(s€ Instantiates an AISource object of the correct type based on the passed in ua, source, zone, key and cert. t.iiis8Source version was unable to be determined for zone '%s'thttpss*key option is required for an HTTPS sources2certificate option is required for an HTTPS sources<key and certificate options are required for an HTTPS sources-Credentials are only valid with HTTPS sourcesthttps$Credentials valid only with --sourceN(RSR,R\R:RTt os_versiontbranchtsplitR]RFt startswitht HTTPSSourcet IPSSourcet ISOSourcetget_source_from_archivet ArchiveSourceR(tNone( RHR*R/R,R0R1RYRZtversionstversiontarchive_source((s ../media.pyR.ùs4Y cCs‹d}x2|iD]'}|ii|jo|i}PqqW|dj o;ti|iƒ}|i|iƒi djodS|iSdSdS(s| Attempts to get the AI source from the archive. If the source does not exist, this method returns None iN( R†RSR,R\tai_mediattarfiletopenR(t getmembertsize(RHR*R,RŠRZtua_tar((s ../media.pyR„&s    c"CsÓtitƒ}|idƒtiƒ}|idƒd|i|ii f}t t ƒ}yLt |ƒi iƒz.t|ƒ}|io|idƒny|iƒWn&tj o}|id|ƒnXz¼y|ii|ƒ}Wn(tj o}|it|ƒƒnXt|iidƒdƒ}t|idƒdƒi} tii |iiƒ} t|id ƒƒi} | | d | jo|id |iƒnh|id ƒd 6|id ƒd6tii!|id ƒdƒd6tii"|i#ƒd6} |i$i%i&t't(| ƒƒhdd6dd6} |i$i)i&t't*| ƒƒt+tii,tii-|i#ƒƒdƒ}|i$i%i&|ƒ|idƒh|iid6|id ƒd6|id ƒd6}|i.dddd|ƒt/i0ƒdjo|i.ddd ƒnt1ƒi iƒz|i2ƒ\}}Wd!QX|ti3jot4|ƒn|ii5|ƒ|id"ƒ|i6d#jo$|id$ƒ|i.d%d&d'ƒn!|id(ƒ|i.d%d)d*ƒtii!|id ƒd+ƒ}tii|ƒo(ti7|ƒot8t9|gƒq)n|id,|i#ƒt1ƒi iƒz|i2d-d%ƒ\}}Wd!QX|ti3jot4|ƒnWd!|id.ƒ|d!j o–|ioŒtii!|id ƒd+ƒ}tii|ƒoWti7|ƒoCyt8t9|gƒWq:tj o}|it|ƒƒq:Xq>qBn|ii5|ƒy|i5d/t;d0t<ƒWn/tj o#}|id1|i|fƒnXXWd!QXWn&t=j o}|id2|ƒnXd!S(3s Creates media from the archive s,archiveadm: ArchiveMediaCreator:create_mediasPreparing build environment...s %s/archive_%ss$Build dataset must not already exists'Failed to create build area dataset: %st/itfreetusedgš™™™™™ñ?s/Insufficient free space in '%s' to create mediat mountpointt pkg_img_pathtba_buildttmpttmp_dirRjs boot/bios.imgsbios-eltorito-imgs boot/uefi.imgsuefi-eltorito-imgsAdding archive content...R‰R3t ai_sourcetAddArchiveToISOs#solaris_install/archive/checkpointstkwargsR!s archive-bootssolaris_install/boot/boottArchiveISOImageBootMenuNsImage preparation completeRsCreating ISO image...s create-medias3solaris_install/distro_const/checkpoints/create_isot CreateISOsCreating USB image...s3solaris_install/distro_const/checkpoints/create_usbt CreateUSBtusrsFinalizing %s...t start_fromsCleaning up...tdry_runt recursives&Unable to destroy build dataset %s. %ss2An instance of create-media is already running: %s(>R"R#R$R%RRoROR3R*tuuidR t ARCHIVE_LOCKR RfRgRR`RFtcreateRR/ttransferRERGRR\RRtgett byte_valueR'R(RbR:RdR8RtRutinsert_childrenRRt persistentRRR;RcRpRBRCRRqRrRstdestroyR5tlistdirRtUMOUNTR†tFalsetTrueR (RHRKRwt build_datasett lockfile_pathtbuild_fsRLt ai_image_fstzpoolt zpool_spacet archive_sizet source_sizetd1td2tdistroRšRxRyt fs_usr_mount((s ../media.pyt create_media>sÊ                           $ ! (t__name__t __module__t__doc__RaRMRORFR+R-R2R4R7R=R&R.R„RR»(((s ../media.pyRBs  -    !     - tAISourcecBsMeZdZeiZd„Zeid„ƒZeid„ƒZ d„Z RS(s8 Abstract AISource class to be parent of all AI sources cCs ||_dS(N(R/(RHR/((s ../media.pyRMÖscCstdƒ‚dS(s? Abstract method that ensures the AISource is in a good state. s#This method needs to be implementedN(tNotImplementedError(RH((s ../media.pyR_ÙscCstdƒ‚dS(s~ Abstract method that transfers the contents of the source into the staging directory for media creation. s#This method needs to be implementedN(RÀ(RHtfs((s ../media.pyR¥ÞscCsyyFttii|idƒƒ}|io|idtdtƒnWn,t j o t d|i dƒƒ‚nXdS(sZ Method that cleans up the temporary source in the staging directory. t tmp_pkg_imageR R¡s#Unable to destroy source dataset %sR“N( RR'R(R:R\R`RªR­R®RRER¦(RHRÁR²((s ../media.pyRªås ( R¼R½R¾tabctABCMetat __metaclass__RMtabstractmethodR_R¥Rª(((s ../media.pyR¿Òs   RƒcBs eZdZd„Zd„ZRS(s@ AISource subclass that handles an AISource coming from an ISO. c Cs{tii|iƒ pti|itiƒ otd|iƒ‚ntidt ƒ}y t t dd|i|gƒWn&t j otd|iƒ‚nXz³d}tiitii|ddƒƒo d}n0tiitii|dd ƒƒo d }n|djotd |iƒ‚n|tiƒjotd |iƒ‚ntii|d ƒ}tii|ƒptd|iƒ‚nt|dƒiiƒ}zp|~}x`|iƒiƒD]L}|idƒo6|idƒddjotd|iƒ‚nPqÐqÐWWdQXy.tii|dƒ}t td|gƒ}Wnt j otdƒ‚nX|iiƒ} tidt ƒ} zy#t t dddd| | gƒWnt j otdƒ‚n:Xtii| dƒ} tii| ƒptdƒ‚nWdt t| gdtiƒti| ƒt td| gƒXWdt t|gƒti|ƒXdS(Ns'%s' not found or not readabletdirs-FthsfssCannot mount '%s'.RBti86pcR!tsun4vtsparcs'Could not identify architecture of '%s'sBArchitecture of '%s' does not match the architecture of the systems .image_infos#.image_info does not exist in '%s'.trs IMAGE_TYPE=t=itAIs3'%s' is not a Solaris Automated Installer ISO images solaris.zlibs-as#Unable to verify ISO image provideds-otrossbin/archiveadms.Source ISO does not support archive operationst check_results-d(R'R(R`R/RhRnREttempfiletmkdtempR RtMOUNTRR†R:RBRCRŒRfRgtreadt splitlinesR€RtLOFIADMR?R@R¬R tANYtrmdir( RHR“tiso_archtimage_info_pathRYtftlinet zlib_pathtptlofi_devt zlib_mounttcli((s ../media.pyR_õsh % %  &# c Csyóttii|idƒƒ}|iƒtdƒ}|idƒ|_d|_ dg|_ d|_ t i dtdd ƒ}td d |i|g}t|ƒ||_z4y|iƒWntj otd ƒ‚nXWdtt|gƒXWntj otd ƒ‚nX|S(NRÂs ISO TransferR“tinstalls./s-pdbRÇtprefixt ai_iso_tmp_s-FRÈsFailed to transfer ISO contentssTransfer was interrupted(RR'R(R:R\R¤RR¦tdsttactiontcontentst cpio_argsRÑRÒR RÓR/Rtsrctexecutet ExceptionRER¬tKeyboardInterrupt(RHRÁR²tnodettmpdirtcmd((s ../media.pyR¥@s,        (R¼R½R¾R_R¥(((s ../media.pyRƒòs KR…cBs)eZdZd„Zd„Zd„ZRS(sE AISource subclass that handles an AI source coming from an archive. cCs#tt|ƒi|ƒ||_dS(N(tsuperR…RMRI(RHR/RI((s ../media.pyRMascCsŽtii|iƒptd|iƒ‚ntii|iƒotd|iƒ‚nti|itiƒptd|iƒ‚ndS(NsArchive '%s' does not exists'%s' is a directorys'%s' is not readable(R'R(R`RIRER9RhRn(RH((s ../media.pyR_esc Cs‡yati|iƒ}ttii|idƒƒ}|iƒ|i |i |i dƒƒt dƒ}|i dƒ|_ d|_dg|_d|_tidtdd ƒ}td d tii|i dƒ|i ƒ|g}t|ƒ||_z4y|iƒWntj otd ƒ‚nXWdtt|gƒXtitii|i dƒ|i ƒƒWntj otd ƒ‚nX|S(NRÂR“s ISO TransferRâs./s-pdbRÇRãRäs-FRÈsFailed to transfer ISO contentssTransfer was interrupted(R‹RŒRIRR'R(R:R\R¤textractR/R¦RRåRæRçRèRÑRÒR RÓRRéRêRëRER¬tremoveRì(RHRÁRR²RíRîRï((s ../media.pyR¥os6          ,(R¼R½R¾RMR_R¥(((s ../media.pyR…^s  R‚cBs)eZdZd„Zd„Zd„ZRS(s> AISource subclass that handles an AI source coming from IPS. cCs#tt|ƒi|ƒ||_dS(N(RðR‚RMRˆ(RHR/Rˆ((s ../media.pyRM—scCsdS(N((RH((s ../media.pyR_›sc CsÈy‰tiƒ}|idddd||idd|igƒtƒiiƒz|i ƒ\}}WdQX|ti jot |ƒnWnt j ot dƒ‚nX|iiidtƒidS(NtDownloadAIPackages#solaris_install/archive/checkpointsRlsTransfer was interruptedRmtai_image_dataset(RRoRpR/R†RˆRRfRgRqRrRsRìRERtRuRvRt data_dict(RHRÁRwRxRy((s ../media.pyR¥Ÿs   (R¼R½R¾RMR_R¥(((s ../media.pyR‚”s  RcBs)eZdZd„Zd„Zd„ZRS(sM IPSSource subclass that handles an AI source coming from an HTTPS repo. cCs/tt|ƒi||ƒ||_||_dS(N(RðRRMR0R1(RHR/RˆR0R1((s ../media.pyRM¸s cCs£ti|itiƒptd|iƒ‚nti|itiƒptd|iƒ‚nyt|i|i|iƒWntj otdƒ‚nXdS(NsKey '%s' not foundsCertificate '%s' not foundsInvalid credentials(R'RhR0RnRER1RR/(RH((s ../media.pyR_½sc CsÎytiƒ}|idddd||i|i|i|igƒtƒii ƒz|i ƒ\}}WdQX|ti jot |ƒnWnt j otdƒ‚nX|iiidtƒidS(NRós#solaris_install/archive/checkpointsRlsTransfer was interruptedRmRô(RRoRpR/R0R1RˆRRfRgRqRrRsRìRERtRuRvRRõ(RHRÁRwRxRy((s ../media.pyR¥És   (R¼R½R¾RMR_R¥(((s ../media.pyR´s  cCs tdƒS(sE Initializes and returns usage string for 'create-media' subcommand. s÷ create-media [-g|--global-zone ] [-s|--source | ] [-k|--key ] [-c|--cert ] [-d|--dataset ] [-f|--format [usb | iso]] [-o|--output ](R(((s ../media.pyt get_usageÞsc Cst|dd"ƒ}|idddddtdƒƒ|idd dd dtd ƒƒ|id d dddtdƒƒ|idddddtdƒƒ|idddddtdƒƒ|idddddtdƒddƒ|idddd dtd!ƒƒ|i|ƒd"S(#s8 Sets up the options for the 'create-media' subcommand. sMedia Creation Optionss-gs --global-zonetdestR,thelps.optional global zone from which media is builts-ss--sourceR/s"optional ISO path or publisher URIs-ks--keyR0s&key for use with https repository URIss-cs--certR1s.certificate for use with https repository URIss-ds --datasetR3s1optional dataset under which media is constructeds-fs--formatR5s*format for media construction. USB or ISOtdefaulttUSBs-os--outputR8soptional path for final mediaN(RR†t add_optionRtadd_option_group(tparsertgroup((s ../media.pyt setup_optionsês"       cCsËtitƒ}d}xe|D]]}ti|ƒ}xE|D]=}|iti}|djo |}n|id|ƒq8WqWt |t ƒp.t i i td|ƒƒtd|ƒ‚n tdƒ‚dS(sjLog a set of failed checkpoints and exit, issuing the first failure's exception string to stderr. s'%s' checkpoint failedsarchiveadm create-media: %s s%ss*Execution failed due to keyboard interruptN(R"R#R$R†terrsvctget_errors_by_mod_idt error_datatES_DATA_EXCEPTIONR%t isinstanceRìRPRQRRRRE(RyRKttopt failed_cpterrorsterrRL((s ../media.pyRss  c CsÒddg}||jotd|ƒ‚ntiƒ}tiƒ\}}ti|ƒttdd|gƒttd|gƒ}|i i ƒ}|djo"t dd|i d d ƒg}n*|djot |i d d ƒg}nt|d td d ƒƒ|djotdd||g}n-|djotdddd||g}nzHyt|ƒWn#tj otd|ƒ‚nXtt|gƒWdti|ƒttd|gƒti|ƒXdS(s1Verify files can be mounted via fs_type in a zoneRR s+Filesystem type '%s' is not a required types-nt8ms-as-osnofdisk,size=8192tlofitrlofitstdins /dev/zeroRÌs-Ft nologgingsiFS type '%s' is not allowed via 'fs-allowed' property in the zone configuration. Media cannot be created.Ns-d(RERÑRÒtmkstempR'tunlinkRtMKFILERÖR?R@t PCFS_MKFStreplacetNEWFSRŒRÓRR¬RØ(tfs_typetrequired_fs_typest mount_pointt_noneR\RÞRßRï((s ../media.pyRAs<          cCsCtddg}yt|ƒWntj otdƒ‚nXdS(s7 Verify grub is installed if needed on i386 platforms. tinfossystem/boot/grubs/Required package system/boot/grub not installedN(tPKGRRRE(Rï((s ../media.pyRDDs cCs'|d}t||ƒ}|iƒdS(s2 Main point of entry for archiveadm create-media. iN(RR»(RJRltarchivet media_creator((s ../media.pytrun_create_mediaNs (ER¾RÃR"R'RBRPR‹RÑtsolaris_install.errsvcRtoptparseRtsolaris_installRRRRRRRRR R R R R tsolaris_install.archiveRtsolaris_install.archive.utilRRt%solaris_install.data_object.data_dictRt(solaris_install.distro_const.distro_specRtsolaris_install.engineRtsolaris_install.loggerRR$tsolaris_install.target.logicalRRtsolaris_install.target.sizeRtsolaris_install.transfer.cpioRRÖRRÓRRRR¬R>R£tobjectRR¿RƒR…R‚RRöRÿRsRARDR(((s ../media.pytsR       Xÿ‘ l6 *   /