3 # Copyright 2013 Intel Corporation
4 # Author: Artem Bityutskiy
7 PROG="setup-ivi-bootloader-conf"
10 srcdir="$(readlink -ev -- ${0%/*})"
11 PATH="/usr/share/setup-ivi:$srcdir:$PATH"
13 . "$srcdir/setup-ivi-sh-functions"
14 . "$srcdir/installerfw-sh-functions"
16 # This is a small trick which I use to make sure my scripts are portable -
17 # check if 'dash' is present, and if yes - use it.
18 if can_switch_to_dash; then
19 exec dash -euf "$srcdir/$PROG" "$@"
23 # Preparation stuff common for all subcommands
26 # Get the installer framework environment
27 installerfw_restore_env
29 bootdir="$(installerfw_mnt_prefix "/boot")"
31 if installerfw_is_efi_boot_system; then
39 # -----------------------------------------------------------------------------
40 # The "add" subcommand
41 # -----------------------------------------------------------------------------
47 Usage: $PROG add [options] <kernel>
49 Add bootloader entries for kernel <kernel>.
52 -f, --force if bootloader entries for <kernel> already exist in bootloader's
53 config file(s) - re-write them, if <kernel> does not exist - do
55 -h, --help show this text and exit
61 IFS= printf "%s\n\n" "$PROG: error: $*" >&2
68 if [ "$#" -eq 0 ]; then
74 tmp=`getopt -n $PROG -o f,h --long force,help -- "$@"` ||
75 show_add_usage_fail "cannot parse command-line options"
90 *) show_add_usage_fail "unrecognized option \"$1\""
96 if [ "$#" -lt 1 ]; then
97 show_add_usage_fail "please, specify the kernel"
99 if [ "$#" -gt 1 ]; then
100 show_add_usage_fail "too many arguments: \"$1\""
106 local kernel_path="$bootdir/$kernel"
108 if ! [ -f "$kernel_path" ] && [ -z "$force" ]; then
109 fatal "cannot find kernel \"$kernel_path\"" \
110 "(use -f to ignore this error)"
113 # Get root partition PARTUUID
114 installerfw_get_part_info "/" "PARTUUID" "root_partuuid"
115 [ -n "$root_partuuid" ] || \
116 fatal "cannot find PARTUUID of the root partition"
119 local options="${INSTALLERFW_KERNEL_OPTS:-} root=PARTUUID=$root_partuuid"
123 get_os_name "os_name"
125 # Add the bootloader entry
126 setup-$boot-conf $verbose --bootdir "$bootdir" add $force \
127 "$kernel" "$os_name" "$kernel" "$options"
129 # If there is the "quiet" option, create a non-quiet configuration
130 local dbgopts="$(printf "%s" "$options" | LC_ALL=C \
131 sed -e "s/[[:blank:]]\+quiet[[:blank:]]\+/ /
132 s/^quiet[[:blank:]]\+//
133 s/[[:blank:]]\+quiet$//
136 dbgopts="$dbgopts ignore_loglevel initcall_debug log_buf_len=2M"
138 setup-$boot-conf $verbose --bootdir "$bootdir" add \
139 $force "$kernel-debug" "$os_name (debug)" \
144 # -----------------------------------------------------------------------------
145 # The "remove" subcommand
146 # -----------------------------------------------------------------------------
152 Usage: $PROG remove [options] <kernel>
154 Delete bootloader entries for kernel <kernel> (only those which were previously
155 created with "$PROG add").
158 -f, --force do not fail if <kernel> does not have corresponding bootloader
160 -h, --help show this text and exit
164 show_remove_usage_fail()
166 IFS= printf "%s\n\n" "$PROG: error: $*" >&2
167 show_remove_usage >&2
173 if [ "$#" -eq 0 ]; then
179 tmp=`getopt -n $PROG -o f,h --long force,help -- "$@"` ||
180 show_remove_usage_fail "cannot parse command-line options"
195 *) show_remove_usage_fail "unrecognized option \"$1\""
201 if [ "$#" -lt 1 ]; then
202 show_add_usage_fail "please, specify the kernel"
204 if [ "$#" -gt 1 ]; then
205 show_remove_usage_fail "too many arguments: \"$1\""
212 # Get the current default entry
213 local default="$(setup-$boot-conf $verbose --bootdir "$bootdir" \
216 fatal "cannot get the default kernel, setup-$boot-conf failed"
218 local default_kernel="$(printf "%s" "$default" | LC_ALL=C \
219 sed -n -e 's/^kernel: \(.\+\)$/\1/p')"
221 if [ -n "$default_kernel" ]; then
222 verbose "current default boot kernel is " \
223 "\"$default_kernel\""
225 verbose "did not find the default kernel," \
226 "setup-$boot-conf returned: $default"
230 setup-$boot-conf $verbose --bootdir "$bootdir" \
231 remove $force "$kernel" || \
232 fatal "setup-$boot-conf failed to remove" \
234 setup-$boot-conf $verbose --bootdir "$bootdir" \
235 remove $force "$kernel-verbose" || \
236 fatal "setup-$boot-conf failed to remove" \
237 "entry \"$kernel-verbose\""
239 # If this is not the default kernel, we are done
240 [ "$kernel" = "$default_kernel" ] || return 0
242 # We've just removed the default kernel, find the kernel with the
243 # latest version and make it to be the default
245 verbose "removed the default kernel, find the newest available"
247 local newest_kernel="$(get_newest_kernel "$bootdir" "$kernel")"
249 if [ -z "$newest_kernel" ]; then
250 verbose "no more kernels, set the kernel to none"
251 setup-$boot-conf $verbose --bootdir "$bootdir" \
252 default --force "<none>"
254 verbose "new default kernel is \"$newest_kernel\""
255 setup-$boot-conf $verbose --bootdir "$bootdir" \
256 default "$newest_kernel"
259 if [ "$?" -ne 0 ]; then
260 fatal "cannot set default kernel, \"setup-$boot-conf\" failed"
265 # -----------------------------------------------------------------------------
266 # The "default" subcommand
267 # -----------------------------------------------------------------------------
273 Usage: $PROG default [options] <kernel>
275 Set the default boot kernel to <kernel>. If <kernel> is omited, print the
276 current default boot kernel name.
279 -f, --force do not fail if <kernel> doesn't exist
280 -h, --help show this text and exit
284 show_default_usage_fail()
286 IFS= printf "%s\n\n" "$PROG: error: $*" >&2
287 show_default_usage >&2
294 tmp=`getopt -n $PROG -o f,h --long force,help -- "$@"` ||
295 show_default_usage_fail "cannot parse command-line options"
310 *) show_default_usage_fail "unrecognized option \"$1\""
316 if [ "$#" -gt 1 ]; then
317 show_default_usage_fail "too many arguments: \"$1\""
322 local kernel="${1:-}"
323 local kernel_path="$bootdir/$kernel"
325 if [ -n "$kernel" ] && ! [ -f "$kernel_path" ] && [ -z "$force" ]; then
326 fatal "cannot find kernel \"$kernel_path\"" \
327 "(use -f to ignore this error)"
330 setup-$boot-conf $verbose --bootdir "$bootdir" default $force "$kernel"
334 # -----------------------------------------------------------------------------
340 Usage: $PROG [options] <subcommand> [options] <arguments>
342 This program adds or removes a kernel to/from the bootloader configuration
343 file(s). This is a Tizen IVI-specific program and it currently supports only 2
344 bootloader types - extlinux and gummiboot. Each new kernel gets 2 boot menu
345 entries - the default and verbose, and both of these are removed by the
348 The supported subcommands are:
349 add - add bootloader entries for a kernel
350 remove - remove bootloader entries for a kernel
351 default - get or set the default boot kernel
353 Run "$PROG <subcommand>" to see subcommand-specific help.
356 --version show the program version and exit
357 -v, --verbose be verbose
358 -h, --help show this text and exit
364 IFS= printf "%s\n\n" "$PROG: error: $*" >&2
370 while [ -n "${1:-""}" ] && [ -z "${1##-*}" ]; do
385 *) show_usage_fail "unrecognized option \"$1\""
391 if [ "$#" -eq 0 ]; then
398 subcommand="$1"; shift
400 case "$subcommand" in
406 remove_subcommand "$@"
410 default_subcommand "$@"
413 *) show_usage_fail "unrecognized subcommand \"$subcommand\""