Ho fatto una modifica allo script del post precedente facendo in modo che lo script controlli tutte le wireless contemporaneamente.
Ho inoltre aggiunto un paramentro fortuna che in maniera assolutamente empirica calcola quanto sia possibile connettersi a quella wireless.
I valori vanno da 0 a 100, per valori superiori a 50 la connessione dovrebbe essere stabile
#!/usr/bin/ruby @versione="1.1.1" @monitors=Hash.new("None") def spazia(valore,n=20) return valore.to_s if n<valore.to_s.size return valore.to_s+" "*(n-valore.to_s.size) end def tokenize(stream) token=Hash.new("None") stream.each("Cell"){|cella| nome=cella.scan(/ESSID.*/).to_s[7...-1] token[nome]=cella } return token end def battery() begin responso=[] `cat /proc/acpi/battery/BAT1/state`.each{|riga| responso<<riga} attuale=responso[4].scan(/:.*/).to_s[7..-1].to_f massima=responso[3].scan(/:.*/).to_s[7..-1].to_f percento=(100*attuale/massima).to_i return "Batteria in carica: #{attuale}mAh" if not responso[2].scan("discharging").size>0 return "Nella batteria rimangono "+responso[4].scan(/:.*/).to_s[7..-1]+" pari al #{percento}%" rescue => azz return "Informazioni ACPI non disponibili" end end def fortuna(p,l) f= (p+13) / (1.0+(l-50)/6000) return 100 if f>100 return f end class Monitor def initialize(essid) @alpha=1.0/8 @n=0 @beacon=0 @power=0 @delay=2 @same=0#Scarto assoluto medio esponenziale @oldpower=0 @essid=essid end def estrai(celle) @cella=celle[@essid] beacon=celle[@essid].scan(/beacon.*/).to_s[8..-7].to_i power=celle[@essid].scan(/uality.*/).to_s[7..-6].to_i enc=(celle[@essid].split("Encryption key")[1])[1..5].tr("\n",' ') same=(power-@oldpower).abs if(@n==0 || @power+@beacon==0) @beacon=beacon @power=power else @beacon=(1-3*@alpha)*@beacon+3*@alpha*beacon if power>0 @power=(1-@alpha)*@power+@alpha*power @power=4*@alpha*@power if power==0 @beacon=@beacon+ 1000*@delay if (beacon==0 && power==0 && @beacon<10**6 && @beacon>0) end @oldpower=power @fortuna=fortuna(@power,@beacon) @n=@n+1 @map={ "essid" => @essid , "fortuna" => @fortuna, "mpower" => @power, "mlatence" => @beacon, "beacon"=> beacon, "power" => power, "same" => same.to_i, "enc" => enc } end def compatta() puts spazia(@map["essid"])+spazia(@map["fortuna"])+spazia(@map["mpower"])+spazia(@map["mlatence"])+spazia(@map["enc"]) end def estesa() ora=Time.now.strftime("%I:%M:%S ") puts "\ec \n#{ora} #{battery()}\n"+@cella puts "Power = #{@map["power"]}" puts "Latence = #{@map["beacon"]}\n" puts "Scarto = #{@map["same"]}%\n" verso="up";verso="down" if @power>@map["power"] puts "MPower = #{@power} (#{verso})"; verso="up";verso="down" if @beacon>@map["beacon"] puts "MLatence = #{@beacon} (#{verso})" puts "Fortuna = #{@fortuna}" puts "Codifica = #{@map["enc"]}" end end def thread_main() #lista solo le celle attualmente visibili. #le statistiche delle celle non visibili non vengono aggiornate. responso= `iwlist eth1 s` celle=tokenize(responso) celle.delete(nil) ora=Time.now.strftime("%I:%M:%S ") puts "\ec#{ora} #{battery()}\n\n" puts spazia("ESSID")+spazia("Fortuna")+spazia("MPower")+spazia("MLatence")+spazia("Crittografia") celle.each_key{|k| @monitors[k]=Monitor.new(k) if @monitors[k]=="None" @monitors[k].estrai(celle) @monitors[k].compatta() } puts "\n#{celle.size} celle rilevate" # puts @monitors.size end thread_main() esecutore=Thread.new { while(true) # puts "\ec" thread_main() sleep 2 end } while(cosa=readline.chomp.upcase) if cosa=="Q" then Thread.kill(esecutore) exit end end
ho aggiunto una pagina dedicata a questo script wscanner