re-support parsing of AV2 log entries, document path forward strategy
This commit is contained in:
parent
e28ea84548
commit
bda342f136
|
@ -31,7 +31,7 @@ let write_complete s cs =
|
||||||
|
|
||||||
let read_from_file file =
|
let read_from_file file =
|
||||||
Vmm_lwt.read_from_file file >|= fun data ->
|
Vmm_lwt.read_from_file file >|= fun data ->
|
||||||
let logs = Vmm_asn.logs_of_disk my_version data in
|
let logs = Vmm_asn.logs_of_disk data in
|
||||||
List.rev logs
|
List.rev logs
|
||||||
|
|
||||||
let write_to_file file =
|
let write_to_file file =
|
||||||
|
|
|
@ -313,9 +313,11 @@ let block_cmd =
|
||||||
let version =
|
let version =
|
||||||
let f data = match data with
|
let f data = match data with
|
||||||
| 3 -> `AV3
|
| 3 -> `AV3
|
||||||
|
| 2 -> `AV2
|
||||||
| x -> Asn.S.error (`Parse (Printf.sprintf "unknown version number 0x%X" x))
|
| x -> Asn.S.error (`Parse (Printf.sprintf "unknown version number 0x%X" x))
|
||||||
and g = function
|
and g = function
|
||||||
| `AV3 -> 3
|
| `AV3 -> 3
|
||||||
|
| `AV2 -> 2
|
||||||
in
|
in
|
||||||
Asn.S.map f g Asn.S.int
|
Asn.S.map f g Asn.S.int
|
||||||
|
|
||||||
|
@ -445,6 +447,12 @@ let log_entry =
|
||||||
|
|
||||||
let log_entry_of_cstruct, log_entry_to_cstruct = projections_of log_entry
|
let log_entry_of_cstruct, log_entry_to_cstruct = projections_of log_entry
|
||||||
|
|
||||||
|
(* if we revise structure, we need to stay in a sequence.. the first element
|
||||||
|
is always the version, we can dispatch on it for the later reader
|
||||||
|
-- would be easier to use a choice here -- we can define implicit tagged
|
||||||
|
is the current structure, and then 1 for new format etc.
|
||||||
|
keep in mind while changing arbitrary data here which may end up in the log ;)
|
||||||
|
*)
|
||||||
let log_disk =
|
let log_disk =
|
||||||
Asn.S.(sequence2
|
Asn.S.(sequence2
|
||||||
(required ~label:"version" version)
|
(required ~label:"version" version)
|
||||||
|
@ -457,17 +465,12 @@ let log_disk_of_cstruct, log_disk_to_cstruct =
|
||||||
let log_to_disk version entry =
|
let log_to_disk version entry =
|
||||||
log_disk_to_cstruct (version, entry)
|
log_disk_to_cstruct (version, entry)
|
||||||
|
|
||||||
let logs_of_disk version buf =
|
let logs_of_disk buf =
|
||||||
let rec next acc buf =
|
let rec next acc buf =
|
||||||
match log_disk_of_cstruct buf with
|
match log_disk_of_cstruct buf with
|
||||||
| Ok ((version', entry), cs) ->
|
| Ok ((version, entry), cs) ->
|
||||||
let acc' =
|
Logs.info (fun m -> m "read a log entry version %a" pp_version version) ;
|
||||||
if Vmm_commands.version_eq version version' then
|
next (entry :: acc) cs
|
||||||
entry :: acc
|
|
||||||
else
|
|
||||||
acc
|
|
||||||
in
|
|
||||||
next acc' cs
|
|
||||||
| Error (`Parse msg) ->
|
| Error (`Parse msg) ->
|
||||||
Logs.warn (fun m -> m "parse error %s while parsing log" msg) ;
|
Logs.warn (fun m -> m "parse error %s while parsing log" msg) ;
|
||||||
acc (* ignore *)
|
acc (* ignore *)
|
||||||
|
|
|
@ -19,7 +19,7 @@ val log_entry_of_cstruct : Cstruct.t -> (Log.t, [> `Msg of string ]) result
|
||||||
|
|
||||||
val log_to_disk : Vmm_commands.version -> Log.t -> Cstruct.t
|
val log_to_disk : Vmm_commands.version -> Log.t -> Cstruct.t
|
||||||
|
|
||||||
val logs_of_disk : Vmm_commands.version -> Cstruct.t -> Log.t list
|
val logs_of_disk : Cstruct.t -> Log.t list
|
||||||
|
|
||||||
type cert_extension = Vmm_commands.version * Vmm_commands.t
|
type cert_extension = Vmm_commands.version * Vmm_commands.t
|
||||||
|
|
||||||
|
|
|
@ -3,16 +3,18 @@
|
||||||
(* the wire protocol *)
|
(* the wire protocol *)
|
||||||
open Vmm_core
|
open Vmm_core
|
||||||
|
|
||||||
type version = [ `AV3 ]
|
type version = [ `AV2 | `AV3 ]
|
||||||
|
|
||||||
let pp_version ppf v =
|
let pp_version ppf v =
|
||||||
Fmt.int ppf
|
Fmt.int ppf
|
||||||
(match v with
|
(match v with
|
||||||
| `AV3 -> 3)
|
| `AV3 -> 3
|
||||||
|
| `AV2 -> 2)
|
||||||
|
|
||||||
let version_eq a b =
|
let version_eq a b =
|
||||||
match a, b with
|
match a, b with
|
||||||
| `AV3, `AV3 -> true
|
| `AV3, `AV3 -> true
|
||||||
|
| `AV2, `AV2 -> true
|
||||||
| _ -> false
|
| _ -> false
|
||||||
|
|
||||||
type console_cmd = [
|
type console_cmd = [
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
open Vmm_core
|
open Vmm_core
|
||||||
|
|
||||||
(** The type of versions of the grammar defined below. *)
|
(** The type of versions of the grammar defined below. *)
|
||||||
type version = [ `AV3 ]
|
type version = [ `AV2 | `AV3 ]
|
||||||
|
|
||||||
(** [version_eq a b] is true if [a] and [b] are equal. *)
|
(** [version_eq a b] is true if [a] and [b] are equal. *)
|
||||||
val version_eq : version -> version -> bool
|
val version_eq : version -> version -> bool
|
||||||
|
|
Loading…
Reference in a new issue