class MultipleLicenseGenerator #require 'net/http' #require 'uri' attr_accessor :license_key, :generated_licenses LICENSE_KEY_XML = < 1 %{time} %{time} Component Owl Component Owl support@componentowl.com Component Owl Component Owl support@componentowl.com Component Owl %{bmt_id} 1 127.0.0.1 Internal Generator eos ORDER_XML = < %{time} %{time} Component Owl Component Owl support@componentowl.com Component Owl Component Owl support@componentowl.com Component Owl %{time} %{bmt_id} %{product_name} 1 %{license_key} %{today} 127.0.0.1 eos def initialize(*args) @licenses_per_product = args.first self.generated_licenses = [] end def self.generate(licenses_per_product = 51) inst = new(licenses_per_product) inst.generate_and_deliver end def generate_and_deliver ProductEdition.ordered.each do |product_edition| @product = product_edition license = { :product => @product, :license_keys => [] } @licenses_per_product.times { license[:license_keys] << request_key } generated_licenses << license end deliver_licenses! end def request_key bmt_license_key = BmtLicenseKey.new self.license_key = bmt_license_key.generate! params = Hash.from_xml(format(ORDER_XML)).with_indifferent_access bmt_order = BmtOrder.new(params[:request]) bmt_order.save license_key end =begin def request_key url = URI.parse('http://localhost:3000/products/generate_license?t=' + Settings.api_token) request = Net::HTTP::Post.new(url.path + '?' + url.query) request.content_type = "application/xml" request.body = format(LICENSE_KEY_XML) response = Net::HTTP.start(url.host, url.port) { |http| http.request(request) } doc = Nokogiri::XML(response.body) error_node = doc.search("//errormessage").first if error_node raise "Multiple license generator failed with message (#{@product.id}): #{error_node.content}" else keydata_node = doc.search("//keydata").first if keydata_node return keydata_node.content else raise "License key is missing (#{@product.id})" end end end =end def format(text) formatted_text = "#{text}" text.scan(/%\{([^\}]+)\}/).each do |interpolation| method = interpolation.first formatted_text.gsub!("%{#{method}}", send(method)) if respond_to?(method) end formatted_text end def time (rand(1<<64) + Time.now.to_i).to_s end def today Date.today.to_s end def bmt_id @product.bmtID.to_s end def product_name @product.name end private def deliver_licenses! Notifier.deliver_licenses!(generated_licenses) end end