2022-08-25 12:57:03 +00:00
|
|
|
open Mirage
|
|
|
|
|
2022-08-29 16:32:32 +00:00
|
|
|
type http_client = HTTP_client
|
|
|
|
let http_client = typ HTTP_client
|
2022-08-25 12:57:03 +00:00
|
|
|
|
2022-09-01 07:30:11 +00:00
|
|
|
let check =
|
|
|
|
let doc =
|
2022-09-26 19:49:47 +00:00
|
|
|
Key.Arg.info ~doc:"Only check the cache" ["check"]
|
2022-09-01 07:30:11 +00:00
|
|
|
in
|
|
|
|
Key.(create "check" Arg.(flag doc))
|
|
|
|
|
2022-10-28 12:58:58 +00:00
|
|
|
let verify_sha256 =
|
2022-09-26 19:49:47 +00:00
|
|
|
let doc =
|
2022-10-28 12:58:58 +00:00
|
|
|
Key.Arg.info ~doc:"Verify the SHA256 checksums of the cache contents, and \
|
|
|
|
re-build the other checksum caches."
|
|
|
|
["verify-sha256"]
|
2022-09-26 19:49:47 +00:00
|
|
|
in
|
2022-10-28 12:58:58 +00:00
|
|
|
Key.(create "verify-sha256" Arg.(flag doc))
|
2022-09-26 19:49:47 +00:00
|
|
|
|
2022-08-25 20:47:46 +00:00
|
|
|
let remote =
|
2022-09-01 07:30:11 +00:00
|
|
|
let doc =
|
|
|
|
Key.Arg.info
|
2022-08-25 20:47:46 +00:00
|
|
|
~doc:"Remote repository url, use suffix #foo to specify a branch 'foo': \
|
|
|
|
https://github.com/ocaml/opam-repository.git"
|
|
|
|
["remote"]
|
|
|
|
in
|
|
|
|
Key.(create "remote" Arg.(opt string "https://github.com/ocaml/opam-repository.git#master" doc))
|
|
|
|
|
2022-09-25 21:13:52 +00:00
|
|
|
let parallel_downloads =
|
|
|
|
let doc =
|
|
|
|
Key.Arg.info
|
|
|
|
~doc:"Amount of parallel HTTP downloads"
|
|
|
|
["parallel-downloads"]
|
|
|
|
in
|
|
|
|
Key.(create "parallel-downloads" Arg.(opt int 20 doc))
|
|
|
|
|
2022-09-04 12:51:41 +00:00
|
|
|
let hook_url =
|
|
|
|
let doc =
|
|
|
|
Key.Arg.info
|
|
|
|
~doc:"URL to conduct an update of the git repository" ["hook-url"]
|
|
|
|
in
|
|
|
|
Key.(create "hook-url" Arg.(opt string "update" doc))
|
|
|
|
|
2022-09-04 08:01:45 +00:00
|
|
|
let port =
|
|
|
|
let doc = Key.Arg.info ~doc:"HTTP listen port." ["port"] in
|
|
|
|
Key.(create "port" Arg.(opt int 80 doc))
|
|
|
|
|
2022-08-25 20:47:46 +00:00
|
|
|
let tls_authenticator =
|
|
|
|
(* this will not look the same in the help printout *)
|
|
|
|
let doc = "TLS host authenticator. See git_http in lib/mirage/mirage.mli for a description of the format."
|
|
|
|
in
|
|
|
|
let doc = Key.Arg.info ~doc ["tls-authenticator"] in
|
|
|
|
Key.(create "tls-authenticator" Arg.(opt (some string) None doc))
|
2022-08-25 12:57:03 +00:00
|
|
|
|
2022-09-26 15:46:40 +00:00
|
|
|
let sectors_cache =
|
|
|
|
let doc = "Number of sectors reserved for each checksum cache (md5, sha512)." in
|
|
|
|
let doc = Key.Arg.info ~doc ["sectors-cache"] in
|
|
|
|
Key.(create "sectors-cache" Arg.(opt int64 Int64.(mul 4L 2048L) doc))
|
|
|
|
|
2022-09-26 20:42:00 +00:00
|
|
|
let sectors_git =
|
|
|
|
let doc = "Number of sectors reserved for git dump." in
|
|
|
|
let doc = Key.Arg.info ~doc ["sectors-git"] in
|
|
|
|
Key.(create "sectors-git" Arg.(opt int64 Int64.(mul 40L (mul 2L 1024L)) doc))
|
|
|
|
|
2022-10-05 12:15:42 +00:00
|
|
|
let ignore_local_git =
|
|
|
|
let doc = "Ignore restoring locally saved git repository." in
|
|
|
|
let doc = Key.Arg.info ~doc ["ignore-local-git"] in
|
|
|
|
Key.(create "ignore-local-git" Arg.(flag doc))
|
|
|
|
|
2022-08-25 12:57:03 +00:00
|
|
|
let mirror =
|
|
|
|
foreign "Unikernel.Make"
|
2022-10-28 12:58:58 +00:00
|
|
|
~keys:[ Key.v check ; Key.v verify_sha256 ; Key.v remote ;
|
2022-09-26 20:42:00 +00:00
|
|
|
Key.v parallel_downloads ; Key.v hook_url ; Key.v tls_authenticator ;
|
2022-10-05 12:15:42 +00:00
|
|
|
Key.v port ; Key.v sectors_cache ; Key.v sectors_git ;
|
|
|
|
Key.v ignore_local_git ;
|
|
|
|
]
|
2022-08-25 20:47:46 +00:00
|
|
|
~packages:[
|
2022-10-20 14:09:05 +00:00
|
|
|
package ~min:"0.3.0" ~sublibs:[ "mirage" ] "paf" ;
|
2022-08-29 16:32:32 +00:00
|
|
|
package "h2" ;
|
2022-10-21 16:02:09 +00:00
|
|
|
package "hex" ;
|
2022-08-29 16:32:32 +00:00
|
|
|
package "httpaf" ;
|
2022-09-26 09:26:58 +00:00
|
|
|
package ~pin:"git+https://git.robur.io/robur/git-kv.git#main" "git-kv" ;
|
2022-10-20 14:09:05 +00:00
|
|
|
package ~min:"3.10.0" "git-paf" ;
|
2022-08-25 20:47:46 +00:00
|
|
|
package "opam-file-format" ;
|
2022-10-21 13:35:15 +00:00
|
|
|
package ~min:"2.2.0" ~sublibs:[ "gz" ] "tar" ;
|
|
|
|
package ~min:"2.2.0" "tar-mirage" ;
|
2022-09-28 22:12:42 +00:00
|
|
|
package "mirage-block-partition" ;
|
|
|
|
package "oneffs" ;
|
2022-08-25 20:47:46 +00:00
|
|
|
]
|
2022-09-07 07:08:45 +00:00
|
|
|
(block @-> time @-> pclock @-> stackv4v6 @-> git_client @-> http_client @-> job)
|
2022-08-25 12:57:03 +00:00
|
|
|
|
2022-08-25 20:47:46 +00:00
|
|
|
let stack = generic_stackv4v6 default_network
|
|
|
|
|
|
|
|
let dns = generic_dns_client stack
|
|
|
|
|
|
|
|
let tcp = tcpv4v6_of_stackv4v6 stack
|
|
|
|
|
2022-08-29 16:32:32 +00:00
|
|
|
let http_client =
|
2022-10-20 14:09:05 +00:00
|
|
|
let packages =
|
2022-11-02 21:19:03 +00:00
|
|
|
[ package "http-mirage-client" ] in
|
2022-08-29 16:32:32 +00:00
|
|
|
let connect _ modname = function
|
2022-10-21 13:56:20 +00:00
|
|
|
| [ _pclock; _tcpv4v6; ctx ] ->
|
2022-08-29 16:32:32 +00:00
|
|
|
Fmt.str {ocaml|%s.connect %s|ocaml} modname ctx
|
|
|
|
| _ -> assert false in
|
2022-10-20 14:09:05 +00:00
|
|
|
impl ~packages ~connect "Http_mirage_client.Make"
|
2022-10-21 13:56:20 +00:00
|
|
|
(pclock @-> tcpv4v6 @-> git_client @-> http_client)
|
2022-08-29 16:32:32 +00:00
|
|
|
(* XXX(dinosaure): [git_client] seems bad but it becames from a long discussion
|
|
|
|
when a "mimic" device seems not accepted by everyone. We can copy [git_happy_eyeballs]
|
|
|
|
and provide an [http_client] instead of a [git_client] but that mostly means that
|
|
|
|
2 instances of happy-eyeballs will exists together which is not really good
|
|
|
|
(it puts a pressure on the scheduler). *)
|
|
|
|
|
|
|
|
let git_client, http_client =
|
|
|
|
let happy_eyeballs = git_happy_eyeballs stack dns (generic_happy_eyeballs stack dns) in
|
|
|
|
merge_git_clients (git_tcp tcp happy_eyeballs)
|
|
|
|
(git_http ~authenticator:tls_authenticator tcp happy_eyeballs),
|
2022-10-21 13:56:20 +00:00
|
|
|
http_client $ default_posix_clock $ tcp $ happy_eyeballs
|
2022-08-25 12:57:03 +00:00
|
|
|
|
2022-08-26 15:23:46 +00:00
|
|
|
let program_block_size =
|
|
|
|
let doc = Key.Arg.info [ "program-block-size" ] in
|
2022-08-30 09:35:28 +00:00
|
|
|
Key.(create "program_block_size" Arg.(opt int 16 doc))
|
2022-08-26 15:23:46 +00:00
|
|
|
|
2022-09-07 07:08:45 +00:00
|
|
|
let block = block_of_file "tar"
|
|
|
|
|
2022-08-25 12:57:03 +00:00
|
|
|
let () = register "mirror"
|
2022-09-07 07:08:45 +00:00
|
|
|
[ mirror $ block $ default_time $ default_posix_clock $ stack $ git_client $ http_client ]
|