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