machinery-tool 1.9.1 → 1.10.0

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 (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"