You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.2 KiB
87 lines
2.2 KiB
#!/usr/bin/env bash |
|
|
|
file="$1" |
|
# Shift the attributes so we can ignore the filename easily |
|
shift |
|
|
|
if [ ! -n "$file" ]; then |
|
echo "You must provide an xml file" |
|
exit 1 |
|
fi |
|
|
|
|
|
json=$(php -r "echo json_encode(simplexml_load_file('$file'));" 2> /dev/null) |
|
|
|
if [[ "$json" == "false" ]]; then |
|
echo "Please provide a valid xml file" |
|
exit 1 |
|
fi |
|
|
|
function print_basic_info(){ |
|
echo $json | # Echo the full json file |
|
jq ' if ( .host | type ) == "object" then [ .host ] else .host end ' | # Get the hosts as an array (even if there is only one |
|
#jq '.[0]' |
|
jq '[ .[] | { |
|
address: .address."@attributes".addr, |
|
port: { |
|
tcp : (try ( [ .ports.port[] | select( ."@attributes".protocol == "tcp" ) | { |
|
port: ."@attributes".portid, |
|
service: .service."@attributes", |
|
} ] ) catch null ), |
|
udp : (try ( [ .ports.port[] | select( ."@attributes".protocol == "udp" ) | { |
|
port: ."@attributes".portid, |
|
service: .service."@attributes", |
|
} ] ) catch null ) |
|
} |
|
} ]' |
|
#.ports.port[] | [ . ] |
|
#| [select(."@attributes".protocol)] |
|
} |
|
|
|
function print_with_match(){ |
|
local match=$1 |
|
echo $json | # Echo the full json file |
|
jq ' if ( .host | type ) == "object" then [ .host ] else .host end ' | # Get the hosts as an array (even if there is only one |
|
#jq '.[9]' |
|
#jq '[ .[9] | { |
|
# address: .address."@attributes".addr, |
|
# domains: .hostnames.hostname."@attributes".name, |
|
# port: { |
|
# tcp : (try ( [ .ports.port[] | select( ."@attributes".protocol == "tcp" ) | select( .service."@attributes".name | test("'"$match"'; "i") ) | { |
|
# port: ."@attributes".portid, |
|
# service: .service."@attributes", |
|
# } ] ) catch null ), |
|
# udp : (try ( [ .ports.port[] | select( ."@attributes".protocol == "udp" ) | { |
|
# port: ."@attributes".portid, |
|
# service: .service."@attributes", |
|
# } ] ) catch null ) |
|
# } |
|
#} ]' |
|
jq '[ .[9] | { |
|
address: .address."@attributes".addr, |
|
domains: .hostnames.hostname."@attributes".name, |
|
port: { |
|
tcp : [ .ports.port | { |
|
port: ., |
|
service: .service."@attributes", |
|
} ], |
|
} |
|
} ]' |
|
} |
|
|
|
if [ -n "$1" ] ; then |
|
case "$1" in |
|
-h|--help) |
|
#print_help |
|
exit 0 |
|
;; |
|
basic) |
|
print_basic_info |
|
exit 0 |
|
;; |
|
*) |
|
print_with_match "$@" |
|
exit 0 |
|
;; |
|
esac |
|
fi
|
|
|