You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

109 lines
2.7 KiB

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";
};