class LogStash::Outputs::Rocketchat
An rocketchat output that does nothing.
Public Instance Methods
auth()
click to toggle source
# File lib/logstash/outputs/rocketchat.rb, line 103 def auth() m = __method__.to_s @logger.debug("[#{m}] Trying to authenticate") # https://rocket.chat/docs/developer-guides/rest-api/authentication/login/ endpoint = "#{@url}/login" # We have to send a valid username/password in order to get a token payload = Hash.new payload['username'] = @username payload['password'] = @password @logger.debug("[#{m}] Endpoint: #{endpoint}, payload: #{payload}") # Go get this token... body = make_request('POST', endpoint, nil, payload) if body.nil? @logger.error("[#{m}] An error occurred trying to authenticate to the Rocketchat server") return false else status = body['status'] if status == 'success' # If it succeds, then we'll have an user id. and an authentication token @userId = body['data']['userId'] @authToken = body['data']['authToken'] return true end end end
get_room_id(room_name)
click to toggle source
# File lib/logstash/outputs/rocketchat.rb, line 136 def get_room_id(room_name) m = __method__.to_s @logger.debug("[#{m}] Trying to get the room's id for room #{room_name}") # Have we got the room's id already? if @room_ids.key?(room_name) @logger.debug("[#{m}] Already got the id for room #{room_name}, no need to ask Rocketchat server") return @room_ids[room_name] end # https://rocket.chat/docs/developer-guides/rest-api/channels/info/ endpoint = "#{@url}/channels.info" body = make_request('GET', endpoint, {:roomName => room_name}, nil) if body.nil? @logger.error("[#{m}] An error occurred trying to get the room id (channels endpoint) for room #{room_name}") else success = body['success'] if success # It's a channel... return the room's id @logger.debug("[#{m}] Room #{room_name} is a channel, saving its id so we don't need to ask for it anymore") @room_ids[:room_name] = body['channel']['_id'] @logger.debug("[#{m}] Rooms' ids: #{@room_ids}") return body['channel']['_id'] else @logger.info("[#{m}] Couldn't get the room id for room #{room_name} through the channels endpoint, trying with the groups endpoint") # https://rocket.chat/docs/developer-guides/rest-api/groups/info/ endpoint = "#{@url}/groups.info" body = make_request('GET', endpoint, {:roomName => room_name}, nil) if body.nil? @logger.error("[#{m}] An error occurred trying to get the room id (groups endpoint) for room #{room_name}") else success = body['success'] if success # It's a group... return the room's id @logger.debug("[#{m}] Room #{room_name} is a group, saving its id so we don't need to ask for it anymore") @room_ids[:room_name] = body['group']['_id'] @logger.debug("[#{m}] Rooms' ids: #{@room_ids}") return body['group']['_id'] else return nil end end end end return nil end
make_request(method, endpoint, params = nil, payload = nil)
click to toggle source
# File lib/logstash/outputs/rocketchat.rb, line 229 def make_request(method, endpoint, params = nil, payload = nil) m = __method__.to_s @logger.debug("[#{m}] Making a #{method} request to #{endpoint}") @logger.debug("[#{m}] Auth token: #{@authToken}") @logger.debug("[#{m}] User id: #{@userId}") @logger.debug("[#{m}] Params: #{params}") @logger.debug("[#{m}] Payload: #{payload}") begin if method == 'POST' RestClient.post( endpoint, JSON.dump(payload), { :'X-Auth-Token' => @authToken || '', :'X-User-Id' => @userId || '' , :accept => "application/json", :'User-Agent' => "logstash-output-rocketchat", :content_type => @content_type }) { |response, request, result, &block| if response.code != 200 @logger.error("[#{m}] An error occurred trying to request from the Rocketchat's server API: #{response.code}") @logger.debug("[#{m}] Got a #{response.code} response: #{response}") return response.body ? JSON.parse(response.body) : nil else @logger.debug("[#{m}] Got a #{response.code} response: #{response}") return response.body ? JSON.parse(response.body) : nil end } elsif method == 'GET' RestClient.get( endpoint, { :params => params, :'X-Auth-Token' => @authToken || '', :'X-User-Id' => @userId || '' , :accept => "application/json", :'User-Agent' => "logstash-output-rocketchat", :content_type => @content_type }) { |response, request, result, &block| if response.code != 200 @logger.error("[#{m}] An error occurred trying to request from the Rocketchat's server API: #{response.code}") @logger.debug("[#{m}] Got a #{response.code} response: #{response}") return response.body ? JSON.parse(response.body) : nil else @logger.debug("[#{m}] Got a #{response.code} response: #{response}") return response.body ? JSON.parse(response.body) : nil end } end rescue Exception => e @logger.error("[#{m}] Unhandled exception", :exception => e, :stacktrace => e.backtrace) end end
receive(event)
click to toggle source
# File lib/logstash/outputs/rocketchat.rb, line 83 def receive(event) return unless output?(event) m = __method__.to_s # The message itself message = event.sprintf(@content) # To which channels/groups should the message be sent @channels.map {|channel| if send_message(channel, message) @logger.debug("[#{m}] Message sent to room #{channel}") else @logger.error("[#{m}] An error occurred trying to send a message to room #{channel}.") end } end
register()
click to toggle source
# File lib/logstash/outputs/rocketchat.rb, line 61 def register m = __method__.to_s require 'rest-client' require 'cgi' require 'json' # Rocketchat's API # More information in https://rocket.chat/docs/developer-guides/rest-api/ raw_url = "#{@scheme}://#{@host}:#{@port}#{@api}" @url = ::LogStash::Util::SafeURI.new(raw_url) # We'll keep the rooms' ids so we don't need to ask again for each event @room_ids = Hash.new @logger.info("[#{m}] URL #{@url}, Username: #{@username}, Channel: #{@channels}") # We need to grab a token from Rocketchat auth() end
send_message(room_name, message)
click to toggle source
# File lib/logstash/outputs/rocketchat.rb, line 189 def send_message(room_name, message) m = __method__.to_s @logger.debug("[#{m}] Trying to a send message to room #{room_name}") # https://rocket.chat/docs/developer-guides/rest-api/chat/sendmessage/ endpoint = "#{@url}/chat.sendMessage" # Go get the room's id room_id = get_room_id(room_name) if room_id payload = Hash.new payload['message'] = Hash.new payload['message']['rid'] = room_id payload['message']['msg'] = message body = make_request('POST', endpoint, nil, payload) if body.nil? @logger.error("[#{m}] An error occurred trying to send message to the Rocketchat server, room #{room_name}") return false else success = body['success'] if success # Message sent return true else # Something went wrong return false end end else @logger.warn("[#{m}] An error occurred trying to get the room id for room #{room_name}. Are you sure the user #{@user} is subscribed to this room?") end return false end