ó ºµiVc@sÈdZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z m Z mZddlmZmZddlmZmZmZddlmZddlmZmZmZmZddlmZmZm Z m!Z!dd l"m#Z#m$Z$dd l%m&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 OBPBootLoadercBs0eZdZidd6ZgZed„ƒZRS(itobptsparccKs"tƒdkrtdƒ‚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/installbooticKs•ytj|Wntk r%dSX|jddƒ}|dksS|jdkrWdS|jtjkr…|jdkr…t j |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$^s  cKsk|jddƒ}|j|ƒ}|s+dStj|kr>dStj|krQdS||dR;R<tjoinRhtlstrip(RX((s+../../common/bootmgmt/backend/loader/sbb.pyt MENU_LST_PATHüs c CsV|j}yt|ƒ}WnTtk rA}td||ƒ‚n/tk ro}td|t|ƒfƒ‚nXg}x¼|jƒD]®}t|tƒs®|j d|ƒqƒn|j dƒ}|dkrß|j d|ƒqƒnt ddddd j |j dƒjƒƒdd j |jƒƒƒ}||g7}qƒW|rN|jj|ƒ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[s6    c Cs¢|jjdkr+td|jjƒ‚n|ry|s@t}ntjj||jjdƒƒ}|j |||ƒ}n|j ||j ƒ}|dkrždS|j ||j ƒ}g}|rÌ||7}n|rß||7}nx¼tt|ƒƒD]¨\}} | tj} | tjtjkrò| tjtjfkròt| ƒ} | tjkrk| itƒd6} ndtjd| | tjRkt_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>            cCsGtjitƒd6}tjj|jƒ|ƒ}|dkr¶||}yRtjj|ƒ}tjj |ƒs™|r†|d|IJntj |dƒnWq t k r²}‚q XnTy/t j d|dtƒ} | j}| jƒWn"tk r } td| ƒ‚nXyt} ybtj|ƒ} tj|ƒ} t||ƒrt| j| jkrt|jd||fƒt} nWnt k rŠ}nX| r$|r±|jd||fƒntj||ƒyt||ƒWn&tk rú}|jd |jƒnX|r|jd ƒn|jd |ƒnWnltk r“} ytj|ƒWn,t k rv}|jd ||jfƒnXtd ||f| ƒ‚nX|dkryHtj|tjƒtj |t!j"tj#ƒj$t%j&tj'ƒj(ƒWn&t k r}td||ƒ‚nXgSt)j*| jdtjtj#tj'tjfgSdS(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™|st}nxƒ|jjD]u}||ddƒ}||ddƒ}|dks^|dkrt|jd|ƒqn|jd|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 cCsutjddg}|jd k r7|d|jg7}n|rM|dg7}n||tjitƒd6|g7}|jddj|ƒƒ|r²|d|dj|ƒfIJnd }t}zEy–t j |d t j d t j ƒ}t }|j jr@|j jjr@|j jj} | jƒ} |jd | |ƒWd QXn|jd |j|ƒWn¨tk r²} |jd | jƒ| j}| jtjkrtjd d ƒd k rtjdIJy|jd |jƒWn*tk rÿ} tjdt| ƒIJnXd Sd} | jr‡| jjs+| jjr‡ddj|ƒ} | jjra| d| jj7} n| jjr‡| d| jj7} q‡ntd|dt| jƒ| ƒ‚qnPtk r} |rÚdt| ƒ}nd|dt| ƒ}t|ƒ‚nXWd |rp|rp|ddj|ƒIJ|jrF|d|jIn|jrc|d|jIn|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_datasetRRhRt returncodetpopentINSTALLBOOT_NOUPDTR;tgetenvR)R¹RIRrR¸R(RXtdevnamet data_roottforceR¬Retargstpobjtinstalling_bootlstRÀ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|ƒj|ƒ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.       ."" ÿÙ