Node: fails gracefully if data dir cannot be created, fixes #83

This commit is contained in:
Pietro 2018-01-05 18:37:34 +01:00 committed by Benjamin Canou
parent 311f10aa83
commit 2f85dc526d
3 changed files with 26 additions and 11 deletions

View File

@ -20,10 +20,22 @@ let version_file_name = "version.json"
let pp ppf version = Format.pp_print_string ppf version let pp ppf version = Format.pp_print_string ppf version
type error += Invalid_data_dir_version of t * t type error += Invalid_data_dir_version of t * t
type error += Invalid_data_dir of string
type error += No_data_dir_version_file of string type error += No_data_dir_version_file of string
type error += Could_not_read_data_dir_version of string type error += Could_not_read_data_dir_version of string
let () = let () =
register_error_kind
`Permanent
~id: "invalidDataDir"
~title: "Invalid data directory"
~description: "The data directory cannot be accessed or created"
Data_encoding.(obj1 (req "datadirPath" string))
(function
| Invalid_data_dir path ->
Some path
| _ -> None)
(fun path -> Invalid_data_dir path) ;
register_error_kind register_error_kind
`Permanent `Permanent
~id: "invalidDataDirVersion" ~id: "invalidDataDirVersion"
@ -87,11 +99,14 @@ let ensure_data_dir data_dir =
Data_encoding_ezjsonm.write_file Data_encoding_ezjsonm.write_file
(version_file data_dir) (version_file data_dir)
(Data_encoding.Json.construct version_encoding data_version) in (Data_encoding.Json.construct version_encoding data_version) in
if Sys.file_exists data_dir then try if Sys.file_exists data_dir then
match Sys.readdir data_dir with match Sys.readdir data_dir with
| [||] -> write_version () | [||] -> write_version ()
| [| single |] when single = default_identity_file_name -> write_version () | [| single |] when single = default_identity_file_name -> write_version ()
| _ -> check_data_dir_version data_dir | _ -> check_data_dir_version data_dir
else else begin
Lwt_utils.create_dir ~perm:0o700 data_dir >>= fun () -> Utils.mkdir ~perm:0o700 data_dir ;
write_version () write_version ()
end
with Sys_error _ | Unix.Unix_error _ ->
fail (Invalid_data_dir data_dir)

View File

@ -48,10 +48,10 @@ let write_file ?(bin=false) fn contents =
) )
(fun () -> close_out oc) (fun () -> close_out oc)
let mkdir dir = let mkdir ?(perm=0o755) dir =
let safe_mkdir dir = let safe_mkdir dir =
if not (Sys.file_exists dir) then if not (Sys.file_exists dir) then
try Unix.mkdir dir 0o755 try Unix.mkdir dir perm
with Unix.Unix_error(Unix.EEXIST,_,_) -> () in with Unix.Unix_error(Unix.EEXIST,_,_) -> () in
let rec aux dir = let rec aux dir =
if not (Sys.file_exists dir) then begin if not (Sys.file_exists dir) then begin

View File

@ -29,4 +29,4 @@ val read_file: ?bin:bool -> string -> string
(** [write_file p c] writes c to file at path p **) (** [write_file p c] writes c to file at path p **)
val write_file: ?bin:bool -> string -> string -> unit val write_file: ?bin:bool -> string -> string -> unit
val mkdir: string -> unit val mkdir: ?perm:Unix.file_perm -> string -> unit