let unix_exec = (~args=[||], ~env=?, ~stderr: Lwt_process.redirection=`Keep, command) => { let realArgs = Array.append([|command|], args); Lwt_process.pread_lines(~stderr, ~env?, ("", realArgs)) |> Lwt_stream.to_list; }; let mkdirp = destination => unix_exec("mkdir", ~stderr=`Dev_null, ~args=[|"-p", destination|]); module Shell = { type t = | Bash | Zsh | Fish; let infer = () => { let processInfo = pid => { switch%lwt (unix_exec("ps", ~args=[|"-o", "ppid,comm", pid|])) { | [] => Lwt.return_none | [_headers, line, ..._otherLines] => let psResult = String.split_on_char(' ', line |> String.trim); let parentPid = List.nth(psResult, 0); let executable = List.nth(psResult, 1) |> Filename.basename; Lwt.return_some((parentPid, executable)); | [_, ..._] => Lwt.return_none }; }; let rec getShell = (~level=0, pid) => { switch%lwt (processInfo(pid)) { | Some((_, "sh")) | Some((_, "-sh")) | Some((_, "-bash")) | Some((_, "bash")) => Lwt.return_some(Bash) | Some((_, "-zsh")) | Some((_, "zsh")) => Lwt.return_some(Zsh) | Some((_, "fish")) | Some((_, "-fish")) => Lwt.return_some(Fish) | Some((ppid, _)) when level < 10 => getShell(~level=level + 1, ppid) | Some(_) | None => Lwt.return_none }; }; getShell(Unix.getpid() |> string_of_int); }; }; module NodeArch = { type t = | X32 | X64 | Other; let rec last = xs => switch (xs) { | [x] => Some(x) | [_, ...xs] => last(xs) | [] => None }; let findArches = unameResult => { let words = unameResult |> List.hd |> String.split_on_char(' '); List.exists(word => word == "x86_64", words) ? X64 : X32; }; /* Get node-compliant architecture (x64, x86) */ let get = () => switch (Sys.os_type) { | "Unix" => let%lwt result = unix_exec("uname", ~args=[|"-a"|]); try (result |> findArches |> Lwt.return) { | _ => Lwt.fail_with("Error getting unix information") }; | _ => Lwt.return(Other) }; let toString = fun | X64 => "x64" | X32 => "x32" | Other => "other"; }; module NodeOS = { type t = | Darwin | Linux | Other(string); let get = () => switch (Sys.os_type) { | "Unix" => let%lwt result = unix_exec("uname", ~args=[|"-s"|]); switch (result |> List.hd) { | "Darwin" => Lwt.return(Darwin) | _ => Lwt.return(Linux) | exception _ => Lwt.fail_with("Error getting unix information") }; | other => Other(other) |> Lwt.return }; let toString = fun | Darwin => "darwin" | Linux => "linux" | Other(_) => "other"; };