Ñò ºµiVc@sÈdZddkZddkZddkZddkZddkZddkZddkZddkl Z l Z l Z l Z l Z lZddklZlZddklZlZlZddklZddklZlZlZlZddklZlZl Z l!Z!dd k"l#Z#l$Z$dd k%l&Z&d efd „ƒYZ'd e'fd„ƒYZ(de'fd„ƒYZ)de'fd„ƒYZ*de'efd„ƒYZ+defd„ƒYZ,d„Z-dS(s/ Loader backend for the SPARC Boot Block (SBB) iÿÿÿÿN(t BootmgmtErrort BootmgmtUnsupportedPlatformErrortBootmgmtConfigWriteErrort!BootmgmtUnsupportedOperationErrortBootmgmtConfigReadErrortBootmgmtInterfaceCodingError(t BootLoadertBootLoaderInstallError(t BootConfigtDiskBootConfigtSolarisDiskBootInstance(tget_current_arch_string(t MenuDotLstt MenuLstErrortMenuLstMenuEntrytMenuLstBootLoaderMixIn(t platform_namet machine_nametsynch_file_am_timestcompare_usec_file_mtime(tPopentCalledProcessError(tpartialt OBPBootLoadercBs0eZdZhdd6ZgZed„ƒZRS(itobptsparccKs$tƒdjotdƒ‚ndS(s)Generic probe checks for OBP boot loadersRs SPARC-onlyN(R R(tkwargs((s+../../common/bootmgmt/backend/loader/sbb.pyt probe_generic8s(R(t__name__t __module__tWEIGHTtSUPPORTED_PLATFORMStSUPPORTED_PROPSt staticmethodR(((s+../../common/bootmgmt/backend/loader/sbb.pyR4s tWanbootBootLoadercBseZed„ƒZRS(cKsdS(N(tNone(R((s+../../common/bootmgmt/backend/loader/sbb.pytprobe@s(RRR!R$(((s+../../common/bootmgmt/backend/loader/sbb.pyR"?stHSFSBootLoadercBseZed„ƒZRS(cKsdS(N(R#(R((s+../../common/bootmgmt/backend/loader/sbb.pyR$Fs(RRR!R$(((s+../../common/bootmgmt/backend/loader/sbb.pyR%Est UFSBootLoadercBseZed„ƒZRS(cKsdS(N(R#(R((s+../../common/bootmgmt/backend/loader/sbb.pyR$Ls(RRR!R$(((s+../../common/bootmgmt/backend/loader/sbb.pyR&Kst ZFSBootLoadercBsæeZdZdZdZdZdZdZdZdZ e d„ƒZ e d „ƒZ e d „ƒZd „Zd „Zed „Zdd„Zed„ƒZed„ƒZd„Zddd„Zdd„Zdd„Zd„ZRS(s/boot/menu.lsts/platform/%(mach)s/bootlsttroottsysi¤s1/usr/platform/%(platformname)s/lib/fs/zfs/bootblks/sbin/installbooticKsyti|Wntj odSX|iddƒ}|djp|idjodS|itijo|idjot i |St dƒ‚dS(sLProbe for ZFS boot block files for use with the BootConfig passed int bootconfigtzfss>ZFSBootLoader only supports ZFS-based disk boot configurationsN( RRRR#tgett boot_classRtBOOT_CLASS_DISKt boot_fstypeR't _probe_diskR(RR*((s+../../common/bootmgmt/backend/loader/sbb.pyR$^scKsq|iddƒ}|i|ƒ}|pdSti|jodSti|jodS||dR;R<tjoinRhtlstrip(RX((s+../../common/bootmgmt/backend/loader/sbb.pyt MENU_LST_PATHüs c Cs`|i}yt|ƒ}WnXtj o}td||ƒ‚n2tj o%}td|t|ƒfƒ‚nXg}xÀ|iƒD]²}t|tƒp|i d|ƒq‡n|i dƒ}|djo|i d|ƒq‡nt ddddd i |i dƒiƒƒdd i |iƒƒƒ}||g7}q‡W|o|ii|ƒn|SdS( Ns"Error while processing the %s files&Error while processing the %s file: %ss=Found something that was not a menu entry in menu.lst: [[%s]]tbootfssMalformed menu entry found: %stfstypeR+ttitlet (Rlt SPARCMenuFileRBRR tstrtentitiest isinstanceRR:t find_commandR#R Rjtget_argsRZtadd_boot_instance( RXR^tmenu_lsttmenufileterrtboot_instancestentityRmtinst((s+../../common/bootmgmt/backend/loader/sbb.pyR[s8     c Cs³|iidjotd|iiƒ‚n|oK|p t}ntii||iidƒƒ}|i |||ƒ}n|i ||i ƒ}|djodS|i ||i ƒ}g}|o||7}n|o||7}nxÁtt|ƒƒD]­\}} | ti} | titijo}| titifjodt| ƒ} | tijo| htƒd6} ndtid| | tiRkt_write_config_genericRlR#t_write_bootlstRht enumeratetlistRt IDX_DESTNAMEt IDX_FILETYPEtOUTPUT_TYPE_FILER't BOOTLST_PATHRR tTOKEN_ZFS_RPOOL_TOP_DATASETttuple( RXRdRataccessortmenupathtgeneric_tuplestbootlst_tuplesttuplestidxtitemtdestname((s+../../common/bootmgmt/backend/loader/sbb.pyRc0s@           cCsftihtƒd6}tii|iƒ|ƒ}|djo||}yVtii|ƒ}tii |ƒp-|o|d|IJnti |dƒnWqt j o }‚qXnWy/t i d|dtƒ} | i}| iƒWn$tj o} td| ƒ‚nXy(t} yeti|ƒ} ti|ƒ} t||ƒo3| i| ijo |id||fƒt} nWnt j o }nX| oš|o|id||fƒnti||ƒyt||ƒWn(tj o}|id |iƒnX|o|id ƒn|id |ƒnWnptj od} yti|ƒWn.t j o"}|id ||ifƒnXtd ||f| ƒ‚nX|djoxyHti|tiƒti |t!i"ti#ƒi$t%i&ti'ƒi(ƒWn(t j o}td||ƒ‚nXgSt)i*| idtiti#ti'tifgSdS(sªCopy the bootlst program from the root of the data source boot instance to either the basepath or the boot_data_root_dir and return a tuple describing it.R~sCreating %s for bootlstiítdirtdeletes,Couldn't create a temporary file for bootlsts%[NOT COPYING] unchanged file %s -> %ssCopying %s -> %s...s1[IGNORED] Could not set file access/mod times: %ssdone. sbootlst copied to %ss#Error while trying to remove %s: %ssCouldn't copy %s to %ssCouldn't set mode/perms on N(+R'R‡RR;R<Rjt_get_boot_loader_data_rootR#tdirnameRFtmakedirsRIttempfiletNamedTemporaryFileR\RSR@RBRtTruetstatRtst_sizeR:twritetshutiltcopyRRCtremovetchmodt BOOTLST_PERMStchowntpwdtgetpwnamt BOOTLST_OWNERtpw_uidtgrptgetgrnamt BOOTLST_GROUPtgr_gidRR†(RXRdtboot_data_root_dirt verbose_filetbootlsttsourcet destinationtdirsRPttmpfileRztdo_copytbsbtsbtoseRM((s+../../common/bootmgmt/backend/loader/sbb.pyRdsŒ            cCsž|p t}nx†|iiD]x}||ddƒ}||ddƒ}|djp |djo|id|ƒqn|id|d|dƒqWdS(sÚInvoked by the MenuLstBootLoaderMixIn. The SPARC menu.lst is very, very simple. We don't need to support comments or other in-place editing complexities. Just blast out the title/bootfs pairs.RmRos)Boot instance missing title or bootfs: %sstitle s bootfs s N(RRZR{R#R:Rœ(RXtoutfileRŠR}RmRo((s+../../common/bootmgmt/backend/loader/sbb.pyt_write_menu_lst¾s  cCs­tiddg}|id j o|d|ig7}n|o|dg7}n||tihtƒd6|g7}|iddi|ƒƒ|o!|d|di|ƒfIJnd }t}zpy­t i |d t i d t i ƒ}t }|i io_|i iioO|i ii} | iƒiiƒ} z | ~ } |id | |ƒWd QXn|id |i|ƒWn¼tj o]} |id | iƒ| i}| itijo%tid d ƒd j oXtidIJy|id |iƒWn,tj o } tidt| ƒIJnXd Sd}| io{| iip | iioaddi|ƒ}| iio|d| ii7}n| iio|d| ii7}q²nt d|dt| iƒ|ƒ‚q3nUtj oH} |odt| ƒ}nd|dt| ƒ}t |ƒ‚nXWd |oj|oc|ddi|ƒIJ|io|d|iIn|io|d|iIn|dIJnXd S(s_Invoked by the MenuLstBootLoaderMixIn. Invoke installboot to write the bootblk to disk.s-FR+s-us-fR7s!_write_loader: Invoking command: Rps$Installing loader on %s with `%s'...tstdouttstderrNs_write_loader: Return code = %dtBOOTMGMT_TESTINGs%[IGNORING] Loader installation failedsError installing bootlst: %sts Output from "%s" was: s : %ss : %ssinstallboot failed for device s: Return code s$Error while trying to copy bootlst: s4Error while trying to invoke installboot for device s: sOutput from "%s" was:s(!R'REtversionR#RDRR:RjR\Rt check_calltSTORER™RZt versaboott boot_poolt top_datasett__exit__t __enter__RRhRt returncodetpopentINSTALLBOOT_NOUPDTR;tgetenvR)R¹RIRrR¸R(RXtdevnamet data_roottforceR¬Retargstpobjtinstalling_bootlstRÀt_[1]tdatadirtcpeRµtoutputRf((s+../../common/bootmgmt/backend/loader/sbb.pyt _write_loaderØsv    #   $  *  N(RRR>R‡R¥R©R¡RDRERÆR!R$t classmethodR0R2RURYR™R`R#RgtpropertyRhRlR[RcRR·RÒ(((s+../../common/bootmgmt/backend/loader/sbb.pyR'Qs,2     *4 Z RqcBseZdd„Zd„ZRS(s/rpool/boot/menu.lstcCstt|ƒi|ƒdS(N(RTRqRU(RXtfilename((s+../../common/bootmgmt/backend/loader/sbb.pyRU*scCsdS(sÅ Start := Commands Commands := Command Commands | Command Command := TitleLine BootfsLine TitleLine := 'title' [ ]+ Arguments BootfsLine := 'bootfs' [ ]+ BootFsSpec Arguments := Arguments [ ]+ Argument | Argument Argument := [^ ]+ BootFsSpec := ZpoolSpec '/ROOT/' ZfsSpec ZpoolSpec := see zpool(1M) ZfsSpec := see zfs(1M) N((RX((s+../../common/bootmgmt/backend/loader/sbb.pyt_analyze_syntax-s(RRRURÖ(((s+../../common/bootmgmt/backend/loader/sbb.pyRq)s cCsttttgS(N(R"R%R&R'(((s+../../common/bootmgmt/backend/loader/sbb.pytbootloader_classes=s(.t__doc__terrnoR§R;R£RR)R—tbootmgmtRRRRRRtbootmgmt.bootloaderRRtbootmgmt.bootconfigRR R tbootmgmt.bootutilR tbootmgmt.backend.loader.menulstR R RRtbootmgmt.pysolRRRRtsolaris_installRRt functoolsRRR"R%R&R'RqR×(((s+../../common/bootmgmt/backend/loader/sbb.pyts.       ."" ÿÙ