[ruby-it] Ruby ha un nuovo Whois

Paolo Montrasio paolo a paolomontrasio.com
Lun 10 Ago 2009 09:52:50 CEST


Simone Carletti 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,
> 
> http://www.simonecarletti.com/blog/2009/08/ruby-has-a-new-whois-library/
> 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
-- 
Posted via http://www.ruby-forum.com/.


More information about the Ml mailing list