repsheet_visualizer 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- repsheet_visualizer (0.0.7)
4
+ repsheet_visualizer (0.0.8)
5
5
  geoip
6
6
  json
7
7
  redis
@@ -4,6 +4,11 @@ require 'redis'
4
4
  require 'json'
5
5
 
6
6
  class RepsheetVisualizer < Sinatra::Base
7
+ # Grab the mount point before every request
8
+ before do
9
+ @mount = mount
10
+ end
11
+
7
12
  helpers do
8
13
  def action(data)
9
14
  if data[:blacklist].nil? || data[:blacklist] == "false"
@@ -14,10 +19,10 @@ class RepsheetVisualizer < Sinatra::Base
14
19
  end
15
20
  end
16
21
 
22
+ # Settings methods
17
23
  def redis_connection
18
24
  host = defined?(settings.redis_host) ? settings.redis_host : "localhost"
19
25
  port = defined?(settings.redis_port) ? settings.redis_port : 6379
20
-
21
26
  Redis.new(:host => host, :port => port)
22
27
  end
23
28
 
@@ -32,64 +37,78 @@ class RepsheetVisualizer < Sinatra::Base
32
37
  defined?(settings.mount) ? (settings.mount + "/") : "/"
33
38
  end
34
39
 
35
- get '/' do
36
- redis = redis_connection
37
- data = redis.keys("*:requests").map {|d| d.split(":").first}.reject {|ip| ip.empty?}
38
- @actors = {}
39
- data.each do |actor|
40
- @actors[actor] = {}
41
- @actors[actor][:repsheet] = redis.get("#{actor}:repsheet")
42
- @actors[actor][:blacklist] = redis.get("#{actor}:repsheet:blacklist")
43
- @actors[actor][:detected] = redis.smembers("#{actor}:detected").join(", ")
40
+ # TODO: These methods should get moved out to another place
41
+ def summary(connection)
42
+ actors = {}
43
+ connection.keys("*:requests").map {|d| d.split(":").first}.reject {|ip| ip.empty?}.each do |actor|
44
+ actors[actor] = Hash.new 0
45
+ actors[actor][:repsheet] = connection.get("#{actor}:repsheet")
46
+ actors[actor][:blacklist] = connection.get("#{actor}:repsheet:blacklist")
47
+ actors[actor][:detected] = connection.smembers("#{actor}:detected").join(", ")
48
+ connection.smembers("#{actor}:detected").each do |rule|
49
+ actors[actor][:total] += connection.get("#{actor}:#{rule}:count").to_i
50
+ end
44
51
  end
45
- @mount = mount
46
- erb :actors
52
+ actors
47
53
  end
48
54
 
49
- get '/activity/:ip' do
50
- redis = redis_connection
51
- @ip = params[:ip]
52
- @activity = redis.lrange("#{@ip}:requests", 0, -1)
53
- @mount = mount
54
- erb :activity
55
+ def breakdown(connection)
56
+ data = {}
57
+ offenders = connection.keys("*:repsheet").map {|o| o.split(":").first}
58
+ offenders.each do |offender|
59
+ data[offender] = {"totals" => {}}
60
+ connection.smembers("#{offender}:detected").each do |rule|
61
+ data[offender]["totals"][rule] = connection.get "#{offender}:#{rule}:count"
62
+ end
63
+ end
64
+ aggregate = Hash.new 0
65
+ data.each {|ip,data| data["totals"].each {|rule,count| aggregate[rule] += count.to_i}}
66
+ [data, aggregate]
55
67
  end
56
68
 
57
- post '/action' do
58
- redis = redis_connection
59
- if params["action"] == "allow"
60
- redis.set("#{params[:ip]}:repsheet:blacklist", "false")
61
- else
62
- redis.set("#{params[:ip]}:repsheet:blacklist", "true")
69
+ def activity(connection)
70
+ connection.lrange("#{@ip}:requests", 0, -1)
71
+ end
72
+
73
+ def worldview(connection, database)
74
+ data = {}
75
+ offenders = connection.keys("*:repsheet*").map {|o| o.split(":").first}
76
+ offenders.each do |address|
77
+ details = database.country(address)
78
+ data[address] = [details.latitude, details.longitude]
63
79
  end
64
- @mount = mount
65
- redirect back
80
+ data
81
+ end
82
+
83
+ # This is the actual application
84
+ get '/' do
85
+ @data = summary(redis_connection)
86
+ erb :actors
66
87
  end
67
88
 
68
89
  get '/breakdown' do
69
- redis = redis_connection
70
- @data = {}
71
- offenders = redis.keys("*:repsheet").map {|o| o.split(":").first}
72
- offenders.each do |offender|
73
- @data[offender] = {"totals" => {}}
74
- redis.smembers("#{offender}:detected").each do |rule|
75
- @data[offender]["totals"][rule] = redis.get "#{offender}:#{rule}:count"
76
- end
77
- end
78
- @aggregate = Hash.new 0
79
- @data.each {|ip,data| data["totals"].each {|rule,count| @aggregate[rule] += count.to_i}}
80
- @mount = mount
90
+ @data, @aggregate = breakdown(redis_connection)
81
91
  erb :breakdown
82
92
  end
83
93
 
84
94
  get '/worldview' do
85
- db = geoip_database
86
- redis = redis_connection
87
- @data = {}
88
- offenders = redis.keys("*:repsheet*").map {|o| o.split(":").first}
89
- offenders.each do |address|
90
- details = db.country(address)
91
- @data[address] = [details.latitude, details.longitude]
92
- end
95
+ @data = worldview(redis_connection, geoip_database)
93
96
  erb :worldview
94
97
  end
98
+
99
+ get '/activity/:ip' do
100
+ @ip = params[:ip]
101
+ @data = activity(redis_connection)
102
+ erb :activity
103
+ end
104
+
105
+ post '/action' do
106
+ connection = redis_connection
107
+ if params["action"] == "allow"
108
+ connection.set("#{params[:ip]}:repsheet:blacklist", "false")
109
+ else
110
+ connection.set("#{params[:ip]}:repsheet:blacklist", "true")
111
+ end
112
+ redirect back
113
+ end
95
114
  end
@@ -1,5 +1,8 @@
1
1
  $(document).ready(function() {
2
- $("#actors").tablesorter({sortList: [[2,1], [1,1]],widgets: ['zebra']});
2
+ // Bring up tablesorter and sort by people who have committed the
3
+ // most number of ModSecurity violations and who are not yet on
4
+ // the blacklist
5
+ $("#actors").tablesorter({sortList: [[2,0], [4,1]],widgets: ['zebra']});
3
6
  });
4
7
 
5
8
  function angle(d) {
@@ -46,7 +46,7 @@
46
46
  <h2>Activity for <%= @ip %></h2>
47
47
  <div><a href="<%= @mount %>">Back</a></div>
48
48
  <ul>
49
- <% @activity.each do |action| %>
49
+ <% @data.each do |action| %>
50
50
  <li><%= action %></li>
51
51
  <% end %>
52
52
  </ul>
@@ -56,24 +56,26 @@
56
56
  <th>Repsheet?</th>
57
57
  <th>Blacklist?</th>
58
58
  <th>Triggered Rules</th>
59
+ <th>Offenses</th>
59
60
  <th>Activity</th>
60
61
  <th>Action</th>
61
62
  </tr>
62
63
  </thead>
63
64
  <tbody>
64
- <% @actors.each do |actor,data| %>
65
+ <% @data.each do |actor,details| %>
65
66
  <tr>
66
67
  <td><%= actor %></td>
67
- <td><%= data[:repsheet] %></td>
68
- <td><%= data[:blacklist] %></td>
69
- <td><%= data[:detected] %></td>
68
+ <td><%= details[:repsheet] %></td>
69
+ <td><%= details[:blacklist] %></td>
70
+ <td><%= details[:detected] %></td>
71
+ <td><%= details[:total] %></td>
70
72
  <td><a href="<%= @mount %>activity/<%= actor %>">Click to see activity</a>
71
73
  <td>
72
74
  <form method="post" action="<%= @mount %>action" class="button_to">
73
75
  <div>
74
- <input value="<%= action(data) %>" type="submit" />
76
+ <input value="<%= action(details) %>" type="submit" />
75
77
  <input type="hidden" name="ip" value="<%= actor %>"/>
76
- <input type="hidden" name="action" value="<%= action(data) %>"/>
78
+ <input type="hidden" name="action" value="<%= action(details) %>"/>
77
79
  </div>
78
80
  </form>
79
81
  </td>
@@ -1,3 +1,3 @@
1
1
  module RepsheetVisualizer
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: repsheet_visualizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-27 00:00:00.000000000 Z
12
+ date: 2013-05-29 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: geoip
@@ -176,7 +176,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
176
176
  version: '0'
177
177
  segments:
178
178
  - 0
179
- hash: -1556641184775599076
179
+ hash: -3255625678553513827
180
180
  required_rubygems_version: !ruby/object:Gem::Requirement
181
181
  none: false
182
182
  requirements:
@@ -185,7 +185,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
185
  version: '0'
186
186
  segments:
187
187
  - 0
188
- hash: -1556641184775599076
188
+ hash: -3255625678553513827
189
189
  requirements: []
190
190
  rubyforge_project:
191
191
  rubygems_version: 1.8.25