semplice rate limit in Sinatra

Giocando con Sinatra ho avuto l’esigenza di servire una determinata pagina solo con un certa frequenza (tecnicamente un rate-limit); la cosa si puo’ fare installando il middleware Rack:Throttle ma non volevo aggiungere un’altra gemma alle dipendenze… In questo esempio se al server arriva piu’ di una richiesta in un intervallo di cinque secondi, rispondiamo a tono… SECONDS_BETWEEN_REQUEST=5 enable :sessions def ratelimit? now=Time.new.to_i session['lastrequest']||=0 #inizializza se non presente result=(now-session['lastrequest'])<SECONDS_BETWEEN_REQUEST #passati dall'ultima richiesta ? session['lastrequest']=now # aggiorna return result end get '/' do if ratelimit? return "<h1>sorry, rate limit exceeded!</h1>" end "<h1>hello!</h1>" end

December 21, 2012 · Andrea Manzini

run-parts e problemi di crontab

Mi e’ capitato di inserire degli script nelle varie directory /etc/cron.daily, /etc/cron.weekly ma di scoprire che questi script non vengono eseguiti. Il motivo e’ che il run-parts usato nelle Debian e derivate ignora i file che contengono un “.” (e quindi tutti quelli con l’estensione) Questo comportamento e’ documentato anche nella man page, e previene alcuni inconvenienti come l’esecuzione dei .bak ma lo scrivo anche qui per ricordarmelo … E forse potra’ essere utile a qualcun altro :) ...

December 6, 2012 · Andrea Manzini

generare comandi di creazione utenze a partire da un passwd

A volte e’ necessario replicare le utenze con gli stessi parametri su piu’ server linux diversi. Perche’ farlo a mano ? Se sono tanti e’ un lavoro noioso e potremmo anche commettere degli errori. Ecco un semplice one-liner che fa il parsing di un file /etc/passwd e genera i corrispondenti comandi useradd awk -F: '{printf "useradd -m -u%s -g%s -d%s -s%s %s\n" , $3,$4,$6,$7,$1}' /etc/passwd Ovviamente l’output puo’ essere comodamente filtrato con grep, usato via copy&paste, inserito in uno script, eccetera… ...

November 23, 2012 · Andrea Manzini

gestire i led delle schede PC Engines ALIX in Ruby

Natale si avvicina: mentre smanettavo su queste ottime PC Engines ALIX su cui ho installato una Debian modificata, ho scritto una comoda interfaccia per accendere/spegnere e far lampeggiare i led alla velocita’ desiderata… class Led #numero da 1 a 3 def initialize(ledno) ledno++ # passo 0 ma comando 1 ledno=1 if ledno<1 ledno=3 if ledno>3 @ledsyspath="/sys/devices/platform/leds_alix2/leds/alix:#{ledno}/" end def blink(millisec) File.open(@ledsyspath+'trigger','w') { |f| f.write('timer') } File.open(@ledsyspath+'delay_off','w') do |f| f.write(millisec.to_s) end File.open(@ledsyspath+'delay_on','w') do |f| f.write(millisec.to_s) end end def blink_slow! blink(500) end def blink_fast! blink(50) end def on! File.open(@ledsyspath+'trigger','w') { |f| f.write('default-on') } File.open(@ledsyspath+'brightness','w') do |f| f.write('1') end end def off! File.open(@ledsyspath+'trigger','w') { |f| f.write("none") } File.open(@ledsyspath+'brightness','w') do |f| f.write('0') end end end

November 9, 2012 · Andrea Manzini