thm 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,65 @@
1
+ ########################################################################
2
+ #
3
+ # Author: Brian Hood
4
+ #
5
+ # Description: Threatmonitor User Administration
6
+ #
7
+ # Extends the functionality of the Thm module adding Authorization
8
+ # Adding Authentication to the Privileges model
9
+ #
10
+ ########################################################################
11
+
12
+ require "#{File.dirname(__FILE__)}/lib/thm.rb"
13
+ require "#{File.dirname(__FILE__)}/config.rb"
14
+ require "#{File.dirname(__FILE__)}/thm-privileges.rb"
15
+
16
+ #require File.expand_path(File.join(
17
+ # File.dirname(__FILE__),
18
+ # "/lib/thm.rb")
19
+
20
+ module Thm::Authorization
21
+
22
+ class Authentication < Thm::DataServices
23
+
24
+ attr_reader :thmsession
25
+ attr_accessor :thmsesslock
26
+
27
+ def initialize
28
+ super
29
+ @debug = 1
30
+ end
31
+
32
+ def login(username, password)
33
+ obj = Thm::Authorization::Privileges.new
34
+ pwhash = obj.mkhash(password)
35
+ sqlusrcnt = "SELECT count(*) as num FROM users WHERE username = '#{username}' AND password = '#{pwhash}'"
36
+ resusrcnt = @conn.query("#{sqlusrcnt}")
37
+ rowusrcnt = resusrcnt.fetch_hash
38
+ puts "#{rowusrcnt["num"].to_i}"
39
+ if rowusrcnt["num"].to_i == 1
40
+ puts "Authentication Success"
41
+ @thmsession = Tools::guid.to_s
42
+ @thmsesslock = "OK"
43
+ else
44
+ @thmsession = "failure"
45
+ @thmsesslock = "FAILURE"
46
+ puts "\e[1;31m\Failure to Authenticate \e[0m\ "
47
+ end
48
+ end
49
+
50
+ def login_session?
51
+ if @thmsession != "failure" or @thmsession != nil
52
+ return true
53
+ else
54
+ return false
55
+ end
56
+ end
57
+
58
+ def logout
59
+ @thmsession = nil
60
+ @thmsesslock = "DEADBEEF"
61
+ end
62
+
63
+ end
64
+
65
+ end
@@ -0,0 +1,173 @@
1
+ ########################################################################
2
+ #
3
+ # Author: Brian Hood
4
+ #
5
+ # Description: Threatmonitor Authorization
6
+ #
7
+ # Extends the functionality of the Thm module adding Authorization
8
+ #
9
+ ########################################################################
10
+
11
+ require 'digest'
12
+ require "#{File.dirname(__FILE__)}/lib/thm.rb"
13
+ require 'pp'
14
+
15
+ puts "\e[1;33m\Threatmonitor - User Administration\e[0m\ "
16
+ puts "\e[1;33m\===================================\e[0m\ \n\n"
17
+
18
+ module Thm::Authorization
19
+
20
+ class AuthTemplate < Thm::DataServices
21
+
22
+ def initialize
23
+ super
24
+ @debug = 1
25
+ end
26
+
27
+ def setup_privileges(name, obj)
28
+ data = obj.new
29
+ actiontemplate = { 'userdata' => {
30
+ 'type' => "#{data.type}",
31
+ 'group' => "#{data.group}",
32
+ 'password' => "#{data.password}"
33
+ }
34
+ }
35
+ #pp actiontemplate
36
+ if @debug == 1
37
+ puts "Action template User data"
38
+ puts "User: #{name}"
39
+ puts "Type: #{actiontemplate["userdata"]["type"]}"
40
+ puts "Group: #{actiontemplate["userdata"]["group"]}"
41
+ puts "Password: #{actiontemplate["userdata"]["password"]}"
42
+ end
43
+ case actiontemplate["userdata"]["type"]
44
+ when "adduser"
45
+ sqlid = "SELECT gid FROM groups WHERE groupname = '#{actiontemplate["userdata"]["group"]}';"
46
+ resgid = @conn.query("#{sqlid}")
47
+ rowgid = resgid.fetch_hash
48
+ puts "#{rowgid["gid"].to_i}"
49
+ if rowgid["gid"] =~ /^[0-9]*$/ # Check the value is numeric
50
+ sqlidcnt = "SELECT count(*) as num FROM groups WHERE groupname = '#{actiontemplate["userdata"]["group"]}';"
51
+ resgidcnt = @conn.query("#{sqlidcnt}")
52
+ rowgidcnt = resgidcnt.fetch_hash
53
+ puts "#{rowgidcnt["num"].to_i}"
54
+ if rowgidcnt["num"].to_i == 1
55
+ sql = "INSERT INTO users (username, password, gid) VALUES ('#{name}', '#{actiontemplate["userdata"]["password"]}', #{rowgid["gid"]});"
56
+ begin
57
+ @conn.query("#{sql}")
58
+ @conn.commit
59
+ rescue
60
+ puts "There was a issue adding user check database privileges"
61
+ end
62
+ else
63
+ puts "Group #{actiontemplate["userdata"]["group"]} doesn't exist"
64
+ end
65
+ else
66
+ puts "Group #{actiontemplate["userdata"]["group"]} invalid GID ?"
67
+ end
68
+ when "userexists?"
69
+ sqlchkname = "SELECT COUNT(*) as num FROM users WHERE username = '#{name}';"
70
+ reschkname = @conn.query("#{sqlchkname}")
71
+ rowchknamecnt = reschkname.fetch_hash
72
+ puts "#{rowchknamecnt["num"].to_i}"
73
+ if rowchknamecnt["num"].to_i == 0
74
+ puts "User #{name} doesn't exist"
75
+ return false
76
+ else
77
+ return true
78
+ end
79
+ when "deleteuser"
80
+ if self.user_exists?("#{name}") == true
81
+ sqldeluser = "DELETE FROM users WHERE username = '#{name}';"
82
+ begin
83
+ @conn.query("#{sqldeluser}")
84
+ @conn.commit
85
+ puts "User #{name} deleted"
86
+ rescue
87
+ puts "Error deleting User #{name}"
88
+ end
89
+ end
90
+ when "listusers"
91
+ sqllsusers = "SELECT uid, username FROM users;"
92
+ reslsusers = @conn.query("#{sqllsusers}")
93
+ puts "\n"
94
+ puts "\e[1;38m| Users Table |\e[0m\ \n"
95
+ puts "\e[1;38m\\==========================/\e[0m\ "
96
+ while row = reslsusers.fetch_hash do
97
+ puts "UID: #{row["uid"]} Username: #{row["username"]}"
98
+ end
99
+ puts "\n"
100
+ when "listgroups"
101
+ sqllsusers = "SELECT gid, groupname FROM groups;"
102
+ reslsusers = @conn.query("#{sqllsusers}")
103
+ puts "\n"
104
+ puts "\e[1;38m| Groups Table |\e[0m\ \n"
105
+ puts "\e[1;38m\\==========================/\e[0m\ "
106
+ while row = reslsusers.fetch_hash do
107
+ puts "GID: #{row["gid"]} Groupname: #{row["groupname"]}"
108
+ end
109
+ puts "\n"
110
+ when "groupexists?"
111
+ sqlchkname = "SELECT COUNT(*) as num FROM groups WHERE groupname = '#{name}';"
112
+ reschkname = @conn.query("#{sqlchkname}")
113
+ rowchknamecnt = reschkname.fetch_hash
114
+ puts "#{rowchknamecnt["num"].to_i}"
115
+ if rowchknamecnt["num"].to_i == 0
116
+ if actiontemplate["userdata"]["msg"] == true
117
+ puts "Group #{name} doesn't exist"
118
+ end
119
+ return false
120
+ else
121
+ return true
122
+ end
123
+ when "deletegroup"
124
+ puts "#{name}"
125
+ if self.group_exists?("#{name}") == true
126
+ sqldelgroup = "DELETE FROM groups WHERE groupname = '#{name}';"
127
+ begin
128
+ @conn.query("#{sqldelgroup}")
129
+ @conn.commit
130
+ puts "Group #{name} deleted"
131
+ rescue
132
+ puts "Error deleting Group #{name}"
133
+ end
134
+ end
135
+ when "addgroup"
136
+ sqlidcnt = "SELECT count(*) as num FROM groups WHERE groupname = '#{name}';"
137
+ resgidcnt = @conn.query("#{sqlidcnt}")
138
+ rowgidcnt = resgidcnt.fetch_hash
139
+ puts "#{rowgidcnt["num"].to_i}"
140
+ if rowgidcnt["num"].to_i == 0
141
+ sqladdgroup = "INSERT INTO groups (groupname) VALUES ('#{name}');"
142
+ begin
143
+ @conn.query("#{sqladdgroup}")
144
+ @conn.commit
145
+ rescue
146
+ puts "There was a issue adding group check database privileges"
147
+ end
148
+ else
149
+ puts "Group #{actiontemplate["userdata"]["group"]} doesn't exist"
150
+ end
151
+ end
152
+ end
153
+
154
+ # Build a class object using a Flat scope so we can pass through variables
155
+ # Then pass it as an object to setup_privileges
156
+ def objbuilder(user, type="", group="", password="")
157
+ # user becomes group when adding / deleting groups
158
+ # objbuilder("#{@thmgroupname}", "addgroup")
159
+ designobj = Class.new do
160
+ attr_reader :type, :group, :password
161
+ define_method :initialize do
162
+ instance_variable_set("@type", "#{type}")
163
+ instance_variable_set("@group", "#{group}")
164
+ instance_variable_set("@password", "#{password}")
165
+ end
166
+ end
167
+ setup_privileges("#{user}", designobj)
168
+ end
169
+
170
+ end
171
+
172
+ end
173
+
data/thm-privileges.rb ADDED
@@ -0,0 +1,97 @@
1
+ ########################################################################
2
+ #
3
+ # Author: Brian Hood
4
+ #
5
+ # Description: Threatmonitor User Administration
6
+ #
7
+ # Extends the functionality of the Thm module adding Authorization
8
+ # Adding User / Group Privileges functionality
9
+ #
10
+ ########################################################################
11
+
12
+ require "#{File.dirname(__FILE__)}/thm-authorization.rb"
13
+
14
+ module Thm::Authorization
15
+
16
+ class Privileges < AuthTemplate
17
+
18
+ puts "\e[1;34m\ Manage User / Group Privileges \e[0m\ \n\n"
19
+
20
+ def mkhash(payload)
21
+ hash = Digest::SHA512.new
22
+ puts "Password Omitted !"
23
+ hash.update("#{payload}")
24
+ end
25
+
26
+ def user_exists?(name)
27
+ objbuilder("#{name}", "userexists?", msg=false)
28
+ end
29
+
30
+ def add_user
31
+ while buf = Readline.readline("\e[1;36m\Add User: \e[0m\ ", true)
32
+ @thmusername = buf
33
+ while buf2 = Readline.readline("\e[1;36m\Existing Group: \e[0m\ ", true)
34
+ @thmgroupname = buf2
35
+ break
36
+ end
37
+ if self.user_exists?("#{@thmusername}"); puts "Exiting ... Can't create duplicate users ?"; exit; end
38
+ break
39
+ end
40
+ end
41
+
42
+ #def update_user; end
43
+
44
+ #alias_method :modify_user, :update_user
45
+
46
+ def delete_user
47
+ while buf = Readline.readline("\e[1;36m\Remove User: \e[0m\ ", true)
48
+ @thmusername = buf
49
+ objbuilder("#{@thmusername}", "deleteuser")
50
+ break
51
+ end
52
+ end
53
+
54
+ def set_password(prompt="\e[1;36m\Password: \e[0m\ ")
55
+ print prompt
56
+ plain = STDIN.noecho(&:gets).chomp
57
+ @thmpassword = mkhash(plain)
58
+ objbuilder("#{@thmusername}", "adduser", "#{@thmgroupname}", "#{@thmpassword}")
59
+ end
60
+
61
+ def list_users
62
+ objbuilder("system", "listusers")
63
+ end
64
+
65
+ def list_groups
66
+ objbuilder("system", "listgroups")
67
+ end
68
+
69
+ def group_exists?(name)
70
+ objbuilder("#{name}", "groupexists?")
71
+ end
72
+
73
+ def add_group
74
+ while buf = Readline.readline("\e[1;36m\Add Group: \e[0m\ ", true)
75
+ @thmgroupname = buf
76
+ if self.group_exists?("#{@thmgroupname}") == true
77
+ puts "Exiting Group exists ..."
78
+ end
79
+ if self.group_exists?("#{@thmgroupname}"); puts "Exiting ... Can't create duplicate groups ?"; exit; end
80
+ objbuilder("#{@thmgroupname}", "addgroup")
81
+ break
82
+ end
83
+ end
84
+
85
+ def delete_group
86
+ while buf = Readline.readline("\e[1;36m\Delete Group: \e[0m\ ", true)
87
+ @thmgroupname = buf
88
+ objbuilder("#{@thmgroupname}", "deletegroup")
89
+ break
90
+ end
91
+ end
92
+
93
+ end
94
+
95
+ end
96
+
97
+
@@ -0,0 +1,18 @@
1
+ doctype 5
2
+ html
3
+ head
4
+ title Threatmonitor Suite - Login
5
+ link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen"
6
+ script src="js/react.js"
7
+ script src="js/JSXTransformer.js"
8
+ script src="js/jquery.min.js"
9
+ script src="js/marked.min.js"
10
+
11
+ body
12
+ h2 Threatmonitor Suite Login
13
+ #content
14
+
15
+ div id="content"
16
+ script type="text/jsx" src="js/files/authenticate.jsx"
17
+
18
+
@@ -0,0 +1,69 @@
1
+ <html>
2
+ <head>
3
+ <title>Threatmonitor Suite - Dashboard</title>
4
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen">
5
+ <script src="js/react.js"></script>
6
+ <script src="js/JSXTransformer.js"></script>
7
+ <script src="js/jquery.min.js"></script>
8
+ <script src="js/marked.min.js"></script>
9
+ <script src="js/jsapi.js"></script>
10
+ <script src="js/chartkick.js"></script>
11
+ </head>
12
+ <body>
13
+ <h3>Threatmonitor - Overview</h3>
14
+ <div id="content" style='width:100%; overflow:off;'>
15
+ <p align="left">Protocol data</p>
16
+ <table width="100%">
17
+
18
+ <tr><td colspan="2">Geo Location</td></tr>
19
+ <tr>
20
+ <td colspan="2" width="100%">
21
+ <div align="left" id="contentgeo" style='width:100%; height:100%; transform:scale(0.9);'>
22
+ <%= geo_chart @rowgeocount, id: "contentgeo", height: "400px", width: "400px" %>
23
+ </div></td>
24
+ </td>
25
+ </tr>
26
+
27
+ <tr><td>UDP Packets</td><td>TCP Packets</td></tr>
28
+ <tr>
29
+ <td width="50%">
30
+ <div align="left" id="content1" style='width:100%; height:100%; transform:scale(0.9);'>
31
+ <%= pie_chart @rowusrcnt, id: "content1", height: "400px", width: "400px" %>
32
+ </div></td>
33
+ <td width="50%">
34
+ <div align="left" id="content2" style='width:100%; height:100%; transform:scale(0.9);'>
35
+ <%= pie_chart @rowusrcnt2, id: "content2", height: "400px", width: "400px" %>
36
+ </div>
37
+ </td>
38
+ </tr>
39
+
40
+ <tr><td>Top TCP/IP Talkers</td><td>Top UDP/IP Talkers</td></tr>
41
+ <tr>
42
+ <td width="50%" height="50%">
43
+ <div align="left" id="content5" style='width:100%; height:100%; transform:scale(0.9);'>
44
+ <%= column_chart @rowusrcnt5, id: "content5", colors: ["orange", "#ed7718"] %>
45
+ </div></td>
46
+ <td width="50%" height="50%">
47
+ <div align="left" id="content6" style='width:100%; height:100%; transform:scale(0.9);'>
48
+ <%= column_chart @rowusrcnt6, id: "content6", colors: ["purple", "#78099d"] %>
49
+ </div></td>
50
+ </tr>
51
+
52
+ <tr><td>UDP Services</td><td>TCP Services</td></tr>
53
+ <tr>
54
+ <td width="50%" height="50%">
55
+ <div align="left" id="content3" style='width:100%; height:100%; transform:scale(0.9);'>
56
+ <%= bar_chart @rowusrcnt3, id: "content3", colors: ["green", "#177925"] %>
57
+ </div></td>
58
+ <td width="50%" height="50%">
59
+ <div align="left" id="content4" style='width:100%; height:100%; transform:scale(0.9);'>
60
+ <%= bar_chart @rowusrcnt4, id: "content4", colors: ["red", "#b80000"] %>
61
+ </div></td>
62
+ </tr>
63
+ </table>
64
+ </div>
65
+ <script type="text/jsx">
66
+
67
+ </script>
68
+ </body>
69
+ </html>
data/views/logout.slim ADDED
@@ -0,0 +1,10 @@
1
+ doctype 5
2
+ html
3
+ head
4
+ title Threatmonitor Suite - Dashboard
5
+ link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen"
6
+
7
+ body
8
+ h5 Logging out ...
9
+ #content
10
+
metadata ADDED
@@ -0,0 +1,237 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: thm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.8
5
+ platform: ruby
6
+ authors:
7
+ - puppetpies
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-07-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.4'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bunny
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.7'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.7'
69
+ - !ruby/object:Gem::Dependency
70
+ name: amqp
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.5'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pcap
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.7'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.7'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guid
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: eventmachine
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: chartkick
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.3'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.3'
139
+ - !ruby/object:Gem::Dependency
140
+ name: sinatra
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.4'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.4'
153
+ - !ruby/object:Gem::Dependency
154
+ name: slim
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '3.0'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '3.0'
167
+ description: Threatmonitor - Packet Capture / Analysis Suite
168
+ email: brianh6854@googlemail.com
169
+ executables:
170
+ - thm-consumer
171
+ - thm-pcap
172
+ - thm-producer
173
+ - thm-session
174
+ - thm-useradmin
175
+ extensions: []
176
+ extra_rdoc_files:
177
+ - README.md
178
+ - README.1ST
179
+ files:
180
+ - README.1ST
181
+ - README.md
182
+ - bin/thm-consumer
183
+ - bin/thm-pcap
184
+ - bin/thm-producer
185
+ - bin/thm-session
186
+ - bin/thm-useradmin
187
+ - config.rb
188
+ - datalayerlight.rb
189
+ - js/JSXTransformer.js
190
+ - js/chartkick.js
191
+ - js/files/authenticate.jsx
192
+ - js/jquery.min.js
193
+ - js/marked.min.js
194
+ - js/react.js
195
+ - lib/thm.rb
196
+ - lib/thm/consumer.rb
197
+ - lib/thm/dataservices.rb
198
+ - lib/thm/localmachine.rb
199
+ - lib/thm/producer.rb
200
+ - lib/thm/version.rb
201
+ - service_definitions.csv
202
+ - sql/geoipdata-monetdb.sql
203
+ - sql/threatmonitor-monetdb.sql
204
+ - sql/threatmonitor-mysql.sql
205
+ - stylesheets/screen.css
206
+ - thm-authentication.rb
207
+ - thm-authorization.rb
208
+ - thm-privileges.rb
209
+ - views/authenticate.slim
210
+ - views/dashboard.erb
211
+ - views/logout.slim
212
+ homepage: https://github.com/puppetpies/threatmonitor
213
+ licenses:
214
+ - MIT
215
+ metadata: {}
216
+ post_install_message:
217
+ rdoc_options: []
218
+ require_paths:
219
+ - lib
220
+ required_ruby_version: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ">="
223
+ - !ruby/object:Gem::Version
224
+ version: '0'
225
+ required_rubygems_version: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '0'
230
+ requirements:
231
+ - libpcap
232
+ rubyforge_project:
233
+ rubygems_version: 2.2.2
234
+ signing_key:
235
+ specification_version: 4
236
+ summary: Packet Data Analysis
237
+ test_files: []