ronin-web 0.3.0.rc1 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +11 -0
  3. data/.github/workflows/ruby.yml +31 -0
  4. data/.gitignore +13 -0
  5. data/.mailmap +1 -0
  6. data/.ruby-version +1 -0
  7. data/COPYING.txt +3 -3
  8. data/ChangeLog.md +115 -70
  9. data/Gemfile +42 -37
  10. data/README.md +159 -145
  11. data/Rakefile +12 -3
  12. data/bin/ronin-web +9 -17
  13. data/data/new/nokogiri.rb.erb +12 -0
  14. data/data/new/server.rb.erb +22 -0
  15. data/data/new/spider.rb.erb +26 -0
  16. data/data/new/webapp/.gitignore +15 -0
  17. data/data/new/webapp/.ruby-version.erb +1 -0
  18. data/data/new/webapp/Dockerfile.erb +11 -0
  19. data/data/new/webapp/Gemfile +6 -0
  20. data/data/new/webapp/app.rb.erb +15 -0
  21. data/data/new/webapp/config.ru +4 -0
  22. data/data/new/webapp/docker-compose.yml.erb +9 -0
  23. data/gemspec.yml +32 -14
  24. data/lib/ronin/web/cli/command.rb +36 -0
  25. data/lib/ronin/web/cli/commands/diff.rb +106 -0
  26. data/lib/ronin/web/cli/commands/html.rb +174 -0
  27. data/lib/ronin/web/cli/commands/irb.rb +56 -0
  28. data/lib/ronin/web/cli/commands/new/nokogiri.rb +85 -0
  29. data/lib/ronin/web/cli/commands/new/server.rb +96 -0
  30. data/lib/ronin/web/cli/commands/new/spider.rb +315 -0
  31. data/lib/ronin/web/cli/commands/new/webapp.rb +123 -0
  32. data/lib/ronin/web/cli/commands/new.rb +64 -0
  33. data/lib/ronin/web/cli/commands/reverse_proxy.rb +215 -0
  34. data/lib/ronin/web/cli/commands/server.rb +155 -0
  35. data/lib/ronin/web/cli/commands/spider.rb +822 -0
  36. data/lib/ronin/web/cli/ruby_shell.rb +50 -0
  37. data/lib/ronin/web/cli.rb +44 -0
  38. data/lib/ronin/web/html.rb +85 -0
  39. data/lib/ronin/web/mechanize.rb +34 -36
  40. data/lib/ronin/web/root.rb +27 -0
  41. data/lib/ronin/web/version.rb +7 -10
  42. data/lib/ronin/web/xml.rb +85 -0
  43. data/lib/ronin/web.rb +372 -13
  44. data/man/ronin-web-diff.1 +41 -0
  45. data/man/ronin-web-diff.1.md +30 -0
  46. data/man/ronin-web-html.1 +89 -0
  47. data/man/ronin-web-html.1.md +66 -0
  48. data/man/ronin-web-irb.1 +31 -0
  49. data/man/ronin-web-irb.1.md +22 -0
  50. data/man/ronin-web-new-nokogiri.1 +41 -0
  51. data/man/ronin-web-new-nokogiri.1.md +30 -0
  52. data/man/ronin-web-new-server.1 +45 -0
  53. data/man/ronin-web-new-server.1.md +33 -0
  54. data/man/ronin-web-new-spider.1 +173 -0
  55. data/man/ronin-web-new-spider.1.md +129 -0
  56. data/man/ronin-web-new-webapp.1 +53 -0
  57. data/man/ronin-web-new-webapp.1.md +39 -0
  58. data/man/ronin-web-new.1 +59 -0
  59. data/man/ronin-web-new.1.md +44 -0
  60. data/man/ronin-web-reverse-proxy.1 +63 -0
  61. data/man/ronin-web-reverse-proxy.1.md +47 -0
  62. data/man/ronin-web-server.1 +59 -0
  63. data/man/ronin-web-server.1.md +43 -0
  64. data/man/ronin-web-spider.1 +225 -0
  65. data/man/ronin-web-spider.1.md +168 -0
  66. data/man/ronin-web.1 +41 -0
  67. data/man/ronin-web.1.md +30 -0
  68. data/ronin-web.gemspec +39 -109
  69. data/spec/cli/ruby_shell_spec.rb +14 -0
  70. data/spec/html_spec.rb +43 -0
  71. data/spec/mechanize_spec.rb +72 -0
  72. data/spec/spec_helper.rb +5 -3
  73. data/spec/web_spec.rb +97 -0
  74. data/spec/xml_spec.rb +42 -0
  75. metadata +236 -224
  76. data/.gemtest +0 -0
  77. data/data/ronin/web/user_agents.yml +0 -247
  78. data/lib/ronin/network/mixins/web.rb +0 -258
  79. data/lib/ronin/web/config.rb +0 -34
  80. data/lib/ronin/web/extensions/nokogiri/xml/attr.rb +0 -47
  81. data/lib/ronin/web/extensions/nokogiri/xml/document.rb +0 -48
  82. data/lib/ronin/web/extensions/nokogiri/xml/element.rb +0 -57
  83. data/lib/ronin/web/extensions/nokogiri/xml/node.rb +0 -86
  84. data/lib/ronin/web/extensions/nokogiri/xml/text.rb +0 -47
  85. data/lib/ronin/web/extensions/nokogiri/xml.rb +0 -27
  86. data/lib/ronin/web/extensions/nokogiri.rb +0 -23
  87. data/lib/ronin/web/extensions.rb +0 -23
  88. data/lib/ronin/web/middleware/base.rb +0 -144
  89. data/lib/ronin/web/middleware/directories.rb +0 -179
  90. data/lib/ronin/web/middleware/files.rb +0 -144
  91. data/lib/ronin/web/middleware/filters/campaign_filter.rb +0 -77
  92. data/lib/ronin/web/middleware/filters/ip_filter.rb +0 -73
  93. data/lib/ronin/web/middleware/filters/path_filter.rb +0 -73
  94. data/lib/ronin/web/middleware/filters/referer_filter.rb +0 -71
  95. data/lib/ronin/web/middleware/filters/user_agent_filter.rb +0 -71
  96. data/lib/ronin/web/middleware/filters/vhost_filter.rb +0 -71
  97. data/lib/ronin/web/middleware/filters.rb +0 -28
  98. data/lib/ronin/web/middleware/helpers.rb +0 -145
  99. data/lib/ronin/web/middleware/proxy.rb +0 -265
  100. data/lib/ronin/web/middleware/proxy_request.rb +0 -262
  101. data/lib/ronin/web/middleware/request.rb +0 -79
  102. data/lib/ronin/web/middleware/response.rb +0 -33
  103. data/lib/ronin/web/middleware/router.rb +0 -167
  104. data/lib/ronin/web/middleware/rule.rb +0 -103
  105. data/lib/ronin/web/middleware.rb +0 -27
  106. data/lib/ronin/web/proxy/app.rb +0 -32
  107. data/lib/ronin/web/proxy/base.rb +0 -46
  108. data/lib/ronin/web/proxy/web.rb +0 -46
  109. data/lib/ronin/web/proxy.rb +0 -25
  110. data/lib/ronin/web/server/app.rb +0 -32
  111. data/lib/ronin/web/server/base.rb +0 -461
  112. data/lib/ronin/web/server/web.rb +0 -66
  113. data/lib/ronin/web/server.rb +0 -25
  114. data/lib/ronin/web/spider.rb +0 -120
  115. data/lib/ronin/web/user_agents.rb +0 -196
  116. data/lib/ronin/web/web.rb +0 -560
  117. data/spec/helpers/output.rb +0 -3
  118. data/spec/web/extensions/nokogiri_spec.rb +0 -38
  119. data/spec/web/helpers/rack_app.rb +0 -24
  120. data/spec/web/helpers/root/test1/index.html +0 -1
  121. data/spec/web/helpers/root/test1/test1.txt +0 -1
  122. data/spec/web/helpers/root/test1.txt +0 -1
  123. data/spec/web/helpers/root/test2/test2.txt +0 -1
  124. data/spec/web/helpers/root/test2.txt +0 -1
  125. data/spec/web/helpers/root/test3/test3.txt +0 -1
  126. data/spec/web/helpers/root/test3.txt +0 -1
  127. data/spec/web/helpers/root.rb +0 -15
  128. data/spec/web/mechanize_spec.rb +0 -62
  129. data/spec/web/middleware/directories_spec.rb +0 -86
  130. data/spec/web/middleware/files_spec.rb +0 -57
  131. data/spec/web/middleware/filters/campaign_filter_spec.rb +0 -30
  132. data/spec/web/middleware/filters/ip_filter_spec.rb +0 -25
  133. data/spec/web/middleware/filters/path_filter_spec.rb +0 -29
  134. data/spec/web/middleware/filters/referer_filter_spec.rb +0 -25
  135. data/spec/web/middleware/filters/user_agent_filter_spec.rb +0 -25
  136. data/spec/web/middleware/filters/vhost_filter_spec.rb +0 -23
  137. data/spec/web/middleware/proxy_spec.rb +0 -67
  138. data/spec/web/middleware/response_spec.rb +0 -20
  139. data/spec/web/middleware/router_spec.rb +0 -65
  140. data/spec/web/middleware/rule_spec.rb +0 -37
  141. data/spec/web/proxy/base_spec.rb +0 -8
  142. data/spec/web/server/base_spec.rb +0 -77
  143. data/spec/web/server/classes/public1/static1.txt +0 -1
  144. data/spec/web/server/classes/public2/static2.txt +0 -1
  145. data/spec/web/server/classes/sub_app.rb +0 -13
  146. data/spec/web/server/classes/test_app.rb +0 -20
  147. data/spec/web/user_agents_spec.rb +0 -56
  148. data/spec/web/web_spec.rb +0 -101
@@ -0,0 +1,315 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # ronin-web is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # ronin-web 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 General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/web/cli/command'
20
+ require 'ronin/web/root'
21
+
22
+ require 'ronin/core/cli/generator'
23
+
24
+ module Ronin
25
+ module Web
26
+ class CLI
27
+ module Commands
28
+ class New < Command
29
+ #
30
+ # Creates a new [ronin-web-spider] script.
31
+ #
32
+ # [ronin-web-spider]: https://github.com/ronin-rb/ronin-web-spider#readme
33
+ #
34
+ # ## Usage
35
+ #
36
+ # ronin-web spider [options] {--host[=HOST] | --domain[=DOMAIN] | --site[=URL]} FILE
37
+ #
38
+ # ## Options
39
+ #
40
+ # --host[=[HOST]] Spiders a host
41
+ # --domain[=[DOMAIN]] Spiders a domain
42
+ # --site[=[URL]] Spiders a site
43
+ # --every-link Adds a callback for every link
44
+ # --every-url Adds a callback for every URL
45
+ # --every-failed-url Adds a callback for every failed URL
46
+ # --every-url-like /REGEXP/ Adds a callback for every URL that matches the regexp
47
+ # --all-headers Adds a callback for all HTTP Headers
48
+ # --every-page Adds a callback for every page
49
+ # --every-ok-page Adds a callback for every HTTP 200 page
50
+ # --every-redirect-page Adds a callback for every redirect page
51
+ # --every-timedout-page Adds a callback for every timedout page
52
+ # --every-bad-request-page Adds a callback for every bad request page
53
+ # --every-unauthorized-page Adds a callback for every unauthorized page
54
+ # --every-forbidden-page Adds a callback for every forbidden page
55
+ # --every-missing-page Adds a callback for every missing page
56
+ # --every-internal-server-error-page
57
+ # Adds a callback for every internal server error page
58
+ # --every-txt-page Adds a callback for every TXT page
59
+ # --every-html-page Adds a callback for every HTML page
60
+ # --every-xml-page Adds a callback for every XML page
61
+ # --every-xsl-page Adds a callback for every XSL page
62
+ # --every-javascript-page Adds a callback for every JavaScript page
63
+ # --every-css-page Adds a callback for every CSS page
64
+ # --every-rss-page Adds a callback for every RSS page
65
+ # --every-atom-page Adds a callback for every Atom page
66
+ # --every-ms-word-page Adds a callback for every MS Wod page
67
+ # --every-pdf-page Adds a callback for every PDF page
68
+ # --every-zip-page Adds a callback for every ZIP page
69
+ # --every-doc Adds a callback for every HTML/XML document
70
+ # --every-html-doc Adds a callback for every HTML document
71
+ # --every-xml-doc Adds a callback for every XML document
72
+ # --every-xsl-doc Adds a callback for every XSL document
73
+ # --every-rss-doc Adds a callback for every RSS document
74
+ # --every-atom-doc Adds a callback for every Atom document
75
+ # -h, --help Print help information
76
+ #
77
+ # ## Arguments
78
+ #
79
+ # FILE The file to create
80
+ #
81
+ class Spider < Command
82
+
83
+ include Core::CLI::Generator
84
+
85
+ template_dir File.join(ROOT,'data','new')
86
+
87
+ usage '[options] {--host[=HOST] | --domain[=DOMAIN] | --site[=URL]} FILE'
88
+
89
+ option :host, equals: true,
90
+ value: {
91
+ type: String,
92
+ usage: 'HOST',
93
+ required: false
94
+ },
95
+ desc: 'Spiders a host' do |value|
96
+ @entry_point_method = :host
97
+ @entry_point_argument = value
98
+ end
99
+
100
+ option :domain, equals: true,
101
+ value: {
102
+ type: String,
103
+ usage: 'DOMAIN',
104
+ required: false
105
+ },
106
+ desc: 'Spiders a domain' do |value|
107
+ @entry_point_method = :domain
108
+ @entry_point_argument = value
109
+ end
110
+
111
+
112
+ option :site, equals: true,
113
+ value: {
114
+ type: String,
115
+ usage: 'URL',
116
+ required: false
117
+ },
118
+ desc: 'Spiders a site' do |value|
119
+ @entry_point_method = :site
120
+ @entry_point_argument = value
121
+ end
122
+
123
+ option :every_link, desc: 'Adds a callback for every link' do
124
+ @callbacks << [:every_link, [], :link]
125
+ end
126
+
127
+ option :every_url, desc: 'Adds a callback for every URL' do
128
+ @callbacks << [:every_url, [], :url]
129
+ end
130
+
131
+ option :every_failed_url, desc: 'Adds a callback for every failed URL' do
132
+ @callbacks << [:every_failed_url, [], :url]
133
+ end
134
+
135
+ option :every_url_like, value: {
136
+ type: Regexp,
137
+ usage: '/REGEXP/'
138
+ },
139
+ desc: 'Adds a callback for every URL that matches the regexp' do |regexp|
140
+ @callbacks << [:every_url_like, [regexp], :url]
141
+ end
142
+
143
+ option :all_headers, desc: 'Adds a callback for all HTTP Headers' do
144
+ @callbacks << [:all_headers, [], :headers]
145
+ end
146
+
147
+ option :every_page, desc: 'Adds a callback for every page' do
148
+ @callbacks << [:every_page, [], :page]
149
+ end
150
+
151
+ option :every_ok_page, desc: 'Adds a callback for every HTTP 200 page' do
152
+ @callbacks << [:every_ok_page, [], :page]
153
+ end
154
+
155
+ option :every_redirect_page, desc: 'Adds a callback for every redirect page' do
156
+ @callbacks << [:every_redirect_page, [], :page]
157
+ end
158
+
159
+ option :every_timedout_page, desc: 'Adds a callback for every timedout page' do
160
+ @callbacks << [:every_timedout_page, [], :page]
161
+ end
162
+
163
+ option :every_bad_request_page, desc: 'Adds a callback for every bad request page' do
164
+ @callbacks << [:every_bad_request_page, [], :page]
165
+ end
166
+
167
+ option :every_unauthorized_page, desc: 'Adds a callback for every unauthorized page' do
168
+ @callbacks << [:every_unauthorized_page, [], :page]
169
+ end
170
+
171
+ option :every_forbidden_page, desc: 'Adds a callback for every forbidden page' do
172
+ @callbacks << [:every_forbidden_page, [], :page]
173
+ end
174
+
175
+ option :every_missing_page, desc: 'Adds a callback for every missing page' do
176
+ @callbacks << [:every_missing_page, [], :page]
177
+ end
178
+
179
+ option :every_internal_server_error_page, desc: 'Adds a callback for every internal server error page' do
180
+ @callbacks << [:every_internal_server_error_page, [], :page]
181
+ end
182
+
183
+ option :every_txt_page, desc: 'Adds a callback for every TXT page' do
184
+ @callbacks << [:every_txt_page, [], :page]
185
+ end
186
+
187
+ option :every_html_page, desc: 'Adds a callback for every HTML page' do
188
+ @callbacks << [:every_html_page, [], :page]
189
+ end
190
+
191
+ option :every_xml_page, desc: 'Adds a callback for every XML page' do
192
+ @callbacks << [:every_xml_page, [], :page]
193
+ end
194
+
195
+ option :every_xsl_page, desc: 'Adds a callback for every XSL page' do
196
+ @callbacks << [:every_xsl_page, [], :page]
197
+ end
198
+
199
+ option :every_javascript_page, desc: 'Adds a callback for every JavaScript page' do
200
+ @callbacks << [:every_javascript_page, [], :page]
201
+ end
202
+
203
+ option :every_css_page, desc: 'Adds a callback for every CSS page' do
204
+ @callbacks << [:every_css_page, [], :page]
205
+ end
206
+
207
+ option :every_rss_page, desc: 'Adds a callback for every RSS page' do
208
+ @callbacks << [:every_rss_page, [], :page]
209
+ end
210
+
211
+ option :every_atom_page, desc: 'Adds a callback for every Atom page' do
212
+ @callbacks << [:every_atom_page, [], :page]
213
+ end
214
+
215
+ option :every_ms_word_page, desc: 'Adds a callback for every MS Wod page' do
216
+ @callbacks << [:every_ms_wod_page, [], :page]
217
+ end
218
+
219
+ option :every_pdf_page, desc: 'Adds a callback for every PDF page' do
220
+ @callbacks << [:every_pdf_page, [], :page]
221
+ end
222
+
223
+ option :every_zip_page, desc: 'Adds a callback for every ZIP page' do
224
+ @callbacks << [:every_zip_page, [], :page]
225
+ end
226
+
227
+ option :every_doc, desc: 'Adds a callback for every HTML/XML document' do
228
+ @callbacks << [:every_doc, [], :doc]
229
+ end
230
+
231
+ option :every_html_doc, desc: 'Adds a callback for every HTML document' do
232
+ @callbacks << [:every_html_doc, [], :doc]
233
+ end
234
+
235
+ option :every_xml_doc, desc: 'Adds a callback for every XML document' do
236
+ @callbacks << [:every_xml_doc, [], :doc]
237
+ end
238
+
239
+ option :every_xsl_doc, desc: 'Adds a callback for every XSL document' do
240
+ @callbacks << [:every_xsl_doc, [], :doc]
241
+ end
242
+
243
+ option :every_rss_doc, desc: 'Adds a callback for every RSS document' do
244
+ @callbacks << [:every_rss_doc, [], :doc]
245
+ end
246
+
247
+ option :every_atom_doc, desc: 'Adds a callback for every Atom document' do
248
+ @callbacks << [:every_atom_doc, [], :doc]
249
+ end
250
+
251
+ argument :file, required: true,
252
+ desc: 'The file to create'
253
+
254
+ description 'Creates a new ronin-web-spider script'
255
+
256
+ man_page 'ronin-web-new-spider.1'
257
+
258
+ # The entry point method for the web spider agent.
259
+ #
260
+ # @return [Symbol, nil]
261
+ attr_reader :entry_point_method
262
+
263
+ # The callbacks for the web spider agent.
264
+ #
265
+ # @return [Array<(Symbol, Array, Symbol)>]
266
+ attr_reader :callbacks
267
+
268
+ #
269
+ # Initializes the command.
270
+ #
271
+ # @param [Hash{Symbol => Object}] kwargs
272
+ # Additional keyword arguments for the command.
273
+ #
274
+ def initialize(**kwargs)
275
+ super(**kwargs)
276
+
277
+ @callbacks = []
278
+ end
279
+
280
+ #
281
+ # Runs the `ronin-web new spider` command.
282
+ #
283
+ # @param [String] path
284
+ # The path to the new script file to create.
285
+ #
286
+ def run(path)
287
+ unless @entry_point_method
288
+ print_error "must specify --host, --domain, or --site"
289
+ exit(-1)
290
+ end
291
+
292
+ erb 'spider.rb.erb', path
293
+ chmod '+x', path
294
+ end
295
+
296
+ #
297
+ # The entry method's argument.
298
+ #
299
+ # @return [String]
300
+ # The escaped entry point method argument or `ARGV[0]`.
301
+ #
302
+ def entry_point_argument
303
+ if @entry_point_argument
304
+ @entry_point_argument.inspect
305
+ else
306
+ 'ARGV[0]'
307
+ end
308
+ end
309
+
310
+ end
311
+ end
312
+ end
313
+ end
314
+ end
315
+ end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # ronin-web is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # ronin-web 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 General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/web/cli/command'
20
+ require 'ronin/web/root'
21
+
22
+ require 'ronin/core/cli/generator'
23
+
24
+ module Ronin
25
+ module Web
26
+ class CLI
27
+ module Commands
28
+ class New < Command
29
+ #
30
+ # Generate a new ronin-web-server based webapp.
31
+ #
32
+ # ## Usage
33
+ #
34
+ # ronin-web new webapp [options] DIR
35
+ #
36
+ # ## Options
37
+ #
38
+ # --port PORT The port the webpp will listen on by default (Default: 3000)
39
+ # --ruby-version VERSION The desired ruby version for the project (Default: 3.1.3)
40
+ # --git Initializes a git repo
41
+ # -D, --dockerfile Adds a Dockerfile to the new project
42
+ # -h, --help Print help information
43
+ #
44
+ # ## Arguments
45
+ #
46
+ # DIR The directory to create
47
+ #
48
+ class Webapp < Command
49
+
50
+ include Core::CLI::Generator
51
+
52
+ template_dir File.join(ROOT,'data','new','webapp')
53
+
54
+ usage '[options] DIR'
55
+
56
+ option :port, value: {
57
+ type: Integer,
58
+ usage: 'PORT',
59
+ default: 3000
60
+ },
61
+ desc: 'The port the webpp will listen on by default'
62
+
63
+ option :ruby_version, value: {
64
+ type: String,
65
+ usage: 'VERSION',
66
+ default: RUBY_VERSION
67
+ },
68
+ desc: 'The desired ruby version for the project'
69
+
70
+ option :git, desc: 'Initializes a git repo'
71
+
72
+ option :dockerfile, short: '-D',
73
+ desc: 'Adds a Dockerfile to the new project'
74
+
75
+ argument :dir, required: true,
76
+ desc: 'The directory to create'
77
+
78
+ description 'Generate a new ronin-web-server based webapp'
79
+
80
+ man_page 'ronin-web-new-webapp.1'
81
+
82
+ #
83
+ # Runs the `ronin-web new webapp` command.
84
+ #
85
+ # @param [String] path
86
+ # The path to the new project directory to create.
87
+ #
88
+ def run(path)
89
+ @ruby_version = options[:ruby_version]
90
+ @port = options[:port]
91
+
92
+ mkdir path
93
+ mkdir File.join(path,'lib')
94
+ mkdir File.join(path,'views')
95
+ mkdir File.join(path,'public')
96
+
97
+ erb '.ruby-version.erb', File.join(path,'.ruby-version')
98
+ cp 'Gemfile', path
99
+ erb 'app.rb.erb', File.join(path,'app.rb')
100
+ cp 'config.ru', path
101
+
102
+ if options[:dockerfile]
103
+ erb 'Dockerfile.erb', File.join(path,'Dockerfile')
104
+ erb 'docker-compose.yml.erb', File.join(path,'docker-compose.yml')
105
+ end
106
+
107
+ if options[:git]
108
+ cp '.gitignore', path
109
+
110
+ Dir.chdir(path) do
111
+ sh 'git', 'init', '-q', '-b', 'main'
112
+ sh 'git', 'add', '.'
113
+ sh 'git', 'commit', '-q', '-m', 'Initial commit.'
114
+ end
115
+ end
116
+ end
117
+
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # Copyright (c) 2006-2022 Hal Brodigan (postmodern.mod3 at gmail.com)
4
+ #
5
+ # ronin-web is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU General Public License as published by
7
+ # the Free Software Foundation, either version 3 of the License, or
8
+ # (at your option) any later version.
9
+ #
10
+ # ronin-web 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 General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License
16
+ # along with ronin-web. If not, see <https://www.gnu.org/licenses/>.
17
+ #
18
+
19
+ require 'ronin/web/cli/command'
20
+ require 'command_kit/commands/auto_load'
21
+
22
+ module Ronin
23
+ module Web
24
+ class CLI
25
+ module Commands
26
+ #
27
+ # Creates new projects or scripts.
28
+ #
29
+ # ## Usage
30
+ #
31
+ # ronin-web new {nokogiri | server | spider | webapp}
32
+ #
33
+ # ## Options
34
+ #
35
+ # -h, --help Print help information
36
+ #
37
+ # ## Arguments
38
+ #
39
+ #
40
+ # [COMMAND] The command name to run
41
+ # [ARGS ...] Additional arguments for the command
42
+ #
43
+ # ## Commands
44
+ #
45
+ # help
46
+ # nokogiri
47
+ # server
48
+ # spider
49
+ # webapp
50
+ #
51
+ class New < Command
52
+
53
+ include CommandKit::Commands::AutoLoad.new(
54
+ dir: "#{__dir__}/new",
55
+ namespace: "#{self}"
56
+ )
57
+
58
+ man_page 'ronin-web-new.1'
59
+
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end