123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122(*
* Copyright (c) 2018-2022 Tarides <contact@tarides.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*)openLwt.SyntaxopenIrmin_serverlet()=Irmin.Backend.Watch.set_listen_dir_hookIrmin_watcher.hookletsetup_logstyle_rendererlevel=Fmt_tty.setup_std_outputs?style_renderer();Logs.set_levellevel;Logs.set_reporter(Logs_fmt.reporter());()letsetup_log=Cmdliner.Term.(constsetup_log$Fmt_cli.style_renderer()$Logs_cli.level())letmain~readonly~root~uri~tls~store~contents~hash~dashboard~config_path(moduleCodec:Conn.Codec.S)fingerprint=letstore,config=Resolver.load_config?root?config_path?store?hash?contents()inletconfig=Irmin_server.Cli.Conf.vconfiguriinlet(moduleStore:Irmin.Generic_key.S)=Resolver.Store.generic_keyedstoreinletmoduleServer=Irmin_server_unix.Make_ext(Codec)(Store)iniffingerprintthenLwt_io.printl@@Server.Command.Conn.Handshake.V1.fingerprint(moduleStore:Irmin.Generic_key.S)elselettls_config=matchtlswith|Some(c,k)->Some(`Cert_filec,`Key_filek)|_->Noneinleturi=Irmin.Backend.Conf.(getconfig)Irmin_server.Cli.Conf.Key.uriinletconfig=ifreadonlythenServer.readonlyconfigelseconfiginletdashboard=matchdashboardwith|Someport->Some(`TCP(`Portport))|None->Noneinlet*server=Server.v?tls_config?dashboard~uriconfiginletroot=matchrootwithSomeroot->root|None->""inLogs.app(funl->l"Listening on %a, store: %s"Uri.pp_humuriroot);Server.serveserverletmainreadonlyrooturitls(store,hash,contents)codecconfig_pathdashboardfingerprint()=letcodec=matchcodecwith|`Bin->(moduleConn.Codec.Bin:Conn.Codec.S)|`Json->(moduleConn.Codec.Json)inLwt_main.run@@main~readonly~root~uri~tls~store~contents~hash~config_path~dashboardcodecfingerprintopenCmdlinerletroot=letdoc=Arg.info~docs:""~docv:"PATH"~doc:"Irmin store path"["r";"root"]inArg.(value@@opt(somestring)Nonedoc)letreadonly=letdoc=Arg.info~doc:"Open in read-only mode. This only has an effect when using irmin-pack"["readonly"]inArg.(value@@flagdoc)lettls=letdoc=Arg.info~docs:""~docv:"CERT_FILE,KEY_FILE"~doc:"TLS config"["tls"]inArg.(value@@opt(some(pairstringstring))Nonedoc)letfingerprint=letdoc=Arg.info~docs:""~doc:"Print handshake fingerprint"["fingerprint"]inArg.(value@@flagdoc)letdashboard=letdoc=Arg.info~docs:""~doc:"HTTP server port for dashboard"["dashboard"]inArg.(value@@opt(someint)Nonedoc)letmain_term=Term.(constmain$readonly$root$Irmin_server.Cli.uri$tls$Resolver.Store.term()$Irmin_server.Cli.codec$Irmin_server.Cli.config_path$dashboard$fingerprint$setup_log)