on linux, be a bit smarter which network device name to use

This commit is contained in:
Hannes Mehnert 2020-04-25 19:57:52 +02:00
parent 0c5af23848
commit 7cad9bd08d

View file

@ -137,15 +137,17 @@ let create_tap bridge =
Bos.OS.Cmd.run Bos.Cmd.(v "ifconfig" % bridge % "addm" % name) >>= fun () -> Bos.OS.Cmd.run Bos.Cmd.(v "ifconfig" % bridge % "addm" % name) >>= fun () ->
Ok name Ok name
| Linux -> | Linux ->
Bos.(OS.Cmd.(run_out Cmd.(v "ip" % "tuntap" % "show") |> out_lines)) >>= fun (taps, _) ->
let prefix = "vmmtap" in let prefix = "vmmtap" in
let rec find_n x = let plen = String.length prefix in
let nam = prefix ^ string_of_int x in let num acc n =
let err = Bos.OS.Cmd.err_null in match Astring.String.(cut ~sep:":" (snd (span ~min:plen ~max:plen n))) with
match Bos.OS.Cmd.run ~err Bos.Cmd.(v "ip" % "link" % "show" % nam) with | Some (x, _) -> (try IS.add (int_of_string x) acc with Failure _ -> acc)
| Error _ -> nam | None -> acc
| Ok _ -> find_n (succ x)
in in
let tap = find_n 0 in let taps = List.fold_left num IS.empty taps in
let rec find_n x = if IS.mem x taps then find_n (succ x) else x in
let tap = prefix ^ string_of_int (find_n 0) in
Bos.OS.Cmd.run Bos.Cmd.(v "ip" % "tuntap" % "add" % tap % "mode" % "tap") >>= fun () -> Bos.OS.Cmd.run Bos.Cmd.(v "ip" % "tuntap" % "add" % tap % "mode" % "tap") >>= fun () ->
Bos.OS.Cmd.run Bos.Cmd.(v "ip" % "link" % "set" % "dev" % tap % "up") >>= fun () -> Bos.OS.Cmd.run Bos.Cmd.(v "ip" % "link" % "set" % "dev" % tap % "up") >>= fun () ->
Bos.OS.Cmd.run Bos.Cmd.(v "ip" % "link" % "set" % "dev" % tap % "master" % bridge) >>= fun () -> Bos.OS.Cmd.run Bos.Cmd.(v "ip" % "link" % "set" % "dev" % tap % "master" % bridge) >>= fun () ->