mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-21 22:53:37 +00:00
fish: Don't fail if some mountpoints in /etc/fstab are bogus (RHBZ#668574).
Fix guestfish (and other C tools) so that they ignore errors
when /etc/fstab contains bogus entries.
Update the documentation for inspect-get-mountpoints to emphasize
that callers must be aware of this when mounting the returned
values.
Add a regression test.
Update the example code ("inspect_vm") to reflect the way this
API ought to be called.
For more detail see:
https://bugzilla.redhat.com/show_bug.cgi?id=668574
This commit is contained in:
@@ -98,8 +98,10 @@ main (int argc, char *argv[])
|
||||
qsort (mountpoints, count_strings (mountpoints) / 2, 2 * sizeof (char *),
|
||||
compare_keys_len);
|
||||
for (i = 0; mountpoints[i] != NULL; i += 2) {
|
||||
if (guestfs_mount_ro (g, mountpoints[i+1], mountpoints[i]) == -1)
|
||||
exit (EXIT_FAILURE);
|
||||
/* Ignore failures from this call, since bogus entries can
|
||||
* appear in the guest's /etc/fstab.
|
||||
*/
|
||||
guestfs_mount_ro (g, mountpoints[i+1], mountpoints[i]);
|
||||
free (mountpoints[i]);
|
||||
free (mountpoints[i+1]);
|
||||
}
|
||||
|
||||
@@ -111,6 +111,7 @@ inspect_mount_root (const char *root)
|
||||
compare_keys_len);
|
||||
|
||||
size_t i;
|
||||
size_t mount_errors = 0;
|
||||
for (i = 0; mountpoints[i] != NULL; i += 2) {
|
||||
int r;
|
||||
if (!read_only)
|
||||
@@ -118,10 +119,14 @@ inspect_mount_root (const char *root)
|
||||
else
|
||||
r = guestfs_mount_ro (g, mountpoints[i+1], mountpoints[i]);
|
||||
if (r == -1)
|
||||
exit (EXIT_FAILURE);
|
||||
mount_errors++;
|
||||
}
|
||||
|
||||
free_strings (mountpoints);
|
||||
|
||||
if (mount_errors)
|
||||
fprintf (stderr, _("%s: some filesystems could not be mounted (ignored)\n"),
|
||||
program_name);
|
||||
}
|
||||
|
||||
/* This function is called only if the above function was called,
|
||||
|
||||
@@ -907,6 +907,10 @@ This returns a hash of where we think the filesystems
|
||||
associated with this operating system should be mounted.
|
||||
Callers should note that this is at best an educated guess
|
||||
made by reading configuration files such as C</etc/fstab>.
|
||||
I<In particular note> that this may return filesystems
|
||||
which are non-existent or not mountable and callers should
|
||||
be prepared to handle or ignore failures if they try to
|
||||
mount them.
|
||||
|
||||
Each element in the returned hashtable has a key which
|
||||
is the path of the mountpoint (eg. C</boot>) and a value
|
||||
|
||||
@@ -43,7 +43,11 @@ let () =
|
||||
let cmp (a,_) (b,_) =
|
||||
compare (String.length a) (String.length b) in
|
||||
let mps = List.sort cmp mps in
|
||||
List.iter (fun (mp, dev) -> g#mount_ro dev mp) mps;
|
||||
List.iter (
|
||||
fun (mp, dev) ->
|
||||
try g#mount_ro dev mp
|
||||
with Guestfs.Error msg -> eprintf "%s (ignored)\n" msg
|
||||
) mps;
|
||||
|
||||
(* If /etc/issue.net file exists, print up to 3 lines. *)
|
||||
let filename = "/etc/issue.net" in
|
||||
|
||||
@@ -44,7 +44,10 @@ for root in roots:
|
||||
return -1
|
||||
mps.sort (compare)
|
||||
for mp_dev in mps:
|
||||
g.mount_ro (mp_dev[1], mp_dev[0])
|
||||
try:
|
||||
g.mount_ro (mp_dev[1], mp_dev[0])
|
||||
except RuntimeError as msg:
|
||||
print "%s (ignored)" % msg
|
||||
|
||||
# If /etc/issue.net file exists, print up to 3 lines.
|
||||
filename = "/etc/issue.net"
|
||||
|
||||
@@ -39,6 +39,7 @@ TESTS = \
|
||||
test-guestfish-a.sh \
|
||||
test-guestfish-d.sh \
|
||||
test-guestfish-tilde.sh \
|
||||
test-inspect-fstab.sh \
|
||||
test-launch-race.pl \
|
||||
test-luks.sh \
|
||||
test-lvm-filtering.sh \
|
||||
|
||||
70
regressions/test-inspect-fstab.sh
Executable file
70
regressions/test-inspect-fstab.sh
Executable file
@@ -0,0 +1,70 @@
|
||||
#!/bin/bash -
|
||||
# libguestfs
|
||||
# Copyright (C) 2011 Red Hat Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
# Test various aspects of core inspection of /etc/fstab.
|
||||
# This also tests: https://bugzilla.redhat.com/668574
|
||||
|
||||
set -e
|
||||
export LANG=C
|
||||
|
||||
guestfish=../fish/guestfish
|
||||
|
||||
rm -f test1.img test.fstab test.output
|
||||
|
||||
# Start with the regular (good) fedora image, modify /etc/fstab
|
||||
# and then inspect it.
|
||||
cp ../images/fedora.img test1.img
|
||||
|
||||
cat <<'EOF' > test.fstab
|
||||
/dev/VG/Root / ext2 default 0 0
|
||||
|
||||
# Xen-style partition names.
|
||||
/dev/xvda1 /boot ext2 default 0 0
|
||||
|
||||
# Non-existant device.
|
||||
/dev/sdb3 /var ext2 default 0 0
|
||||
|
||||
# Non-existant mountpoint.
|
||||
/dev/VG/LV1 /nosuchfile ext2 default 0 0
|
||||
EOF
|
||||
|
||||
$guestfish -a test1.img <<'EOF'
|
||||
run
|
||||
mount-options "" /dev/VG/Root /
|
||||
upload test.fstab /etc/fstab
|
||||
EOF
|
||||
|
||||
rm test.fstab
|
||||
|
||||
# This will give a warning, but should not fail.
|
||||
$guestfish -a test1.img -i <<'EOF' | sort > test.output
|
||||
inspect-get-mountpoints /dev/VG/Root
|
||||
EOF
|
||||
|
||||
rm test1.img
|
||||
|
||||
if [ "$(cat test.output)" != "/: /dev/VG/Root
|
||||
/boot: /dev/vda1
|
||||
/nosuchfile: /dev/VG/LV1
|
||||
/var: /dev/sdb3" ]; then
|
||||
echo "$0: error: unexpected output from inspect-get-mountpoints command"
|
||||
cat test.output
|
||||
exit 1
|
||||
fi
|
||||
|
||||
rm test.output
|
||||
@@ -41,7 +41,11 @@ for root in roots do
|
||||
mps = g.inspect_get_mountpoints(root)
|
||||
mps = mps.sort {|a,b| a[0].length <=> b[0].length}
|
||||
for mp in mps do
|
||||
g.mount_ro(mp[1], mp[0])
|
||||
begin
|
||||
g.mount_ro(mp[1], mp[0])
|
||||
rescue Guestfs::Error => msg
|
||||
printf("%s (ignored)\n", msg)
|
||||
end
|
||||
end
|
||||
|
||||
# If /etc/issue.net file exists, print up to 3 lines.
|
||||
|
||||
Reference in New Issue
Block a user