ronin-db 0.1.0.beta1-java

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.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.github/workflows/ruby.yml +31 -0
  4. data/.gitignore +13 -0
  5. data/.rspec +1 -0
  6. data/.ruby-version +1 -0
  7. data/.yardopts +1 -0
  8. data/COPYING.txt +165 -0
  9. data/ChangeLog.md +12 -0
  10. data/Gemfile +39 -0
  11. data/README.md +272 -0
  12. data/Rakefile +76 -0
  13. data/bin/ronin-db +35 -0
  14. data/gemspec.yml +46 -0
  15. data/lib/ronin/db/cli/command.rb +37 -0
  16. data/lib/ronin/db/cli/commands/add.rb +206 -0
  17. data/lib/ronin/db/cli/commands/asn.rb +218 -0
  18. data/lib/ronin/db/cli/commands/creds.rb +80 -0
  19. data/lib/ronin/db/cli/commands/edit.rb +58 -0
  20. data/lib/ronin/db/cli/commands/emails.rb +90 -0
  21. data/lib/ronin/db/cli/commands/hosts.rb +100 -0
  22. data/lib/ronin/db/cli/commands/ips.rb +100 -0
  23. data/lib/ronin/db/cli/commands/irb.rb +81 -0
  24. data/lib/ronin/db/cli/commands/list.rb +124 -0
  25. data/lib/ronin/db/cli/commands/migrate.rb +75 -0
  26. data/lib/ronin/db/cli/commands/remove.rb +69 -0
  27. data/lib/ronin/db/cli/commands/urls.rb +170 -0
  28. data/lib/ronin/db/cli/database_command.rb +71 -0
  29. data/lib/ronin/db/cli/model_command.rb +202 -0
  30. data/lib/ronin/db/cli/modifiable.rb +141 -0
  31. data/lib/ronin/db/cli/resources_command.rb +120 -0
  32. data/lib/ronin/db/cli/ruby_shell.rb +51 -0
  33. data/lib/ronin/db/cli/uri_methods.rb +97 -0
  34. data/lib/ronin/db/cli.rb +38 -0
  35. data/lib/ronin/db/config_file.rb +132 -0
  36. data/lib/ronin/db/exceptions.rb +26 -0
  37. data/lib/ronin/db/home.rb +36 -0
  38. data/lib/ronin/db/root.rb +28 -0
  39. data/lib/ronin/db/version.rb +26 -0
  40. data/lib/ronin/db.rb +123 -0
  41. data/man/ronin-db-add.1 +99 -0
  42. data/man/ronin-db-add.1.md +75 -0
  43. data/man/ronin-db-asn.1 +79 -0
  44. data/man/ronin-db-asn.1.md +59 -0
  45. data/man/ronin-db-creds.1 +78 -0
  46. data/man/ronin-db-creds.1.md +58 -0
  47. data/man/ronin-db-edit.1 +48 -0
  48. data/man/ronin-db-edit.1.md +36 -0
  49. data/man/ronin-db-emails.1 +82 -0
  50. data/man/ronin-db-emails.1.md +61 -0
  51. data/man/ronin-db-hosts.1 +86 -0
  52. data/man/ronin-db-hosts.1.md +64 -0
  53. data/man/ronin-db-ips.1 +90 -0
  54. data/man/ronin-db-ips.1.md +67 -0
  55. data/man/ronin-db-irb.1 +61 -0
  56. data/man/ronin-db-irb.1.md +46 -0
  57. data/man/ronin-db-list.1 +58 -0
  58. data/man/ronin-db-list.1.md +44 -0
  59. data/man/ronin-db-migrate.1 +44 -0
  60. data/man/ronin-db-migrate.1.md +32 -0
  61. data/man/ronin-db-remove.1 +55 -0
  62. data/man/ronin-db-remove.1.md +42 -0
  63. data/man/ronin-db-urls.1 +98 -0
  64. data/man/ronin-db-urls.1.md +73 -0
  65. data/ronin-db.gemspec +78 -0
  66. data/spec/cli/commands/add_spec.rb +220 -0
  67. data/spec/cli/commands/edit_spec.rb +12 -0
  68. data/spec/cli/commands/irb_spec.rb +26 -0
  69. data/spec/cli/database_command_spec.rb +53 -0
  70. data/spec/cli/model_command_spec.rb +237 -0
  71. data/spec/cli/ruby_shell_spec.rb +14 -0
  72. data/spec/cli/uri_methods_spec.rb +190 -0
  73. data/spec/spec_helper.rb +15 -0
  74. metadata +200 -0
@@ -0,0 +1,170 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db - A common database library for managing and querying security data.
4
+ #
5
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/db/cli/model_command'
22
+ require 'ronin/db/cli/modifiable'
23
+
24
+ module Ronin
25
+ module DB
26
+ class CLI
27
+ module Commands
28
+ #
29
+ # Manages all URLs in the database.
30
+ #
31
+ # ## Usage
32
+ #
33
+ # ronin-db urls [options]
34
+ #
35
+ # ## Options
36
+ #
37
+ # --db NAME The database to connect to (Default: default)
38
+ # --db-uri URI The database URI to connect to
39
+ # -v, --verbose Enables verbose output
40
+ # --add VALUE Adds a value to the database
41
+ # --import FILE Imports the values from the FILE into the database
42
+ # --delete VALUE Deletes a value from the database
43
+ # --delete-all Deletes all values from the database
44
+ # --http
45
+ # --https
46
+ # -H, --host HOST
47
+ # -P, --port PORT
48
+ # -d, --directory SUBDIR
49
+ # -E, --ext EXT
50
+ # -q NAME
51
+ # --with-query-param
52
+ # -Q VALUE
53
+ # --with-query-value
54
+ #
55
+ class Urls < ModelCommand
56
+
57
+ include Modifiable
58
+
59
+ model_file 'ronin/db/url'
60
+ model_name 'URL'
61
+
62
+ option :http, desc: 'Searches for http:// URLs' do
63
+ @query_method_calls << :http
64
+ end
65
+
66
+ option :https, desc: 'Searches for https:// URLs' do
67
+ @query_method_calls << :https
68
+ end
69
+
70
+ option :host, short: '-H',
71
+ value: {
72
+ type: String,
73
+ usage: 'HOST'
74
+ },
75
+ desc: 'Searches for the associated HOST(s)' do |host|
76
+ @query_method_calls << [:with_host_name, [host]]
77
+ end
78
+
79
+ option :port, short: '-p',
80
+ value: {
81
+ type: Integer,
82
+ usage: 'PORT'
83
+ },
84
+ desc: 'Searches for the associated PORT(s)' do |port|
85
+ @query_method_calls << [:with_port_number, [port]]
86
+ end
87
+
88
+ option :path, value: {
89
+ type: String,
90
+ usage: 'PATH'
91
+ },
92
+ desc: 'Searches for all URLs with the PATH' do |path|
93
+ @query_method_calls << [:where, [], {path: path}]
94
+ end
95
+
96
+ option :fragment, value: {
97
+ type: String,
98
+ usage: 'FRAGMENT'
99
+ },
100
+ desc: 'Searches for all URLs with the FRAGMENT' do |fragment|
101
+ @query_method_calls << [:where, [], {fragment: fragment}]
102
+ end
103
+
104
+ option :directory, short: '-d',
105
+ value: {
106
+ type: String,
107
+ usage: 'DIR'
108
+ },
109
+ desc: 'Searches for the associated DIR' do |dir|
110
+ @query_method_calls << [:with_directory, [dir]]
111
+ end
112
+
113
+ option :with_ext, short: '-E',
114
+ value: {
115
+ type: String,
116
+ usage: 'EXT'
117
+ },
118
+ desc: 'Searches for URLs with the file extension' do |ext|
119
+ @query_method_calls << [:with_ext, [ext]]
120
+ end
121
+
122
+ option :query_string, short: '-q',
123
+ value: {
124
+ type: String,
125
+ usage: 'STRING',
126
+ },
127
+ desc: 'Searches for all URLs with the query string' do |string|
128
+ @query_method_calls << [:where, [], {query: string}]
129
+ end
130
+
131
+ option :with_query_param, short: '-P',
132
+ value: {
133
+ type: String,
134
+ usage: 'NAME[=VALUE]'
135
+ },
136
+ desc: 'Searches for the associated query-param NAME(s)' do |string|
137
+ name, value = string.split('=',2)
138
+
139
+ if value
140
+ @query_method_calls << [:with_query_param, [name, value]]
141
+ else
142
+ @query_method_calls << [:with_query_param_name, [name]]
143
+ end
144
+ end
145
+
146
+ option :with_query_param_name, value: {
147
+ type: String,
148
+ usage: 'NAME'
149
+ },
150
+ desc: 'Searches for the associated query-param VALUE(s)' do |name|
151
+ @query_method_calls << [:with_query_param_name, [name]]
152
+ end
153
+
154
+ option :with_query_param_value, value: {
155
+ type: String,
156
+ usage: 'VALUE'
157
+ },
158
+ desc: 'Searches for the associated query-param VALUE(s)' do |value|
159
+ @query_method_calls << [:with_query_param_value, [value]]
160
+ end
161
+
162
+ description 'Manages URLs'
163
+
164
+ man_page 'ronin-db-urls.1'
165
+
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db - A common database library for managing and querying security data.
4
+ #
5
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/db/cli/command'
22
+ require 'ronin/db/cli/uri_methods'
23
+ require 'ronin/db'
24
+
25
+ module Ronin
26
+ module DB
27
+ class CLI
28
+ #
29
+ # Base class for all commands that access the database.
30
+ #
31
+ class DatabaseCommand < Command
32
+
33
+ include URIMethods
34
+
35
+ option :db, value: {
36
+ type: DB.config.keys,
37
+ default: :default,
38
+ usage: 'NAME'
39
+ },
40
+ desc: 'The database to connect to'
41
+
42
+ option :db_uri, value: {
43
+ type: String,
44
+ usage: 'URI'
45
+ },
46
+ desc: 'The database URI to connect to'
47
+
48
+ #
49
+ # The database connection configuration.
50
+ #
51
+ # @return [Hash{Symbol => String,Integer}]
52
+ #
53
+ def config
54
+ if options[:db_uri]
55
+ parse_uri(options[:db_uri])
56
+ else
57
+ DB.config[options[:db]]
58
+ end
59
+ end
60
+
61
+ #
62
+ # Connects to the database.
63
+ #
64
+ def connect
65
+ DB.connect(config)
66
+ end
67
+
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,202 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db - A common database library for managing and querying security data.
4
+ #
5
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/db/cli/database_command'
22
+ require 'ronin/core/cli/logging'
23
+
24
+ require 'command_kit/options/verbose'
25
+
26
+ module Ronin
27
+ module DB
28
+ class CLI
29
+ #
30
+ # A base-command for database models commands.
31
+ #
32
+ class ModelCommand < DatabaseCommand
33
+
34
+ include CommandKit::Options::Verbose
35
+ include Core::CLI::Logging
36
+
37
+ #
38
+ # Sets or gets the model file to require.
39
+ #
40
+ # @param [String, nil] new_model_file
41
+ # The new model file.
42
+ #
43
+ # @return [String]
44
+ # The model file to require.
45
+ #
46
+ # @raise [NotImplementedError]
47
+ # The class did not define a `model_file`.
48
+ #
49
+ # @example
50
+ # model_file 'ronin/db/foo'
51
+ #
52
+ def self.model_file(new_model_file=nil)
53
+ if new_model_file
54
+ @model_file = new_model_file
55
+ else
56
+ @model_file ||= if superclass < ModelCommand
57
+ superclass.model_file
58
+ else
59
+ raise(NotImplementedError,"#{self} did not define model_file")
60
+ end
61
+ end
62
+ end
63
+
64
+ #
65
+ # Sets or gets the model name to lookup.
66
+ #
67
+ # @param [String, nil] new_model_name
68
+ # The new model name.
69
+ #
70
+ # @return [String]
71
+ # The model name to lookup.
72
+ #
73
+ # @raise [NotImplementedError]
74
+ # The class did not define a `model_name`.
75
+ #
76
+ # @example
77
+ # model_name 'Foo'
78
+ #
79
+ def self.model_name(new_model_name=nil)
80
+ if new_model_name
81
+ @model_name = new_model_name
82
+ else
83
+ @model_name ||= if superclass < ModelCommand
84
+ superclass.model_name
85
+ else
86
+ raise(NotImplementedError,"#{self} did not define model_name")
87
+ end
88
+ end
89
+ end
90
+
91
+ # The query method calls to chain together.
92
+ #
93
+ # @return [Array<(Symbol),
94
+ # (Symbol, Array),
95
+ # (Symbol, Hash),
96
+ # (Symbol, Array, Hash)>]
97
+ attr_reader :query_method_calls
98
+
99
+ #
100
+ # Initializes the command.
101
+ #
102
+ # @param [Hash{Symbol => Object}] kwargs
103
+ # Additional keyword arguments.
104
+ #
105
+ def initialize(**kwargs)
106
+ super(**kwargs)
107
+
108
+ @query_method_calls = []
109
+ end
110
+
111
+ #
112
+ # Runs the command.
113
+ #
114
+ def run
115
+ connect
116
+ list
117
+ end
118
+
119
+ #
120
+ # Connects to the database.
121
+ #
122
+ def connect
123
+ # connect to the database but do not load other models.
124
+ DB.connect(config, load_models: false)
125
+
126
+ # load and connect the model
127
+ model.connection
128
+ end
129
+
130
+ #
131
+ # The model to query.
132
+ #
133
+ # @return [Class<ActiveRecord::Base>]
134
+ # The loaded model.
135
+ #
136
+ # @raise [LoadError]
137
+ # The {model_file} could not be loaded.
138
+ #
139
+ # @raise [NameError]
140
+ # The {model_name} was not found within {Ronin::DB}.
141
+ #
142
+ def load_model
143
+ require self.class.model_file
144
+
145
+ Ronin::DB.const_get(self.class.model_name)
146
+ end
147
+
148
+ #
149
+ # The model to query.
150
+ #
151
+ # @return [Class<ActiveRecord::Base>]
152
+ # The loaded model.
153
+ #
154
+ def model
155
+ @model ||= load_model
156
+ end
157
+
158
+ #
159
+ # Queries and lists records.
160
+ #
161
+ def list
162
+ records = query
163
+ records.each(&method(:print_record))
164
+ end
165
+
166
+ #
167
+ # Builds a new query by chaining together the method calls defined by
168
+ # {#query_method_calls}.
169
+ #
170
+ # @return [ActiveRecord::Relation, ActiveRecord::QueryMethods::WhereChain]
171
+ # The new query.
172
+ #
173
+ def query
174
+ common_object_methods = Object.public_instance_methods
175
+
176
+ query = model.all
177
+
178
+ @query_method_calls.each do |method,arguments,kwargs={}|
179
+ if common_object_methods.include?(method)
180
+ raise(ArgumentError,"cannot call method Object##{method} on query #{query.inspect}")
181
+ end
182
+
183
+ query = query.public_send(method,*arguments,**kwargs)
184
+ end
185
+
186
+ return query
187
+ end
188
+
189
+ #
190
+ # Prints the given record.
191
+ #
192
+ # @param [ActiveRecord::Base] record
193
+ # The record to print.
194
+ #
195
+ def print_record(record)
196
+ puts record
197
+ end
198
+
199
+ end
200
+ end
201
+ end
202
+ end
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db - A common database library for managing and querying security data.
4
+ #
5
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ module Ronin
22
+ module DB
23
+ class CLI
24
+ #
25
+ # Allows a {ModelCommand} to add, import, delete, or delete all records.
26
+ #
27
+ module Modifiable
28
+ #
29
+ # Adds the `--add`, `--import`, `--delete`, and `--delete-all` options
30
+ # to the command.
31
+ #
32
+ # @param [Class<ModelCommand>] command
33
+ # The command class including {Modifiable}.
34
+ #
35
+ def self.included(command)
36
+ command.option :add, value: {
37
+ type: String,
38
+ usage: 'VALUE'
39
+ },
40
+ desc: 'Adds a value to the database'
41
+
42
+ command.option :import, value: {
43
+ type: String,
44
+ usage: 'FILE'
45
+ },
46
+ desc: 'Imports the values from the FILE into the database'
47
+
48
+ command.option :delete, value: {
49
+ type: String,
50
+ usage: 'VALUE'
51
+ },
52
+ desc: 'Deletes a value from the database'
53
+
54
+ command.option :delete_all, desc: 'Deletes all values from the database'
55
+ end
56
+
57
+ #
58
+ # Runs the command.
59
+ #
60
+ def run
61
+ connect
62
+
63
+ if options[:add]
64
+ add(options[:add])
65
+ elsif options[:import]
66
+ import_file(options[:import])
67
+ elsif options[:delete]
68
+ delete(options[:delete])
69
+ elsif options[:delete_all]
70
+ delete_all
71
+ else
72
+ list
73
+ end
74
+ end
75
+
76
+ #
77
+ # Adds a value to the database.
78
+ #
79
+ # @param [String] value
80
+ # The value to add.
81
+ #
82
+ def add(value)
83
+ record = model.import(value)
84
+
85
+ unless record.valid?
86
+ print_error "failed to import #{value}!"
87
+
88
+ record.errors.full_messages.each do |message|
89
+ print_error " - #{message}"
90
+ end
91
+ end
92
+ end
93
+
94
+ #
95
+ # Imports the values from the givne file.
96
+ #
97
+ # @param [String] path
98
+ # The path to the file.
99
+ #
100
+ def import_file(path)
101
+ unless File.file?(path)
102
+ print_error "no such file or directory: #{path}"
103
+ exit(-1)
104
+ end
105
+
106
+ File.open(path) do |file|
107
+ model.transaction do
108
+ file.each_line(chomp: true) do |value|
109
+ log_info "Importing #{value} ..." if verbose?
110
+
111
+ add(value)
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ #
118
+ # Deletes a value from the database.
119
+ #
120
+ # @param [String] value
121
+ # The value to lookup and delete.
122
+ #
123
+ def delete(value)
124
+ if (record = model.lookup(value))
125
+ record.destroy
126
+ else
127
+ print_error "value does not exist in the database: #{value}"
128
+ exit(-1)
129
+ end
130
+ end
131
+
132
+ #
133
+ # Deletes all values from the database.
134
+ #
135
+ def delete_all
136
+ model.destroy_all
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-db - A common database library for managing and querying security data.
4
+ #
5
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
6
+ #
7
+ # ronin-db is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-db is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-db. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/ui/cli/model_command'
22
+ require 'ronin/db/model/importable'
23
+
24
+ require 'dm-serializer'
25
+
26
+ module Ronin
27
+ module DB
28
+ module CLI
29
+ #
30
+ # A base-command class for listing Database Resources.
31
+ #
32
+ class ResourcesCommand < ModelCommand
33
+
34
+ option :csv, type: true,
35
+ description: 'CSV output'
36
+
37
+ option :xml, type: true,
38
+ description: 'XML output'
39
+
40
+ option :yaml, type: true,
41
+ description: 'YAML output'
42
+
43
+ option :json, type: true,
44
+ description: 'JSON output'
45
+
46
+ #
47
+ # Default method performs the query and prints the found resources.
48
+ #
49
+ # @since 1.1.0
50
+ #
51
+ # @api semipublic
52
+ #
53
+ def execute
54
+ if @import
55
+ self.class.model.import(@import) do |resource|
56
+ print_info "Imported #{resource}"
57
+ end
58
+ else
59
+ print_resources(query)
60
+ end
61
+ end
62
+
63
+ protected
64
+
65
+ #
66
+ # Sets the model used by the command.
67
+ #
68
+ # @see ModelCommand.model
69
+ #
70
+ # @since 1.3.0
71
+ #
72
+ def self.model(model=nil)
73
+ if (model && model < Model::Importable)
74
+ option :import, type: String,
75
+ flag: '-i',
76
+ usage: 'FILE',
77
+ description: 'The file to import'
78
+ end
79
+
80
+ return super(model)
81
+ end
82
+
83
+ #
84
+ # Default method which will print every queried resource.
85
+ #
86
+ # @param [DataMapper::Resource] resource
87
+ # A queried resource from the Database.
88
+ #
89
+ # @since 1.1.0
90
+ #
91
+ # @api semipublic
92
+ #
93
+ def print_resource(resource)
94
+ puts resource
95
+ end
96
+
97
+ #
98
+ # Prints multiple resources.
99
+ #
100
+ # @param [DataMapper::Collection] resources
101
+ # The query to print.
102
+ #
103
+ # @since 1.1.0
104
+ #
105
+ # @api semipublic
106
+ #
107
+ def print_resources(resources)
108
+ if csv? then puts resources.to_csv
109
+ elsif xml? then puts resources.to_xml
110
+ elsif yaml? then puts resources.to_yaml
111
+ elsif json? then puts resources.to_json
112
+ else
113
+ resources.each { |resource| print_resource(resource) }
114
+ end
115
+ end
116
+
117
+ end
118
+ end
119
+ end
120
+ end