diff options
Diffstat (limited to 'data')
-rw-r--r-- | data/rbot/plugins/iplookup.rb | 232 |
1 files changed, 0 insertions, 232 deletions
diff --git a/data/rbot/plugins/iplookup.rb b/data/rbot/plugins/iplookup.rb deleted file mode 100644 index e629d233..00000000 --- a/data/rbot/plugins/iplookup.rb +++ /dev/null @@ -1,232 +0,0 @@ -################################################################# -# IP Lookup Plugin -# ---------------------------- -# by Chris Gahan (chris@ill-logic.com) -# -# Purpose: -# ------------------ -# Lets you lookup the owner and their address for any IP address -# or IRC user. -# -################################################################# - -require 'socket' -require 'resolv' - -################################################################# -## ARIN Whois module... -## - -module ArinWhois - - class Chunk < Hash - def customer? - keys.grep(/^(City|Address|StateProv|(Org|Cust)Name)$/).any? - end - - def network? - keys.grep(/^(CIDR|NetHandle|Parent)$/).any? - end - - def contact? - keys.grep(/^(R|Org)(Tech|Abuse)(Handle|Name|Phone|Email)$/).any? - end - - def valid? - customer? or network? or contact? - end - - def owner - self[keys.grep(/^(Org|Cust)Name$/).first] - end - - def location - [ self['City'], self['StateProv'], self['Country'] ].compact.join(', ') - end - - def address - [ self['Address'], location, self['PostalCode'] ].compact.join(', ') - end - - end - - class ArinWhoisParser - - def initialize(data) - @data = data - end - - def split_array_at(a, &block) - return a unless a.any? - a = a.to_a - - results = [] - last_cutpoint = 0 - - a.each_with_index do |el,i| - if block.call(el) - unless i == 0 - results << a[last_cutpoint...i] - last_cutpoint = i - end - end - end - - if last_cutpoint < a.size or last_cutpoint == 0 - results << a[last_cutpoint..-1] - end - - results - end - - # Whois output format - # ------------------------ - # Owner info block: - # {Org,Cust}Name - # Address - # City - # StateProv - # PostalCode - # Country (2-digit) - # - # Network Information: - # CIDR (69.195.25.0/25) - # NetHandle (NET-72-14-192-0-1) - # Parent (NET-72-0-0-0-0) - # - # Contacts: - # ({R,Org}{Tech,Abuse}{Handle,Name,Phone,Email})* - - def parse_chunks - return if @data =~ /^No match found / - chunks = @data.gsub(/^# ARIN WHOIS database, last updated.+/m, '').scan(/(([^\n]+\n)+\n)/m) - chunks = chunks.map do |chunk| - result = Chunk.new - - chunk[0].scan(/([A-Za-z]+?):(.*)/).each do |tuple| - tuple[1].strip! - result[tuple[0]] = tuple[1].empty? ? nil : tuple[1] - end - - result - end - chunks.reject(&:empty?) - end - - - def get_parsed_data - return unless chunks = parse_chunks - - results = split_array_at(chunks) {|chunk|chunk.customer?} - results.map do |data| - { - :customer => data.select{|x|x.customer?}[0], - :net => data.select{|x|x.network?}[0], - :contacts => data.select{|x|x.contact?} - } - end - end - - # Return a hash with :customer, :net, and :contacts info filled in. - def get_most_specific_owner - return unless datas = get_parsed_data - - datas_with_bitmasks = datas.map do |data| - next unless data[:customer] - next unless net_data = data[:net] - bitmask = net_data['CIDR'].split('/')[1].to_i - [bitmask, data] - end - datas_with_bitmasks.compact! - #datas_with_bitmasks.sort.each{|x|puts x[0]} - winner = datas_with_bitmasks.sort[-1][1] - end - - end # of class ArinWhoisParser - -module_function - - def raw_whois(query_string, host) - s = TCPSocket.open(host, 43) - s.write(query_string+"\n") - ret = s.read - s.close - ret - end - - def lookup(ip) - data = raw_whois("+ n #{ip}", 'whois.arin.net') - arin = ArinWhoisParser.new data - arin.get_most_specific_owner - end - - def lookup_location(ip) - result = lookup(ip) - result[:customer].location - end - - def lookup_address(ip) - result = lookup(ip) - result[:customer].address - end - - def lookup_info(ip) - if result = lookup(ip) - "#{result[:net]['CIDR']} => #{result[:customer].owner} (#{result[:customer].address})" - else - "Address not found." - end - end - -end - - - -################################################################# -## The Plugin -## - -class IPLookupPlugin < Plugin - def help(plugin, topic="") - "iplookup [ip address / domain name] => lookup info about the owner of the IP address from the ARIN whois database" - end - - def iplookup(m, params) - reply = "" - if params[:domain].match(/^#{Regexp::Irc::HOSTADDR}$/) - ip = params[:domain] - else - begin - ip = Resolv.getaddress(params[:domain]) - reply << "#{params[:domain]} | " - rescue => e - m.reply "#{e.message}" - return - end - end - - reply << ArinWhois.lookup_info(ip) - - m.reply reply - end - - def userip(m, params) - m.reply "not implemented yet" - #users = @channels[m.channel].users - #m.reply "users = #{users.inspect}" - #m.reply @bot.sendq("WHO #{params[:user]}") - end - -end - -plugin = IPLookupPlugin.new -plugin.map 'iplookup :domain', :action => 'iplookup', :thread => true -plugin.map 'userip :user', :action => 'userip', :requirements => {:user => /\w+/}, :thread => true - - -if __FILE__ == $0 - include ArinWhois - data = open('whoistest.txt').read - c = ArinWhoisParser.new data - puts c.get_parsed_data.inspect -end |