]> git.ipfire.org Git - ipfire-2.x.git/blob - src/scripts/update-bootloader
core115: Include captive portal in updater
[ipfire-2.x.git] / src / scripts / update-bootloader
1 #!/bin/bash
2 ############################################################################
3 # #
4 # This file is part of the IPFire Firewall. #
5 # #
6 # IPFire is free software; you can redistribute it and/or modify #
7 # it under the terms of the GNU General Public License as published by #
8 # the Free Software Foundation; either version 2 of the License, or #
9 # (at your option) any later version. #
10 # #
11 # IPFire is distributed in the hope that it will be useful, #
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
14 # GNU General Public License for more details. #
15 # #
16 # You should have received a copy of the GNU General Public License #
17 # along with IPFire; if not, write to the Free Software #
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #
19 # #
20 # Copyright (C) 2014 IPFire Team <info@ipfire.org>. #
21 # #
22 ############################################################################
23
24 GRUB_INSTALL_ARGS="--no-floppy --recheck"
25
26 function find_bootloader_device() {
27 local mp
28 for mp in /boot /; do
29 if find_device "${mp}"; then
30 return 0
31 fi
32 done
33
34 return 1
35 }
36
37 function find_device() {
38 local mountpoint="${1}"
39
40 local root
41 local dev mp fs flags rest
42 while read -r dev mp fs flags rest; do
43 # Skip unwanted entries
44 [ "${dev}" = "rootfs" ] && continue
45
46 if [ "${mp}" = "${mountpoint}" ] && [ -b "${dev}" ]; then
47 root="$(basename "${dev}")"
48 break
49 fi
50 done < /proc/mounts
51
52 # Get the actual device from the partition that holds /
53 while [ -n "${root}" ]; do
54 if [ -e "/sys/block/${root}" ]; then
55 echo "${root}"
56 return 0
57 fi
58
59 # Remove last character
60 root="${root::-1}"
61 done
62
63 return 1
64 }
65
66 function device_is_mdraid() {
67 local device="${1}"
68
69 [ -d "/sys/block/${device}/md" ]
70 }
71
72 function mdraid_get_slaves() {
73 local device="${1}"
74
75 local slave
76 for slave in /sys/block/${device}/slaves/*; do
77 basename "${slave}"
78 done 2>/dev/null
79 }
80
81 function grub_update_config() {
82 echo "Updating configuration..."
83
84 if ! grub-mkconfig -o /boot/grub/grub.cfg &>/dev/null; then
85 echo "Could not update configuration. Aborting." >&2
86 return 1
87 fi
88
89 return 0
90 }
91
92 function grub_install() {
93 local device="${1}"
94
95 echo "Installing GRUB on ${device}..."
96
97 if [ ! -b "${device}" ]; then
98 echo "${device} does not exist or is not a block device" >&2
99 return 1
100 fi
101
102 local args
103 for args in "" "--force"; do
104 if grub-install ${GRUB_INSTALL_ARGS} ${args} "${device}" &>/dev/null; then
105 return 0
106 fi
107 done
108
109 echo "Could not install GRUB on ${device}" >&2
110 return 1
111 }
112
113 function main() {
114 # Find the root device
115 local device="$(find_bootloader_device)"
116 if [ -z "${device}" ]; then
117 echo "Could not find root device. Aborting." >&2
118 exit 1
119 fi
120
121 echo "Found bootloader device: /dev/${device}"
122
123 # Update configuration files
124 grub_update_config || exit $?
125
126 # Handle mdraid devices
127 if device_is_mdraid "${device}"; then
128 local slave
129 for slave in $(mdraid_get_slaves "${device}"); do
130 grub_install "/dev/${slave}"
131 done
132
133 # Handle normal block devices
134 else
135 grub_install "/dev/${device}"
136 fi
137
138 return 0
139 }
140
141 # Run main function
142 main