Bluetooth spamtool
30 May 2008
Właśnie miałem skasować bo już mi to nie potrzebne, ale pomyślałem, że blog to taka wygodna forma backupu ;-) Narzędzie do "prowadzenia akcji promocyjno-informacyjnych" za pomocą Bluetooth. Odpuszczając sobie eufemizmy, jest to zwykła spamownica wysyłająca losowy plik ze wskazanego katalogu do każdego nieboraka znajdującego się w pobliżu. Dodatkowo prowadzi ewidencję obdarowanych odbiorców by nie wysyłać więcej niż jednego pliku do tego samego urządzenia.
Z całą pewnością nie jest to bashopisarstwo najwyższych (ani też tych nieco niższych) lotów. Do pracy wymaga uprawnień do zapisu w /dev/rfcomm1, co zostało tu zaprotezowane poprzez użycie gksu. Można nadsyłać poprawki - niech się ostaną w komentarzach na cudzy użytek.
#!/bin/bash
db=spamtool.sqlite
dir=$1
[ "$dir" == "" ] && dir=`zenity --file-selection --directory`
yes | zenity --progress --pulsate --text="Looking for Bluetooth devices in range" --title="Scanning" --auto-close &
btdevs=`hcitool scan | grep -v Scanning | awk '{print $1}'`
killall yes
total=0
steps=`echo -e "$btdevs" | wc -l`
step=$(( 100 / ( $steps + 1) ))
exec 3> >(zenity --progress --title="Sending files" --auto-close)
for btdev in $btdevs
do
total=$(( $total + $step ))
echo $total >&3
sent=`sqlite3 $db "SELECT count(*) FROM sent WHERE client = '$btdev'"`
if [ "$sent" != "0" ]
then
echo "Skipping client $btdev"
else
set -- $dir/*
length=$#
random_num=$(( $RANDOM % ($length + 1) ))
file=${!random_num}
dev="/dev/rfcomm1"
ch=`sdptool browse $btdev | grep -A 4 'OBEX Object Push' | grep Channel | head -n 1 | awk '{print $2}'`
if [ "$ch" != "" ]
then
gksu "rfcomm bind $dev $btdev $ch"
echo "Sending $file to $btdev on channel $ch via $dev"
remote_file=`basename "$file"`
ussp-push $dev "$file" "$remote_file"
if [ "$?" == "0" ]
then
sqlite3 $db "INSERT INTO sent (client, file) VALUES ('$btdev', '$file')"
total=$(( $total + 1))
fi
gksu "rfcomm release $dev"
fi
fi
done
sleep 1
echo 100 >&3
exec 3>&-
zenity --info --text="Sent $total files to Bluetooth clients" --title="Sending results" --timeout 5
A jefcze jedno, by zaoszczędzić trudu. Próbowałem bez większych sukcesów paralelizować (prawda że piękne słowo?) algorytm poprzez wykonanie w tle wnętrzności pętli z użyciem wiele urządzeń /dev/rfcommX jednocześnie. Nie znam przyczyn niepowodzenia - może fizyczne urządzenie Bluetooth może być przypisane tylko do jednego urządzenia logicznego...







