ronin-core 0.1.3 → 0.2.0.rc1
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 +4 -4
- data/.rubocop.yml +2 -0
- data/ChangeLog.md +25 -0
- data/Gemfile +1 -1
- data/README.md +2 -2
- data/gemspec.yml +1 -1
- data/lib/ronin/core/class_registry.rb +1 -1
- data/lib/ronin/core/cli/banner.rb +60 -0
- data/lib/ronin/core/cli/command.rb +1 -1
- data/lib/ronin/core/cli/command_shell/command.rb +1 -1
- data/lib/ronin/core/cli/command_shell.rb +12 -1
- data/lib/ronin/core/cli/completion_command.rb +204 -0
- data/lib/ronin/core/cli/generator/options/author.rb +1 -1
- data/lib/ronin/core/cli/generator/options/description.rb +1 -1
- data/lib/ronin/core/cli/generator/options/reference.rb +1 -1
- data/lib/ronin/core/cli/generator/options/summary.rb +1 -1
- data/lib/ronin/core/cli/generator.rb +1 -1
- data/lib/ronin/core/cli/help/banner.rb +49 -0
- data/lib/ronin/core/cli/logging.rb +3 -3
- data/lib/ronin/core/cli/options/param.rb +1 -1
- data/lib/ronin/core/cli/options/values/arches.rb +1 -1
- data/lib/ronin/core/cli/options/values/oses.rb +1 -1
- data/lib/ronin/core/cli/printing/arch.rb +1 -1
- data/lib/ronin/core/cli/printing/metadata.rb +33 -8
- data/lib/ronin/core/cli/printing/os.rb +1 -1
- data/lib/ronin/core/cli/printing/params.rb +30 -1
- data/lib/ronin/core/cli/ruby_shell.rb +6 -2
- data/lib/ronin/core/cli/shell.rb +6 -1
- data/lib/ronin/core/git.rb +1 -1
- data/lib/ronin/core/home.rb +1 -1
- data/lib/ronin/core/metadata/authors/author.rb +55 -15
- data/lib/ronin/core/metadata/authors.rb +4 -1
- data/lib/ronin/core/metadata/description.rb +1 -1
- data/lib/ronin/core/metadata/id.rb +1 -1
- data/lib/ronin/core/metadata/references.rb +1 -1
- data/lib/ronin/core/metadata/summary.rb +1 -1
- data/lib/ronin/core/metadata/version.rb +1 -1
- data/lib/ronin/core/output_formats/csv.rb +58 -0
- data/lib/ronin/core/output_formats/json.rb +90 -0
- data/lib/ronin/core/output_formats/ndjson.rb +55 -0
- data/lib/ronin/core/output_formats/output_dir.rb +93 -0
- data/lib/ronin/core/output_formats/output_file.rb +89 -0
- data/lib/ronin/core/output_formats/output_format.rb +48 -0
- data/lib/ronin/core/output_formats/txt.rb +50 -0
- data/lib/ronin/core/output_formats.rb +89 -0
- data/lib/ronin/core/params/exceptions.rb +1 -1
- data/lib/ronin/core/params/mixin.rb +1 -1
- data/lib/ronin/core/params/param.rb +1 -1
- data/lib/ronin/core/params/types/boolean.rb +1 -1
- data/lib/ronin/core/params/types/enum.rb +1 -1
- data/lib/ronin/core/params/types/float.rb +1 -1
- data/lib/ronin/core/params/types/integer.rb +1 -1
- data/lib/ronin/core/params/types/numeric.rb +1 -1
- data/lib/ronin/core/params/types/regexp.rb +1 -1
- data/lib/ronin/core/params/types/string.rb +1 -1
- data/lib/ronin/core/params/types/type.rb +1 -1
- data/lib/ronin/core/params/types/uri.rb +1 -1
- data/lib/ronin/core/params/types.rb +1 -1
- data/lib/ronin/core/params.rb +1 -1
- data/lib/ronin/core/system.rb +144 -0
- data/lib/ronin/core/version.rb +2 -2
- metadata +16 -4
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -61,6 +61,35 @@ module Ronin
|
|
61
61
|
indent do
|
62
62
|
print_table(rows,header: PARAM_TABLE_HEADER, border: :line)
|
63
63
|
end
|
64
|
+
|
65
|
+
puts
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# Returns a placeholder usage value for the given param.
|
70
|
+
#
|
71
|
+
# @param [Core::Params::Param] param
|
72
|
+
# The param.
|
73
|
+
#
|
74
|
+
# @return [String]
|
75
|
+
# The placeholder usage value.
|
76
|
+
#
|
77
|
+
# @note
|
78
|
+
# This method is primarily used to help build example commands
|
79
|
+
# that accept certain params.
|
80
|
+
#
|
81
|
+
# @since 0.2.0
|
82
|
+
#
|
83
|
+
def param_usage(param)
|
84
|
+
case param.type
|
85
|
+
when Core::Params::Types::Boolean then 'BOOL'
|
86
|
+
when Core::Params::Types::Integer then 'NUM'
|
87
|
+
when Core::Params::Types::Float then 'FLOAT'
|
88
|
+
when Core::Params::Types::Regexp then '/REGEX/'
|
89
|
+
when Core::Params::Types::URI then 'URL'
|
90
|
+
else
|
91
|
+
param.name.upcase
|
92
|
+
end
|
64
93
|
end
|
65
94
|
end
|
66
95
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -16,8 +16,9 @@
|
|
16
16
|
# along with ronin-core. If not, see <https://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
|
19
|
-
require '
|
19
|
+
require 'ronin/core/cli/banner'
|
20
20
|
|
21
|
+
require 'command_kit/colors'
|
21
22
|
require 'irb'
|
22
23
|
|
23
24
|
module Ronin
|
@@ -30,6 +31,7 @@ module Ronin
|
|
30
31
|
#
|
31
32
|
class RubyShell
|
32
33
|
|
34
|
+
include Banner
|
33
35
|
include CommandKit::Colors
|
34
36
|
|
35
37
|
# The console name.
|
@@ -104,6 +106,8 @@ module Ronin
|
|
104
106
|
# [irb]: https://github.com/ruby/irb#readme
|
105
107
|
#
|
106
108
|
def start
|
109
|
+
print_banner if STDOUT.tty?
|
110
|
+
|
107
111
|
configure
|
108
112
|
|
109
113
|
workspace = if @context then IRB::WorkSpace.new(@context)
|
data/lib/ronin/core/cli/shell.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -16,6 +16,8 @@
|
|
16
16
|
# along with ronin-core. If not, see <https://www.gnu.org/licenses/>.
|
17
17
|
#
|
18
18
|
|
19
|
+
require 'ronin/core/cli/banner'
|
20
|
+
|
19
21
|
require 'command_kit/printing'
|
20
22
|
require 'command_kit/colors'
|
21
23
|
require 'reline'
|
@@ -28,6 +30,7 @@ module Ronin
|
|
28
30
|
#
|
29
31
|
class Shell
|
30
32
|
|
33
|
+
include Banner
|
31
34
|
include CommandKit::Printing
|
32
35
|
include CommandKit::Colors
|
33
36
|
|
@@ -89,6 +92,8 @@ module Ronin
|
|
89
92
|
prev_completion_proc = Reline.completion_proc
|
90
93
|
Reline.completion_proc = shell.method(:complete)
|
91
94
|
|
95
|
+
shell.print_banner if shell.stdout.tty?
|
96
|
+
|
92
97
|
begin
|
93
98
|
loop do
|
94
99
|
line = Reline.readline("#{shell.prompt} ", true)
|
data/lib/ronin/core/git.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
data/lib/ronin/core/home.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -65,6 +65,13 @@ module Ronin
|
|
65
65
|
# @return [String, nil]
|
66
66
|
attr_reader :twitter
|
67
67
|
|
68
|
+
# The author's Mastodon handle.
|
69
|
+
#
|
70
|
+
# @return [String, nil]
|
71
|
+
#
|
72
|
+
# @since 0.2.0
|
73
|
+
attr_reader :mastodon
|
74
|
+
|
68
75
|
# The author's Discord handle.
|
69
76
|
#
|
70
77
|
# @return [String, nil]
|
@@ -97,27 +104,32 @@ module Ronin
|
|
97
104
|
# @param [String, nil] twitter
|
98
105
|
# The author's Twitter handle.
|
99
106
|
#
|
107
|
+
# @param [String, nil] mastodon
|
108
|
+
# The author's Mastodon handle.
|
109
|
+
#
|
100
110
|
# @param [String, nil] discord
|
101
111
|
# The author's Discord handle.
|
102
112
|
#
|
103
|
-
def initialize(name, email:
|
104
|
-
pgp:
|
105
|
-
website:
|
106
|
-
blog:
|
107
|
-
github:
|
108
|
-
gitlab:
|
109
|
-
twitter:
|
110
|
-
|
113
|
+
def initialize(name, email: nil,
|
114
|
+
pgp: nil,
|
115
|
+
website: nil,
|
116
|
+
blog: nil,
|
117
|
+
github: nil,
|
118
|
+
gitlab: nil,
|
119
|
+
twitter: nil,
|
120
|
+
mastodon: nil,
|
121
|
+
discord: nil)
|
111
122
|
@name = name
|
112
123
|
@email = email
|
113
124
|
@pgp = pgp
|
114
125
|
|
115
|
-
@website
|
116
|
-
@blog
|
117
|
-
@github
|
118
|
-
@gitlab
|
119
|
-
@twitter
|
120
|
-
@
|
126
|
+
@website = website
|
127
|
+
@blog = blog
|
128
|
+
@github = github
|
129
|
+
@gitlab = gitlab
|
130
|
+
@twitter = twitter
|
131
|
+
@mastodon = mastodon
|
132
|
+
@discord = discord
|
121
133
|
end
|
122
134
|
|
123
135
|
#
|
@@ -183,6 +195,17 @@ module Ronin
|
|
183
195
|
@twitter != nil
|
184
196
|
end
|
185
197
|
|
198
|
+
#
|
199
|
+
# Determines if the author has a {#mastodon} handle set.
|
200
|
+
#
|
201
|
+
# @return [Boolean]
|
202
|
+
#
|
203
|
+
# @since 0.2.0
|
204
|
+
#
|
205
|
+
def mastodon?
|
206
|
+
@mastodon != nil
|
207
|
+
end
|
208
|
+
|
186
209
|
#
|
187
210
|
# Determines if the author has a {#discord} handle set.
|
188
211
|
#
|
@@ -225,6 +248,23 @@ module Ronin
|
|
225
248
|
"https://twitter.com/#{@twitter.sub(/\A@/,'')}" if @twitter
|
226
249
|
end
|
227
250
|
|
251
|
+
#
|
252
|
+
# Returns the URL to the author's Mastodon profile.
|
253
|
+
#
|
254
|
+
# @return [String, nil]
|
255
|
+
# Returns the URL to the author's Mastodon profile, or `nil`
|
256
|
+
# if no {#mastodon} user name has been set.
|
257
|
+
#
|
258
|
+
# @since 0.2.0
|
259
|
+
#
|
260
|
+
def mastodon_url
|
261
|
+
if @mastodon
|
262
|
+
username, host = @mastodon.sub(/\A@/,'').split('@',2)
|
263
|
+
|
264
|
+
"https://#{host}/@#{username}"
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
228
268
|
#
|
229
269
|
# Converts the author to a String.
|
230
270
|
#
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -102,6 +102,9 @@ module Ronin
|
|
102
102
|
# @option kwargs [String, nil] :twitter
|
103
103
|
# The author's Twitter handle.
|
104
104
|
#
|
105
|
+
# @option kwargs [String, nil] :mastodon
|
106
|
+
# The author's Mastodon handle.
|
107
|
+
#
|
105
108
|
# @option kwargs [String, nil] :discord
|
106
109
|
# The author's Discord handle.
|
107
110
|
#
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
#
|
3
|
-
# Copyright (c) 2021-
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
4
|
#
|
5
5
|
# ronin-core is free software: you can redistribute it and/or modify
|
6
6
|
# it under the terms of the GNU Lesser General Public License as published
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
|
+
#
|
5
|
+
# ronin-core is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published
|
7
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# ronin-core is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with ronin-core. If not, see <https://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'ronin/core/output_formats/output_file'
|
20
|
+
|
21
|
+
require 'csv'
|
22
|
+
|
23
|
+
module Ronin
|
24
|
+
module Core
|
25
|
+
module OutputFormats
|
26
|
+
#
|
27
|
+
# Represents a CSV (`.csv`) output format.
|
28
|
+
#
|
29
|
+
# @api semipublic
|
30
|
+
#
|
31
|
+
# @since 0.2.0
|
32
|
+
#
|
33
|
+
class CSV < OutputFile
|
34
|
+
|
35
|
+
#
|
36
|
+
# Appends a value to the CSV stream.
|
37
|
+
#
|
38
|
+
# @param [#to_csv] value
|
39
|
+
# The value to append.
|
40
|
+
#
|
41
|
+
# @raise [NotImplementedError]
|
42
|
+
# The given output value does not define a `to_csv` method.
|
43
|
+
#
|
44
|
+
def <<(value)
|
45
|
+
unless value.respond_to?(:to_csv)
|
46
|
+
raise(NotImplementedError,"output value must define a #to_csv method: #{value.inspect}")
|
47
|
+
end
|
48
|
+
|
49
|
+
@io.write(value.to_csv)
|
50
|
+
@io.flush
|
51
|
+
|
52
|
+
return self
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
|
+
#
|
5
|
+
# ronin-core is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published
|
7
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# ronin-core is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with ronin-core. If not, see <https://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'ronin/core/output_formats/output_file'
|
20
|
+
|
21
|
+
require 'json'
|
22
|
+
|
23
|
+
module Ronin
|
24
|
+
module Core
|
25
|
+
module OutputFormats
|
26
|
+
#
|
27
|
+
# Represents a JSON (`.json`) output format.
|
28
|
+
#
|
29
|
+
# @api semipublic
|
30
|
+
#
|
31
|
+
# @since 0.2.0
|
32
|
+
#
|
33
|
+
class JSON < OutputFile
|
34
|
+
|
35
|
+
#
|
36
|
+
# Initializes the JSON output format.
|
37
|
+
#
|
38
|
+
# @param [IO] io
|
39
|
+
# The JSON output stream.
|
40
|
+
#
|
41
|
+
def initialize(io)
|
42
|
+
super(io)
|
43
|
+
|
44
|
+
@first_value = true
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# Appends a value to the JSON stream.
|
49
|
+
#
|
50
|
+
# @param [#to_json] value
|
51
|
+
# The value to append.
|
52
|
+
#
|
53
|
+
# @return [self]
|
54
|
+
#
|
55
|
+
# @raise [NotImplementedError]
|
56
|
+
# The given value object does not define a `to_json` method.
|
57
|
+
#
|
58
|
+
def <<(value)
|
59
|
+
unless value.respond_to?(:to_json)
|
60
|
+
raise(NotImplementedError,"output value does not define a #to_json method: #{value.inspect}")
|
61
|
+
end
|
62
|
+
|
63
|
+
if @first_value
|
64
|
+
@io.write("[#{value.to_json}")
|
65
|
+
@first_value = false
|
66
|
+
else
|
67
|
+
@io.write(",#{value.to_json}")
|
68
|
+
end
|
69
|
+
|
70
|
+
@io.flush
|
71
|
+
return self
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
# Closes the JSON output stream.
|
76
|
+
#
|
77
|
+
def close
|
78
|
+
if @first_value
|
79
|
+
@io.write("[]")
|
80
|
+
else
|
81
|
+
@io.write("]")
|
82
|
+
end
|
83
|
+
|
84
|
+
super
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
|
+
#
|
5
|
+
# ronin-core is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published
|
7
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# ronin-core is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with ronin-core. If not, see <https://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'ronin/core/output_formats/output_file'
|
20
|
+
|
21
|
+
require 'json'
|
22
|
+
|
23
|
+
module Ronin
|
24
|
+
module Core
|
25
|
+
module OutputFormats
|
26
|
+
#
|
27
|
+
# Represents a newline deliminated JSON (`.ndjson`) output format.
|
28
|
+
#
|
29
|
+
# @api semipublic
|
30
|
+
#
|
31
|
+
# @since 0.2.0
|
32
|
+
#
|
33
|
+
class NDJSON < OutputFile
|
34
|
+
|
35
|
+
#
|
36
|
+
# Appends a value to the NDJSON stream.
|
37
|
+
#
|
38
|
+
# @param [#to_json] value
|
39
|
+
# The value to append.
|
40
|
+
#
|
41
|
+
# @return [self]
|
42
|
+
#
|
43
|
+
# @raise [NotImplementedError]
|
44
|
+
# The given value object does not define a `to_json` method.
|
45
|
+
#
|
46
|
+
def <<(value)
|
47
|
+
@io.puts(value.to_json)
|
48
|
+
@io.flush
|
49
|
+
return self
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
|
+
#
|
5
|
+
# ronin-core is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published
|
7
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# ronin-core is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with ronin-core. If not, see <https://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'ronin/core/output_formats/output_format'
|
20
|
+
|
21
|
+
require 'fileutils'
|
22
|
+
|
23
|
+
module Ronin
|
24
|
+
module Core
|
25
|
+
module OutputFormats
|
26
|
+
#
|
27
|
+
# Base class that represents an output directory.
|
28
|
+
#
|
29
|
+
# @api semipublic
|
30
|
+
#
|
31
|
+
# @since 0.2.0
|
32
|
+
#
|
33
|
+
class OutputDir < OutputFormat
|
34
|
+
|
35
|
+
# The path to the output directory.
|
36
|
+
#
|
37
|
+
# @return [String]
|
38
|
+
attr_reader :path
|
39
|
+
|
40
|
+
#
|
41
|
+
# Initializes the output directory.
|
42
|
+
#
|
43
|
+
# @param [String] path
|
44
|
+
# The path to the output directory.
|
45
|
+
#
|
46
|
+
def initialize(path)
|
47
|
+
super()
|
48
|
+
|
49
|
+
@path = File.expand_path(path)
|
50
|
+
FileUtils.mkdir_p(@path)
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
# Opens an output directory.
|
55
|
+
#
|
56
|
+
# @param [String] path
|
57
|
+
# The path to the new output directory.
|
58
|
+
#
|
59
|
+
# @yield [output_dir]
|
60
|
+
# If a block is given, it will be passed the initialized output
|
61
|
+
# directory. Once the block returns, the output format will
|
62
|
+
# automatically be closed.
|
63
|
+
#
|
64
|
+
# @yieldparam [Dir] output_dir
|
65
|
+
# The newly opened output directory.
|
66
|
+
#
|
67
|
+
# @return [Dir]
|
68
|
+
# If no block is given, the newly initialized output directory will be
|
69
|
+
# returned.
|
70
|
+
#
|
71
|
+
def self.open(path)
|
72
|
+
output_dir = new(path)
|
73
|
+
|
74
|
+
if block_given?
|
75
|
+
yield output_dir
|
76
|
+
output_dir.close
|
77
|
+
else
|
78
|
+
return output_dir
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
# "Closes" the output directory.
|
84
|
+
#
|
85
|
+
# @note This method is mainly for compatibility with {OutputFile}.
|
86
|
+
#
|
87
|
+
def close
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Copyright (c) 2021-2024 Hal Brodigan (postmodern.mod3 at gmail.com)
|
4
|
+
#
|
5
|
+
# ronin-core is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Lesser General Public License as published
|
7
|
+
# by the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# ronin-core is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Lesser General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Lesser General Public License
|
16
|
+
# along with ronin-core. If not, see <https://www.gnu.org/licenses/>.
|
17
|
+
#
|
18
|
+
|
19
|
+
require 'ronin/core/output_formats/output_format'
|
20
|
+
|
21
|
+
module Ronin
|
22
|
+
module Core
|
23
|
+
module OutputFormats
|
24
|
+
#
|
25
|
+
# Base class for all output file formats.
|
26
|
+
#
|
27
|
+
# @api semipublic
|
28
|
+
#
|
29
|
+
# @since 0.2.0
|
30
|
+
#
|
31
|
+
class OutputFile < OutputFormat
|
32
|
+
|
33
|
+
# The output stream to write to.
|
34
|
+
#
|
35
|
+
# @return [IO]
|
36
|
+
attr_reader :io
|
37
|
+
|
38
|
+
#
|
39
|
+
# Initializes the output format.
|
40
|
+
#
|
41
|
+
# @param [IO] io
|
42
|
+
# The output stream to write to.
|
43
|
+
#
|
44
|
+
def initialize(io)
|
45
|
+
super()
|
46
|
+
|
47
|
+
@io = io
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Opens an output file.
|
52
|
+
#
|
53
|
+
# @param [String] path
|
54
|
+
# The path to the new output file.
|
55
|
+
#
|
56
|
+
# @yield [output_format]
|
57
|
+
# If a block is given, it will be passed the initialized output
|
58
|
+
# format. Once the block returns, the output format will automatically
|
59
|
+
# be closed.
|
60
|
+
#
|
61
|
+
# @yieldparam [OutputFormat] output_format
|
62
|
+
# The newly opened output format.
|
63
|
+
#
|
64
|
+
# @return [OutputFormat]
|
65
|
+
# If no block is given, the newly initialized output format will be
|
66
|
+
# returned.
|
67
|
+
#
|
68
|
+
def self.open(path)
|
69
|
+
output = new(File.open(path,'w'))
|
70
|
+
|
71
|
+
if block_given?
|
72
|
+
yield output
|
73
|
+
output.close
|
74
|
+
else
|
75
|
+
return output
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
#
|
80
|
+
# Closes the output file.
|
81
|
+
#
|
82
|
+
def close
|
83
|
+
@io.close unless @io == $stdout
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|