lib/navi_client.rb in navi_client-0.1.4 vs lib/navi_client.rb in navi_client-0.1.5

- old
+ new

@@ -14,215 +14,6 @@ require "cloud/navi_cloud_client" require "http_service/naviai" module NaviClient - def logger - @logger - end - - # - # login - # - # login to the navi-cloud and get the authentication token - # - def login - provider_url = "http://localhost:3008/oauth/token" - @token = HTTParty.post(provider_url, - body: { - client_id: config["uid"], # get from sso_web application - client_secret: config["secret_key"], - grant_type: "client_credentials" - } - )['access_token'] - end - - # - # imap_connection - # - # connect the app with imap server - # - def imap_connection(server, username, password) - # connect to IMAP server - imap = Net::IMAP.new server, ssl: true, certs: nil, verify: false - - Net::IMAP.debug = @net_imap_debug - - # http://ruby-doc.org/stdlib-2.1.5/libdoc/net/imap/rdoc/Net/IMAP.html#method-i-capability - capabilities = imap.capability - - @logger.debug("imap capabilities: #{capabilities.join(',')}") if @debug - - unless capabilities.include? "IDLE" - @logger.info "'IDLE' IMAP capability not available in server: #{server}" - imap.disconnect - exit - end - - # login - imap.login username, password - - # return IMAP connection handler - imap - end - - # - # retrieve_emails - # - # retrieve any mail from a folder, followin specified serach condition - # for any mail retrieved call a specified block - # - def retrieve_emails(imap, search_condition, folder, &process_email_block) - - # select folder - imap.select folder - - message_ids = imap.search(search_condition) - - if @debug - if message_ids.empty? - @logger.debug "\nno messages found.\n" - return - else - @logger.debug "\nProcessing #{message_ids.count} mails.\n" - end - end - - message_ids.each_with_index do |message_id, i| - # fetch all the email contents - data = imap.fetch(message_id, "RFC822") - - data.each do |d| - msg = d.attr['RFC822'] - # instantiate a Mail object to avoid further IMAP parameters nightmares - mail = Mail.read_from_string msg - - # call the block with mail object as param - start = (i == 0) - last = (i == message_ids-1) - process_email_block.call mail, start, last - - # mark as read - if @mark_as_read - imap.store(message_id, "+FLAGS", [:Seen]) - end - end - end - end - - # - # idle_loop - # - # check for any further mail with "real-time" responsiveness. - # retrieve any mail from a folder, following specified search condition - # for any mail retrieved call a specified block - # - def idle_loop(imap, search_condition, folder, server, username, password) - - @logger.info "\nwaiting new mails (IDLE loop)..." - - loop do - begin - imap.select folder - imap.idle do |resp| - - # You'll get all the things from the server. For new emails (EXISTS) - if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS" - - @logger.debug resp.inspect if @debug - # Got something. Send DONE. This breaks you out of the blocking call - imap.idle_done - end - end - - # We're out, which means there are some emails ready for us. - # Go do a search for UNSEEN and fetch them. - retrieve_emails(imap, search_condition, folder) { |mail| process_email mail } - @logger.debug "Process Completed." if @debug - - rescue SignalException => e - # http://stackoverflow.com/questions/2089421/capturing-ctrl-c-in-ruby - @logger.info "Signal received at #{time_now}: #{e.class}. #{e.message}" - shutdown imap - - rescue Net::IMAP::Error => e - @logger.error "Net::IMAP::Error at #{time_now}: #{e.class}. #{e.message}" - - # timeout ? reopen connection - imap = imap_connection(server, username, password) #if e.message == 'connection closed' - @logger.info "reconnected to server: #{server}" - - rescue Exception => e - @logger.error "Something went wrong at #{time_now}: #{e.class}. #{e.message}" - - imap = imap_connection(server, username, password) - @logger.info "reconnected to server: #{server}" - end - end - end - - def process_email(mail, start, last) - meta = Hash.new - custom_uid = (Time.now.to_f * 1000).to_s + "_" + mail.__id__.to_s - - meta["from"] = mail.from.first - meta["to"] = mail.to.join(";") unless mail.to.nil? - meta["cc"] = mail.cc.join(";") unless mail.cc.nil? - meta["subject"] = mail.subject - meta["date"] = mail.date.to_s - - if mail.multipart? - for i in 0...mail.parts.length - m = @local_flag ? download_local(mail, custom_uid) : download_s3(mail, custom_uid) - meta.merge!(m) unless m.nil? - end - else - m = @local_flag ? download_local(mail, custom_uid) : download_s3(mail, custom_uid) - meta.merge!(m) unless m.nil? - end - - meta_file_path = save(meta, "meta/#{custom_uid}") - pid = Process.spawn(@cmd+" -f=#{meta_file_path} -t=#{@token}") - - HTTPService::NaviAI.start(start, last) - end - - private - - def save(data={}, filename) - download_path = config['download_path'] - filepath = download_path + filename + ".yml" - - mkdir_if_not_exist(filepath) - - File.write(filepath, data.to_yaml) - return filepath - end - - def encrypt(data) - Base64.encode64(data) - end - - def mkdir_if_not_exist(filepath) - dirname = File.dirname(filepath) - unless File.directory?(dirname) - FileUtils.mkdir_p(dirname) - end - end - - def time_now - Time.now.utc.iso8601(3) - end - - def shutdown(imap) - imap.idle_done - imap.logout unless imap.disconnected? - imap.disconnect - - @logger.info "#{$0} has ended (crowd applauds)" - exit 0 - end - - def config - YAML.load_file('/var/navi/config.yml') - end end