aboutsummaryrefslogtreecommitdiff
path: root/commands
diff options
context:
space:
mode:
authorJordan Bracco <href@random.sh>2022-03-25 15:44:44 +0000
committerJordan Bracco <href@random.sh>2022-03-25 15:44:44 +0000
commitbabd144393c0cbfdc28fb475190d9a552070b240 (patch)
tree927edd0818be95134ece7b819311b0269b3c5fdc /commands
parentInitial PoC (diff)
slowly but surely (maybe)HEADmain
Diffstat (limited to 'commands')
-rw-r--r--commands/freebsd/_freebsd.sh21
-rwxr-xr-xcommands/freebsd/ifconfig/list-interfaces-names (renamed from commands/ifconfig/interfaces-names)0
-rwxr-xr-xcommands/freebsd/jails/list (renamed from commands/jails/list)0
-rw-r--r--commands/freebsd/netgraph/.mock.ngctl.list.l.txt380
-rw-r--r--commands/freebsd/netgraph/_netgraph.sh7
-rwxr-xr-xcommands/freebsd/netgraph/list-nodes111
6 files changed, 519 insertions, 0 deletions
diff --git a/commands/freebsd/_freebsd.sh b/commands/freebsd/_freebsd.sh
new file mode 100644
index 0000000..76871f7
--- /dev/null
+++ b/commands/freebsd/_freebsd.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+freebsd() {
+ if [ ! "$(os_get "id")" = "freebsd" ]; then exit 1; fi
+}
+
+freebsd_ensure() {
+ _os_type=os_get "id"
+ if [ ! "${_os_type}" = "freebsd" ]; then
+ _execution_error error=unsupported_operating_system expected_os_type="freebsd" os_type="${_os_type}"
+ fi
+}
+
+freebsd_ensure_kernel_module_loaded() {
+ _kmod="${1}"
+ if [ -z "${_kmod}" ]; then _execution_error function=freebsd_ensure_kernel_module_loaded error=missing_argument arg=kmod; fi
+ if ! kldstat -q -m "${_kmod}" > /dev/null 2>&1; then
+ _execution_error error=missing_dependency dependency=kernel_module kernel_module="${_kmod}"
+ fi
+}
+
diff --git a/commands/ifconfig/interfaces-names b/commands/freebsd/ifconfig/list-interfaces-names
index f058404..f058404 100755
--- a/commands/ifconfig/interfaces-names
+++ b/commands/freebsd/ifconfig/list-interfaces-names
diff --git a/commands/jails/list b/commands/freebsd/jails/list
index b7e009e..b7e009e 100755
--- a/commands/jails/list
+++ b/commands/freebsd/jails/list
diff --git a/commands/freebsd/netgraph/.mock.ngctl.list.l.txt b/commands/freebsd/netgraph/.mock.ngctl.list.l.txt
new file mode 100644
index 0000000..90a8957
--- /dev/null
+++ b/commands/freebsd/netgraph/.mock.ngctl.list.l.txt
@@ -0,0 +1,380 @@
+There are 66 total nodes:
+ Name: pub Type: ether ID: 00000001 Num hooks: 2
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ upper pubbridge bridge 00000038 link1
+ lower pubbridge bridge 00000038 link0
+
+ Name: igb1 Type: ether ID: 00000002 Num hooks: 0
+
+ Name: ng0_beautte Type: eiface ID: 00000202 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link2
+
+ Name: tinc Type: ether ID: 00000003 Num hooks: 2
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ upper tincbridge bridge 0000002b link1
+ lower tincbridge bridge 0000002b link0
+
+ Name: local Type: eiface ID: 00000006 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link0
+
+ Name: ng1_front Type: eiface ID: 00000107 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link9
+
+ Name: ng0_opa Type: eiface ID: 00000407 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link23
+
+ Name: localbridge Type: bridge ID: 0000000a Num hooks: 25
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ link25 ng0_barrel eiface 0000047f ether
+ link24 ng0_portsdev eiface 00000442 ether
+ link23 ng0_opa eiface 00000407 ether
+ link22 ng0_kraui eiface 000003ce ether
+ link21 ngeth48 eiface 000003b1 ether
+ link20 ng0_kratos_admi eiface 0000037b ether
+ link19 ng0_enki_test2 eiface 00000347 ether
+ link18 ng0_enki_test1 eiface 00000315 ether
+ link17 ng0_grafana eiface 000002e5 ether
+ link16 ng0_ca eiface 000002b7 ether
+ link15 ng0_deterior eiface 000002a0 ether
+ link14 ng0_vpn_as43069 eiface 0000026a ether
+ link2 ng0_beautte eiface 00000202 ether
+ link13 ng0_mgmt eiface 000001a0 ether
+ link12 ng0_sade eiface 0000016c ether
+ link11 ng0_loki eiface 00000147 ether
+ link10 ng0_sso eiface 00000124 ether
+ link9 ng0_front eiface 000000f7 ether
+ link8 ng0_net eiface 000000c1 ether
+ link7 ng0_matrix eiface 000000a5 ether
+ link6 ng0_git eiface 0000008b ether
+ link5 ng0_vpn eiface 00000068 ether
+ link4 ng0_piss eiface 00000048 ether
+ link3 ng0_bender eiface 00000023 ether
+ link0 local eiface 00000006 ether
+
+ Name: as43069 Type: eiface ID: 0000000d Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether as43069bridge bridge 00000011 link0
+
+ Name: as43069bridge Type: bridge ID: 00000011 Num hooks: 4
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ link4 ng2_vpn_as43069 eiface 0000028a ether
+ link3 ng2_beautte eiface 0000021b ether
+ link2 ng2_net eiface 000000d8 ether
+ link0 as43069 eiface 0000000d ether
+
+ Name: ng1_beautte Type: eiface ID: 00000211 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link8
+
+ Name: ng2_front Type: eiface ID: 00000113 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether pubbridge bridge 00000038 link5
+
+ Name: ng0_enki_test1 Type: eiface ID: 00000315 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link18
+
+ Name: ng2_beautte Type: eiface ID: 0000021b Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether as43069bridge bridge 00000011 link3
+
+ Name: ng0_bender Type: eiface ID: 00000023 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link3
+
+ Name: ng1_opa Type: eiface ID: 00000423 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link21
+
+ Name: ng0_sso Type: eiface ID: 00000124 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link10
+
+ Name: tincbridge Type: bridge ID: 0000002b Num hooks: 24
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ link23 ng1_barrel eiface 0000049d ether
+ link22 ng1_portsdev eiface 0000045f ether
+ link21 ng1_opa eiface 00000423 ether
+ link20 ng1_kraui eiface 000003e9 ether
+ link19 ng1_kratos_admi eiface 00000395 ether
+ link18 ng1_enki_test2 eiface 00000360 ether
+ link17 ng1_enki_test1 eiface 0000032d ether
+ link16 ng1_grafana eiface 000002fc ether
+ link15 ng1_ca eiface 000002cd ether
+ link14 ng1_vpn_as43069 eiface 0000027f ether
+ link8 ng1_beautte eiface 00000211 ether
+ link13 ng1_mgmt eiface 000001b4 ether
+ link12 ng1_sade eiface 0000017f ether
+ link11 ng1_loki eiface 00000159 ether
+ link10 ng1_sso eiface 00000135 ether
+ link9 ng1_front eiface 00000107 ether
+ link7 ng1_net eiface 000000cf ether
+ link6 ng1_matrix eiface 000000b2 ether
+ link5 ng1_git eiface 00000097 ether
+ link4 ng1_vpn eiface 00000073 ether
+ link3 ng1_piss eiface 00000052 ether
+ link2 ng1_bender eiface 00000030 ether
+ link1 tinc ether 00000003 upper
+ link0 tinc ether 00000003 lower
+
+ Name: ng1_enki_test1 Type: eiface ID: 0000032d Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link17
+
+ Name: ng1_bender Type: eiface ID: 00000030 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link2
+
+ Name: ng1_sso Type: eiface ID: 00000135 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link10
+
+ Name: pubbridge Type: bridge ID: 00000038 Num hooks: 8
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ link7 ng2_mgmt eiface 000001c2 ether
+ link6 ng2_sade eiface 0000018c ether
+ link5 ng2_front eiface 00000113 ether
+ link4 ng2_vpn eiface 0000007e ether
+ link3 ng2_piss eiface 0000005c ether
+ link2 ng2_bender eiface 0000003d ether
+ link1 pub ether 00000001 upper
+ link0 pub ether 00000001 lower
+
+ Name: ng2_bender Type: eiface ID: 0000003d Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether pubbridge bridge 00000038 link2
+
+ Name: ng0_portsdev Type: eiface ID: 00000442 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link24
+
+ Name: ng0_loki Type: eiface ID: 00000147 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link11
+
+ Name: ng0_enki_test2 Type: eiface ID: 00000347 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link19
+
+ Name: ng0_piss Type: eiface ID: 00000048 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link4
+
+ Name: ng1_piss Type: eiface ID: 00000052 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link3
+
+ Name: ng1_loki Type: eiface ID: 00000159 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link11
+
+ Name: ng2_piss Type: eiface ID: 0000005c Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether pubbridge bridge 00000038 link3
+
+ Name: ng1_portsdev Type: eiface ID: 0000045f Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link22
+
+ Name: ng1_enki_test2 Type: eiface ID: 00000360 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link18
+
+ Name: ng0_vpn Type: eiface ID: 00000068 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link5
+
+ Name: ng0_vpn_as43069 Type: eiface ID: 0000026a Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link14
+
+ Name: ng0_sade Type: eiface ID: 0000016c Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link12
+
+ Name: ng1_vpn Type: eiface ID: 00000073 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link4
+
+ Name: ng0_kratos_admi Type: eiface ID: 0000037b Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link20
+
+ Name: ng2_vpn Type: eiface ID: 0000007e Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether pubbridge bridge 00000038 link4
+
+ Name: ng0_barrel Type: eiface ID: 0000047f Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link25
+
+ Name: ng1_sade Type: eiface ID: 0000017f Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link12
+
+ Name: ng1_vpn_as43069 Type: eiface ID: 0000027f Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link14
+
+ Name: ng2_vpn_as43069 Type: eiface ID: 0000028a Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether as43069bridge bridge 00000011 link4
+
+ Name: ng0_git Type: eiface ID: 0000008b Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link6
+
+ Name: ng2_sade Type: eiface ID: 0000018c Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether pubbridge bridge 00000038 link6
+
+ Name: ng1_kratos_admi Type: eiface ID: 00000395 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link19
+
+ Name: ng1_git Type: eiface ID: 00000097 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link5
+
+ Name: ng1_barrel Type: eiface ID: 0000049d Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link23
+
+ Name: ng0_mgmt Type: eiface ID: 000001a0 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link13
+
+ Name: ng0_deterior Type: eiface ID: 000002a0 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link15
+
+ Name: ngeth57 Type: eiface ID: 000004a3 Num hooks: 0
+
+ Name: ng0_matrix Type: eiface ID: 000000a5 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link7
+
+ Name: ngeth48 Type: eiface ID: 000003b1 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link21
+
+ Name: ng1_matrix Type: eiface ID: 000000b2 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link6
+
+ Name: ngctl39192 Type: socket ID: 000004b4 Num hooks: 0
+
+ Name: ng1_mgmt Type: eiface ID: 000001b4 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link13
+
+ Name: ng0_ca Type: eiface ID: 000002b7 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link16
+
+ Name: ng0_net Type: eiface ID: 000000c1 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link8
+
+ Name: ng2_mgmt Type: eiface ID: 000001c2 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether pubbridge bridge 00000038 link7
+
+ Name: ng1_ca Type: eiface ID: 000002cd Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link15
+
+ Name: ng0_kraui Type: eiface ID: 000003ce Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link22
+
+ Name: ng1_net Type: eiface ID: 000000cf Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link7
+
+ Name: ng2_net Type: eiface ID: 000000d8 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether as43069bridge bridge 00000011 link2
+
+ Name: ng0_grafana Type: eiface ID: 000002e5 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link17
+
+ Name: ng1_kraui Type: eiface ID: 000003e9 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link20
+
+ Name: ng0_front Type: eiface ID: 000000f7 Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether localbridge bridge 0000000a link9
+
+ Name: ng1_grafana Type: eiface ID: 000002fc Num hooks: 1
+ Local hook Peer name Peer type Peer ID Peer hook
+ ---------- --------- --------- ------- ---------
+ ether tincbridge bridge 0000002b link16
diff --git a/commands/freebsd/netgraph/_netgraph.sh b/commands/freebsd/netgraph/_netgraph.sh
new file mode 100644
index 0000000..d30ff76
--- /dev/null
+++ b/commands/freebsd/netgraph/_netgraph.sh
@@ -0,0 +1,7 @@
+include_cmd_dir "../_freebsd.sh"
+
+netgraph_prerun() {
+ freebsd_ensure
+ freebsd_ensure_kernel_module_loaded netgraph
+ ensure_command_exists ngctl
+}
diff --git a/commands/freebsd/netgraph/list-nodes b/commands/freebsd/netgraph/list-nodes
new file mode 100755
index 0000000..4ebcd63
--- /dev/null
+++ b/commands/freebsd/netgraph/list-nodes
@@ -0,0 +1,111 @@
+#!./cloyster
+include_cmd_dir '_netgraph.sh'
+
+awkk=$(cat <<AWK
+BEGIN {
+ RS="#";
+ FS="|";
+}
+{ print $1; }
+AWK
+)
+
+_netgraph_list_reformat() {
+ _input="${1}"
+ echo "${_input}" | \
+ tail -n +2 | \
+ grep -v "Local hook" | \
+ grep -v "\----------" | \
+ sed -e 's:^ ::g' \
+ -e 's:Name\: ::g' -e 's:Type\: ::g' -e 's:ID\: ::g' -e 's:Num hooks\: ::g' | \
+ tr '\n' ':' | \
+ sed -e "s/::/#/g" | \
+ awk '{gsub(/ {2,}/, "|")}; $1' | \
+ sed -e "s/|$//g" -e "s/|:$//g" | \
+ FS='[:]' awk -F'[:]' "${awkk}"
+ #) || fail "awk exited: $?"
+}
+
+_netgraph_list_json=
+_netgraph_list_to_json() {
+ if [ -z "${_netgraph_list_json}" ]; then
+ _input="${1}"
+ _ifs=$IFS
+ _json=$(jo nodes="{}")
+ for _line in ${_input}; do
+ _at=0; _node=; _nodename=
+ IFS=:
+ for _row in ${_line}; do
+ _at=$((_at + 1))
+ IFS='|'
+ set -- ""
+ _hook=;
+ for _field in ${_row}; do set -- "${@}" "${_field}"; done
+ if [ "${_at}" = "1" ]; then
+ _nodename="${2}"
+ _node=$(jo node="${_nodename}" type="${3}" id="${4}" links_count="${5}" hooks=[])
+ else
+ _hook=$(jo hook="${2}" peer_name="${3}" peer_type="${4}" peer_id="${5}" peer_hook="${6}")
+ _node=$(echo "$_node" | jo -f - hooks[]="${_hook}")
+ fi
+ done
+ _json=$(echo "$_json" | jo -d. -f - "nodes.${_nodename}=${_node}")
+ done
+ IFS=$_ifs
+ _netgraph_list_json="${_json}"
+ else
+ "${_netgraph_list_json}"
+ fi
+ echo "${_netgraph_list_json}"
+}
+
+RUN
+ netgraph_prerun
+ list="$(ngctl list -l)"
+ reformatted=$(_netgraph_list_reformat "${list}")
+ json=$(_netgraph_list_to_json "${reformatted}")
+ return_result "${json}"
+ENDR
+
+_test "awk"
+TEST
+ input="$(cat "${CLOYSTER_COMMAND_DIR}/.mock.ngctl.list.l.txt")"
+ assert_exited $? 0 "could not read mock data file"
+ assert "test -n \"${input}\""
+ (echo "$input" | grep "There are 66 total nodes" >/dev/null)
+ assert_exited $? 0 "mock input does not contains banner"
+ (echo "$input" | grep "ng0_" >/dev/null)
+ assert_exited $? 0 "mock input does not contains ng0_"
+
+ reformatted=$(_netgraph_list_reformat "${input}")
+
+ (echo "$reformatted" | grep "There are 66 total nodes" >/dev/null); s=$?
+ assert_exited "$s" 1 "reformat output contains banner"
+
+ (echo "$reformatted" | grep "ng0" > /dev/null); s=$?
+ assert_exited $s 0 "reformat output does not contains ng0"
+
+ json=$(_netgraph_list_to_json "${reformatted}")
+
+ (echo "${json}" | jq >/dev/null)
+ assert_exited $? 0 "json couldn't get parsed by jq"
+
+ # shellcheck disable=SC2034
+ count=$(echo "${json}" | jq '[.nodes[].node] | length')
+ assert_exited $? 0 "json query failed"
+ assert "echo \"\${count}\"" "67" "should contain 67 nodes"
+
+# assert "$(echo ${json}) | jq '[.nodes[].node] | length'" "67" "should contain 67 nodes"
+ENDT
+
+_test "runs on freebsd" .tag:integration .if:freebsd .skip:FIXME
+TEST
+ # ( /bin/su -l $(whoami) /bin/sh ${CLOYSTER_COMMAND_FILE} )
+ exit 1
+ENDT
+
+_test "doesnt run on freebsd" .tag:integration .not:freebsd .refute
+TEST
+ ( ${CLOYSTER_COMMAND_FILE} )
+ENDT
+