mirror of
https://dev.iopsys.eu/feed/iopsys.git
synced 2025-12-10 07:44:50 +01:00
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>
190 lines
4.8 KiB
Bash
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
|