Viewing File: /usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyo

ó
æ”\c@s¥ddlmZddlTddlZddlmZddlmZddlj	Z	ddl
Z
ddlZddlZej
jƒZdejfd„ƒYZdS(	i(tbase(t*iÿÿÿÿN(t
exceptions(tcommandstBootloaderPlugincBseZdZd„Zd„Zd„Zed„ƒZd„Zd„Z	d„Z
d„Zed	„Z
d
„Zd„Zd„Zd
„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zedƒd„ƒZedƒd„ƒZedƒd„ƒZeddeddƒd „ƒZed!deddƒd"„ƒZed#deddƒd$„ƒZ d%„Z!RS(&sÁ
	Plugin for tuning bootloader options.

	Currently only grub2 is supported and reboot is required to apply the tunings.
	These tunings are unloaded only on profile change followed by reboot.
	cOsPtjjtjƒs'tjdƒ‚ntt|ƒj	||Žt
ƒ|_dS(Ns4Required GRUB2 template not found, disabling plugin.(tostpathtisfiletconststGRUB2_TUNED_TEMPLATE_PATHRtNotSupportedPluginExceptiontsuperRt__init__Rt_cmd(tselftargstkwargs((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyRscCsRt|_t|_t|_t|_d|_d|_d|_	|j
ƒ|_dS(Nt(tFalset_has_dynamic_tuningtTruet_has_static_tuningtupdate_grub2_cfgt_initrd_remove_dirtNonet_initrd_dst_img_valt_cmdline_valt_initrd_valt_get_grub2_cfg_filest_grub2_cfg_file_names(Rtinstance((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_instance_inits							cCsdS(N((RR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_instance_cleanup'scCs.idd6dd6dd6dd6dd6dd6S(Ntgrub2_cfg_filetinitrd_dst_imgtinitrd_add_imgtinitrd_add_dirtinitrd_remove_dirtcmdline(R(tcls((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_get_config_options*sc	Cs©|jƒjƒ}g}xm|D]e}t|ƒjdƒrJ|j|ƒq||krg||||<qtjd||jjfƒqW|j	ƒd}xå|D]Ý}||}|dksŸ|dkrÍqŸn|d}|djƒ}|dkr|dkr|d|7}qŸ|dkrn|dkrnxQ|jƒD]2}	t
j|	ƒ}
t
jd	|
d
d|ƒ}q5WqŸ|d|7}qŸW|jƒ}|dkr¥||d<n|S(sSMerge provided options with plugin default options and merge all cmdline.* options.R&s$Unknown option '%s' for plugin '%s'.Riit+t t-s(\A|\s)s	(?=\Z|\s)N(R(tcopytstrt
startswithtappendtlogtwarnt	__class__t__name__tsortRtstriptsplittretescapetsub(Rtoptionst	effectivetcmdline_keystkeyR&tvaltoptvalstptregex((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_get_effective_options5s6
!



$
cCs@g}x3tjD](}tjj|ƒr|j|ƒqqW|S(N(RtGRUB2_CFG_FILESRRtexistsR/(Rt	cfg_filestf((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyRUs
cCs|jjtj|ƒS(N(R
tadd_modify_option_in_fileRtBOOT_CMDLINE_FILE(Rtd((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_patch_bootcmdline\scCsÁ|jstjdƒdS|jidtj6dtj6ƒxF|jD];}|jj|iddtj	6ddtj
6dtƒqEW|jdk	r½tjd|jƒ|jj|jƒndS(Nscannot find grub.cfg to patchRsset\s+taddsremoving initrd image '%s'(RR0tinfoRKRtBOOT_CMDLINE_TUNED_VARtBOOT_CMDLINE_INITRD_ADD_VARR
RHtGRUB2_TUNED_VARtGRUB2_TUNED_INITRD_VARRRRtunlink(RRG((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_remove_grub2_tuning_s	
!9cCs?|r;tjdƒ|jƒ|jidd6dd6ƒndS(Ns/removing grub2 tuning previously added by TunedRttuned_paramsttuned_initrd(R0RMRSt_update_grubenv(RRt
full_rollback((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_instance_unapply_staticjs

cCsñtjdƒtjdtjdd|dtjƒ}tjdtjd|dtjƒ}tjdtjdd|dtjƒ}tjdtjd|dtjƒ}tjtjdd|dtjƒ}tjtj	dd|dtjƒS(	Nsunpatching grub.cfgs
^\s*set\s+s\s*=.*
Rtflagss *\$s\ns\n+(
R0tdebugR7R9RRPt	MULTILINERQtGRUB2_TEMPLATE_HEADER_BEGINtGRUB2_TEMPLATE_HEADER_END(Rt	grub2_cfgtcfg((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_grub2_cfg_unpatchps
)%)%%cCsItjdƒdtjd}xD|D]<}|d|jj|ƒd|jj||ƒd7}q%W|tjd7}tjd||d	tj	ƒ}itj
d
6tjd6}x”|D]Œ}tjd|d
d|||d	tj	ƒ}tjd|d||dd|d	tj	ƒ}tjd|dd|d	tj	ƒ}qµW|S(Nsinitial patching of grub.cfgs\1\n\ns
sset s="s"
s\ns+^(\s*###\s+END\s+[^#]+/00_header\s+### *)\nRYtlinuxtinitrds^(\s*s(16|efi)?\s+.*)$s\1 $s(?:16|efi)?\s+\S+rescue.*)\$s *(.*)$s\1\2s(?:16|efi)?\s+\S+rescue.*) +$s\1(R0RZRR\R
R8R]R7R9R[RPRQ(RR^RJtstopttd2ti((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_grub2_cfg_patch_initialys

:
.2*cCs,|jjtjƒ}t|ƒdkr?tjdtjƒtSitjd6tj	d6}t}x“|D]‹}t
jd|d||d|dt
jƒdkrft}|d	d
krÄ|d
7}n||d|d|d
||d7}qfqfW|r(tjdtjƒ|jjtj|ƒntS(Niscannot read '%s'tGRUB_CMDLINE_LINUX_DEFAULTtGRUB_INITRD_OVERLAYs^[^#]*\bs
\s*=.*\\\$s\b.*$RYiÿÿÿÿs
s="${s:+$s }\$s"
s
patching '%s'(R
t	read_fileRtGRUB2_DEFAULT_ENV_FILEtlenR0RMRRPRQR7tsearchR[RRRZt
write_to_file(Rtgrub2_default_envRJtwriteRf((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_grub2_default_env_patch‹s 
5
1cCs²tjdƒ|js'tjdƒtSxz|jD]o}|jj|ƒ}t|ƒdkrptjd|ƒtStjd|ƒ|}t}x€|D]x}tj	d|dd
||d	|d
tj
ƒ\}}|dkstjd||d
tj
ƒdkr”t
}q”q”Wttjdtj|d
tj
ƒƒttjdtj|d
tj
ƒƒkrit
}n|r|j|j|ƒ|ƒ}n|jj||ƒq1W|jƒt
S(Nspatching grub.cfgscannot find grub.cfg to patchiscannot patch %ss+adding boot command line parameters to '%s's	\b(set\s+s\s*=).*$s\1s"RYis\$s\1"(R0RZRRMRR
RjRlR7tsubnR[RmRRtfindallRRPRQRgR`RnRq(RRJRGR^t
grub2_cfg_newt
patch_initialRdtnsubs((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_grub2_cfg_patchžs0
	

81
%+	
cCsR|ji|jtj6|jtj6ƒ|ji|jtj6|jtj6ƒdS(N(	RwRRRPRRQRKRNRO(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt
_grub2_update»s'cCstjjtjƒS(N(RRRERtBLS_ENTRIES_PATH(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_has_bls¿scCsœtjdt|ƒƒg|jƒD](\}}dt|ƒt|ƒf^q$}|jjdddg|ƒ\}}|dkr˜tjd|ƒtStS(Nsupdating grubenv, setting %ss%s=%ss
grub2-editenvR+tsetiscannot update grubenv: '%s'(	R0RZR-titemsR
texecuteR1RR(RRJtoptiontvaluetltrctout((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyRVÂs;%cCs†|jjƒ}|dkrtStjdtjƒ|jjtjdgdi|d6ƒ\}}|dkr‚tjd|ƒtSt	S(NRs4running kernel update hook '%s' to patch BLS entriesRLtenvtKERNEL_INSTALL_MACHINE_IDiscannot patch BLS entries: '%s'(
R
tget_machine_idRR0RZRtKERNEL_UPDATE_HOOK_FILER}R1R(Rt
machine_idRR‚((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_bls_entries_patch_initialËs.cCsPtjdƒ|jƒrL|ji|jd6|jd6ƒrL|jƒrLtStS(Nsupdating BLSRTRU(	R0RZRzRVRRRˆRR(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_bls_updateÖs
#cCs=|jdkr9tjjtjtjj|ƒƒ|_ndS(N(RRRRtjoinRtBOOT_DIRtbasename(Rtname((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_init_initrd_dst_imgÞscCstjjtjƒS(N(RRtisdirRtPETITBOOT_DETECT_DIR(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_check_petitbootâscCsé|jƒrtjdƒntjd|jƒtjj|jƒ}|jj	||jƒsat
St|_|jj
dƒjƒ}d}t|ƒ}|rÍtjdd|ƒ}t|ƒ|krÍ|}qÍntjj||ƒ|_tS(NskDetected Petitboot which doesn't support initrd overlays. The initrd overlay will be ignored by bootloader.sinstalling initrd image as '%s's
/proc/cmdlinet/s^\s*BOOT_IMAGE=\s*(\S*/).*$s\1(R‘R0R1RMRRRRŒR
R,RRRRjtrstripRlR7R9RŠR(Rtimgtimg_nametcurr_cmdlinetinitrd_grubpathtlcR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_install_initrdås 	R!cCs5|r
dS|r1|dk	r1t|ƒg|_ndS(N(RR-R(RtenablingRtverifytignore_missing((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_grub2_cfg_file÷sR"cCsy|r
dS|ru|dk	rut|ƒ|_|jdkr>tS|jddkrutjjtj|jƒ|_qundS(NRiR’(	RR-RRRRRŠRR‹(RRšRR›Rœ((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_initrd_dst_imgÿsR%cCs>|r
dS|r:|dk	r:|jj|ƒdk|_ndS(Nt1(RR
tget_boolR(RRšRR›Rœ((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyRsR#t
per_devicetpriorityi
cCs_|r
dS|r[|dk	r[t|ƒ}|j|ƒ|dkrEtS|j|ƒs[tSndS(NR(RR-RŽRR™(RRšRR›Rœtsrc_img((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_initrd_add_imgs
R$c
Csv|r
dS|rr|dk	rrt|ƒ}|j|ƒ|dkrEtStjj|ƒsltjd|ƒtStj	d|ƒt
jddddƒ\}}tjd|ƒtj
|ƒ|jjd	|d
|dtƒ\}}	tjd|	ƒ|d
kr%tjdƒ|jj|dtƒtS|j|ƒ|jj|ƒ|jrrtj	d|ƒ|jj|ƒqrndS(NRsFerror: cannot create initrd image, source directory '%s' doesn't exists+generating initrd image from directory '%s'tprefixstuned-bootloader-tsuffixs.tmps+writing initrd image to temporary file '%s'sfind . | cpio -co > %stcwdtshellscpio log: %siserror generating initrd imagetno_errorsremoving directory '%s'(RR-RŽRRRRR0terrorRMttempfiletmkstempRZtcloseR
R}RRRR™Rtrmtree(
RRšRR›Rœtsrc_dirtfdttmpfileRR‚((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_initrd_add_dir s2

(

	R&c
Cs|jj|jj|ƒƒ}|rß|jjdƒ}t|ƒdkrLdSt|jƒƒ}t|jƒƒ}|j	|ƒ}	|	|kr¯t
jtj
dt|ƒfƒtSt
jtjdt|	ƒt|ƒfƒtSn|r|dk	rt
jdƒt|_||_ndS(Ns
/proc/cmdlineiR&s;installing additional boot command line parameters to grub2(t
_variablestexpandR
tunquoteRjRlRR{R6tintersectionR0RMRtSTR_VERIFY_PROFILE_VALUE_OKR-RRªtSTR_VERIFY_PROFILE_VALUE_FAILRRR(
RRšRR›RœtvR&tcmdline_sett	value_settcmdline_intersect((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_cmdline>s" )
	cCs3|r/|jr/|jƒ|jƒt|_ndS(N(RRxR‰R(RRRš((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_instance_post_staticSs

("R3t
__module__t__doc__RRR tclassmethodR(RCRRKRSRRXR`RgRqRwRxRzRVRˆR‰RŽR‘R™tcommand_customRRžRR¤R²R½R¾(((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyRs:				 																	!
!!(RRt
decoratorst
tuned.logsttunedRttuned.utils.commandsRttuned.constsRRR7R«tlogstgetR0tPluginR(((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt<module>s

Back to Directory File Manager