Ñò ºµiVc @sídZddkZddkZddkZddklZlZddklZl Z l Z l Z ddk l Z lZddklZddklZddklZlZlZlZdd klZd e fd „ƒYZd „ZdS( s2 Loader backend for the zvmm boot loader (zvboot) iÿÿÿÿN(tPopentCalledProcessError(t!BootmgmtUnsupportedOperationErrortBootmgmtInterfaceCodingErrortBootmgmtConfigReadErrortBootmgmtConfigWriteError(t BootLoadertBootLoaderInstallError(tget_bootfs_list_from_libbe(tMenuConfigParser(t BootConfigtDiskBootConfigt ODDBootConfigtSolarisDiskBootInstance(tpysolt ZvBootLoadercBs8eZdZhdd6ZgZdZdZdZdZe d„ƒZ e d„ƒZ e d „ƒZ ed „ƒZed „ƒZed „ƒZed „ƒZed„ƒZed„ƒZd„Zd„Zed„Ze d„ƒZd„Zdd„Zd„Zd„Zd„Zd„Z d„Z!d„Z"RS(itzvmmtx86s/sbin/installzvbootis/boot/menu.confs)/usr/platform/%(platformname)s/lib/zvbootcCs4|ip|iStii|i|iidƒƒS(s“If a BootConfig is associated with this loader, the menu.conf file is located inside the configuration directory of the BootConfig.t/(t _boot_configt_MENU_CONF_PATHtostpathtjoint config_dirtlstrip(tself((s.../../common/bootmgmt/backend/loader/zvboot.pytmenu_conf_path8s cCstiƒ}tih|d6S(Nt platformname(Rt platform_nameRt _BOOTBLK_PATH(tplatname((s.../../common/bootmgmt/backend/loader/zvboot.pyt bootblk_pathCs cKs†|iddƒ}|djp|idjodS|itijoti|S|itijoti|St dƒ‚dS(s-Platform specific probe for zvmm boot loader.t bootconfigs>ZvBootLoader does not support the specified boot configurationN( tgettNonet boot_classR tBOOT_CLASS_DISKRt _probe_disktBOOT_CLASS_ODDt _probe_oddR(tkwargsR!((s.../../common/bootmgmt/backend/loader/zvboot.pytprobeHscKs@|iddƒ}|idjoti|Stdƒ‚dS(s/Only ZFS based disk environments are supported.R!tzfss=ZvBootLoader only supports ZFS based disk boot configurationsN(R"R#t boot_fstypeRt_probe_disk_zfsR(tclsR)R!((s.../../common/bootmgmt/backend/loader/zvboot.pyR&ZscKse|iddƒ}|i|ƒ}ti|jodSti|jodS||d<||}|S(NR!t artifacts(R"R#tprobe_artifactsRtARTIFACT_BOOTLOADER_IMAGEStARTIFACT_BOOTLOADER_TOOLS(R.R)R!R/t zvbootloader((s.../../common/bootmgmt/backend/loader/zvboot.pyR-hs  cKsP|iddƒ}|i|ƒ}ti|jodS||d<||}|S(NR!R/(R"R#R0RR1(R.R)R!R/R3((s.../../common/bootmgmt/backend/loader/zvboot.pyR(ws  cCsJ|itijo|i|ƒS|itijo|i|ƒSgSdS(N(R$R R%t_probe_artifacts_diskR't_probe_artifacts_odd(R.R!((s.../../common/bootmgmt/backend/loader/zvboot.pyR0„s c Cs¡|iƒ}|i}|djp |djo|idƒgS|id||fƒg}||i}y$t|ƒiƒ|tig7}Wn.t j o"}|id||i fƒnX|t i ƒ}y$t|ƒiƒ|ti g7}Wn%t j o}|id|ƒnXyZ|i}tii|ƒo*ti|tiƒo|tig7}n|id|ƒWn%tj o} |id| ƒnX|S(sƒRequired: - the menu.conf, - the bootloader image, - the utility to install the boot loader image. s'dataroot is None or cfgdataroot is Nonesdataroot=%s cfgdataroot=%ssError opening %s: %ss-Error while looking for boot loader image: %ss%s not found or not executables.Error while looking for ZvBootLoader tools: %sN(tget_roottzfstopR#t_debugRtopentcloseRtARTIFACT_BOOTLOADER_CONFIGFILEStIOErrortstrerrorRR R1tINSTALLZVBOOT_PATHRRtexiststaccesstX_OKR2tOSError( R.R!tdataroott cfgdatarootR/tmenuconftioerrtbootblktfull_exec_pathtoserr((s.../../common/bootmgmt/backend/loader/zvboot.pyR4s8     cCs‘|iƒ}|djo|idƒgSg}||iƒ}y$t|ƒiƒ|tig7}Wn%tj o}|id|ƒnX|S(s2Required: - the bootloader image. sdataroot is Nones-Error while looking for boot loader image: %sN( R6R#R8R R9R:RR1R<(R.R!RCR/RGRF((s.../../common/bootmgmt/backend/loader/zvboot.pyR5¹s   cKsHdg|_d|_d|_tt|ƒi|d|iti tcmp_fncs |iˆjS((tsection_string(tx(t order_list(s.../../common/bootmgmt/backend/loader/zvboot.pyt]sN(RR$R R%tvalidate_bootfsRR#R8t isinstanceR tgetattrt __class__t__name__tserialization_dictRLt add_entrytappendRrt set_ordertdelete_entries(Rtbi_listtvalid_bootfsesRit inst_bootfst classnametpropdictt custom_entry((Rts.../../common/bootmgmt/backend/loader/zvboot.pytsynch_menu_config5s,        cCs©|ipt|tƒ|_n|i|iiƒ|id|ƒy titi i |ƒdƒWn/t j o#}|i t i jo‚q•nX|ii|ƒdS(Ns&Writing configuration entries to "%s".ií(RLR RRR†RRgR8RtmakedirsRtdirnameRBterrnotEEXISTtwrite(RR]RI((s.../../common/bootmgmt/backend/loader/zvboot.pyt_write_menu_conf_s   cCsu|djo|i|iƒdStii|tii|iƒƒ}|i|ƒti |d|idddfgS(Ntroottsysi¤( R#RŒRRRRtbasenameRR tOUTPUT_TYPE_FILE(RRltintermediate_name((s.../../common/bootmgmt/backend/loader/zvboot.pyt_write_config_genericns   cCs|iidjotd|iiƒ‚n|i|ƒ}|djodSg}|o||7}nxtt|ƒƒD]|\}}|ti}|ti ti joL|t i jo<t|ƒ}dt id||ti     '   c Cshtig}|idj o|d|ig7}n|o|dg7}n|tii||iƒidƒƒ|g7}|i ddi|ƒƒd}zVy%t i |dt i dt i ƒ}Wn*t j oì}|i d|iƒ|i}|itijo´d } |io{|iip |iioad di|ƒ} |iio| d |ii7} n|iio| d |ii7} qŽntd |dt|iƒ| ƒ‚qîn4tj o'} td|dt| ƒƒ‚nXWd|oj|oc|ddi|ƒIJ|io|d |iIn|io|d |iIn|dIJnXdS(s2Invoke installzvboot to write the bootblk to disk.s-us-fRs!_write_loader: Invoking command: t tstdouttstderrs_write_loader: Return code = %dts Output from "%s" was: s : %ss : %ssinstallboot failed for device s: Return code s4Error while trying to invoke installboot for device s: NsOutput from "%s" was:s(RR>tversionR#RRRR RR8Rt check_calltSTORERt returncodetpopentINSTALLZVBOOT_NOUPDTR¦R¥RRaRB( Rtdevnamet data_roottforcet verbose_fileRmtargstpobjtcpetoutputtose((s.../../common/bootmgmt/backend/loader/zvboot.pyt _write_loaderÙsJ $  $  *$  (szvmmN(#Rzt __module__tWEIGHTtSUPPORTED_PLATFORMStSUPPORTED_PROPSR>R­RRtpropertyRt staticmethodR R*t classmethodR&R-R(R0R4R5RNRQRRRXRRSR#RoR†RŒR’RjRkR·(((s.../../common/bootmgmt/backend/loader/zvboot.pyR,s8    ,   0  *   # 5cCstgS(N(R(((s.../../common/bootmgmt/backend/loader/zvboot.pytbootloader_classes s(t__doc__RR‰RŸtsolaris_installRRtbootmgmtRRRRtbootmgmt.bootloaderRRtbootmgmt.bootutilRt bootmgmt.backend.loader.menuconfR tbootmgmt.bootconfigR R R R RRR¿(((s.../../common/bootmgmt/backend/loader/zvboot.pyts   ""ÿß