summaryrefslogtreecommitdiff
path: root/src/completion/list_interfaces/list_interfaces.ml
blob: fec5c9cccfd6c076662021ef8bfb2fedc9e0bf05 (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
(*
 *)
let intf_type = ref ""
let broadcast = ref false
let bridgeable = ref false
let bondable = ref false
let no_vlan = 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");
    ("--no-vlan-subinterfaces", Arg.Unit (fun () -> no_vlan := true), "List only parent 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|vxlan|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 filter_no_vlan s =
    let pattern = {|^([^.]+)(\.\d+)+$|}
    in
    try
        let _ = Pcre.exec ~pat:pattern s in
        false
    with Not_found -> true

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 =
        if !no_vlan then List.filter filter_no_vlan 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"