#!/usr/bin/ruby #(c)Darshan 2008-2009 (thedarshan.wordpress.com) @versione="1.2.0" @monitors=Hash.new("None") @stato="F" def spazia(valore,n=20) return valore.to_s if n0 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 attr_reader :essid attr_reader :enc attr_reader :chan def to_i() (@fortuna*100).to_i end 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 @chan=celle[@essid].scan(/Channel.*/).to_s[8..-2] @chan="0"+@chan if chan.to_i<10 @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, "chan" => @chan.to_i } end def compatta() return spazia(@map["essid"])+spazia(@map["fortuna"])+spazia(@map["mpower"])+spazia(@map["mlatence"])+spazia(@map["enc"])+spazia(@map["chan"]) 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")+spazia("Channel") temp=Hash.new(nil) celle.each_key{|k| @monitors[k]=Monitor.new(k) if @monitors[k]=="None" @monitors[k].estrai(celle) if @stato=="F" temp[-@monitors[k].to_i]=@monitors[k].compatta() elsif @stato=="E" temp[@monitors[k].enc + @monitors[k].essid]=@monitors[k].compatta() elsif @stato=="C" temp[@monitors[k].chan + @monitors[k].essid]=@monitors[k].compatta() else temp[@monitors[k].essid]=@monitors[k].compatta() end } temp=temp.to_a.sort temp.each{|v| puts v[1]} puts "\n#{celle.size} celle rilevate" puts "F per ordinare per fortuna, N per ordinare per essid" puts "C per ordinare per canale, E per ordinare per crittografia" puts "Q per uscire" puts "\nWirelessmonitor v#{@versione} (c)Darshan 2008-2009 (thedarshan.wordpress.com)" 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 @stato=cosa end