grub-mkconfig: Fix detecting .sig files as system images
[grub.git] / util / grub-mkconfig_lib.in
1 # Helper library for grub-mkconfig
2 # Copyright (C) 2007,2008,2009,2010  Free Software Foundation, Inc.
3 #
4 # GRUB is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # GRUB is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
16
17 prefix="@prefix@"
18 exec_prefix="@exec_prefix@"
19 datarootdir="@datarootdir@"
20 datadir="@datadir@"
21 bindir="@bindir@"
22 sbindir="@sbindir@"
23 if [ "x$pkgdatadir" = x ]; then
24     pkgdatadir="${datadir}/@PACKAGE@"
25 fi
26
27 if test "x$grub_probe" = x; then
28   grub_probe="${sbindir}/@grub_probe@"
29 fi
30 if test "x$grub_file" = x; then
31   grub_file="${bindir}/@grub_file@"
32 fi
33 if test "x$grub_mkrelpath" = x; then
34   grub_mkrelpath="${bindir}/@grub_mkrelpath@"
35 fi
36
37 if which gettext >/dev/null 2>/dev/null; then
38   :
39 else
40   gettext () {
41      printf "%s" "$@"
42   }
43 fi
44
45 grub_warn ()
46 {
47   echo "$(gettext "Warning:")" "$@" >&2
48 }
49
50 make_system_path_relative_to_its_root ()
51 {
52   "${grub_mkrelpath}" "$1"
53 }
54
55 is_path_readable_by_grub ()
56 {
57   path="$1"
58
59   # abort if path doesn't exist
60   if test -e "$path" ; then : ;else
61     return 1
62   fi
63
64   # abort if file is in a filesystem we can't read
65   if "${grub_probe}" -t fs "$path" > /dev/null 2>&1 ; then : ; else
66     return 1
67   fi
68
69   # ... or if we can't figure out the abstraction module, for example if
70   # memberlist fails on an LVM volume group.
71   if abstractions="`"${grub_probe}" -t abstraction "$path"`" 2> /dev/null ; then 
72       :
73   else
74     return 1
75   fi
76
77   if [ x$GRUB_ENABLE_CRYPTODISK = xy ]; then
78       return 0
79   fi
80   
81   for abstraction in $abstractions; do
82       if [ "x$abstraction" = xcryptodisk ]; then
83           return 1
84       fi
85   done
86
87   return 0
88 }
89
90 convert_system_path_to_grub_path ()
91 {
92   path="$1"
93
94   grub_warn "convert_system_path_to_grub_path() is deprecated.  Use prepare_grub_to_access_device() instead."
95
96   # abort if GRUB can't access the path
97   if is_path_readable_by_grub "${path}" ; then : ; else
98     return 1
99   fi
100
101   if drive="`"${grub_probe}" -t drive "$path"`" ; then : ; else
102     return 1
103   fi
104
105   if relative_path="`make_system_path_relative_to_its_root "$path"`" ; then : ; else
106     return 1
107   fi
108
109   echo "${drive}${relative_path}"
110 }
111
112 save_default_entry ()
113 {
114   if [ "x${GRUB_SAVEDEFAULT}" = "xtrue" ] ; then
115     cat << EOF
116 savedefault
117 EOF
118   fi
119 }
120
121 prepare_grub_to_access_device ()
122 {
123   old_ifs="$IFS"
124   IFS='
125 '
126   partmap="`"${grub_probe}" --device $@ --target=partmap`"
127   for module in ${partmap} ; do
128     case "${module}" in
129       netbsd | openbsd)
130         echo "insmod part_bsd";;
131       *)
132         echo "insmod part_${module}";;
133     esac
134   done
135
136   # Abstraction modules aren't auto-loaded.
137   abstraction="`"${grub_probe}" --device $@ --target=abstraction`"
138   for module in ${abstraction} ; do
139     echo "insmod ${module}"
140   done
141
142   fs="`"${grub_probe}" --device $@ --target=fs`"
143   for module in ${fs} ; do
144     echo "insmod ${module}"
145   done
146
147   if [ x$GRUB_ENABLE_CRYPTODISK = xy ]; then
148       for uuid in `"${grub_probe}" --device $@ --target=cryptodisk_uuid`; do
149           echo "cryptomount -u $uuid"
150       done
151   fi
152
153   # If there's a filesystem UUID that GRUB is capable of identifying, use it;
154   # otherwise set root as per value in device.map.
155   fs_hint="`"${grub_probe}" --device $@ --target=compatibility_hint`"
156   if [ "x$fs_hint" != x ]; then
157     echo "set root='$fs_hint'"
158   fi
159   if fs_uuid="`"${grub_probe}" --device $@ --target=fs_uuid 2> /dev/null`" ; then
160     hints="`"${grub_probe}" --device $@ --target=hints_string 2> /dev/null`" || hints=
161     echo "if [ x\$feature_platform_search_hint = xy ]; then"
162     echo "  search --no-floppy --fs-uuid --set=root ${hints} ${fs_uuid}"
163     echo "else"
164     echo "  search --no-floppy --fs-uuid --set=root ${fs_uuid}"
165     echo "fi"
166   fi
167   IFS="$old_ifs"
168 }
169
170 grub_get_device_id ()
171 {
172   old_ifs="$IFS"
173   IFS='
174 '
175   device="$1"
176   if fs_uuid="`"${grub_probe}" --device ${device} --target=fs_uuid 2> /dev/null`" ; then
177     echo "$fs_uuid";
178   else
179     echo $device |sed 's, ,_,g'
180   fi
181   IFS="$old_ifs"
182 }
183
184 grub_file_is_not_garbage ()
185 {
186   if test -f "$1" ; then
187     case "$1" in
188       *.dpkg-*) return 1 ;; # debian dpkg
189       *.rpmsave|*.rpmnew) return 1 ;;
190       README*|*/README*)  return 1 ;; # documentation
191       *.sig) return 1 ;; # signatures
192     esac
193   else
194     return 1
195   fi
196   return 0
197 }
198
199 version_sort ()
200 {
201   case $version_sort_sort_has_v in
202     yes)
203       LC_ALL=C sort -V;;
204     no)
205       LC_ALL=C sort -n;;
206     *)
207       if sort -V </dev/null > /dev/null 2>&1; then
208         version_sort_sort_has_v=yes
209         LC_ALL=C sort -V
210       else
211         version_sort_sort_has_v=no
212         LC_ALL=C sort -n
213       fi;;
214    esac
215 }
216
217 version_test_numeric ()
218 {
219   version_test_numeric_a="$1"
220   version_test_numeric_cmp="$2"
221   version_test_numeric_b="$3"
222   if [ "$version_test_numeric_a" = "$version_test_numeric_b" ] ; then
223     case "$version_test_numeric_cmp" in
224       ge|eq|le) return 0 ;;
225       gt|lt) return 1 ;;
226     esac
227   fi
228   if [ "$version_test_numeric_cmp" = "lt" ] ; then
229     version_test_numeric_c="$version_test_numeric_a"
230     version_test_numeric_a="$version_test_numeric_b"
231     version_test_numeric_b="$version_test_numeric_c"
232   fi
233   if (echo "$version_test_numeric_a" ; echo "$version_test_numeric_b") | version_sort | head -n 1 | grep -qx "$version_test_numeric_b" ; then
234     return 0
235   else
236     return 1
237   fi
238 }
239
240 version_test_gt ()
241 {
242   version_test_gt_a="`echo "$1" | sed -e "s/[^-]*-//"`"
243   version_test_gt_b="`echo "$2" | sed -e "s/[^-]*-//"`"
244   version_test_gt_cmp=gt
245   if [ "x$version_test_gt_b" = "x" ] ; then
246     return 0
247   fi
248   case "$version_test_gt_a:$version_test_gt_b" in
249     *.old:*.old) ;;
250     *.old:*) version_test_gt_a="`echo "$version_test_gt_a" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=gt ;;
251     *:*.old) version_test_gt_b="`echo "$version_test_gt_b" | sed -e 's/\.old$//'`" ; version_test_gt_cmp=ge ;;
252   esac
253   version_test_numeric "$version_test_gt_a" "$version_test_gt_cmp" "$version_test_gt_b"
254   return "$?"
255 }
256
257 version_find_latest ()
258 {
259   version_find_latest_a=""
260   for i in "$@" ; do
261     if version_test_gt "$i" "$version_find_latest_a" ; then
262       version_find_latest_a="$i"
263     fi
264   done
265   echo "$version_find_latest_a"
266 }
267
268 # One layer of quotation is eaten by "" and the second by sed; so this turns
269 # ' into \'.
270 grub_quote () {
271   sed "s/'/'\\\\''/g"
272 }
273
274 gettext_quoted () {
275   gettext "$@" | grub_quote
276 }
277
278 # Run the first argument through gettext, and then pass that and all
279 # remaining arguments to printf.  This is a useful abbreviation and tends to
280 # be easier to type.
281 gettext_printf () {
282   gettext_printf_format="$1"
283   shift
284   printf "$(gettext "$gettext_printf_format")" "$@"
285 }
286
287 uses_abstraction () {
288   device="$1"
289   old_ifs="$IFS"
290   IFS='
291 '
292
293   abstraction="`"${grub_probe}" --device ${device} --target=abstraction`"
294   for module in ${abstraction}; do
295     if test "x${module}" = "x$2"; then
296       IFS="$old_ifs"
297       return 0
298     fi
299   done
300   IFS="$old_ifs"
301   return 1
302 }
303
304 print_option_help () {
305   if test x$print_option_help_wc = x; then
306       if wc -L  </dev/null > /dev/null 2>&1; then
307           print_option_help_wc=-L
308       elif wc -m  </dev/null > /dev/null 2>&1; then
309           print_option_help_wc=-m
310       else
311           print_option_help_wc=-b
312       fi
313   fi
314   if test x$grub_have_fmt = x; then
315       if fmt -w 40  </dev/null > /dev/null 2>&1; then
316           grub_have_fmt=y;
317       else
318           grub_have_fmt=n;
319       fi
320   fi
321   print_option_help_lead="  $1"
322   print_option_help_lspace="$(echo "$print_option_help_lead" | wc $print_option_help_wc)"
323   print_option_help_fill="$((26 - print_option_help_lspace))"
324   printf "%s" "$print_option_help_lead"
325   if test $print_option_help_fill -le 0; then
326       print_option_help_nl=y
327       echo
328   else
329       print_option_help_i=0;
330       while test $print_option_help_i -lt $print_option_help_fill; do
331       printf " "
332           print_option_help_i=$((print_option_help_i+1))
333       done
334       print_option_help_nl=n
335   fi
336   if test x$grub_have_fmt = xy; then
337       print_option_help_split="$(echo "$2" | fmt -w 50)"
338   else
339       print_option_help_split="$2"
340   fi
341   if test x$print_option_help_nl = xy; then
342       echo "$print_option_help_split" | awk \
343           '{ print "                          " $0; }'
344   else
345       echo "$print_option_help_split" | awk 'BEGIN   { n = 0 }
346   { if (n == 1) print "                          " $0; else print $0; n = 1 ; }'
347   fi
348 }
349
350 grub_fmt () {
351   if test x$grub_have_fmt = x; then
352       if fmt -w 40 < /dev/null > /dev/null; then
353           grub_have_fmt=y;
354       else
355           grub_have_fmt=n;
356       fi
357   fi
358
359   if test x$grub_have_fmt = xy; then
360       fmt
361   else
362       cat
363   fi
364 }
365
366 grub_tab="      "
367
368 grub_add_tab () {
369   sed -e "s/^/$grub_tab/"
370 }
371