iopsys-feed/packet-capture-diagnostics/files/scripts/packetcapture
Andreas Gnau d232e76905
packet-capture-diagnostics: Don't use jq
jq is used inside packetcapture but it is not declared as a dependency.
Remove this usage of jq.

jq is a complex piece of software that requires security maintenance and
adds bloat to the image. Using existing tools like jshn and jsonfilter
is preferred where the additional functionality provided by jq is not
required.

Signed-off-by: Andreas Gnau <andreas.gnau@iopsys.eu>
2025-09-02 10:06:16 +02:00

190 lines
4.8 KiB
Bash

#!/bin/sh
# Copyright (C) 2024 iopsys Software Solutions AB
# Author: Suvendhu Hansa <suvendhu.hansa@iopsys.eu>
. /usr/share/libubox/jshn.sh
ROOT="$(dirname "${0}")"
. "${ROOT}"/bbf_api
UPLOAD_TIMEOUT=1800
packet_capture_error() {
json_init
json_add_string "Status" "$1"
json_add_string "FileLocation" ""
json_add_string "StartTime" "0"
json_add_string "EndTime" "0"
json_add_string "Count" "0"
json_dump
[ "$2" = "both_proto" ] && {
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.DiagnosticState="$1"
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.FileLocation=""
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.StartTime=0
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.EndTime=0
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.Count=0
$UCI_COMMIT_BBF_DMMAP
}
}
packet_capture_launch() {
input="$1"
intf=""
filename=$(mktemp /tmp/capture.XXXXXXX)
# Delete if any local capture file exist
find / -name "packetcapture.pcap" -exec rm {} \;
json_load "${input}"
json_get_var interface interface
json_get_var format format
json_get_var duration duration
json_get_var packet_count packet_count
json_get_var file_target file_target
json_get_var expression expression
json_get_var username username
json_get_var password password
json_get_var proto proto
json_get_var cancel cancel
[ "$proto" = "both_proto" ] && {
old_pid=$(cat /tmp/packetcapture_pid)
[ -n "${old_pid}" ] && {
cmd=$(cat /proc/$old_pid/cmdline)
}
if [[ "${cmd}" = *packetcapture* ]]; then
kill -9 ${old_pid}
fi
if [ "${cancel}" -eq "1" ]; then
json_init
json_add_string "Status" "None"
json_add_string "FileLocation" ""
json_add_string "StartTime" "0"
json_add_string "EndTime" "0"
json_add_string "Count" "0"
json_dump
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.DiagnosticState="None"
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.FileLocation=""
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.StartTime=0
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.EndTime=0
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.Count=0
$UCI_COMMIT_BBF_DMMAP
return
else
echo $$ > /tmp/packetcapture_pid
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.DiagnosticState="Requested_running"
$UCI_COMMIT_BBF_DMMAP
fi
}
if [ -n "${format}" ] && [ "${format}" != "libpcap" ]; then
# Error
packet_capture_error "Error_Internal" "${proto}"
return
fi
if [ -z "${file_target}" ]; then
# Error
packet_capture_error "Error_Internal" "${proto}"
return
fi
if [ -n "${interface}" ]; then
intf=$(ifstatus "${interface}" | jsonfilter -e '$.l3_device')
if [ -z "${intf}" ]; then
# Error
packet_capture_error "Error_Internal" "${proto}"
return
fi
fi
cmd="timeout ${duration} tcpdump -w ${filename}"
if [ -n "${intf}" ]; then
cmd="${cmd} -i ${intf}"
fi
if [ "${packet_count}" -ne 0 ]; then
cmd="${cmd} -c ${packet_count}"
fi
if [ -n "${expression}" ]; then
cmd="${cmd} \"${expression}\""
fi
time_start=$(date +"%s")
output=$(eval ${cmd} 2>&1 | grep "packets captured")
res="$?"
time_stop=$(date +"%s")
if [ "${res}" -ne 0 ]; then
# Error
packet_capture_error "Error_Internal" "${proto}"
return
fi
pkt_count=$(echo $output | cut -d' ' -f 1)
if [[ "${file_target}" == "file://"* ]]; then
# Local file
file_target=$(realpath "${file_target:6}/packetcapture.pcap")
if [ -z "${file_target}" ]; then
# Invalid local path Error
rm -rf "${filename}"
res=1
else
# Copy file to destination
mv "${filename}" "${file_target}"
res="$?"
fi
else
# Remote file
opt=""
if [ -n "${username}" ] && [ -n "${password}" ]; then
opt="--user ${username}:${password}"
fi
file_target="${file_target}/packetcapture.pcap"
opt="${opt} --upload-file ${filename}"
eval curl --fail --silent "${opt}" --max-time ${UPLOAD_TIMEOUT} "${file_target}"
res="$?"
rm -rf "${filename}"
fi
if [ "$res" -ne 0 ]; then
# Error
packet_capture_error "Error_Internal" "${proto}"
return
else
json_init
json_add_string "Status" "Complete"
json_add_string "FileLocation" "${file_target}"
json_add_string "StartTime" "${time_start}"
json_add_string "EndTime" "${time_stop}"
json_add_string "Count" "${pkt_count}"
json_dump
[ "${proto}" = "both_proto" ] && {
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.DiagnosticState="Complete"
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.FileLocation="${file_target}"
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.StartTime="${time_start}"
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.EndTime="${time_stop}"
$UCI_SET_BBF_DMMAP dmmap_diagnostics.packetcapture.Count="${pkt_count}"
$UCI_COMMIT_BBF_DMMAP
}
fi
}
if [ -n "$1" ]; then
packet_capture_launch "$1"
else
packet_capture_error "Error_Internal"
fi