modified the script so that it only supports url and uses comma as separator for csv

This commit is contained in:
sandbender 2011-02-12 22:03:35 +01:00
parent 5b5e91eaa3
commit b0d9788f37

View File

@ -23,25 +23,29 @@ LICENSE
PAM_DIR="$(cd $(dirname $0) && pwd)" PAM_DIR="$(cd $(dirname $0) && pwd)"
PAM_CRON="/etc/cron.d/pamela" PAM_CRON="/etc/cron.d/pamela"
PAM_SCRIPT="$PAM_DIR/$(basename $0)" PAM_SCRIPT="${PAM_DIR}/$(basename $0)"
REGISTER=''
REGISTER= SIMULATE=''
IF='eth0' IF='eth0'
OUT='http://yourserver.com/pamela/upload.php' OUT='http://yourserver.com/pamela/upload.php'
USER='' USER=''
PASSWORD='' PASSWORD=''
TRANSLATE=''
POST=''
function usage { function usage {
echo "Usage: pamela-scanner [OPTIONS] echo "Usage: pamela-scanner [OPTIONS]
-i INTERFACE Interface to arp-scan. Defaults to [$IF]. -i INTERFACE Interface to arp-scan. Defaults to [${IF}].
-o URL The url of the pamela upload script (including /upload.php). -o URL The url of the pamela upload script (including /upload.php).
Defaults to [$OUT]. Defaults to [${OUT}].
-r Register the script in cron every 2 minutes -r Register the script in cron every 2 minutes
-q Unregister the script from cron -q Unregister the script from cron
-u Http-auth user. Defaults to [$USER]. -u Http-auth user. Defaults to [${USER}].
-p Http-auth password. Defaults to [$PASSWORD]. -p Http-auth password. Defaults to [${PASSWORD}].
-s Simulate, don't commit the post.
-t URL Translate mac addresses using the data provided from the
specified URL. CSV format expected (mac,name\\n).
-h Shows help -h Shows help
This pamela scanner is an arp-scanner that uploads mac addresses in your local This pamela scanner is an arp-scanner that uploads mac addresses in your local
@ -68,22 +72,27 @@ function check_if_arpscan_installed {
function register { function register {
check_if_root check_if_root
check_if_arpscan_installed check_if_arpscan_installed
echo "Registering pamela in cron: $PAM_CRON" echo "Registering pamela in cron: ${PAM_CRON}"
echo "*/2 * * * * [ -x \"$PAM_SCRIPT\" ] && \"$PAM_SCRIPT\" -i \"$IF\" -o \"$OUT\" -u \"$USER\" -p \"$PASSWORD\" | logger -t pamela" > "$PAM_CRON" echo "*/2 * * * * [ -x \"${PAM_SCRIPT}\" ] && \"${PAM_SCRIPT}\" -i \"${IF}\" -o \"${OUT}\" -u \"${USER}\" -p \"${PASSWORD}\" | logger -t pamela" > "${PAM_CRON}"
echo "Depending on your version of crond, you might have to restart the cron daemon for the changes to take effect" echo "Depending on your version of crond, you might have to restart the cron daemon for the changes to take effect"
} }
function unregister { function unregister {
check_if_root check_if_root
echo "Unregistering pamela in cron: $PAM_CRON" echo "Unregistering pamela in cron: ${PAM_CRON}"
rm "$PAM_CRON" rm "${PAM_CRON}"
echo "Depending on your version of crond, you might have to restart the cron daemon for the changes to take effect" echo "Depending on your version of crond, you might have to restart the cron daemon for the changes to take effect"
} }
function parse_params { function parse_params {
TEMP=$(getopt -o 'hrqi:o:s:u:p:-n' "pamela arp scanner" -- "$@") TEMP=$(getopt -o 'hrqsi:o:u:p:t:-n' "pamela arp scanner" -- "$@")
if [ $? != 0 ] ; then echo "Could not parse parameters..." >&2 ; exit 1 ; fi if [ $? != 0 ]
eval set "$TEMP" then
echo "Could not parse parameters..." >&2
exit 1
fi
eval set "${TEMP}"
while true while true
do do
shift; shift;
@ -91,43 +100,93 @@ function parse_params {
case "$1" in case "$1" in
-i) IF="$2"; shift;; -i) IF="$2"; shift;;
-o) OUT="$2"; shift;; -o) OUT="$2"; shift;;
-s) SLEEP="$2"; shift;;
-u) USER="$2"; shift;; -u) USER="$2"; shift;;
-p) PASSWORD="$2"; shift;; -p) PASSWORD="$2"; shift;;
-r) REGISTER='r';; -r) REGISTER='r';;
-s) SIMULATE='s';;
-q) unregister; exit 0;; -q) unregister; exit 0;;
-t) TRANSLATE="$2"; shift;;
-h|'-?') usage; exit 1;; -h|'-?') usage; exit 1;;
*) echo "Unknown param: [$1]"; usage; exit 1;; *) echo "Unknown param: [$1]"; usage; exit 1;;
esac esac
done done
# Register only after parsing all args # Register only after parsing all args
if [ -n "$REGISTER" ]; then if [ -n "${REGISTER}" ]
then
register register
exit 0 exit 0
fi fi
} }
function scan_and_upload { function scan {
echo $(date)" scanning..." echo $(date)" scanning..."
DATA="" DATA=""
NUM_DATA=0 NUM_DATA=0
for M in $(arp-scan -R -i 10 --interface "$IF" --localnet | awk '{ print $2 }' | grep :.*: | sort | uniq) for M in $(arp-scan -R -i 10 --interface "${IF}" --localnet | awk '{ print $2 }' | grep :.*: | sort | uniq)
do do
[ -n "$DATA" ] && DATA="$DATA,$M" || DATA="$M"; [ -n "${DATA}" ] && DATA="${DATA},${M}" || DATA="${M}";
let "NUM_DATA=NUM_DATA+1" let "NUM_DATA=NUM_DATA+1"
done done
POST="data=$DATA" POST="${DATA}"
RESULT=$(wget "$OUT" -O - --quiet --post-data "$POST" --user "$USER" --password "$PASSWORD") }
if [ -n "$RESULT" ]
function translate {
if [ -z "${TRANSLATE}" ]
then
return 0
fi
# translate denotes a url
# save the output of the url to a file and use it as a file
TRANSLATE_URL=${TRANSLATE}
TRANSLATE=$(mktemp)
wget --quiet -O "${TRANSLATE}" "${TRANSLATE_URL}"
POST=$(echo ${POST} | awk -v names="${TRANSLATE}" 'BEGIN {
RS="\n"
FS=","
while ((getline nl < names) > 0) {
split(nl, n);
nms[n[2]] = n[1]
}
close(names)
RS=","
first=1
while ((getline i)> 0) {
sub(/\n$/,"",i)
#print "input:", i, "translates to", (i in nms?nms[i]:i)
if (!first)
printf(",")
printf (i in nms?nms[i]:i)
first=0
}
}')
rm ${TRANSLATE}
}
function upload {
if [ -z "${SIMULATE}" ]
then
RESULT=$(wget "${OUT}" -O - --quiet --post-data "data=${POST}" --user "${USER}" --password "${PASSWORD}")
else
echo Not executing: [wget "${OUT}" -O - --quiet --post-data "data=${POST}" --user "${USER}" --password "${PASSWORD}"]
RESULT=
fi
if [ -n "${RESULT}" ]
then then
echo Error uploading results: echo Error uploading results:
echo "$RESULT" echo "${RESULT}"
fi fi
echo $(date)" Uploaded $NUM_DATA mac addresses..." echo $(date)" Uploaded ${NUM_DATA} mac addresses..."
} }
parse_params $@ parse_params $@
check_if_root check_if_root
check_if_arpscan_installed check_if_arpscan_installed
scan_and_upload scan
translate
upload