package apero-core

  1. Overview
  2. Docs

Source file aunix.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
let inet_addrs () = 
  let rec recurse inchan l f = 
    try 
      String.(List.(
        let words = input_line inchan |> trim |> split_on_char ' ' in
        match words with 
        | _::flags::"mtu"::_ -> flags |> split_on_char '<' |> tl |> hd |>
                                split_on_char '>' |> hd |> split_on_char ',' |>
                                recurse inchan l
        | _::_::flags::"mtu"::_ -> flags |> split_on_char '<' |> tl |> hd |>
                                   split_on_char '>' |> hd |> split_on_char ',' |>
                                   recurse inchan l
        | "inet"::addr::_ -> let addr = addr |> split_on_char '/' |> hd in 
                             recurse inchan ((Unix.inet_addr_of_string addr, f)::l) f
        | _ -> recurse inchan l f
      ))
    with _ -> l
  in
  let stdout_chan, stdin_chan, stderr_chan  = Unix.open_process_full "ip a" (Unix.environment ()) in
  match recurse stdout_chan [] [] with 
  | [] -> (try let _ = Unix.close_process_full (stdout_chan, stdin_chan, stderr_chan) in () with _ -> ());
          let stdout_chan, stdin_chan, stderr_chan  = Unix.open_process_full "ifconfig" (Unix.environment ()) in
          let result = recurse stdout_chan [] [] in 
          (try let _ = Unix.close_process_full (stdout_chan, stdin_chan, stderr_chan) in () with _ -> ()); result
  | ls -> (try let _ = Unix.close_process_full (stdout_chan, stdin_chan, stderr_chan) in () with _ -> ()); ls

let inet_addrs_up_nolo = 
  Acommon.Infix.(String.(List.(
    inet_addrs 
    %> filter (fun (_, f) -> 
            (exists (equal "UP") f, exists (equal "LOOPBACK") f) |> function 
            | true, false -> true
            | _ -> false)
    %> map (fun (addr, _) -> addr)
  )))