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...

Digg del.icio.us StumbleUpon Wykop Reddit Folksr

permalink | trackback | rss

 
 

Your turn:

nick:
and?:
www (if any):
Wpisz kod:code
Bluetooth spamtool bluetooth bash spam