mirror of
https://github.com/anchore/syft.git
synced 2026-11-05 00:46:38 +01:00
Upgrade binary test fixtures management (#2444)
* test: strip fixtures of any execution permissions Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * chore: add lint check for large files Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * add helper script to capture binary snippets Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * chore: update scripts and add new dir output for snippets Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: update erlang test to new generated format Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: update memcached to new generator pattern Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: update openjdk to named version Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: move openjdk lts to versioned folder Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: rename unversioned java to versioned folders Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: migrate bash fixture to new snippet workflow Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: update script to size 600 bytes Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: update go classifier to new snippet workflow Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: move haproxy new new snippet Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: add flatter haproxy example Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: update tests to new pattern Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * test: final version of snippet script Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> * [wip] download bin helpers Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add manager for binary cataloger test fixtures Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add remaining binary cataloger patterns and snippets Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * adjust gitignore to be more permissive to snippets Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add rust darwin snippets Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * skip tests that are missing full binaries Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * address PR feedback Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add tests for binary test fixture manager Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * highlight rows that do not have binaries or snippets Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * bump fixture limit to 1K (found exceptions when adding snippets) Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * add redis and postgres snippets Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> * improve formating of fixture listing Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> --------- Signed-off-by: Christopher Phillips <christopher.phillips@anchore.com> Signed-off-by: Alex Goodman <wagoodman@users.noreply.github.com> Co-authored-by: Alex Goodman <wagoodman@users.noreply.github.com>
This commit is contained in:
co-authored by
Alex Goodman
parent
a16a4ad6c9
commit
7182f5b519
+149
@@ -0,0 +1,149 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Default values for length and prefix length
|
||||
LENGTH=100
|
||||
PREFIX_LENGTH=20
|
||||
SEARCH_FOR=''
|
||||
GROUP_NAME=''
|
||||
|
||||
# Function to show usage
|
||||
usage() {
|
||||
echo "Usage: $0 <path-to-binary> <version> [--search-for <pattern>] [--length <length>] [--prefix-length <prefix_length>] [--group <name>]"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
key="$1"
|
||||
|
||||
case $key in
|
||||
--search-for)
|
||||
SEARCH_FOR="$2"
|
||||
shift # past argument
|
||||
shift # past value
|
||||
;;
|
||||
--length)
|
||||
LENGTH="$2"
|
||||
shift # past argument
|
||||
shift # past value
|
||||
;;
|
||||
--group)
|
||||
GROUP_NAME="$2"
|
||||
shift # past argument
|
||||
shift # past value
|
||||
;;
|
||||
--prefix-length)
|
||||
PREFIX_LENGTH="$2"
|
||||
shift # past argument
|
||||
shift # past value
|
||||
;;
|
||||
*)
|
||||
if [ -z "$BINARY_FILE" ]; then
|
||||
BINARY_FILE="$1"
|
||||
elif [ -z "$VERSION" ]; then
|
||||
VERSION="$1"
|
||||
else
|
||||
echo "Unknown option: $1"
|
||||
usage
|
||||
fi
|
||||
shift # past argument
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
LENGTH=$(expr "$LENGTH" + "$PREFIX_LENGTH")
|
||||
|
||||
# check if binary file and pattern are provided
|
||||
if [ -z "$BINARY_FILE" ] || [ -z "$VERSION" ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
# if group name is empty use the binary filename
|
||||
if [ -z "$GROUP_NAME" ]; then
|
||||
GROUP_NAME=$(basename "$BINARY_FILE")
|
||||
fi
|
||||
|
||||
# check if xxd is even installed
|
||||
if ! command -v xxd &> /dev/null; then
|
||||
echo "xxd not found. Please install xxd."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
PATTERN=${SEARCH_FOR:-$VERSION}
|
||||
|
||||
echo "Using binary file: $BINARY_FILE"
|
||||
echo "Searching for pattern: $PATTERN"
|
||||
echo "Capture length: $LENGTH bytes"
|
||||
echo "Capture prefix length: $PREFIX_LENGTH bytes"
|
||||
|
||||
PATTERN_RESULTS=$(strings -t d "$BINARY_FILE" | grep "$PATTERN")
|
||||
RESULT_COUNT=$(echo "$PATTERN_RESULTS" | wc -l)
|
||||
|
||||
CONTINUE_LOOP=true
|
||||
|
||||
while $CONTINUE_LOOP; do
|
||||
|
||||
# if there are multiple matches, prompt the user to select one
|
||||
if [ $RESULT_COUNT -gt 1 ]; then
|
||||
echo "Multiple string matches found in the binary:"
|
||||
echo ""
|
||||
|
||||
# show result lines one at a time (in a numbered list)
|
||||
# but only show everything after the first field (not the offset)
|
||||
echo "$PATTERN_RESULTS" | cut -d ' ' -f 2- | nl -w 1 -s ') '
|
||||
|
||||
|
||||
echo ""
|
||||
read -p "Please select a match: " SELECTION
|
||||
|
||||
# if the selection is not a number, exit
|
||||
if ! [[ "$SELECTION" =~ ^[0-9]+$ ]]; then
|
||||
echo "Invalid selection."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# if the selection is out of bounds, exit
|
||||
if [ "$SELECTION" -gt $(echo "$PATTERN_RESULTS" | wc -l) ]; then
|
||||
echo "Invalid selection."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# select the line from the results
|
||||
SELECTED_RESULT=$(echo "$PATTERN_RESULTS" | sed -n "${SELECTION}p")
|
||||
else
|
||||
SELECTED_RESULT="$PATTERN_RESULTS"
|
||||
fi
|
||||
|
||||
# search for the pattern in the binary file and capture the offset
|
||||
OFFSET=$(echo "${SELECTED_RESULT}" | cut -d ' ' -f 1)
|
||||
|
||||
if [ -z "$OFFSET" ]; then
|
||||
echo "Pattern not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# adjust the offset to capture prefix length before the match
|
||||
OFFSET=$(expr "$OFFSET" - "$PREFIX_LENGTH")
|
||||
|
||||
# use xxd to capture the specified length from the calculated offset
|
||||
SNIPPET=$(xxd -l "$LENGTH" -s "$OFFSET" "$BINARY_FILE")
|
||||
|
||||
# display the output and prompt the user
|
||||
echo ""
|
||||
echo "$SNIPPET"
|
||||
echo ""
|
||||
read -p "Does this snippet capture what you need? (Y/n/q) " RESPONSE
|
||||
|
||||
RESPONSE=${RESPONSE:-y}
|
||||
|
||||
if [ "$RESPONSE" == "y" ]; then
|
||||
CONTINUE_LOOP=false
|
||||
elif [ $RESULT_COUNT -eq 1 ] || [ "$RESPONSE" == "q" ]; then
|
||||
echo "Exiting with no action taken."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
go run ./manager write-snippet "$BINARY_FILE" --offset "$OFFSET" --length "$LENGTH" --name "$GROUP_NAME" --version "$VERSION"
|
||||
Reference in New Issue
Block a user