Simone C. wrote:
Ciao Paolo,
s�, uso Redmine per i miei progetti ma anche in azienda lo usiamo come
issue
tracker per ogni progetto.
Approfitto per segnalarti che da qualche ora la nuova versione della
libreria � anche disponibile via RubyGems,
Ruby has a new WHOIS library — Simone Carletti
http://rubyforge.org/forum/forum.php?forum_id=34130
Quando avrai modo di provarla, fammi sapere cosa ne pensi.
Ciao Simone,
ho installato la gemma e l’ho provata. Funziona e i vantaggi rispetto ad
una ricerca manuale ci sono anche se non sono poi così grandi. Mi
piacerebbe infatti avere una risposta automatica sull’esistenza o meno
del dominio e poter estrarre delle informazioni dalla risposta del
server.
Non è semplice, dato che ogni registrar presenta i dati in un formato
diverso, ma ho sviluppato un rapido concept. API e implementazione sono
molto provvisori.
Nella dir della gemma aggiungiamo il file lib/info.rb (facendone require
in whois.rb) con questo contenuto
module Whois
class Info
attr_reader :registrar, :whois_server, :url, :name_servers,
:statuses,
:registrant, :technical_contact,
:administrative_contact,
:created_at, :updated_at, :expires_at
def initialize(info_lines)
@registrant = []
@technical_contact = []
@administrative_contact = []
@names = []
@contact_ids = []
@name_servers = []
@statuses = []
@exists = true
info_lines.split("\n").each do |line|
# available domain detection part 1
if line.match /No match for/
@exists = false
break
end
name, value = line.split(": ")
next unless value
next if name.match /NOTICE|TERMS OF USE/
@registrar = value if name.match /Registrar/
@whois_server = value if name.match /Whois Server/
@url = value if name.match /Referral URL/
@registrant << value if name.match /Registrant/
@technical_contact << value if name.match /Technical/
@administrative_contact << value if name.match /Administrative/
@name_servers << value if name.match /Name Server/
@statuses << value if name.match /Status/
@created_at = value if name.match /Creation Date|Created/
@updated_at = value if name.match /Updated Date|Updated|Last
Update/
@expires_at = value if name.match /Expiration
Date|Expires|Expire Date/
end
end
def exists?
# available domain detection part 2, more euristics required
return false if @statuses.length == 1 && @statuses[0].gsub(" ",
“”) == “AVAILABLE”
@exists
end
end
end
poi siamo in grado di scrivere codice come
require ‘rubygems’
require ‘whois’
domain = ARGV[0]
response = Whois.whois(domain)
info = Whois::Info.new(response)
unless info.exists?
puts “No match for #{domain}”
exit
end
puts “Registrar #{info.registrar}”
puts “Server #{info.whois_server}”
puts “Registrant #{info.registrant.join(”, “)}”
puts “Tech contact #{info.technical_contact.join(”, “)}”
puts “Adm contact #{info.administrative_contact.join(”, “)}”
puts “Name servers #{info.name_servers.join(”, “)}”
puts “Status #{info.statuses.join(”, “)}”
puts “Created at #{info.created_at}”
puts “Updated at #{info.updated_at}”
puts “Expires at #{info.expires_at}”
e chiamare il programma con
$ ruby whois_test.rb google.com
$ ruby whois_test.rb simonecarletti.it
$ ruby whois_test.rb simonecarletti.com
$ ruby whois_test.rb asdfasdfasdf.com (sorpresa!)
$ ruby whois_test.rb asdfasdfasdf123123.com
$ ruby whois_test.rb asdfasdfasdf123123.it
Probabilmente l’euristica per estrarre le informazioni andrebbe messa in
una serie di adapter per i vari registrar (ora riesce ad estrarre
informazioni solo in pochi casi) e sicuramente si tratta di un
lavoraccio. Tuttavia se il progetto coinvolgesse molti sviluppatori ed
ognuno si scrivesse l’adapter per uno dei propri registrar lo sforzo per
il singolo sarebbe ragionevole. La cosa difficile sarà coordinare gli
sviluppi stabilendo l’organizzazione delle informazioni estratte. Nota
poi che il client whois di linux già fa un’aggregazione perché spesso
prima della risposta del server presenta un riassunto con un minimo di
informazioni. Ad esempio:
Domain Name: ASDFASDFASDF.COM
Registrar: NAMEVIEW, INC.
Whois Server: whois.nameview.com
Referral URL: http://www.nameview.com
Name Server: NS1.HITFARM.COM
Name Server: NS2.HITFARM.COM
Status: clientTransferProhibited
Updated Date: 12-mar-2009
Creation Date: 19-mar-2002
Expiration Date: 19-mar-2010
Chissà che scavando nei suoi sorgenti non si possa recuperare del codice
da portare a Ruby.
Un’ultima cosa: l’API della demo non mi soddisfa. Whois::Info potrebbe
sparire e i metodi per leggere i suoi attributi dovrebbero forse essere
metodi del client, ma in fondo è solo del codice scritto per spiegarmi
meglio.
Che ne dici? Comunque è già un buon progetto perché se non lo fosse non
ci si potrebbe costruire sopra del sw in un’oretta, post sul forum
incluso
Ciao
Paolo