«

»

nov 21

Stimare accuratamente la potenza di una wireless (parte due)

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

Share Button