43 lines
1.2 KiB
OCaml
43 lines
1.2 KiB
OCaml
open Lwt.Infix
|
|
|
|
let jump () host ports =
|
|
let t = Happy_eyeballs_lwt.create () in
|
|
Lwt_main.run (
|
|
Logs.app (fun m -> m "connecting to %s (on ports %a)" host
|
|
Fmt.(list ~sep:(any ", ") int) ports);
|
|
Happy_eyeballs_lwt.connect t host ports >>= function
|
|
| Ok ((ip, port), fd) ->
|
|
Logs.app (fun m -> m "connected to %a:%d" Ipaddr.pp ip port);
|
|
Lwt_unix.close fd >|= fun () ->
|
|
Ok ()
|
|
| Error `Msg msg as e ->
|
|
Logs.app (fun m -> m "failed to connect %s" msg);
|
|
Lwt.return e)
|
|
|
|
let setup_log style_renderer level =
|
|
Fmt_tty.setup_std_outputs ?style_renderer ();
|
|
Logs.set_level level;
|
|
Logs.set_reporter (Logs_fmt.reporter ~dst:Format.std_formatter ())
|
|
|
|
open Cmdliner
|
|
|
|
let setup_log =
|
|
Term.(const setup_log
|
|
$ Fmt_cli.style_renderer ()
|
|
$ Logs_cli.level ())
|
|
|
|
let host =
|
|
let doc = "Host to connect to" in
|
|
Arg.(required & pos 0 (some string) None & info [] ~doc ~docv:"HOST")
|
|
|
|
let port =
|
|
let doc = "Ports to connect to" in
|
|
Arg.(value & opt_all int [443;80] & info [ "port" ] ~doc ~docv:"PORT")
|
|
|
|
let cmd =
|
|
let term = Term.(term_result (const jump $ setup_log $ host $ port))
|
|
and info = Cmd.info "test" ~version:"2.0.1"
|
|
in
|
|
Cmd.v info term
|
|
|
|
let () = exit (Cmd.eval cmd)
|