diff --git a/searchsploit b/searchsploit index f868424ef..7ad78196b 100755 --- a/searchsploit +++ b/searchsploit @@ -1,44 +1,49 @@ #!/bin/bash # exploitdb CLI search tool -# Version 2 +# Version 3 # Written by Unix-Ninja -csvpath=/usr/share/exploitdb/files.csv +gitremote=https://github.com/offensive-security/exploit-database.git +gitpath=/usr/share/exploitdb +csvpath=${gitpath}/files.csv progname=`basename $0` TAGS= SCASE='-i' +UPDATE=0 VERBOSE=0 -# if files.csv is in the searchsploit source path, use that -scriptsrc=$0 -while [ -h $scriptsrc ]; do - scriptsrc=$(readlink $scriptsrc) - [[ $scriptsrc != /* ]] && scriptsrc="$( cd -P $( dirname $scriptsrc ) && pwd )/$scriptsrc" -done -progdir="$( cd -P "$( dirname "$scriptsrc" )" && pwd )" -if [ -f "$progdir/files.csv" ]; then - csvpath="$progdir/files.csv" +# NOTE: +# Exit code 0 means finished normally +# Exit code 6 means updated from github + +# if files.csv is in the searchsploit path, use that +if [ -f "$( dirname $0 )/files.csv" ]; then + csvpath="$( dirname $0 )/files.csv" fi # usage info function usage() { - echo "Usage : $progname [OPTIONS] term1 [term2] ... [termN]" + echo "Usage: $progname [options] term1 [term2] ... [termN]" echo "Example: $progname oracle windows local" - echo + echo echo "=========" - echo " OPTIONS " + echo " Options " echo "=========" - echo " -c - Perform case-sensitive searches; by default," - echo " searches will try to be greedy" - echo " -v - By setting verbose output, description lines" - echo " are allowed to overflow their columns" - echo " -h, --help - Show help screen" + echo " -c Perform case-sensitive searches; by default, searches will" + echo " try to be greedy" + echo " -h, --help Show help screen" + echo " -u Update db from git" + echo " -v By setting verbose output, description lines are allowed to" + echo " overflow their columns" echo - echo "NOTES:" - echo " - Use any number of search terms you would like (minimum: 1)" - echo " - Search terms are not case sensitive, and order is irrelevant" - exit 0 + echo "=======" + echo " NOTES " + echo "=======" + echo " * Use any number of search terms you would like (minimum: 1)" + echo " * Search terms are not case sensitive, and order is irrelevant" + echo " * When updating from git, searches will be ignored" + exit 1 } # dynamically set column widths @@ -66,26 +71,57 @@ for param in $@; do done # parse short arguments -while getopts "chv" arg $ARGS; do +while getopts "chuv" arg $ARGS; do if [ "$arg" = "?" ]; then usage >&2; fi case $arg in c) SCASE='';; h) usage >&2;; + u) UPDATE=1;; v) VERBOSE=1;; esac shift $((OPTIND-1)) done +# was an update requested? +if [ "$UPDATE" -eq 1 ]; then + cd $gitpath + # make sure a git repo is init before updating + if [ "$(git rev-parse --is-inside-work-tree)" != "true" ]; then + if [ "$(ls)" = "" ]; then + #if directory is empty, just clone + git clone $gitremote . + else + # if not empty, init and add remote + git init > /dev/null + git remote add origin $gitremote + fi + fi + # make sure to prep checkout first + git checkout -- . + # update from github + git pull origin master + # if conflicts, clean and try again + if [ "$?" -ne 0 ]; then + git clean -d -fx "" + git pull origin master + fi + + echo "Update finished." + exit 6 +fi + # print header printf "%0.s-" `eval echo {1..$(( $COL1 + 1 ))}` -echo -n "|" +echo -n " " printf "%0.s-" `eval echo {1..$(( $COL2 - 1 ))}` -printf "%-${COL1}s |%s" " Description" -echo " Path" + +printf "%-${COL1}s %s" " Description" +echo "| Path" + printf "%0.s-" `eval echo {1..$(( $COL1 + 1 ))}` -echo -n "|" +echo -n " " printf "%0.s-" `eval echo {1..$(( $COL2 - 1 ))}` echo @@ -114,7 +150,7 @@ fi | eval $SEARCH printf "%0.s-" `eval echo {1..$(( $COL1 + 1 ))}` -echo -n "|" +echo -n " " printf "%0.s-" `eval echo {1..$(( $COL2 - 1 ))}` exit 0