ronin-web 0.3.0.rc1 → 1.0.0.beta2

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 (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 +160 -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 +38 -16
  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 +49 -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-2023 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-2023 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-2023 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