#!/usr/bin/env ruby # Daniel Bowling # Jun 2021 require 'optparse' require 'net/http' api_url = URI('https://api.macvendors.com/') cmd = File.basename($PROGRAM_NAME) macs = [] options = {} version = 0.1 OptionParser. new do |opts| opts.banner = "Usage: #{cmd} " opts.on('-v', '--version', 'Print verson') { options[:version] = true } end.parse! # Print version if -v specified if options[:version] puts version exit end # Check for arguments unless ARGV[0] puts "#{cmd}: No arguments given, try -h or --help" exit(64) end # Strip symbols from the MACs macs = ARGV.map { |mac| mac.gsub(/[\-\.:]/, '').downcase } # Start up the persistant connection Net::HTTP.start(api_url.host, api_url.port, use_ssl: true) do |q| # Process each MAC macs.each do |mac| # API call res = q.request Net::HTTP::Get.new(api_url + mac) # Add colons to MAC if it's valid mac = if mac =~ /[0-9a-f]{12}/ mac.gsub(/([0-9a-f]{2})/, '\1:').chomp(':') else "#{mac} ?" end # API returns a 404 if it's no good if res.is_a?(Net::HTTPSuccess) # Looks good puts "#{mac}\t#{res.body}" else # Uh-oh warn "#{mac}\t#{res.code} #{res.message}" end # API is rate-limited 1 req/sec: https://macvendors.com/api sleep(1) end end