thm 0.1.8

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.
@@ -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: []