Metadata parser.
[virt-top.git] / virt-df / virt_df_lvm2.ml
index afcab66..fcf1fd2 100644 (file)
@@ -24,12 +24,14 @@ open Printf
 open Virt_df_gettext.Gettext
 open Virt_df
 
+open Virt_df_lvm2_metadata
+
 let plugin_name = "LVM2"
 
 let sector_size = 512
 let sector_size64 = 512L
 
-(* Probe to see if it's an LVM2 PV.  Look for the "LABELONE" label. *)
+(* Probe to see if it's an LVM2 PV. *)
 let rec probe_pv lvm_plugin_id dev =
   try
     let uuid, _ = read_pv_label dev in
@@ -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
@@ -77,7 +86,7 @@ and read_pv_label dev =
 
 and read_metadata dev offset32 len32 =
   if debug then
-    eprintf "metadata: offset 0x%lx len %ld bytes\n" offset32 len32;
+    eprintf "metadata: offset 0x%lx len %ld bytes\n%!" offset32 len32;
 
   (* Check the offset and length are sensible. *)
   let offset64 =
@@ -101,9 +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 =
+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