Module: Fluent::EverySenseProxy

Included in:
EverySenseInput, EverySenseOutput
Defined in:
lib/fluent/plugin/everysense_proxy.rb

Defined Under Namespace

Classes: EverySenseProxyError

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/fluent/plugin/everysense_proxy.rb', line 11

def self.included(base)
  base.desc 'EverySense API URI'
  base.config_param :url, :string, :default => 'https://api.every-sense.com:8001/'
  base.desc 'login_name for EverySense API'
  base.config_param :login_name, :string, :default => nil  # TODO: mandatory option
  base.desc 'password for EverySense API'
  base.config_param :password, :string, :default => nil  # TODO: mandatory option
  base.config_param :device_id, :string, :default => nil
  base.config_param :recipe_id, :string, :default => nil
  base.config_param :format, :string, :default => 'json'
  base.config_param :limit, :integer, :default => 1000
  #base.config_param :keep_alive, :integer, :default => 2
  base.config_param :from, :string, :default => Time.now.iso8601
  base.config_param :keep, :bool, :default => false
  base.config_param :inline, :bool, :default => false
end

Instance Method Details

#create_sessionObject



65
66
67
68
69
70
71
# File 'lib/fluent/plugin/everysense_proxy.rb', line 65

def create_session
  return @session_key if valid_session?
  @session_req ||= create_session_request
  session_res = @https.request(@session_req)
  return nil if !error_handler(session_res, 'create_session failed.')
  @session_key = JSON.parse(session_res.body)["session_key"]
end

#create_session_requestObject



58
59
60
61
62
63
# File 'lib/fluent/plugin/everysense_proxy.rb', line 58

def create_session_request
  session_req = Net::HTTP::Post.new(@uri + '/session')
  session_req.body = {login_name: @login_name, password: @password}.to_json
  session_req.content_type = 'application/json'
  session_req
end

#delete_sessionObject



77
78
79
80
81
# File 'lib/fluent/plugin/everysense_proxy.rb', line 77

def delete_session
  return if !valid_session?
  del_session_res = @https.request(delete_session_request)
  error_handler(del_session_res, 'delete_session failed.')
end

#delete_session_requestObject



73
74
75
# File 'lib/fluent/plugin/everysense_proxy.rb', line 73

def delete_session_request
  Net::HTTP::Delete.new(@uri + "/session/#{@session_key}")
end

#error_handler(response, message) ⇒ Object



43
44
45
46
47
48
49
50
51
52
# File 'lib/fluent/plugin/everysense_proxy.rb', line 43

def error_handler(response, message)
  if response.code != "200"
    $log.error :error => message
    $log.debug "code: #{response.code}"
    $log.debug "message: #{response.message}"
    $log.debug "body: #{response.body}"
    return false
  end
  return true
end

#get_messagesObject



130
131
132
133
134
135
136
137
138
# File 'lib/fluent/plugin/everysense_proxy.rb', line 130

def get_messages
  if !valid_session?
    return nil if create_session.nil?
    $log.debug "session #{@session_key} created."
  end
  get_messages_res = @https.get(get_messages_request)
  return nil if !error_handler(get_messages_res,"get_messages failed.")
  get_messages_res.body
end

#get_messages_paramsObject



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/fluent/plugin/everysense_proxy.rb', line 105

def get_messages_params
  params = {
    session_key: @session_key,
    from: @from,
    to: Time.now.iso8601,
    limit: @limit
  }
  if !@device_id.nil?
    return params
  elsif !@recipe_id.nil?
    return params.merge({keep: @keep, inline: @inline, format: @format})
  else
    raise ConfigError, "device_id or recipe_id must be specified."
  end
end

#get_messages_requestObject



121
122
123
124
125
126
127
128
# File 'lib/fluent/plugin/everysense_proxy.rb', line 121

def get_messages_request
  get_messages_req = @uri + target_path
  get_messages_req.query = URI.encode_www_form(get_messages_params)
  $log.debug "#{@uri + target_path}?#{URI.encode_www_form(get_messages_params)}"
  # currently time window is automatically updated
  @from = (Time.now + 1).iso8601
  get_messages_req
end

#put_message(message) ⇒ Object



90
91
92
93
# File 'lib/fluent/plugin/everysense_proxy.rb', line 90

def put_message(message)
  put_message_res = @https.request(put_message_request(message))
  error_handler(put_message_res, "put_message: '#{message}' failed.")
end

#put_message_request(message) ⇒ Object



83
84
85
86
87
88
# File 'lib/fluent/plugin/everysense_proxy.rb', line 83

def put_message_request(message)
  put_message_req = Net::HTTP::Post.new(@uri + "/device_data/#{@device_id}")
  put_message_req.body = message
  put_message_req.content_type = "application/#{@format}"
  put_message_req
end

#shutdown_proxyObject



37
38
39
40
41
# File 'lib/fluent/plugin/everysense_proxy.rb', line 37

def shutdown_proxy
  $log.debug "shutdown_proxy #{@session_key}"
  delete_session
  @https.finish() if @https.active?
end

#start_proxyObject



28
29
30
31
32
33
34
35
# File 'lib/fluent/plugin/everysense_proxy.rb', line 28

def start_proxy
  $log.debug "start everysense proxy #{@uri}"

  @uri = URI.parse(@url)
  @https = Net::HTTP.new(@uri.host, @uri.port)
  @https.use_ssl = (@uri.scheme == 'https')
  @session_key = nil
end

#target_pathObject



95
96
97
98
99
100
101
102
103
# File 'lib/fluent/plugin/everysense_proxy.rb', line 95

def target_path
  if !@device_id.nil?
    return "/device_data/#{@device_id}"
  elsif !@recipe_id.nil?
    return "/recipe_data/#{@recipe_id}.#{@format}"
  else
    raise ConfigError, "device_id or recipe_id must be specified."
  end
end

#valid_session?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'lib/fluent/plugin/everysense_proxy.rb', line 54

def valid_session?
  !@session_key.nil? # TODO validate @session_key using EverySense API
end