summaryrefslogtreecommitdiff
path: root/src/completion/list_interfaces/list_interfaces.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/completion/list_interfaces/list_interfaces.ml')
-rw-r--r--src/completion/list_interfaces/list_interfaces.ml135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/completion/list_interfaces/list_interfaces.ml b/src/completion/list_interfaces/list_interfaces.ml
new file mode 100644
index 0000000..fec5c9c
--- /dev/null
+++ b/src/completion/list_interfaces/list_interfaces.ml
@@ -0,0 +1,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"