Magellan Linux

Contents of /trunk/grubby/grubby-bls

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3147 - (show annotations) (download)
Tue Jul 7 11:22:29 2020 UTC (3 years, 9 months ago) by niro
File size: 17135 byte(s)
Print information about the entry set as default by grubby-bls script
1 #!/bin/bash
2 #
3 # grubby wrapper to manage BootLoaderSpec files
4 #
5 #
6 # Copyright 2018 Red Hat, Inc. All rights reserved.
7 #
8 # This program is free software; you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation; either version 2 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20
21 readonly SCRIPTNAME="${0##*/}"
22
23 CMDLINE_LINUX_DEBUG=" systemd.log_level=debug systemd.log_target=kmsg"
24 LINUX_DEBUG_VERSION_POSTFIX="_with_debugging"
25 LINUX_DEBUG_TITLE_POSTFIX=" with debugging"
26
27 declare -a bls_file
28 declare -a bls_title
29 declare -a bls_version
30 declare -a bls_linux
31 declare -a bls_initrd
32 declare -a bls_options
33 declare -a bls_id
34
35 [[ -f /etc/sysconfig/kernel ]] && . /etc/sysconfig/kernel
36 [[ -f /etc/os-release ]] && . /etc/os-release
37 read MACHINE_ID < /etc/machine-id
38 arch=$(uname -m)
39
40 if [[ $arch = 's390' || $arch = 's390x' ]]; then
41 bootloader="zipl"
42 else
43 bootloader="grub2"
44 fi
45
46 print_error() {
47 echo "$1" >&2
48 exit 1
49 }
50
51 print_info() {
52 echo "$1" >&2
53 }
54
55 if [[ ${#} = 0 ]]; then
56 print_error "no action specified"
57 fi
58
59 get_bls_value() {
60 local bls="$1" && shift
61 local key="$1" && shift
62
63 echo "$(grep "^${key}[ \t]" "${bls}" | sed -e "s!^${key}[ \t]*!!")"
64 }
65
66 set_bls_value() {
67 local bls="$1" && shift
68 local key="$1" && shift
69 local value="$1" && shift
70
71 sed -i -e "s!^${key}.*!${key} ${value}!" "${bls}"
72 }
73
74 append_bls_value() {
75 local bls="$1" && shift
76 local key="$1" && shift
77 local value="$1" && shift
78
79 old_value="$(get_bls_value ${bls} ${key})"
80 set_bls_value "${bls}" "${key}" "${old_value}${value}"
81 }
82
83 get_bls_values() {
84 count=0
85 for bls in $(ls -vr ${blsdir}/*.conf 2> /dev/null); do
86 bls_file[$count]="${bls}"
87 bls_title[$count]="$(get_bls_value ${bls} title)"
88 bls_version[$count]="$(get_bls_value ${bls} version)"
89 bls_linux[$count]="$(get_bls_value ${bls} linux)"
90 bls_initrd[$count]="$(get_bls_value ${bls} initrd)"
91 bls_options[$count]="$(get_bls_value ${bls} options)"
92 bls_id[$count]="$(get_bls_value ${bls} id)"
93
94 count=$((count+1))
95 done
96 }
97
98 get_default_index() {
99 local default=""
100 local index="-1"
101 local title=""
102 local version=""
103 if [[ $bootloader = "grub2" ]]; then
104 default="$(grep '^saved_entry=' ${env} | sed -e 's/^saved_entry=//')"
105 else
106 default="$(grep '^default=' ${zipl_config} | sed -e 's/^default=//')"
107 fi
108
109 if [[ -z $default ]]; then
110 index=0
111 elif [[ $default =~ ^[0-9]+$ ]]; then
112 index="$default"
113 fi
114
115 # GRUB2 and zipl use different fields to set the default entry
116 if [[ $bootloader = "grub2" ]]; then
117 title="$default"
118 else
119 version="$default"
120 fi
121
122 for i in ${!bls_file[@]}; do
123 if [[ $title = ${bls_title[$i]} || $version = ${bls_version[$i]} ||
124 $i -eq $index ]]; then
125 echo $i
126 return
127 fi
128 done
129 }
130
131 display_default_value() {
132 case "$display_default" in
133 kernel)
134 echo "${bls_linux[$default_index]}"
135 exit 0
136 ;;
137 index)
138 echo "$default_index"
139 exit 0
140 ;;
141 title)
142 echo "${bls_title[$default_index]}"
143 exit 0
144 ;;
145 esac
146 }
147
148 param_to_indexes() {
149 local param="$1"
150 local indexes=""
151
152 if [[ $param = "ALL" ]]; then
153 for i in ${!bls_file[@]}; do
154 indexes="$indexes $i"
155 done
156 echo -n $indexes
157 return
158 fi
159
160 if [[ $param = "DEFAULT" ]]; then
161 echo -n $default_index
162 return
163 fi
164
165 for i in ${!bls_file[@]}; do
166 if [[ $param = "${bls_linux[$i]}" || "/${param##*/}" = "${bls_linux[$i]}" ]]; then
167 indexes="$indexes $i"
168 fi
169
170 if [[ $param = "TITLE=${bls_title[$i]}" ]]; then
171 indexes="$indexes $i"
172 fi
173
174 if [[ $param = $i ]]; then
175 indexes="$indexes $i"
176 fi
177 done
178
179 if [[ -n $indexes ]]; then
180 echo -n $indexes
181 return
182 fi
183
184 echo -n "-1"
185 }
186
187 display_info_values() {
188 local indexes=($(param_to_indexes "$1"))
189
190 for i in ${indexes[*]}; do
191 echo "index=$i"
192 echo "kernel=${bls_linux[$i]}"
193 echo "args=\"${bls_options[$i]}\""
194 echo "initrd=${bls_initrd[$i]}"
195 echo "title=${bls_title[$i]}"
196 done
197 exit 0
198 }
199
200 mkbls() {
201 local kernel=$1 && shift
202 local kernelver=$1 && shift
203 local datetime=$1 && shift
204
205 local debugname=""
206 local flavor=""
207
208 if [[ $kernelver == *\+* ]] ; then
209 local flavor=-"${kernelver##*+}"
210 if [[ $flavor == "-debug" ]]; then
211 local debugname="with debugging"
212 local debugid="-debug"
213 fi
214 fi
215
216 cat <<EOF
217 title ${NAME} (${kernelver}) ${VERSION}${debugname}
218 version ${kernelver}${debugid}
219 linux ${kernel}
220 initrd /initramfs-${kernelver}.img
221 options \$kernelopts
222 id ${ID}-${datetime}-${kernelver}${debugid}
223 grub_users \$grub_users
224 grub_arg --unrestricted
225 grub_class kernel${flavor}
226 EOF
227 }
228
229 remove_bls_fragment() {
230 local indexes=($(param_to_indexes "$1"))
231
232 if [[ $indexes = "-1" ]]; then
233 print_error "The param $1 is incorrect"
234 fi
235
236 for i in ${indexes[*]}; do
237 rm -f "${bls_file[$i]}"
238 done
239
240 get_bls_values
241
242 update_grubcfg
243 }
244
245 add_bls_fragment() {
246 local kernel="$1" && shift
247 local title="$1" && shift
248 local options="$1" && shift
249 local initrd="$1" && shift
250 local extra_initrd="$1" && shift
251
252 if [[ $kernel = *"vmlinuz-"* ]]; then
253 kernelver="${kernel##*/vmlinuz-}"
254 prefix="vmlinuz-"
255 else
256 kernelver="${kernel##*/}"
257 fi
258
259 if [[ ! -f "/boot/${prefix}${kernelver}" ]] &&
260 [[ $bad_image != "true" ]]; then
261 print_error "The ${kernelver} kernel isn't installed in the machine"
262 fi
263
264 if [[ -z $title ]]; then
265 print_error "The kernel title must be specified"
266 fi
267
268 if [[ ! -d $blsdir ]]; then
269 install -m 700 -d "${blsdir}"
270 fi
271
272 bls_target="${blsdir}/${MACHINE_ID}-${kernelver}.conf"
273 kernel_dir="/lib/modules/${kernelver}"
274 if [[ -f "${kernel_dir}/bls.conf" ]]; then
275 cp -aT "${kernel_dir}/bls.conf" "${bls_target}" || exit $?
276 else
277 if [[ -d $kernel_dir ]]; then
278 datetime="$(date -u +%Y%m%d%H%M%S -d "$(stat -c '%y' "${kernel_dir}")")"
279 else
280 datetime=0
281 fi
282 mkbls "${kernel}" "${kernelver}" "${datetime}" > "${bls_target}"
283 fi
284
285 if [[ -n $title ]]; then
286 set_bls_value "${bls_target}" "title" "${title}"
287 fi
288
289 if [[ -n $options ]]; then
290 set_bls_value "${bls_target}" "options" "${options}"
291 fi
292
293 if [[ -n $initrd ]]; then
294 set_bls_value "${bls_target}" "initrd" "${initrd}"
295 fi
296
297 if [[ -n $extra_initrd ]]; then
298 append_bls_value "${bls_target}" "initrd" "${extra_initrd}"
299 fi
300
301 if [[ $MAKEDEBUG = "yes" ]]; then
302 arch="$(uname -m)"
303 bls_debug="$(echo ${bls_target} | sed -e "s/\.${arch}/-debug.${arch}/")"
304 cp -aT "${bls_target}" "${bls_debug}"
305 append_bls_value "${bls_debug}" "title" "${LINUX_DEBUG_TITLE_POSTFIX}"
306 append_bls_value "${bls_debug}" "version" "${LINUX_DEBUG_VERSION_POSTFIX}"
307 append_bls_value "${bls_debug}" "options" "${CMDLINE_LINUX_DEBUG}"
308 blsid="$(get_bls_value ${bls_debug} "id" | sed -e "s/\.${arch}/-debug.${arch}/")"
309 set_bls_value "${bls_debug}" "id" "${blsid}"
310 fi
311
312 get_bls_values
313
314 if [[ $make_default = "true" ]]; then
315 set_default_bls "TITLE=${title}"
316 fi
317
318 update_grubcfg
319
320 exit 0
321 }
322
323 update_args() {
324 local args=$1 && shift
325 local remove_args=($1) && shift
326 local add_args=($1) && shift
327
328 for arg in ${remove_args[*]}; do
329 args="$(echo $args | sed -e "s!$arg[^ ]*!!")"
330 done
331
332 for arg in ${add_args[*]}; do
333 if [[ $arg = *"="* ]]; then
334 value=${arg##*=}
335 key=${arg%%=$value}
336 exist=$(echo $args | grep "${key}=")
337 if [[ -n $exist ]]; then
338 args="$(echo $args | sed -e "s!$key=[^ ]*!$key=$value!")"
339 else
340 args="$args $key=$value"
341 fi
342 else
343 exist=$(echo $args | grep $arg)
344 if ! [[ -n $exist ]]; then
345 args="$args $arg"
346 fi
347 fi
348 done
349
350 echo ${args}
351 }
352
353 update_bls_fragment() {
354 local indexes=($(param_to_indexes "$1")) && shift
355 local remove_args=$1 && shift
356 local add_args=$1 && shift
357 local initrd=$1 && shift
358
359 for i in ${indexes[*]}; do
360 if [[ -n $remove_args || -n $add_args ]]; then
361 local new_args="$(update_args "${bls_options[$i]}" "${remove_args}" "${add_args}")"
362 set_bls_value "${bls_file[$i]}" "options" "${new_args}"
363 fi
364
365 if [[ -n $initrd ]]; then
366 set_bls_value "${bls_file[$i]}" "initrd" "${initrd}"
367 fi
368 done
369
370 update_grubcfg
371 }
372
373 set_default_bls() {
374 local index=($(param_to_indexes "$1"))
375
376 if [[ $bootloader = grub2 ]]; then
377 grub2-editenv "${env}" set saved_entry="${bls_title[$index]}"
378 else
379 local default="${bls_version[$index]}"
380 local current="$(grep '^default=' ${zipl_config} | sed -e 's/^default=//')"
381 if [[ -n $current ]]; then
382 sed -i -e "s,^default=.*,default=${default}," "${zipl_config}"
383 else
384 echo "default=${default}" >> "${zipl_config}"
385 fi
386 fi
387
388 print_info "The default is ${bls_file[$index]} with index $index and kernel ${bls_linux[$index]}"
389 }
390
391 remove_var_prefix() {
392 if [[ -n $remove_kernel && $remove_kernel =~ ^/ ]]; then
393 remove_kernel="/${remove_kernel##*/}"
394 fi
395
396 if [[ -n $initrd ]]; then
397 initrd="/${initrd##*/}"
398 fi
399
400 if [[ -n $extra_initrd ]]; then
401 extra_initrd=" /${extra_initrd##*/}"
402 fi
403
404 if [[ -n $kernel ]]; then
405 kernel="/${kernel##*/}"
406 fi
407
408 if [[ -n $update_kernel && $update_kernel =~ ^/ ]]; then
409 update_kernel="/${update_kernel##*/}"
410 fi
411 }
412
413 update_grubcfg()
414 {
415 if [[ $arch = 'ppc64' || $arch = 'ppc64le' ]]; then
416 grub2-mkconfig -o /boot/grub2/grub.cfg >& /dev/null
417 fi
418 }
419
420 print_usage()
421 {
422 cat <<EOF
423 Usage: grubby [OPTION...]
424 --add-kernel=kernel-path add an entry for the specified kernel
425 --args=args default arguments for the new kernel or new arguments for kernel being updated)
426 --bad-image-okay don't sanity check images in boot entries (for testing only)
427 -c, --config-file=path path to grub config file to update ("-" for stdin)
428 --copy-default use the default boot entry as a template for the new entry being added; if the default is not a linux image, or if the kernel referenced by the default image does not exist, the
429 first linux entry whose kernel does exist is used as the template
430 --default-kernel display the path of the default kernel
431 --default-index display the index of the default kernel
432 --default-title display the title of the default kernel
433 --env=path path for environment data
434 --grub2 configure grub2 bootloader
435 --info=kernel-path display boot information for specified kernel
436 --initrd=initrd-path initrd image for the new kernel
437 -i, --extra-initrd=initrd-path auxiliary initrd image for things other than the new kernel
438 --make-default make the newly added entry the default boot entry
439 -o, --output-file=path path to output updated config file ("-" for stdout)
440 --remove-args=STRING remove kernel arguments
441 --remove-kernel=kernel-path remove all entries for the specified kernel
442 --set-default=kernel-path make the first entry referencing the specified kernel the default
443 --set-default-index=entry-index make the given entry index the default entry
444 --title=entry-title title to use for the new kernel entry
445 --update-kernel=kernel-path updated information for the specified kernel
446 --zipl configure zipl bootloader
447 -b, --bls-directory path to directory containing the BootLoaderSpec fragment files
448
449 Help options:
450 -?, --help Show this help message
451
452 EOF
453 }
454
455 OPTS="$(getopt -o c:i:o:b:? --long help,add-kernel:,args:,bad-image-okay,\
456 config-file:,copy-default,default-kernel,default-index,default-title,env:,\
457 grub2,info:,initrd:,extra-initrd:,make-default,output-file:,remove-args:,\
458 remove-kernel:,set-default:,set-default-index:,title:,update-kernel:,zipl,\
459 bls-directory:,add-kernel:,add-multiboot:,mbargs:,mounts:,boot-filesystem:,\
460 bootloader-probe,debug,devtree,devtreedir:,elilo,efi,extlinux,grub,lilo,\
461 output-file:,remove-mbargs:,remove-multiboot:,silo,yaboot -n ${SCRIPTNAME} -- "$@")"
462
463 [[ $? = 0 ]] || exit 1
464
465 eval set -- "$OPTS"
466
467 while [ ${#} -gt 0 ]; do
468 case "$1" in
469 --help|-h)
470 print_usage
471 exit 0
472 ;;
473 --add-kernel)
474 kernel="${2}"
475 shift
476 ;;
477 --args)
478 args="${2}"
479 shift
480 ;;
481 --bad-image-okay)
482 bad_image=true
483 ;;
484 --config-file|-c)
485 zipl_config="${2}"
486 shift
487 ;;
488 --copy-default)
489 copy_default=true
490 ;;
491 --default-kernel)
492 display_default="kernel"
493 ;;
494 --default-index)
495 display_default="index"
496 ;;
497 --default-title)
498 display_default="title"
499 ;;
500 --env)
501 env="${2}"
502 shift
503 ;;
504 --grub2)
505 bootloader="grub2"
506 ;;
507 --info)
508 display_info="${2}"
509 shift
510 ;;
511 --initrd)
512 initrd="${2}"
513 shift
514 ;;
515 --extra-initrd|-i)
516 extra_initrd=" /${2}"
517 shift
518 ;;
519 --make-default)
520 make_default=true
521 ;;
522 --output-file|-o)
523 output_file="${2}"
524 shift
525 ;;
526 --remove-args)
527 remove_args="${2}"
528 shift
529 ;;
530 --remove-kernel)
531 remove_kernel="${2}"
532 shift
533 ;;
534 --set-default)
535 set_default="${2}"
536 shift
537 ;;
538 --set-default-index)
539 set_default="${2}"
540 shift
541 ;;
542 --title)
543 title="${2}"
544 shift
545 ;;
546 --update-kernel)
547 update_kernel="${2}"
548 shift
549 ;;
550 --zipl)
551 bootloader="zipl"
552 ;;
553 --bls-directory|-b)
554 blsdir="${2}"
555 shift
556 ;;
557 --add-kernel|--add-multiboot|--mbargs|--mounts|--boot-filesystem|\
558 --bootloader-probe|--debug|--devtree|--devtreedir|--elilo|--efi|\
559 --extlinux|--grub|--lilo|--output-file|--remove-mbargs|--silo|\
560 --remove-multiboot|--slilo|--yaboot)
561 echo
562 echo "${SCRIPTNAME}: the option \"${1}\" was deprecated" >&2
563 echo "Try '${SCRIPTNAME} --help' to list supported options" >&2
564 echo
565 exit 1
566 ;;
567 --)
568 shift
569 break
570 ;;
571 *)
572 echo
573 echo "${SCRIPTNAME}: invalid option \"${1}\"" >&2
574 echo "Try '${SCRIPTNAME} --help' for more information" >&2
575 echo
576 exit 1
577 ;;
578 esac
579 shift
580 done
581
582 if [[ -z $blsdir ]]; then
583 blsdir="/boot/loader/entries"
584 fi
585
586 if [[ -z $env ]]; then
587 env="/boot/grub2/grubenv"
588 fi
589
590 if [[ -z $zipl_config ]]; then
591 zipl_config="/etc/zipl.conf"
592 fi
593
594 get_bls_values
595
596 default_index="$(get_default_index)"
597
598 if [[ -n $display_default ]]; then
599 display_default_value
600 fi
601
602 if [[ -n $display_info ]]; then
603 display_info_values "${display_info}"
604 fi
605
606 if [[ $bootloader = grub2 ]]; then
607 remove_var_prefix
608 fi
609
610 if [[ -n $kernel ]]; then
611 if [[ $copy_default = "true" ]]; then
612 opts="${bls_options[$default_index]}"
613 if [[ -n $args ]]; then
614 opts="${opts} ${args}"
615 fi
616 else
617 opts="${args}"
618 fi
619
620 add_bls_fragment "${kernel}" "${title}" "${opts}" "${initrd}" \
621 "${extra_initrd}"
622 fi
623
624 if [[ -n $remove_kernel ]]; then
625 remove_bls_fragment "${remove_kernel}"
626 fi
627
628 if [[ -n $update_kernel ]]; then
629 update_bls_fragment "${update_kernel}" "${remove_args}" "${args}" "${initrd}"
630 fi
631
632 if [[ -n $set_default ]]; then
633 set_default_bls "${set_default}"
634 fi
635
636 exit 0

Properties

Name Value
svn:executable *