diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2008-04-15 18:30:49 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2008-04-15 18:30:49 +0100 |
commit | 81294675f6a5058a3381871f1dc99c806922d77c (patch) | |
tree | 63e8e8bcf5955405749559b45e39e2fc556bdc10 /virt-df/virt_df_lvm2.ml | |
parent | b9320ec4678a8a7bb88a8b8aa72805b79ce48daf (diff) | |
download | virt-top-81294675f6a5058a3381871f1dc99c806922d77c.tar.gz virt-top-81294675f6a5058a3381871f1dc99c806922d77c.tar.xz virt-top-81294675f6a5058a3381871f1dc99c806922d77c.zip |
Metadata parser.
Diffstat (limited to 'virt-df/virt_df_lvm2.ml')
-rw-r--r-- | virt-df/virt_df_lvm2.ml | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/virt-df/virt_df_lvm2.ml b/virt-df/virt_df_lvm2.ml index 16d8e89..fcf1fd2 100644 --- a/virt-df/virt_df_lvm2.ml +++ b/virt-df/virt_df_lvm2.ml @@ -24,6 +24,8 @@ open Printf open Virt_df_gettext.Gettext open Virt_df +open Virt_df_lvm2_metadata + let plugin_name = "LVM2" let sector_size = 512 @@ -64,9 +66,16 @@ and read_pv_label dev = metadata_length : 32 : littleendian (* length of metadata (bytes) *) when Bitmatch.string_of_bitstring labelone = "LABELONE" && Bitmatch.string_of_bitstring lvm2_ver = "LVM2 001" -> + + (* Metadata offset is relative to end of PV label. *) let metadata_offset = metadata_offset +* 0x1000_l in + (* Metadata length appears to include the trailing \000 which + * we don't want. + *) + let metadata_length = metadata_length -* 1_l in + let metadata = read_metadata dev metadata_offset metadata_length in - (*prerr_endline metadata;*) + let uuid = Bitmatch.string_of_bitstring uuid in uuid, metadata @@ -101,11 +110,34 @@ and read_metadata dev offset32 len32 = * (as devices) and return them. Note that we don't try to detect * what is on these LVs - that will be done in the main code. *) -let list_lvs devs = - (* Read the UUID and metadata (again) from each device. *) - let uuidmetas = List.map read_pv_label devs in +let rec list_lvs devs = + (* Read the UUID and metadata (again) from each device to end up with + * an assoc list of PVs, keyed on the UUID. + *) + let pvs = List.map read_pv_label devs in + + (* Parse the metadata using the external lexer/parser. *) + let pvs = List.map ( + fun (uuid, metadata) -> + eprintf "parsing: %s\n<<<<\n" metadata; + uuid, Virt_df_lvm2_lexer.parse_lvm2_metadata_from_string metadata + ) pvs in + + (* Print the parsed metadata. *) + List.iter ( + fun (uuid, metadata) -> + eprintf "metadata for UUID %s:\n" uuid; + output_metadata stderr metadata + ) pvs; + [] + + + + + + (* Register with main code. *) let () = lvm_type_register plugin_name probe_pv list_lvs |