summaryrefslogtreecommitdiff
path: root/src/iface/list_interfaces.ml
blob: 2daa5099fa63e6f00a7c9a22de8cd5eb7f412538 (plain)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
(*
 *)
let intf_type = ref ""
let broadcast = ref false
let bridgeable = ref false
let bondable = ref false

let args = [
    ("--type", Arg.String (fun s -> intf_type := s), "List interfaces of specified type");
    ("--broadcast", Arg.Unit (fun () -> broadcast := true), "List broadcast interfaces");
    ("--bridgeable", Arg.Unit (fun () -> bridgeable := true), "List bridgeable interfaces");
    ("--bondable", Arg.Unit (fun () -> bondable := true), "List bondable interfaces");
]
let usage = Printf.sprintf "Usage: %s [OPTIONS] <number>" Sys.argv.(0)

let () = Arg.parse args (fun _ -> ()) usage

let type_to_prefix it =
    match it with
    | "" -> ""
    | "bonding" -> "bond"
    | "bridge" -> "br"
    | "dummy" -> "dum"
    | "ethernet" -> "eth"
    | "geneve" -> "gnv"
    | "input" -> "ifb"
    | "l2tpeth" -> "l2tpeth"
    | "loopback" -> "lo"
    | "macsec" -> "macsec"
    | "openvpn" -> "vtun"
    | "pppoe" -> "pppoe"
    | "pseudo-ethernet" -> "peth"
    | "sstpc" -> "sstpc"
    | "tunnel" -> "tun"
    | "virtual-ethernet" -> "veth"
    | "vti" -> "vti"
    | "vxlan" -> "vxlan"
    | "wireguard" -> "wg"
    | "wireless" -> "wlan"
    | "wwan" -> "wwan"
    | _ -> ""

(* filter_section to match the constraint of python.vyos.ifconfig.section
 *)
let rx = Pcre.regexp {|\d(\d|v|\.)*$|}

let filter_section s =
    let r = Pcre.qreplace_first ~rex:rx ~templ:"" s in
    match r with
    |"bond"|"br"|"dum"|"eth"|"gnv"|"ifb"|"l2tpeth"|"lo"|"macsec" -> true
    |"peth"|"pppoe"|"sstpc"|"tun"|"veth"|"vti"|"vtun"|"vxlan"|"wg"|"wlan"|"wwan" -> true
    | _ -> false

let filter_from_prefix p s =
    let pattern = Printf.sprintf "^%s(.*)$" p
    in
    try
        let _ = Pcre.exec ~pat:pattern s in
        true
    with Not_found -> false

let filter_from_type it =
    let pre = type_to_prefix it in
    match pre with
    | "" -> None
    | _ -> Some (filter_from_prefix pre)

let filter_broadcast s =
    let pattern = {|^(bond|br|eth)(.*)$|}
    in
    try
        let _ = Pcre.exec ~pat:pattern s in
        true
    with Not_found -> false

let filter_bridgeable s =
    let pattern = {|^(bond|eth|gnv|l2tpeth|lo|tun|veth|vtun|wlan)(.*)$|}
    in
    try
        let _ = Pcre.exec ~pat:pattern s in
        true
    with Not_found -> false

let filter_bondable s =
    let pattern = {|^(eth)(.*)$|}
    in
    try
        let _ = Pcre.exec ~pat:pattern s in
        true
    with Not_found -> false

let get_interfaces =
    let intf_type = !intf_type in
    let fltr =
    if String.length(intf_type) > 0 then
        filter_from_type intf_type
    else None
    in
    let l = Func.list_interfaces () in
    let res = List.sort_uniq compare l in
    let res =
        if !broadcast then List.filter filter_broadcast res
        else res
    in
    let res =
        if !bridgeable then List.filter filter_bridgeable res
        else res
    in
    let res =
        if !bondable then List.filter filter_bondable res
        else res
    in
    let res = List.filter filter_section res in
    match fltr with
    | Some f -> List.filter f res
    | None -> res

let () =
  let res = get_interfaces in
  List.iter (Printf.printf "%s ") res;
  Printf.printf "\n"