Files
libguestfs/ocaml/examples/inspect_vm.ml
Richard W.M. Jones 0c60e4d9dd 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
2011-01-11 11:09:41 +00:00

63 lines
1.8 KiB
OCaml

(* Example showing how to inspect a virtual machine disk. *)
open Printf
let disk =
if Array.length Sys.argv = 2 then
Sys.argv.(1)
else
failwith "usage: inspect_vm disk.img"
let () =
let g = new Guestfs.guestfs () in
(* Attach the disk image read-only to libguestfs. *)
g#add_drive_opts (*~format:"raw"*) ~readonly:true disk;
(* Run the libguestfs back-end. *)
g#launch ();
(* Ask libguestfs to inspect for operating systems. *)
let roots = g#inspect_os () in
if Array.length roots = 0 then
failwith "inspect_vm: no operating systems found";
Array.iter (
fun root ->
printf "Root device: %s\n" root;
(* Print basic information about the operating system. *)
printf " Product name: %s\n" (g#inspect_get_product_name root);
printf " Version: %d.%d\n"
(g#inspect_get_major_version root)
(g#inspect_get_minor_version root);
printf " Type: %s\n" (g#inspect_get_type root);
printf " Distro: %s\n" (g#inspect_get_distro root);
(* Mount up the disks, like guestfish -i.
*
* Sort keys by length, shortest first, so that we end up
* mounting the filesystems in the correct order.
*)
let mps = g#inspect_get_mountpoints root in
let cmp (a,_) (b,_) =
compare (String.length a) (String.length b) in
let mps = List.sort cmp mps in
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
if g#is_file filename then (
printf "--- %s ---\n" filename;
let lines = g#head_n 3 filename in
Array.iter print_endline lines
);
(* Unmount everything. *)
g#umount_all ()
) roots