sig
  val sleep :
    float ->
    (unit, [> `System of [> `Sleep of float ] * [> `Exn of exn ] ])
    Pvem_lwt_unix.Deferred_result.t
  module Shell :
    sig
      val do_or_fail :
        string ->
        (unit,
         [> `Shell of
              string *
              [> `Exited of int
               | `Exn of exn
               | `Signaled of int
               | `Stopped of int ] ])
        Pvem_lwt_unix.Deferred_result.t
      val execute :
        string ->
        (string * string *
         [ `Exited of int | `Signaled of int | `Stopped of int ],
         [> `Shell of string * [> `Exn of exn ] ])
        Pvem_lwt_unix.Deferred_result.t
      val status_to_string :
        [< `Exited of int | `Exn of exn | `Signaled of int | `Stopped of int ] ->
        string
    end
  val with_timeout :
    float ->
    f:(unit ->
       ('a,
        [> `System of [> `With_timeout of float ] * [> `Exn of exn ]
         | `Timeout of float ]
        as 'error)
       Pvem_lwt_unix.Deferred_result.t) ->
    ('a, 'error) Pvem_lwt_unix.Deferred_result.t
  val make_new_directory :
    ?perm:int ->
    string ->
    (unit,
     [> `System of
          [> `Make_directory of string ] *
          [> `Already_exists | `Exn of exn | `Wrong_access_rights of int ] ])
    Pvem_lwt_unix.Deferred_result.t
  val ensure_directory_path :
    ?perm:int ->
    string ->
    (unit,
     [> `System of
          [> `Make_directory of string ] *
          [> `Exn of exn | `Wrong_access_rights of int ] ])
    Pvem_lwt_unix.Deferred_result.t
  type file_info =
      [ `Absent
      | `Block_device
      | `Character_device
      | `Directory
      | `Fifo
      | `Regular_file of int
      | `Socket
      | `Symlink of string ]
  val file_info_to_string : Pvem_lwt_unix.SYSTEM.file_info -> string
  val file_info :
    ?follow_symlink:bool ->
    string ->
    (Pvem_lwt_unix.SYSTEM.file_info,
     [> `System of [> `File_info of string ] * [> `Exn of exn ] ])
    Pvem_lwt_unix.Deferred_result.t
  val list_directory :
    string ->
    [ `Stream of
        unit ->
        (string option,
         [> `System of [> `List_directory of string ] * [> `Exn of exn ] ])
        Pvem_lwt_unix.Deferred_result.t ]
  val remove :
    string ->
    (unit,
     [> `System of
          [> `File_info of string
           | `List_directory of string
           | `Remove of string ] *
          [> `Exn of exn ] ])
    Pvem_lwt_unix.Deferred_result.t
  val make_symlink :
    target:string ->
    link_path:string ->
    (unit,
     [> `System of
          [> `Make_symlink of string * string ] *
          [> `Exn of exn | `File_exists of string ] ])
    Pvem_lwt_unix.Deferred_result.t
  type file_destination = [ `Into of string | `Onto of string ]
  val copy :
    ?ignore_strange:bool ->
    ?symlinks:[ `Fail | `Follow | `Redo ] ->
    ?buffer_size:int ->
    ?if_exists:[ `Fail | `Overwrite | `Update ] ->
    src:string ->
    Pvem_lwt_unix.SYSTEM.file_destination ->
    (unit,
     [> `System of
          [> `Copy of string
           | `File_info of string
           | `List_directory of string
           | `Make_directory of string
           | `Make_symlink of string * string
           | `Remove of string ] *
          [> `Already_exists
           | `Exn of exn
           | `File_exists of string
           | `File_not_found of string
           | `IO of [> `File_exists of string | `Wrong_path of string ]
           | `Not_a_directory of string
           | `Wrong_access_rights of int
           | `Wrong_file_kind of
               string *
               [> `Block_device
                | `Character_device
                | `Fifo
                | `Socket
                | `Symlink of string ]
           | `Wrong_path of string ] ])
    Pvem_lwt_unix.Deferred_result.t
  val move_in_same_device :
    ?if_exists:[ `Fail | `Overwrite | `Update ] ->
    src:string ->
    Pvem_lwt_unix.SYSTEM.file_destination ->
    ([ `Moved | `Must_copy ],
     [> `System of
          [> `File_info of string | `Move of string ] *
          [> `Exn of exn | `File_exists of string ] ])
    Pvem_lwt_unix.Deferred_result.t
  val move :
    ?ignore_strange:bool ->
    ?symlinks:[ `Fail | `Follow | `Redo ] ->
    ?buffer_size:int ->
    ?if_exists:[ `Fail | `Overwrite | `Update ] ->
    src:string ->
    Pvem_lwt_unix.SYSTEM.file_destination ->
    (unit,
     [> `System of
          [> `Copy of string
           | `File_info of string
           | `List_directory of string
           | `Make_directory of string
           | `Make_symlink of string * string
           | `Move of string
           | `Remove of string ] *
          [> `Already_exists
           | `Exn of exn
           | `File_exists of string
           | `File_not_found of string
           | `IO of [> `File_exists of string | `Wrong_path of string ]
           | `Not_a_directory of string
           | `Wrong_access_rights of int
           | `Wrong_file_kind of
               string *
               [> `Block_device
                | `Character_device
                | `Fifo
                | `Socket
                | `Symlink of string ]
           | `Wrong_path of string ] ])
    Pvem_lwt_unix.Deferred_result.t
  type file_tree =
      [ `Leaf of string * Pvem_lwt_unix.SYSTEM.file_info
      | `Node of string * Pvem_lwt_unix.SYSTEM.file_tree list ]
  val file_tree :
    ?follow_symlinks:bool ->
    string ->
    (Pvem_lwt_unix.SYSTEM.file_tree,
     [> `System of
          [> `File_info of string
           | `File_tree of string
           | `List_directory of string ] *
          [> `Exn of exn | `File_not_found of string ] ])
    Pvem_lwt_unix.Deferred_result.t
  val error_to_string :
    [< `Shell of
         string *
         [< `Exited of int | `Exn of exn | `Signaled of int | `Stopped of int ]
     | `System of
         [< `Copy of string
          | `File_info of string
          | `File_tree of string
          | `List_directory of string
          | `Make_directory of string
          | `Make_symlink of string * string
          | `Move of string
          | `Remove of string ] *
         [< `Already_exists
          | `Exn of exn
          | `File_exists of string
          | `File_not_found of string
          | `IO of
              [< `Exn of exn
               | `File_exists of string
               | `Read_file_exn of string * exn
               | `Write_file_exn of string * exn
               | `Wrong_path of string ]
          | `Not_a_directory of string
          | `Wrong_access_rights of int
          | `Wrong_file_kind of string * Pvem_lwt_unix.SYSTEM.file_info
          | `Wrong_path of string ] ] ->
    string
end