machinery-tool 1.9.1 → 1.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS +7 -0
  3. data/html/assets/compare/machinery-compare.js +43 -0
  4. data/html/assets/compare/machinery.js +17 -0
  5. data/html/assets/machinery.css +13 -0
  6. data/html/assets/modal.js +280 -0
  7. data/html/assets/show/machinery-show.js +16 -9
  8. data/html/assets/show/machinery.js +61 -25
  9. data/html/comparison.html.haml +194 -116
  10. data/html/index.html.haml +46 -12
  11. data/lib/array.rb +2 -1
  12. data/lib/cli.rb +44 -23
  13. data/lib/compare_task.rb +5 -29
  14. data/lib/comparison.rb +69 -0
  15. data/lib/config.rb +4 -0
  16. data/lib/export_task.rb +7 -0
  17. data/lib/file_scope.rb +2 -2
  18. data/lib/html.rb +165 -88
  19. data/lib/machinery.rb +6 -2
  20. data/lib/{generate_html_task.rb → man_task.rb} +8 -6
  21. data/lib/object.rb +1 -1
  22. data/lib/renderer.rb +70 -41
  23. data/lib/{scope_file_access.rb → scope_file_access_archive.rb} +23 -20
  24. data/lib/scope_file_access_flat.rb +36 -0
  25. data/lib/serve_html_task.rb +33 -0
  26. data/lib/show_task.rb +19 -5
  27. data/lib/system_file.rb +25 -0
  28. data/lib/version.rb +1 -1
  29. data/man/generated/machinery.1.gz +0 -0
  30. data/man/generated/machinery.1.html +60 -34
  31. data/plugins/changed_managed_files/changed_managed_files_renderer.rb +5 -5
  32. data/plugins/config_files/config_files_renderer.rb +7 -6
  33. data/plugins/groups/groups_renderer.rb +3 -3
  34. data/plugins/os/os_renderer.rb +5 -5
  35. data/plugins/packages/packages_model.rb +25 -0
  36. data/plugins/packages/packages_renderer.rb +36 -5
  37. data/plugins/patterns/patterns_renderer.rb +3 -3
  38. data/plugins/repositories/repositories_model.rb +1 -1
  39. data/plugins/repositories/repositories_renderer.rb +4 -4
  40. data/plugins/services/services_model.rb +2 -2
  41. data/plugins/services/services_renderer.rb +3 -3
  42. data/plugins/unmanaged_files/unmanaged_files_model.rb +2 -1
  43. data/plugins/unmanaged_files/unmanaged_files_renderer.rb +5 -5
  44. data/plugins/users/users_renderer.rb +3 -3
  45. metadata +36 -4
@@ -65,10 +65,11 @@
65
65
  <a href="#deploy-Deploy-Image-to-OpenStack-Cloud">deploy — Deploy Image to OpenStack Cloud</a>
66
66
  <a href="#export-autoyast-Export-System-Description-as-AutoYasST-profile">export-autoyast — Export System Description as AutoYasST profile</a>
67
67
  <a href="#export-kiwi-Export-System-Description-as-KIWI-Image-Description">export-kiwi — Export System Description as KIWI Image Description</a>
68
- <a href="#generate-html-Generate-an-HTML-view-of-a-System-Description">generate-html — Generate an HTML view of a System Description</a>
69
68
  <a href="#inspect-Inspect-Running-System">inspect — Inspect Running System</a>
70
69
  <a href="#list-List-System-Descriptions">list — List System Descriptions</a>
70
+ <a href="#man-Shows-Man-Page">man — Shows Man Page</a>
71
71
  <a href="#remove-Remove-System-Descriptions">remove — Remove System Descriptions</a>
72
+ <a href="#serve-Serve-A-System-Description-Using-A-Web-Server">serve — Serve A System Description Using A Web Server</a>
72
73
  <a href="#show-Show-System-Description">show — Show System Description</a>
73
74
  <a href="#upgrade-format-Upgrade-System-Description">upgrade-format — Upgrade System Description</a>
74
75
  <a href="#validate-Validate-System-Description">validate — Validate System Description</a>
@@ -777,36 +778,6 @@ will be created if it does not exist yet.</p></dd>
777
778
  </dl>
778
779
 
779
780
 
780
- <h2 id="generate-html-Generate-an-HTML-view-of-a-System-Description">generate-html — Generate an HTML view of a System Description</h2>
781
-
782
- <h3 id="SYNOPSIS">SYNOPSIS</h3>
783
-
784
- <p><code>machinery generate-html</code> NAME</p>
785
-
786
- <p><code>machinery</code> help generate-html</p>
787
-
788
- <h3 id="DESCRIPTION">DESCRIPTION</h3>
789
-
790
- <p>The <code>generate-html</code> generates an HTML view of a system description. The
791
- index.html file can be found in the according system description directory, e.g.
792
- ~/.machinery/NAME/index.html.</p>
793
-
794
- <h3 id="ARGUMENTS">ARGUMENTS</h3>
795
-
796
- <dl>
797
- <dt><code>NAME</code> (required)</dt><dd>Name of the system description.</dd>
798
- </dl>
799
-
800
-
801
- <h3 id="EXAMPLES">EXAMPLES</h3>
802
-
803
- <dl>
804
- <dt>Create an HTML view of the <code>moon</code> system description:</dt><dd><p></p>
805
-
806
- <p>$ <code>machinery</code> generate-html moon</p></dd>
807
- </dl>
808
-
809
-
810
781
  <h2 id="inspect-Inspect-Running-System">inspect — Inspect Running System</h2>
811
782
 
812
783
  <h3 id="SYNOPSIS">SYNOPSIS</h3>
@@ -958,6 +929,16 @@ Currently displays [HOSTNAME] and (DATE).</dd>
958
929
  </dl>
959
930
 
960
931
 
932
+ <h2 id="man-Shows-Man-Page">man — Shows Man Page</h2>
933
+
934
+ <h3 id="SYNOPSIS">SYNOPSIS</h3>
935
+
936
+ <p> <code>machinery man</code></p>
937
+
938
+ <h3 id="DESCRIPTION">DESCRIPTION</h3>
939
+
940
+ <p>The <code>man</code> command shows the Machinery man page.</p>
941
+
961
942
  <h2 id="remove-Remove-System-Descriptions">remove — Remove System Descriptions</h2>
962
943
 
963
944
  <h3 id="SYNOPSIS">SYNOPSIS</h3>
@@ -1001,11 +982,53 @@ Currently displays [HOSTNAME] and (DATE).</dd>
1001
982
  </dl>
1002
983
 
1003
984
 
985
+ <h2 id="serve-Serve-A-System-Description-Using-A-Web-Server">serve — Serve A System Description Using A Web Server</h2>
986
+
987
+ <h3 id="SYNOPSIS">SYNOPSIS</h3>
988
+
989
+ <p><code>machinery serve</code> [-p PORT | --port=PORT] [-i IP | --ip=IP] NAME</p>
990
+
991
+ <p><code>machinery</code> help serve</p>
992
+
993
+ <h3 id="DESCRIPTION">DESCRIPTION</h3>
994
+
995
+ <p>The <code>serve</code> command spawns a web server and serves a stored system description on
996
+ it.
997
+ By default the description is available from http://127.0.0.1:7585 but both the
998
+ IP address and the port can be configured using the according options.</p>
999
+
1000
+ <h3 id="ARGUMENTS">ARGUMENTS</h3>
1001
+
1002
+ <dl>
1003
+ <dt><code>NAME</code> (required)</dt><dd>Use specified system description.</dd>
1004
+ </dl>
1005
+
1006
+
1007
+ <h3 id="OPTIONS">OPTIONS</h3>
1008
+
1009
+ <dl>
1010
+ <dt><code>-p PORT</code>, <code>--port=PORT</code> (optional)</dt><dd><p>Specify the port on which the web server will serve the system description: Default: 7585</p></dd>
1011
+ <dt><code>-i IP</code>, <code>--ip=IP</code> (optional)</dt><dd><p>Specify the IP address on which the web server will be made available. Default: 127.0.0.1</p></dd>
1012
+ </dl>
1013
+
1014
+
1015
+ <h3 id="EXAMPLES">EXAMPLES</h3>
1016
+
1017
+ <dl>
1018
+ <dt>Serve the system description taken from the last inspection, saved as <code>earth</code>:</dt><dd><p></p>
1019
+
1020
+ <p>$ <code>machinery</code> serve earth</p></dd>
1021
+ <dt>Make the system description available to other machines on the network:</dt><dd><p></p>
1022
+
1023
+ <p>$ <code>machinery</code> serve earth -i 10.10.100.123 -p 3000</p></dd>
1024
+ </dl>
1025
+
1026
+
1004
1027
  <h2 id="show-Show-System-Description">show — Show System Description</h2>
1005
1028
 
1006
1029
  <h3 id="SYNOPSIS">SYNOPSIS</h3>
1007
1030
 
1008
- <p><code>machinery show</code> [-s SCOPE | --scope=SCOPE] [-e EXCLUDE-SCOPE | --exclude-scope=EXCLUDE-SCOPE] [--no-pager] [--show-diffs] [--html] NAME</p>
1031
+ <p><code>machinery show</code> [-s SCOPE | --scope=SCOPE] [-e EXCLUDE-SCOPE | --exclude-scope=EXCLUDE-SCOPE] [--no-pager] [--show-diffs] [--html] [-p PORT | --port=PORT] [-i IP | --ip=IP] NAME</p>
1009
1032
 
1010
1033
  <p><code>machinery</code> help show</p>
1011
1034
 
@@ -1035,7 +1058,10 @@ See the <a href="#Scopes" data-bare-link="true">Scope section</a> for more infor
1035
1058
  <dt><code>--no-pager</code> (optional)</dt><dd><p>Do not pipe output into a pager.</p></dd>
1036
1059
  <dt><code>--show-diffs</code> (optional)</dt><dd><p>Include the generated diffs in the output if available (see <code>machinery help analyze</code>
1037
1060
  for more information).</p></dd>
1038
- <dt><code>--html</code> (optional)</dt><dd><p>Open the system description in HTML format in your web browser using the <code>xdg-open</code> command.</p></dd>
1061
+ <dt><code>--html</code> (optional)</dt><dd><p>Run a web server and open the system description in HTML format in your web browser using the
1062
+ <code>xdg-open</code> command.</p></dd>
1063
+ <dt><code>-p PORT</code>, <code>--port=PORT</code> (optional)</dt><dd><p>Specify the port on which the web server will serve the system description: Default: 7585</p></dd>
1064
+ <dt><code>-i IP</code>, <code>--ip=IP</code> (optional)</dt><dd><p>Specify the IP address on which the web server will be made available. Default: 127.0.0.1</p></dd>
1039
1065
  <dt><code>--verbose</code> (optional)</dt><dd><p>Display the filters which were applied before showing the system description.</p></dd>
1040
1066
  </dl>
1041
1067
 
@@ -1172,7 +1198,7 @@ manually editing it.</p>
1172
1198
 
1173
1199
  <ol class='man-decor man-foot man foot'>
1174
1200
  <li class='tl'></li>
1175
- <li class='tc'>June 2015</li>
1201
+ <li class='tc'>July 2015</li>
1176
1202
  <li class='tr'>machinery(1)</li>
1177
1203
  </ol>
1178
1204
 
@@ -16,17 +16,17 @@
16
16
  # you may find current contact information at www.suse.com
17
17
 
18
18
  class ChangedManagedFilesRenderer < Renderer
19
- def do_render
20
- return unless @system_description["changed_managed_files"]
19
+ def content(description)
20
+ return unless description["changed_managed_files"]
21
21
 
22
- if @system_description["changed_managed_files"].files
23
- files, errors = @system_description["changed_managed_files"].files.partition do |file|
22
+ if description["changed_managed_files"].files
23
+ files, errors = description["changed_managed_files"].files.partition do |file|
24
24
  file.status != "error"
25
25
  end
26
26
  end
27
27
 
28
28
  list do
29
- file_status = @system_description["changed_managed_files"].extracted
29
+ file_status = description["changed_managed_files"].extracted
30
30
  if !file_status.nil?
31
31
  puts "Files extracted: #{file_status ? "yes" : "no"}"
32
32
  end
@@ -16,24 +16,25 @@
16
16
  # you may find current contact information at www.suse.com
17
17
 
18
18
  class ConfigFilesRenderer < Renderer
19
- def do_render
20
- return unless @system_description["config_files"]
19
+ def content(description)
20
+ return unless description["config_files"]
21
21
 
22
- diffs_dir = @system_description.scope_file_store("analyze/config_file_diffs").path
22
+ diffs_dir = description.scope_file_store("analyze/config_file_diffs").path
23
23
 
24
24
  if !diffs_dir && @options[:show_diffs]
25
25
  raise Machinery::Errors::SystemDescriptionError.new(
26
26
  "Diffs can not be shown because they were not generated yet.\n" \
27
- "You can generate them with `#{$0} analyze --operation=config-file-diffs #{@system_description.name}`."
27
+ "You can generate them with `#{$0} analyze" \
28
+ " --operation=config-file-diffs #{description.name}`."
28
29
  )
29
30
  end
30
31
 
31
32
  list do
32
- file_status = @system_description["config_files"].extracted
33
+ file_status = description["config_files"].extracted
33
34
  if !file_status.nil?
34
35
  puts "Files extracted: #{file_status ? "yes" : "no"}"
35
36
  end
36
- files = @system_description["config_files"].files
37
+ files = description["config_files"].files
37
38
  if files
38
39
  files.each do |p|
39
40
  item_content = "#{p.name} (#{p.package_name}-#{p.package_version}, " \
@@ -16,11 +16,11 @@
16
16
  # you may find current contact information at www.suse.com
17
17
 
18
18
  class GroupsRenderer < Renderer
19
- def do_render
20
- return unless @system_description.groups
19
+ def content(description)
20
+ return unless description.groups
21
21
 
22
22
  list do
23
- @system_description.groups.each do |group|
23
+ description.groups.each do |group|
24
24
  gid = group.gid || "N/A"
25
25
  details ="gid: #{gid}"
26
26
  details += ", users: #{group.users.join(",")}" if !group.users.empty?
@@ -17,12 +17,12 @@
17
17
 
18
18
  # This renderer prints the operating system
19
19
  class OsRenderer < Renderer
20
- def do_render
21
- return unless @system_description.os
20
+ def content(description)
21
+ return unless description.os
22
22
 
23
- puts "Name: #{@system_description.os.name}"
24
- puts "Version: #{@system_description.os.version}"
25
- puts "Architecture: #{@system_description.os.architecture}"
23
+ puts "Name: #{description.os.name}"
24
+ puts "Version: #{description.os.version}"
25
+ puts "Architecture: #{description.os.architecture}"
26
26
  end
27
27
 
28
28
  def display_name
@@ -23,4 +23,29 @@ class PackagesScope < Machinery::Array
23
23
  include Machinery::Scope
24
24
 
25
25
  has_elements class: Package
26
+
27
+ def compare_with(other)
28
+ only_self = self - other
29
+ only_other = other - self
30
+ common = self & other
31
+
32
+ changed_package_names = only_self.map(&:name) & only_other.map(&:name)
33
+ changed = []
34
+
35
+ changed_package_names.each do |name|
36
+ changed << [
37
+ only_self.find { |package| package.name == name },
38
+ only_other.find { |package| package.name == name },
39
+ ]
40
+ only_self.reject! { |package| package.name == name }
41
+ only_other.reject! { |package| package.name == name }
42
+ end
43
+
44
+ [
45
+ only_self,
46
+ only_other,
47
+ changed,
48
+ common
49
+ ].map { |e| (e && !e.empty?) ? e : nil }
50
+ end
26
51
  end
@@ -16,17 +16,48 @@
16
16
  # you may find current contact information at www.suse.com
17
17
 
18
18
  class PackagesRenderer < Renderer
19
- def do_render
20
- return unless @system_description.packages
19
+ def display_name
20
+ "Packages"
21
+ end
22
+
23
+ def content(description)
24
+ return unless description.packages
21
25
 
22
26
  list do
23
- @system_description.packages.each do |p|
27
+ description.packages.each do |p|
24
28
  item "#{p.name}-#{p.version}-#{p.release}.#{p.arch} (#{p.vendor})"
25
29
  end
26
30
  end
27
31
  end
28
32
 
29
- def display_name
30
- "Packages"
33
+ # In the comparison case we only want to show the package name, not all details like version,
34
+ # architecture etc.
35
+ def compare_content_only_in(description)
36
+ list do
37
+ description.packages.each do |p|
38
+ item "#{p.name}"
39
+ end
40
+ end
41
+ end
42
+
43
+ def compare_content_changed(changed_elements)
44
+ list do
45
+ changed_elements.each do |one, two|
46
+ changes = []
47
+ relevant_attributes = ["version", "vendor", "arch"]
48
+ if one.version == two.version
49
+ relevant_attributes << "release"
50
+ relevant_attributes << "checksum" if one.release == two.release
51
+ end
52
+
53
+ relevant_attributes.each do |attribute|
54
+ if one[attribute] != two[attribute]
55
+ changes << "#{attribute}: #{one[attribute]} <> #{two[attribute]}"
56
+ end
57
+ end
58
+
59
+ item "#{one.name} (#{changes.join(", ")})"
60
+ end
61
+ end
31
62
  end
32
63
  end
@@ -16,11 +16,11 @@
16
16
  # you may find current contact information at www.suse.com
17
17
 
18
18
  class PatternsRenderer < Renderer
19
- def do_render
20
- return unless @system_description.patterns
19
+ def content(description)
20
+ return unless description.patterns
21
21
 
22
22
  list do
23
- @system_description.patterns.each do |p|
23
+ description.patterns.each do |p|
24
24
  item "#{p.name}"
25
25
  end
26
26
  end
@@ -18,7 +18,7 @@
18
18
 
19
19
  class Repository < Machinery::Object
20
20
  def external_medium?
21
- url.start_with?("cd://") || url.start_with?("dvd://")
21
+ url.start_with?("cd://") || url.start_with?("dvd://") || url.start_with?("iso://")
22
22
  end
23
23
  end
24
24
 
@@ -16,15 +16,15 @@
16
16
  # you may find current contact information at www.suse.com
17
17
 
18
18
  class RepositoriesRenderer < Renderer
19
- def do_render
20
- return unless @system_description.repositories
19
+ def content(description)
20
+ return unless description.repositories
21
21
 
22
- if @system_description.repositories.empty?
22
+ if description.repositories.empty?
23
23
  puts "System has no repositories"
24
24
  end
25
25
 
26
26
  list do
27
- @system_description.repositories.each do |p|
27
+ description.repositories.each do |p|
28
28
  item "#{p.name}" do
29
29
  puts "URI: #{p.url}"
30
30
  puts "Alias: #{p.alias}"
@@ -38,11 +38,12 @@ class ServicesScope < Machinery::Object
38
38
 
39
39
  def compare_with(other)
40
40
  if self.init_system != other.init_system
41
- [self, other, nil]
41
+ [self, other, nil, nil]
42
42
  else
43
43
  [
44
44
  self.services - other.services,
45
45
  other.services - self.services,
46
+ [],
46
47
  self.services & other.services
47
48
  ].map do |services|
48
49
  if !services.empty?
@@ -54,4 +55,3 @@ class ServicesScope < Machinery::Object
54
55
  end
55
56
  end
56
57
  end
57
-
@@ -16,11 +16,11 @@
16
16
  # you may find current contact information at www.suse.com
17
17
 
18
18
  class ServicesRenderer < Renderer
19
- def do_render
20
- return unless @system_description["services"]
19
+ def content(description)
20
+ return unless description["services"]
21
21
 
22
22
  list do
23
- @system_description["services"].services.each do |p|
23
+ description["services"].services.each do |p|
24
24
  item "#{p.name}: #{p.state}"
25
25
  end
26
26
  end
@@ -35,8 +35,9 @@ class UnmanagedFileList < Machinery::Array
35
35
  [
36
36
  self.class.new(only_self),
37
37
  self.class.new(only_other),
38
+ [],
38
39
  self.class.new(both)
39
- ].map { |e| !e.empty? ? e : nil }
40
+ ].map { |e| e.empty? ? nil : e }
40
41
  end
41
42
 
42
43
  private
@@ -16,17 +16,17 @@
16
16
  # you may find current contact information at www.suse.com
17
17
 
18
18
  class UnmanagedFilesRenderer < Renderer
19
- def do_render
20
- return unless @system_description["unmanaged_files"]
19
+ def content(description)
20
+ return unless description["unmanaged_files"]
21
21
 
22
22
  list do
23
- file_status = @system_description["unmanaged_files"].extracted
23
+ file_status = description["unmanaged_files"].extracted
24
24
  if !file_status.nil?
25
25
  puts "Files extracted: #{file_status ? "yes" : "no"}"
26
26
  end
27
27
 
28
- if @system_description["unmanaged_files"].files
29
- @system_description["unmanaged_files"].files.each do |p|
28
+ if description["unmanaged_files"].files
29
+ description["unmanaged_files"].files.each do |p|
30
30
  if p.user && p.group
31
31
  item "#{p.name} (#{p.type})" do
32
32
  puts "User/Group: #{p.user}:#{p.group}"
@@ -16,11 +16,11 @@
16
16
  # you may find current contact information at www.suse.com
17
17
 
18
18
  class UsersRenderer < Renderer
19
- def do_render
20
- return unless @system_description.users
19
+ def content(description)
20
+ return unless description.users
21
21
 
22
22
  list do
23
- @system_description.users.each do |user|
23
+ description.users.each do |user|
24
24
  info = user.comment.empty? ? "N/A" : user.comment
25
25
  uid = user.uid || "N/A"
26
26
  gid = user.gid || "N/A"