ó ºµiVc@sídZddlZddlZddlZddlmZmZddlmZm Z m Z m Z ddl m Z mZddlmZddlmZddlmZmZmZmZdd lmZd 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 ZvBootLoadercBs8eZdZidd6ZgZdZdZdZdZe 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/zvbootcCs2|js|jStjj|j|jjdƒƒ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 cCstjƒ}tji|d6S(Nt platformname(Rt platform_nameRt _BOOTBLK_PATH(tplatname((s.../../common/bootmgmt/backend/loader/zvboot.pyt bootblk_pathCs cKs|jddƒ}|dks-|jdkr1dS|jtjkrPtj|S|jtjkrotj|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.pytprobeHs  cKs>|jddƒ}|jdkr.tj|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&Zs cKsa|jddƒ}|j|ƒ}tj|kr4dStj|krGdS||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  cKsN|jddƒ}|j|ƒ}tj|kr4dS||d<||}|S(NR!R/(R"R#R0RR1(R.R)R!R/R3((s.../../common/bootmgmt/backend/loader/zvboot.pyR(ws  cCsF|jtjkr|j|ƒS|jtjkr>|j|ƒ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•|jƒ}|j}|dks-|dkr>|jdƒgS|jd||fƒg}||j}y$t|ƒjƒ|tjg7}Wn,t k r¹}|jd||j fƒnX|t j ƒ}y$t|ƒjƒ|tj g7}Wn#t k r}|jd|ƒnXyW|j}tjj|ƒrZtj|tjƒrZ|tjg7}n|jd|ƒWn#tk r} |jd| ƒ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|jƒ}|dkr)|jdƒgSg}||jƒ}y$t|ƒjƒ|tjg7}Wn#tk rˆ}|jd|ƒ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|ƒj|d|jtj tcmp_fncs |jˆkS(N(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£|jst|tƒ|_n|j|jjƒ|jd|ƒy tjtj j |ƒdƒWn+t k rŽ}|j t j kr‚qnX|jj|ƒdS(Ns&Writing configuration entries to "%s".ií(RLR RRR†RRgR8RtmakedirsRtdirnameRBterrnotEEXISTtwrite(RR]RI((s.../../common/bootmgmt/backend/loader/zvboot.pyt_write_menu_conf_s   cCss|dkr |j|jƒdStjj|tjj|jƒƒ}|j|ƒtj |d|jdddfgS(Ntroottsysi¤( R#RŒRRRRtbasenameRR tOUTPUT_TYPE_FILE(RRltintermediate_name((s.../../common/bootmgmt/backend/loader/zvboot.pyt_write_config_genericns   cCs÷|jjdkr+td|jjƒ‚n|j|ƒ}|dkrJdSg}|rc||7}nxtt|ƒƒD]y\}}|tj}|tj tj krv|t j krvt|ƒ}dt jd||tj: %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   ""ÿß