logstash-input-irc 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e59a0260be408291418aa4dcc980025e1f5ad81e
4
- data.tar.gz: e53e0306323c1a7c708ec9fb85fbf4a9e63c2bbf
3
+ metadata.gz: bff489f521755ff86ab1a651e99a0f9fc5b6d237
4
+ data.tar.gz: 48b7b53e0afa268840c7be0fca06b59d702d4530
5
5
  SHA512:
6
- metadata.gz: ec867a1053500599043e4e32051243dffdcabdf48cf1da2a6e579cafbce77b2e58a31b71e33e7f70aca265b37511daf2c6e886265c54853b5561a0f068b58a9c
7
- data.tar.gz: 3bf22e9ccfe38dc322ea10cd59368d44aecc7435de7bc0e11cea12ef8deaf7c86a250edec7f9028cdb68276d353d3b18a600e2fa7f78484f647a437859a76a77
6
+ metadata.gz: c3c7f8fe563344601340753d69c8f61e06026c6e8563c65ce4b4ac42a6da659ef3db99804743a58acad34eb71cc3623ae2ac9a6314ad94a9bc1eb1d2337babbc
7
+ data.tar.gz: 6c9aa83d937645850b044fd06261beaf7a3e28b4e41b78fadcd03421f20fa30f547a6b77216c4493e7da37238f57a93db744efd44b2cd8ed70f7c683b7549cfe
@@ -32,20 +32,31 @@ class LogStash::Inputs::Irc < LogStash::Inputs::Base
32
32
  # IRC Server password
33
33
  config :password, :validate => :password
34
34
 
35
+ # Catch all IRC channel/user events not just channel messages
36
+ config :catch_all, :validate => :boolean, :default => false
37
+
38
+ # Gather and send user counts for channels - this requires catch_all and will force it
39
+ config :get_stats, :validate => :boolean, :default => false
40
+
41
+ # How often in minutes to get the user count stats
42
+ config :stats_interval, :validate => :number, :default => 5
43
+
35
44
  # Channels to join and read messages from.
36
45
  #
37
- # These should be full channel names including the `#` symbol, such as
38
- # `#logstash`.
46
+ # These should be full channel names including the '#' symbol, such as
47
+ # "#logstash".
39
48
  #
40
49
  # For passworded channels, add a space and the channel password, such as
41
- # `#logstash password`.
50
+ # "#logstash password".
42
51
  #
43
52
  config :channels, :validate => :array, :required => true
44
53
 
45
54
  public
46
55
  def register
47
56
  require "cinch"
57
+ @user_stats = Hash.new
48
58
  @irc_queue = Queue.new
59
+ @catch_all = true if @get_stats
49
60
  @logger.info("Connecting to irc server", :host => @host, :port => @port, :nick => @nick, :channels => @channels)
50
61
 
51
62
  @bot = Cinch::Bot.new
@@ -61,27 +72,86 @@ class LogStash::Inputs::Irc < LogStash::Inputs::Base
61
72
  c.ssl.use = @secure
62
73
  end
63
74
  queue = @irc_queue
64
- @bot.on :channel do |m|
65
- queue << m
75
+ if @catch_all
76
+ @bot.on :catchall do |m|
77
+ queue << m
78
+ end
79
+ else
80
+ @bot.on :channel do |m|
81
+ queue << m
82
+ end
66
83
  end
84
+
67
85
  end # def register
68
86
 
69
87
  public
70
88
  def run(output_queue)
71
- Thread.new(@bot) do |bot|
72
- bot.start
89
+ @bot_thread = Stud::Task.new(@bot) do |bot|
90
+ bot.start
91
+ end
92
+ if @get_stats
93
+ @request_names_thread = Stud::Task.new do
94
+ loop do
95
+ sleep (@stats_interval * 60)
96
+ request_names
97
+ end
98
+ end
73
99
  end
74
100
  loop do
75
101
  msg = @irc_queue.pop
76
- if msg.user
102
+ handle_response(msg, output_queue)
103
+ end
104
+ end # def run
105
+
106
+ RPL_NAMREPLY = "353"
107
+ RPL_ENDOFNAMES = "366"
108
+
109
+ def handle_response (msg, output_queue)
110
+ # Set some constant variables based on https://www.alien.net.au/irc/irc2numerics.html
111
+
112
+ if @get_stats and msg.command.to_s == RPL_NAMREPLY
113
+ # Got a names list event
114
+ # Count the users returned in msg.params[3] split by " "
115
+ users = msg.params[3].split(" ")
116
+ @user_stats[msg.channel.to_s] = (@user_stats[msg.channel.to_s] || 0) + users.length
117
+ end
118
+ if @get_stats and msg.command.to_s == RPL_ENDOFNAMES
119
+ # Got an end of names event, now we can send the info down the pipe.
120
+ event = LogStash::Event.new()
121
+ decorate(event)
122
+ event["channel"] = msg.channel.to_s
123
+ event["users"] = @user_stats[msg.channel.to_s]
124
+ event["server"] = "#{@host}:#{@port}"
125
+ output_queue << event
126
+ end
127
+ if msg.command and msg.user
128
+ @logger.debug("IRC Message", :data => msg)
77
129
  @codec.decode(msg.message) do |event|
78
130
  decorate(event)
131
+ event["user"] = msg.prefix.to_s
132
+ event["command"] = msg.command.to_s
79
133
  event["channel"] = msg.channel.to_s
80
134
  event["nick"] = msg.user.nick
81
135
  event["server"] = "#{@host}:#{@port}"
136
+ event["host"] = msg.user.host
82
137
  output_queue << event
83
138
  end
84
139
  end
140
+ end
141
+
142
+ def request_names
143
+ # Go though list of channels, and request a NAMES for them
144
+ # Note : Logstash channel list can have passwords ie : "channel password"
145
+ # Need to account for that
146
+ @channels.each do |channel|
147
+ channel = channel.split(' ').first if channel.include?(' ')
148
+ @user_stats[channel] = 0
149
+ @bot.irc.send("NAMES #{channel}")
85
150
  end
86
- end # def run
151
+ end
152
+
153
+ def teardown
154
+ @request_names_thread#stop!
155
+ @bot_thread#stop!
156
+ end
87
157
  end # class LogStash::Inputs::Irc
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-input-irc'
4
- s.version = '0.1.4'
4
+ s.version = '0.1.5'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Read events from an IRC Server."
7
7
  s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-input-irc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-20 00:00:00.000000000 Z
11
+ date: 2015-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- requirement: !ruby/object:Gem::Requirement
14
+ name: logstash-core
15
+ version_requirements: !ruby/object:Gem::Requirement
15
16
  requirements:
16
17
  - - '>='
17
18
  - !ruby/object:Gem::Version
@@ -19,10 +20,7 @@ dependencies:
19
20
  - - <
20
21
  - !ruby/object:Gem::Version
21
22
  version: 2.0.0
22
- name: logstash-core
23
- prerelease: false
24
- type: :runtime
25
- version_requirements: !ruby/object:Gem::Requirement
23
+ requirement: !ruby/object:Gem::Requirement
26
24
  requirements:
27
25
  - - '>='
28
26
  - !ruby/object:Gem::Version
@@ -30,48 +28,50 @@ dependencies:
30
28
  - - <
31
29
  - !ruby/object:Gem::Version
32
30
  version: 2.0.0
31
+ prerelease: false
32
+ type: :runtime
33
33
  - !ruby/object:Gem::Dependency
34
+ name: logstash-codec-plain
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
34
40
  requirement: !ruby/object:Gem::Requirement
35
41
  requirements:
36
42
  - - '>='
37
43
  - !ruby/object:Gem::Version
38
44
  version: '0'
39
- name: logstash-codec-plain
40
45
  prerelease: false
41
46
  type: :runtime
47
+ - !ruby/object:Gem::Dependency
48
+ name: cinch
42
49
  version_requirements: !ruby/object:Gem::Requirement
43
50
  requirements:
44
51
  - - '>='
45
52
  - !ruby/object:Gem::Version
46
53
  version: '0'
47
- - !ruby/object:Gem::Dependency
48
54
  requirement: !ruby/object:Gem::Requirement
49
55
  requirements:
50
56
  - - '>='
51
57
  - !ruby/object:Gem::Version
52
58
  version: '0'
53
- name: cinch
54
59
  prerelease: false
55
60
  type: :runtime
61
+ - !ruby/object:Gem::Dependency
62
+ name: logstash-devutils
56
63
  version_requirements: !ruby/object:Gem::Requirement
57
64
  requirements:
58
65
  - - '>='
59
66
  - !ruby/object:Gem::Version
60
67
  version: '0'
61
- - !ruby/object:Gem::Dependency
62
68
  requirement: !ruby/object:Gem::Requirement
63
69
  requirements:
64
70
  - - '>='
65
71
  - !ruby/object:Gem::Version
66
72
  version: '0'
67
- name: logstash-devutils
68
73
  prerelease: false
69
74
  type: :development
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - '>='
73
- - !ruby/object:Gem::Version
74
- version: '0'
75
75
  description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
76
76
  email: info@elastic.co
77
77
  executables: []