machinery-tool 1.14.0 → 1.14.1
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/.git_revision +1 -1
- data/NEWS +10 -0
- data/html/assets/compare/machinery.js +1 -0
- data/html/assets/jquery.searcher.min.js +5 -0
- data/html/assets/machinery.css +3 -0
- data/html/assets/show/machinery.js +10 -4
- data/html/comparison.html.haml +18 -652
- data/html/index.html.haml +93 -431
- data/html/partials/changed_managed_files.html.haml +41 -0
- data/html/partials/compare/alert.html.haml +22 -0
- data/html/partials/compare/changed_managed_file_list.html.haml +26 -0
- data/html/partials/compare/changed_managed_files.html.haml +57 -0
- data/html/partials/compare/config_file_list.html.haml +26 -0
- data/html/partials/compare/config_files.html.haml +54 -0
- data/html/partials/compare/group_list.html.haml +14 -0
- data/html/partials/compare/groups.html.haml +52 -0
- data/html/partials/compare/os.html.haml +32 -0
- data/html/partials/compare/os_table.html.haml +10 -0
- data/html/partials/compare/package_list.html.haml +23 -0
- data/html/partials/compare/packages.html.haml +66 -0
- data/html/partials/compare/pattern_list.html.haml +12 -0
- data/html/partials/compare/patterns.html.haml +53 -0
- data/html/partials/compare/repositories.html.haml +51 -0
- data/html/partials/compare/repository_list.html.haml +28 -0
- data/html/partials/compare/service_list.html.haml +11 -0
- data/html/partials/compare/services.html.haml +56 -0
- data/html/partials/compare/unmanaged_file_list.html.haml +13 -0
- data/html/partials/compare/unmanaged_files.html.haml +59 -0
- data/html/partials/compare/user_list.html.haml +18 -0
- data/html/partials/compare/users.html.haml +52 -0
- data/html/partials/config_files.html.haml +57 -0
- data/html/partials/groups.html.haml +25 -0
- data/html/partials/os.html.haml +26 -0
- data/html/partials/packages.html.haml +30 -0
- data/html/partials/patterns.html.haml +23 -0
- data/html/partials/repositories.html.haml +35 -0
- data/html/partials/scope_header.html.haml +17 -0
- data/html/partials/services.html.haml +23 -0
- data/html/partials/unmanaged_files.html.haml +28 -0
- data/html/partials/users.html.haml +29 -0
- data/lib/cli.rb +48 -40
- data/lib/exceptions.rb +7 -0
- data/lib/helper.rb +21 -0
- data/lib/hint.rb +1 -1
- data/lib/html.rb +9 -1
- data/lib/scope_file_access_archive.rb +1 -2
- data/lib/scope_file_access_flat.rb +1 -2
- data/lib/server.rb +104 -50
- data/lib/version.rb +1 -1
- data/machinery-helper/version.go +1 -1
- data/man/generated/machinery.1.gz +0 -0
- data/man/generated/machinery.1.html +106 -16
- metadata +47 -18
- data/html/assets/angular-sanitize.min.js +0 -16
- data/html/assets/angular.min.js +0 -251
- data/html/assets/compare/machinery-compare.js +0 -100
- data/html/assets/show/machinery-show.js +0 -72
@@ -0,0 +1,30 @@
|
|
1
|
+
- if packages
|
2
|
+
%div
|
3
|
+
%a.scope_anchor{ id: "packages" }
|
4
|
+
.scope#packages_container
|
5
|
+
= render_partial "scope_header",
|
6
|
+
:scope => "packages",
|
7
|
+
:title => "Packages",
|
8
|
+
:count => "#{packages.length} #{Machinery.pluralize(packages.length, "packages")}"
|
9
|
+
|
10
|
+
.row.scope_content.collapse.in
|
11
|
+
.col-xs-1
|
12
|
+
.col-xs-11
|
13
|
+
%table.table.table-striped.table-hover.table-condensed.filterable
|
14
|
+
%thead
|
15
|
+
%tr
|
16
|
+
%th Name
|
17
|
+
%th Version
|
18
|
+
%th Release
|
19
|
+
%th Arch
|
20
|
+
%th Vendor
|
21
|
+
%th Checksum
|
22
|
+
%tbody
|
23
|
+
- packages.each do |package|
|
24
|
+
%tr
|
25
|
+
%td= package.name
|
26
|
+
%td= package.version
|
27
|
+
%td= package.release
|
28
|
+
%td= package.arch
|
29
|
+
%td= package.vendor
|
30
|
+
%td= package.checksum
|
@@ -0,0 +1,23 @@
|
|
1
|
+
- if patterns
|
2
|
+
%div
|
3
|
+
%a.scope_anchor{ id: "patterns" }
|
4
|
+
.scope#patterns_container
|
5
|
+
= render_partial "scope_header",
|
6
|
+
:scope => "patterns",
|
7
|
+
:title => "Patterns",
|
8
|
+
:count => "#{patterns.length} #{Machinery.pluralize(patterns.length, "pattern")}"
|
9
|
+
.row.scope_content.collapse.in
|
10
|
+
.col-xs-1
|
11
|
+
.col-xs-11
|
12
|
+
%table.table.table-striped.table-hover.table-condensed.filterable
|
13
|
+
%thead
|
14
|
+
%tr
|
15
|
+
%th Name
|
16
|
+
%th Version
|
17
|
+
%th Release
|
18
|
+
%tbody
|
19
|
+
- patterns.each do |pattern|
|
20
|
+
%tr
|
21
|
+
%td= pattern.name
|
22
|
+
%td= pattern.version
|
23
|
+
%td= pattern.release
|
@@ -0,0 +1,35 @@
|
|
1
|
+
- if repositories
|
2
|
+
%div
|
3
|
+
%a.scope_anchor{ id: "repositories" }
|
4
|
+
.scope#repositories_container
|
5
|
+
- count = repositories.length
|
6
|
+
= render_partial "scope_header",
|
7
|
+
:scope => "repositories",
|
8
|
+
:title => "Repositories",
|
9
|
+
:count => "#{count} #{Machinery.pluralize(count, "repository", "repositories")}"
|
10
|
+
.row.scope_content.collapse.in
|
11
|
+
.col-xs-1
|
12
|
+
.col-xs-11
|
13
|
+
%table.table.table-striped.table-hover.table-condensed.filterable
|
14
|
+
%thead
|
15
|
+
%tr
|
16
|
+
%th Name
|
17
|
+
%th Alias
|
18
|
+
%th Type
|
19
|
+
%th URL
|
20
|
+
%th Enabled
|
21
|
+
%th Autorefresh
|
22
|
+
%th GPG Check
|
23
|
+
%th Priority
|
24
|
+
%tbody
|
25
|
+
- repositories.each do |repo|
|
26
|
+
%tr
|
27
|
+
%td= repo.name
|
28
|
+
%td= repo.alias
|
29
|
+
%td= repo.type
|
30
|
+
%td
|
31
|
+
%a{ href: repo.url }= repo.url
|
32
|
+
%td= repo.enabled
|
33
|
+
%td= repo.autorefresh
|
34
|
+
%td= repo.gpgcheck
|
35
|
+
%td= repo.priority
|
@@ -0,0 +1,17 @@
|
|
1
|
+
- meta = @description[scope].meta
|
2
|
+
.row
|
3
|
+
.col-xs-1
|
4
|
+
%img.over.scope_logo_big{ "data-content" => "<p>#{scope_help(scope)}</p>",
|
5
|
+
"data-toggle" => "popover",
|
6
|
+
"src" => "assets/logo-#{scope.tr("_", "-")}.png",
|
7
|
+
"title" => "",
|
8
|
+
"data-original-title" => title,
|
9
|
+
"style" => "top: 125px;" }
|
10
|
+
%span.toggle{ "title" => "Collapse/Expand" }
|
11
|
+
.col-xs-11
|
12
|
+
%h2
|
13
|
+
= title
|
14
|
+
|
15
|
+
.scope-summary
|
16
|
+
= count
|
17
|
+
(inspected host: '#{meta.hostname}', at: #{DateTime.parse(meta.modified).strftime("%F %T")})
|
@@ -0,0 +1,23 @@
|
|
1
|
+
- if services
|
2
|
+
%div
|
3
|
+
%a.scope_anchor{ id: "services" }
|
4
|
+
.scope#services_container
|
5
|
+
- count = services.services.length
|
6
|
+
= render_partial "scope_header",
|
7
|
+
:scope => "services",
|
8
|
+
:title => "Services",
|
9
|
+
:count => "#{count} #{Machinery.pluralize(count, "service")}"
|
10
|
+
.row.scope_content.collapse.in
|
11
|
+
.col-xs-1
|
12
|
+
.col-xs-11
|
13
|
+
%table.table.table-striped.table-hover.table-condensed.filterable
|
14
|
+
%thead
|
15
|
+
%tr
|
16
|
+
%th Name
|
17
|
+
%th State
|
18
|
+
%tbody
|
19
|
+
- services.services.each do |service|
|
20
|
+
%tr
|
21
|
+
%td= service.name
|
22
|
+
%td{ class: "#{services.init_system}_#{service.state}" }
|
23
|
+
= service.state
|
@@ -0,0 +1,28 @@
|
|
1
|
+
- if unmanaged_files && unmanaged_files.files.length > 0
|
2
|
+
%div
|
3
|
+
%a.scope_anchor{ id: "unmanaged_files" }
|
4
|
+
.scope#unmanaged_files_container{ "data-scope" => "unmanaged_files" }
|
5
|
+
- count = unmanaged_files.files.length
|
6
|
+
= render_partial "scope_header",
|
7
|
+
:scope => "unmanaged_files",
|
8
|
+
:title => "Unmanaged Files",
|
9
|
+
:count => "#{count} #{Machinery.pluralize(count, "file")}"
|
10
|
+
.row.scope_content.collapse.in
|
11
|
+
.col-xs-1
|
12
|
+
.col-xs-11
|
13
|
+
%table.table.table-striped.table-hover.table-condensed.files-table.filterable
|
14
|
+
%thead
|
15
|
+
%tr
|
16
|
+
%th Name
|
17
|
+
%th Type
|
18
|
+
%tbody
|
19
|
+
- unmanaged_files.files.each do |file|
|
20
|
+
%tr
|
21
|
+
%td
|
22
|
+
- if file.on_disk?
|
23
|
+
%a.file-download{ href: "#" }
|
24
|
+
= file.name
|
25
|
+
- else
|
26
|
+
%span
|
27
|
+
= file.name
|
28
|
+
%td= file.type
|
@@ -0,0 +1,29 @@
|
|
1
|
+
- if users
|
2
|
+
%div
|
3
|
+
%a.scope_anchor{ id: "users" }
|
4
|
+
.scope#users_container
|
5
|
+
= render_partial "scope_header",
|
6
|
+
:scope => "users",
|
7
|
+
:title => "Users",
|
8
|
+
:count => "#{users.length} #{Machinery.pluralize(users.length, "user")}"
|
9
|
+
.row.scope_content.collapse.in
|
10
|
+
.col-xs-1
|
11
|
+
.col-xs-11
|
12
|
+
%table.table.table-striped.table-hover.table-condensed.filterable
|
13
|
+
%thead
|
14
|
+
%tr
|
15
|
+
%th Name
|
16
|
+
%th UID
|
17
|
+
%th GID
|
18
|
+
%th Comment
|
19
|
+
%th Home
|
20
|
+
%th Shell
|
21
|
+
%tbody
|
22
|
+
- users.each do |user|
|
23
|
+
%tr
|
24
|
+
%td= user.name
|
25
|
+
%td= user.uid
|
26
|
+
%td= user.gid
|
27
|
+
%td= user.comment
|
28
|
+
%td= user.home
|
29
|
+
%td= user.shell
|
data/lib/cli.rb
CHANGED
@@ -248,12 +248,13 @@ class Cli
|
|
248
248
|
|
249
249
|
def self.check_port_validity(port)
|
250
250
|
if port < 2 || port > 65535
|
251
|
-
raise Machinery::Errors::
|
252
|
-
"65535.")
|
251
|
+
raise Machinery::Errors::ServerPortError.new("The specified port '#{port}' is not " \
|
252
|
+
"valid. A valid port can be in a range between 2 and 65535.")
|
253
253
|
else
|
254
254
|
if port >= 2 && port <= 1023 && !CurrentUser.new.is_root?
|
255
|
-
raise Machinery::Errors::
|
256
|
-
"
|
255
|
+
raise Machinery::Errors::ServerPortError.new("The specified port '#{port}' needs " \
|
256
|
+
"root privileges. Otherwise, the server cannot be started. All ports in a range " \
|
257
|
+
"of 2-1023 need root privileges.")
|
257
258
|
end
|
258
259
|
end
|
259
260
|
end
|
@@ -347,14 +348,6 @@ class Cli
|
|
347
348
|
c.switch "show-all", required: false, negatable: false,
|
348
349
|
desc: "Show also common properties"
|
349
350
|
if @config.experimental_features
|
350
|
-
c.flag [:port, :p], type: Integer, required: false, default_value: @config.http_server_port,
|
351
|
-
desc: "Listen on port PORT. Ports can be selected in a range between 2-65535. Ports between
|
352
|
-
2 and 1023 can only be chosen when `machinery` will be executed as `root` user.",
|
353
|
-
arg_name: "PORT"
|
354
|
-
c.flag [:ip, :i], type: String, required: false, default_value: "127.0.0.1",
|
355
|
-
desc: "Listen on ip address IP. It's only possible to use an IP address (or hostnames
|
356
|
-
resolving to an IP address) which is assigned to a network interface on the local
|
357
|
-
machine.", arg_name: "IP"
|
358
351
|
c.switch "html", required: false, negatable: false,
|
359
352
|
desc: "Open comparison in HTML format in your web browser."
|
360
353
|
end
|
@@ -367,7 +360,14 @@ class Cli
|
|
367
360
|
name1 = shift_arg(args, "NAME1")
|
368
361
|
name2 = shift_arg(args, "NAME2")
|
369
362
|
|
370
|
-
|
363
|
+
if options[:html]
|
364
|
+
begin
|
365
|
+
check_port_validity(@config.http_server_port)
|
366
|
+
rescue Machinery::Errors::ServerPortError => e
|
367
|
+
raise Machinery::Errors::InvalidCommandLine.new(e.message + " The port can be " \
|
368
|
+
"specified in the 'http_server_port' section of the configuration file.")
|
369
|
+
end
|
370
|
+
end
|
371
371
|
|
372
372
|
store = system_description_store
|
373
373
|
description1 = SystemDescription.load(name1, store)
|
@@ -378,8 +378,8 @@ class Cli
|
|
378
378
|
opts = {
|
379
379
|
show_html: options["html"],
|
380
380
|
show_all: options["show-all"],
|
381
|
-
ip:
|
382
|
-
port:
|
381
|
+
ip: "127.0.0.1",
|
382
|
+
port: @config.http_server_port
|
383
383
|
}
|
384
384
|
task.compare(description1, description2, scope_list, opts)
|
385
385
|
end
|
@@ -520,9 +520,6 @@ class Cli
|
|
520
520
|
c.flag "skip-files", required: false, negatable: false,
|
521
521
|
desc: "Do not consider given files or directories during inspection. " \
|
522
522
|
"Either provide one file or directory name or a list of names separated by commas."
|
523
|
-
c.flag ["remote-user", :r], type: String, required: false, default_value: @config.remote_user,
|
524
|
-
desc: "Defines the user which is used to access the inspected system via SSH."\
|
525
|
-
"This user needs sudo access on the remote machine or be root.", arg_name: "USER"
|
526
523
|
c.switch ["extract-files", :x], required: false, negatable: false,
|
527
524
|
desc: "Extract changed configuration files and unmanaged files from inspected system"
|
528
525
|
c.switch "extract-changed-config-files", required: false, negatable: false,
|
@@ -589,6 +586,9 @@ class Cli
|
|
589
586
|
command "inspect" do |c|
|
590
587
|
supports_filtering(c)
|
591
588
|
define_inspect_command_options(c)
|
589
|
+
c.flag ["remote-user", :r], type: String, required: false, default_value: @config.remote_user,
|
590
|
+
desc: "Defines the user which is used to access the inspected system via SSH."\
|
591
|
+
"This user needs sudo access on the remote machine or be root.", arg_name: "USER"
|
592
592
|
|
593
593
|
c.action do |_global_options, options, args|
|
594
594
|
host = shift_arg(args, "HOSTNAME")
|
@@ -618,21 +618,20 @@ class Cli
|
|
618
618
|
desc "Inspect container image"
|
619
619
|
long_desc <<-LONGDESC
|
620
620
|
Inspect container image and generate system descripton from inspected data.
|
621
|
+
Right now we only support docker images.
|
621
622
|
|
622
623
|
Multiple scopes can be passed as comma-separated list. If no specific scopes
|
623
624
|
are given, all scopes are inspected.
|
624
625
|
|
625
626
|
Available scopes: #{AVAILABLE_SCOPE_LIST}
|
626
627
|
LONGDESC
|
627
|
-
arg "IMAGENAME"
|
628
|
+
arg "(IMAGENAME|IMAGEID)"
|
628
629
|
command "inspect-container" do |c|
|
629
630
|
supports_filtering(c)
|
630
631
|
define_inspect_command_options(c)
|
631
|
-
c.switch ["docker", :d], required: true, negatable: false,
|
632
|
-
desc: "Inspect a docker container"
|
633
632
|
|
634
633
|
c.action do |_global_options, options, args|
|
635
|
-
image = shift_arg(args, "IMAGENAME")
|
634
|
+
image = shift_arg(args, "(IMAGENAME|IMAGEID)")
|
636
635
|
system = DockerSystem.new(image)
|
637
636
|
inspector_task = InspectTask.new
|
638
637
|
|
@@ -741,14 +740,6 @@ class Cli
|
|
741
740
|
desc: "Show specified scopes", arg_name: "SCOPE_LIST"
|
742
741
|
c.flag ["exclude-scope", :e], type: String, required: false,
|
743
742
|
desc: "Exclude specified scopes", arg_name: "SCOPE_LIST"
|
744
|
-
c.flag [:port, :p], type: Integer, required: false, default_value: @config.http_server_port,
|
745
|
-
desc: "Listen on port PORT. Ports can be selected in a range between 2-65535. Ports between
|
746
|
-
2 and 1023 can only be chosen when `machinery` will be executed as `root` user.",
|
747
|
-
arg_name: "PORT"
|
748
|
-
c.flag [:ip, :i], type: String, required: false, default_value: "127.0.0.1",
|
749
|
-
desc: "Listen on ip address IP. It's only possible to use an IP address (or hostnames
|
750
|
-
resolving to an IP address) which is assigned to a network interface on the local
|
751
|
-
machine.", arg_name: "IP"
|
752
743
|
c.switch "pager", required: false, default_value: true,
|
753
744
|
desc: "Pipe output into a pager"
|
754
745
|
c.switch "show-diffs", required: false, negatable: false,
|
@@ -761,13 +752,20 @@ class Cli
|
|
761
752
|
c.action do |global_options,options,args|
|
762
753
|
Machinery::Ui.use_pager = options["pager"]
|
763
754
|
|
755
|
+
if options[:html]
|
756
|
+
begin
|
757
|
+
check_port_validity(@config.http_server_port)
|
758
|
+
rescue Machinery::Errors::ServerPortError => e
|
759
|
+
raise Machinery::Errors::InvalidCommandLine.new(e.message + " The port can be " \
|
760
|
+
"specified in the 'http_server_port' section of the configuration file.")
|
761
|
+
end
|
762
|
+
end
|
763
|
+
|
764
764
|
name = shift_arg(args, "NAME")
|
765
765
|
if name == "localhost" && !CurrentUser.new.is_root?
|
766
766
|
Machinery::Ui.puts "You need root rights to access the system description of your locally inspected system."
|
767
767
|
end
|
768
768
|
|
769
|
-
check_port_validity(options[:port]) if options[:html]
|
770
|
-
|
771
769
|
description = SystemDescription.load(name, system_description_store)
|
772
770
|
scope_list = process_scope_option(options[:scope], options["exclude-scope"])
|
773
771
|
|
@@ -791,8 +789,8 @@ class Cli
|
|
791
789
|
opts = {
|
792
790
|
show_diffs: options["show-diffs"],
|
793
791
|
show_html: options["html"],
|
794
|
-
ip:
|
795
|
-
port:
|
792
|
+
ip: "127.0.0.1",
|
793
|
+
port: @config.http_server_port
|
796
794
|
}
|
797
795
|
task.show(description, scope_list, filter, opts)
|
798
796
|
end
|
@@ -887,19 +885,29 @@ class Cli
|
|
887
885
|
desc: "Listen on port PORT. Ports can be selected in a range between 2-65535. Ports between
|
888
886
|
2 and 1023 can only be chosen when `machinery` will be executed as `root` user.",
|
889
887
|
arg_name: "PORT"
|
890
|
-
c.
|
891
|
-
desc: "
|
892
|
-
resolving to an IP address) which is assigned to a network interface on the local
|
893
|
-
machine.", arg_name: "IP"
|
888
|
+
c.switch "public", required: false, negatable: false,
|
889
|
+
desc: "Makes the server reachable from all IP addresses."
|
894
890
|
|
895
891
|
c.action do |_global_options, options, args|
|
896
892
|
name = shift_arg(args, "NAME")
|
897
893
|
|
898
|
-
|
894
|
+
begin
|
895
|
+
check_port_validity(options[:port])
|
896
|
+
rescue Machinery::Errors::ServerPortError => e
|
897
|
+
raise Machinery::Errors::InvalidCommandLine.new(e.message + " The port can be " \
|
898
|
+
"either specified in the 'http_server_port' section of the configuration file " \
|
899
|
+
"or via the --port option.")
|
900
|
+
end
|
901
|
+
|
902
|
+
if options[:public]
|
903
|
+
ip = "0.0.0.0"
|
904
|
+
else
|
905
|
+
ip = "127.0.0.1"
|
906
|
+
end
|
899
907
|
|
900
908
|
description = SystemDescription.load(name, system_description_store)
|
901
909
|
task = ServeHtmlTask.new
|
902
|
-
task.serve(description,
|
910
|
+
task.serve(description, ip, options[:port])
|
903
911
|
end
|
904
912
|
end
|
905
913
|
|
data/lib/exceptions.rb
CHANGED
@@ -140,5 +140,12 @@ module Machinery
|
|
140
140
|
class UnexpectedInputData < MachineryError; end
|
141
141
|
class ComposeServiceLink < MachineryError; end
|
142
142
|
class UnsupportedHelperVersion < MachineryError; end
|
143
|
+
class ServerPortError < MachineryError
|
144
|
+
attr_reader :message
|
145
|
+
|
146
|
+
def initialize(message)
|
147
|
+
@message = message
|
148
|
+
end
|
149
|
+
end
|
143
150
|
end
|
144
151
|
end
|
data/lib/helper.rb
CHANGED
@@ -20,6 +20,27 @@ module Machinery
|
|
20
20
|
(string =~ /^\d+$/) != nil
|
21
21
|
end
|
22
22
|
|
23
|
+
def self.content_is_binary?(content)
|
24
|
+
# Code by http://www.thecodingforums.com/threads/test-if-file-is-binary.843447/#post-4572282
|
25
|
+
# Modified by SUSE Linux GmbH
|
26
|
+
ascii = 0
|
27
|
+
control = 0
|
28
|
+
binary = 0
|
29
|
+
|
30
|
+
content.each_byte do |byte|
|
31
|
+
case byte
|
32
|
+
when 0...32
|
33
|
+
control += 1
|
34
|
+
when 32...128
|
35
|
+
ascii += 1
|
36
|
+
else
|
37
|
+
binary += 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
control.to_f / ascii > 0.1 || binary.to_f / ascii > 0.05
|
42
|
+
end
|
43
|
+
|
23
44
|
# Implementation of String#scrub for Ruby < 2.1. Assumes the string is in
|
24
45
|
# UTF-8.
|
25
46
|
def self.scrub(s)
|
data/lib/hint.rb
CHANGED
@@ -67,7 +67,7 @@ class Hint
|
|
67
67
|
"#{program_name} inspect #{options[:host]} --name #{options[:name]} --extract-files"
|
68
68
|
elsif options[:docker_container]
|
69
69
|
"To do a full inspection containing all scopes and to extract files run:\n" \
|
70
|
-
"#{program_name} inspect-container
|
70
|
+
"#{program_name} inspect-container #{options[:docker_container]}" \
|
71
71
|
"--name #{options[:name]} --extract-files"
|
72
72
|
end
|
73
73
|
end
|
data/lib/html.rb
CHANGED
@@ -26,11 +26,19 @@ class Html
|
|
26
26
|
Server.set :public_folder, File.join(Machinery::ROOT, "html")
|
27
27
|
|
28
28
|
if opts[:ip] != "localhost" && opts[:ip] != "127.0.0.1"
|
29
|
-
|
29
|
+
if opts[:ip] == "0.0.0.0"
|
30
|
+
Machinery::Ui.puts <<EOF
|
31
|
+
Warning:
|
32
|
+
The server is listening on all configured IP addresses.
|
33
|
+
This could lead to confidential data like passwords or private keys being readable by others.
|
34
|
+
EOF
|
35
|
+
else
|
36
|
+
Machinery::Ui.puts <<EOF
|
30
37
|
Warning:
|
31
38
|
You specified an IP address other than '127.0.0.1', your server may be reachable from the network.
|
32
39
|
This could lead to confidential data like passwords or private keys being readable by others.
|
33
40
|
EOF
|
41
|
+
end
|
34
42
|
end
|
35
43
|
|
36
44
|
begin
|