diff options
-rw-r--r-- | data/vyconf.proto | 6 | ||||
-rw-r--r-- | src/vyconf_client.ml | 9 | ||||
-rw-r--r-- | src/vyconf_client.mli | 2 | ||||
-rw-r--r-- | src/vyconf_pbt.ml | 59 | ||||
-rw-r--r-- | src/vyconf_pbt.mli | 21 | ||||
-rw-r--r-- | src/vyconfd.ml | 6 |
6 files changed, 94 insertions, 9 deletions
diff --git a/data/vyconf.proto b/data/vyconf.proto index f2245aa..d989fb3 100644 --- a/data/vyconf.proto +++ b/data/vyconf.proto @@ -17,6 +17,10 @@ message Request { optional int32 OnBehalfOf = 2; } + message Teardown { + optional int32 OnBehalfOf = 1; + } + message Validate { repeated string Path = 1; optional OutputFormat output_format = 2; @@ -135,7 +139,7 @@ message Request { EnterConfigurationMode configure = 19; ExitConfigurationMode exit_configure = 20; Validate validate = 21; - string teardown = 22; + Teardown teardown = 22; } } diff --git a/src/vyconf_client.ml b/src/vyconf_client.ml index 5cbd798..94348b2 100644 --- a/src/vyconf_client.ml +++ b/src/vyconf_client.ml @@ -65,6 +65,15 @@ let setup_session ?(on_behalf_of=None) client client_app = | None -> Error "setup_session did not return a session token!") |> Lwt.return | _ -> Error (Option.value resp.error ~default:"Unknown error") |> Lwt.return +let teardown_session ?(on_behalf_of=None) client = + let id = on_behalf_of |> (function None -> None | Some x -> (Some (Int32.of_int x))) in + let req = Teardown {on_behalf_of=id} in + let%lwt resp = do_request client req in + match resp.status with + | Success -> Ok "" |> Lwt.return + | Fail -> Error (Option.value resp.error ~default:"") |> Lwt.return + | _ -> Error (Option.value resp.error ~default:"") |> Lwt.return + let exists client path = let req = Exists {path=path} in let%lwt resp = do_request client req in diff --git a/src/vyconf_client.mli b/src/vyconf_client.mli index ec78780..0feb063 100644 --- a/src/vyconf_client.mli +++ b/src/vyconf_client.mli @@ -29,6 +29,8 @@ val get_status : t -> response Lwt.t val setup_session : ?on_behalf_of:(int option) -> t -> string -> (t, string) result Lwt.t +val teardown_session : ?on_behalf_of:(int option) -> t -> (string, string) result Lwt.t + val exists : t -> string list -> (string, string) result Lwt.t val get_value : t -> string list -> (string, string) result Lwt.t diff --git a/src/vyconf_pbt.ml b/src/vyconf_pbt.ml index 1e481b9..4c7fcc6 100644 --- a/src/vyconf_pbt.ml +++ b/src/vyconf_pbt.ml @@ -15,6 +15,10 @@ type request_setup_session = { on_behalf_of : int32 option; } +type request_teardown = { + on_behalf_of : int32 option; +} + type request_validate = { path : string list; output_format : request_output_format option; @@ -131,7 +135,7 @@ type request = | Configure of request_enter_configuration_mode | Exit_configure | Validate of request_validate - | Teardown of string + | Teardown of request_teardown type request_envelope = { token : string option; @@ -170,6 +174,12 @@ let rec default_request_setup_session on_behalf_of; } +let rec default_request_teardown + ?on_behalf_of:((on_behalf_of:int32 option) = None) + () : request_teardown = { + on_behalf_of; +} + let rec default_request_validate ?path:((path:string list) = []) ?output_format:((output_format:request_output_format option) = None) @@ -352,6 +362,14 @@ let default_request_setup_session_mutable () : request_setup_session_mutable = { on_behalf_of = None; } +type request_teardown_mutable = { + mutable on_behalf_of : int32 option; +} + +let default_request_teardown_mutable () : request_teardown_mutable = { + on_behalf_of = None; +} + type request_validate_mutable = { mutable path : string list; mutable output_format : request_output_format option; @@ -583,6 +601,12 @@ let rec pp_request_setup_session fmt (v:request_setup_session) = in Pbrt.Pp.pp_brk pp_i fmt () +let rec pp_request_teardown fmt (v:request_teardown) = + let pp_i fmt () = + Pbrt.Pp.pp_record_field ~first:true "on_behalf_of" (Pbrt.Pp.pp_option Pbrt.Pp.pp_int32) fmt v.on_behalf_of; + in + Pbrt.Pp.pp_brk pp_i fmt () + let rec pp_request_validate fmt (v:request_validate) = let pp_i fmt () = Pbrt.Pp.pp_record_field ~first:true "path" (Pbrt.Pp.pp_list Pbrt.Pp.pp_string) fmt v.path; @@ -744,7 +768,7 @@ let rec pp_request fmt (v:request) = | Configure x -> Format.fprintf fmt "@[<hv2>Configure(@,%a)@]" pp_request_enter_configuration_mode x | Exit_configure -> Format.fprintf fmt "Exit_configure" | Validate x -> Format.fprintf fmt "@[<hv2>Validate(@,%a)@]" pp_request_validate x - | Teardown x -> Format.fprintf fmt "@[<hv2>Teardown(@,%a)@]" Pbrt.Pp.pp_string x + | Teardown x -> Format.fprintf fmt "@[<hv2>Teardown(@,%a)@]" pp_request_teardown x let rec pp_request_envelope fmt (v:request_envelope) = let pp_i fmt () = @@ -806,6 +830,15 @@ let rec encode_pb_request_setup_session (v:request_setup_session) encoder = end; () +let rec encode_pb_request_teardown (v:request_teardown) encoder = + begin match v.on_behalf_of with + | Some x -> + Pbrt.Encoder.int32_as_varint x encoder; + Pbrt.Encoder.key 1 Pbrt.Varint encoder; + | None -> (); + end; + () + let rec encode_pb_request_validate (v:request_validate) encoder = Pbrt.List_util.rev_iter_with (fun x encoder -> Pbrt.Encoder.string x encoder; @@ -1080,7 +1113,7 @@ let rec encode_pb_request (v:request) encoder = Pbrt.Encoder.nested encode_pb_request_validate x encoder; Pbrt.Encoder.key 21 Pbrt.Bytes encoder; | Teardown x -> - Pbrt.Encoder.string x encoder; + Pbrt.Encoder.nested encode_pb_request_teardown x encoder; Pbrt.Encoder.key 22 Pbrt.Bytes encoder; end @@ -1176,6 +1209,24 @@ let rec decode_pb_request_setup_session d = on_behalf_of = v.on_behalf_of; } : request_setup_session) +let rec decode_pb_request_teardown d = + let v = default_request_teardown_mutable () in + let continue__= ref true in + while !continue__ do + match Pbrt.Decoder.key d with + | None -> ( + ); continue__ := false + | Some (1, Pbrt.Varint) -> begin + v.on_behalf_of <- Some (Pbrt.Decoder.int32_as_varint d); + end + | Some (1, pk) -> + Pbrt.Decoder.unexpected_payload "Message(request_teardown), field(1)" pk + | Some (_, payload_kind) -> Pbrt.Decoder.skip d payload_kind + done; + ({ + on_behalf_of = v.on_behalf_of; + } : request_teardown) + let rec decode_pb_request_validate d = let v = default_request_validate_mutable () in let continue__= ref true in @@ -1688,7 +1739,7 @@ let rec decode_pb_request d = (Exit_configure : request) end | Some (21, _) -> (Validate (decode_pb_request_validate (Pbrt.Decoder.nested d)) : request) - | Some (22, _) -> (Teardown (Pbrt.Decoder.string d) : request) + | Some (22, _) -> (Teardown (decode_pb_request_teardown (Pbrt.Decoder.nested d)) : request) | Some (n, payload_kind) -> ( Pbrt.Decoder.skip d payload_kind; loop () diff --git a/src/vyconf_pbt.mli b/src/vyconf_pbt.mli index 2cc550f..da94655 100644 --- a/src/vyconf_pbt.mli +++ b/src/vyconf_pbt.mli @@ -22,6 +22,10 @@ type request_setup_session = { on_behalf_of : int32 option; } +type request_teardown = { + on_behalf_of : int32 option; +} + type request_validate = { path : string list; output_format : request_output_format option; @@ -138,7 +142,7 @@ type request = | Configure of request_enter_configuration_mode | Exit_configure | Validate of request_validate - | Teardown of string + | Teardown of request_teardown type request_envelope = { token : string option; @@ -182,6 +186,12 @@ val default_request_setup_session : request_setup_session (** [default_request_setup_session ()] is the default value for type [request_setup_session] *) +val default_request_teardown : + ?on_behalf_of:int32 option -> + unit -> + request_teardown +(** [default_request_teardown ()] is the default value for type [request_teardown] *) + val default_request_validate : ?path:string list -> ?output_format:request_output_format option -> @@ -351,6 +361,9 @@ val pp_request_status : Format.formatter -> request_status -> unit val pp_request_setup_session : Format.formatter -> request_setup_session -> unit (** [pp_request_setup_session v] formats v *) +val pp_request_teardown : Format.formatter -> request_teardown -> unit +(** [pp_request_teardown v] formats v *) + val pp_request_validate : Format.formatter -> request_validate -> unit (** [pp_request_validate v] formats v *) @@ -438,6 +451,9 @@ val encode_pb_request_status : request_status -> Pbrt.Encoder.t -> unit val encode_pb_request_setup_session : request_setup_session -> Pbrt.Encoder.t -> unit (** [encode_pb_request_setup_session v encoder] encodes [v] with the given [encoder] *) +val encode_pb_request_teardown : request_teardown -> Pbrt.Encoder.t -> unit +(** [encode_pb_request_teardown v encoder] encodes [v] with the given [encoder] *) + val encode_pb_request_validate : request_validate -> Pbrt.Encoder.t -> unit (** [encode_pb_request_validate v encoder] encodes [v] with the given [encoder] *) @@ -525,6 +541,9 @@ val decode_pb_request_status : Pbrt.Decoder.t -> request_status val decode_pb_request_setup_session : Pbrt.Decoder.t -> request_setup_session (** [decode_pb_request_setup_session decoder] decodes a [request_setup_session] binary value from [decoder] *) +val decode_pb_request_teardown : Pbrt.Decoder.t -> request_teardown +(** [decode_pb_request_teardown decoder] decodes a [request_teardown] binary value from [decoder] *) + val decode_pb_request_validate : Pbrt.Decoder.t -> request_validate (** [decode_pb_request_validate decoder] decodes a [request_validate] binary value from [decoder] *) diff --git a/src/vyconfd.ml b/src/vyconfd.ml index 2bb3253..a445864 100644 --- a/src/vyconfd.ml +++ b/src/vyconfd.ml @@ -84,10 +84,10 @@ let exit_conf_mode world token = in Hashtbl.replace sessions token session; response_tmpl -let teardown_session token = +let teardown token = try Hashtbl.remove sessions token; - response_tmpl + {response_tmpl with status=Success} with Not_found -> {response_tmpl with status=Fail; error=(Some "Session not found")} @@ -168,7 +168,7 @@ let rec handle_connection world ic oc fd () = | _, Status -> response_tmpl | _, Setup_session r -> setup_session world r | None, _ -> {response_tmpl with status=Fail; output=(Some "Operation requires session token")} - | Some t, Teardown _ -> teardown_session t + | Some t, Teardown _ -> teardown t | Some t, Configure r -> enter_conf_mode r t | Some t, Exit_configure -> exit_conf_mode world t | Some t, Exists r -> exists world t r |