machinery-tool 1.6.0 → 1.7.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 (111) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS +11 -0
  3. data/helpers/changed_managed_files.sh +6 -1
  4. data/html/assets/angular-sanitize.min.js +16 -0
  5. data/html/assets/angular.min.js +251 -0
  6. data/html/assets/compare/machinery-compare.js +36 -0
  7. data/html/assets/compare/machinery.js +53 -0
  8. data/html/assets/machinery.css +30 -1
  9. data/html/assets/show/machinery-show.js +65 -0
  10. data/html/assets/{machinery.js → show/machinery.js} +10 -83
  11. data/html/comparison.html.haml +613 -0
  12. data/html/index.html.haml +353 -414
  13. data/lib/cli.rb +36 -2
  14. data/lib/compare_task.rb +29 -2
  15. data/lib/config.rb +5 -1
  16. data/lib/config_task.rb +4 -1
  17. data/lib/export_task.rb +6 -1
  18. data/{plugins/model → lib}/file_scope.rb +0 -0
  19. data/lib/filter.rb +1 -0
  20. data/lib/filter_option_parser.rb +4 -7
  21. data/lib/helper.rb +12 -0
  22. data/lib/html.rb +25 -2
  23. data/lib/inspect_task.rb +1 -1
  24. data/lib/inspector.rb +21 -1
  25. data/lib/json_validator.rb +7 -6
  26. data/lib/machinery.rb +2 -1
  27. data/lib/manifest.rb +1 -1
  28. data/lib/migration.rb +1 -1
  29. data/lib/remote_system.rb +29 -8
  30. data/lib/{scope_mixin.rb → scope.rb} +1 -1
  31. data/lib/show_task.rb +1 -0
  32. data/lib/system.rb +5 -4
  33. data/lib/system_description.rb +3 -3
  34. data/lib/version.rb +1 -1
  35. data/man/generated/machinery.1.gz +0 -0
  36. data/man/generated/machinery.1.html +38 -36
  37. data/plugins/{docs → changed_managed_files}/changed_managed_files.md +0 -0
  38. data/plugins/{inspect → changed_managed_files}/changed_managed_files_inspector.rb +2 -1
  39. data/plugins/{model → changed_managed_files}/changed_managed_files_model.rb +1 -3
  40. data/plugins/{show → changed_managed_files}/changed_managed_files_renderer.rb +0 -0
  41. data/plugins/{schema/v1/system-description-changed-managed-files.schema.json → changed_managed_files/schema/system-description-changed-managed-files.schema-v1.json} +0 -0
  42. data/plugins/{schema/v2/system-description-changed-managed-files.schema.json → changed_managed_files/schema/system-description-changed-managed-files.schema-v2.json} +0 -0
  43. data/plugins/{schema/v3/system-description-changed-managed-files.schema.json → changed_managed_files/schema/system-description-changed-managed-files.schema-v3.json} +0 -0
  44. data/plugins/{docs → config_files}/config_files.md +0 -0
  45. data/plugins/{inspect → config_files}/config_files_inspector.rb +5 -3
  46. data/plugins/{model → config_files}/config_files_model.rb +1 -3
  47. data/plugins/{show → config_files}/config_files_renderer.rb +0 -0
  48. data/plugins/{schema/v1/system-description-config-files.schema.json → config_files/schema/system-description-config-files.schema-v1.json} +0 -0
  49. data/plugins/{schema/v2/system-description-config-files.schema.json → config_files/schema/system-description-config-files.schema-v2.json} +0 -0
  50. data/plugins/{schema/v3/system-description-config-files.schema.json → config_files/schema/system-description-config-files.schema-v3.json} +0 -0
  51. data/plugins/{docs → groups}/groups.md +0 -0
  52. data/plugins/{inspect → groups}/groups_inspector.rb +2 -0
  53. data/plugins/{model → groups}/groups_model.rb +1 -1
  54. data/plugins/{show → groups}/groups_renderer.rb +0 -0
  55. data/plugins/{schema/v1/system-description-groups.schema.json → groups/schema/system-description-groups.schema-v1.json} +0 -0
  56. data/plugins/{schema/v2/system-description-groups.schema.json → groups/schema/system-description-groups.schema-v2.json} +0 -0
  57. data/plugins/{schema/v3/system-description-groups.schema.json → groups/schema/system-description-groups.schema-v3.json} +0 -0
  58. data/plugins/{docs → os}/os.md +0 -0
  59. data/plugins/{inspect → os}/os_inspector.rb +6 -0
  60. data/plugins/{model → os}/os_model.rb +15 -1
  61. data/plugins/{show → os}/os_renderer.rb +0 -0
  62. data/plugins/{schema/v1/system-description-os.schema.json → os/schema/system-description-os.schema-v1.json} +0 -0
  63. data/plugins/{schema/v2/system-description-os.schema.json → os/schema/system-description-os.schema-v2.json} +0 -0
  64. data/plugins/{schema/v3/system-description-os.schema.json → os/schema/system-description-os.schema-v3.json} +0 -0
  65. data/plugins/{docs → packages}/packages.md +0 -0
  66. data/plugins/{inspect → packages}/packages_inspector.rb +1 -0
  67. data/plugins/{model → packages}/packages_model.rb +1 -1
  68. data/plugins/{show → packages}/packages_renderer.rb +0 -0
  69. data/plugins/{schema/v1/system-description-packages.schema.json → packages/schema/system-description-packages.schema-v1.json} +0 -0
  70. data/plugins/{schema/v2/system-description-packages.schema.json → packages/schema/system-description-packages.schema-v2.json} +0 -0
  71. data/plugins/{schema/v3/system-description-packages.schema.json → packages/schema/system-description-packages.schema-v3.json} +0 -0
  72. data/plugins/{docs → patterns}/patterns.md +0 -0
  73. data/plugins/{inspect → patterns}/patterns_inspector.rb +1 -0
  74. data/plugins/{model → patterns}/patterns_model.rb +1 -1
  75. data/plugins/{show → patterns}/patterns_renderer.rb +0 -0
  76. data/plugins/{schema/v1/system-description-patterns.schema.json → patterns/schema/system-description-patterns.schema-v1.json} +0 -0
  77. data/plugins/{schema/v2/system-description-patterns.schema.json → patterns/schema/system-description-patterns.schema-v2.json} +0 -0
  78. data/plugins/{schema/v3/system-description-patterns.schema.json → patterns/schema/system-description-patterns.schema-v3.json} +0 -0
  79. data/plugins/{docs → repositories}/repositories.md +0 -0
  80. data/plugins/{inspect → repositories}/repositories_inspector.rb +1 -0
  81. data/plugins/{model → repositories}/repositories_model.rb +1 -1
  82. data/plugins/{show → repositories}/repositories_renderer.rb +0 -0
  83. data/plugins/{schema/v1/system-description-repositories.schema.json → repositories/schema/system-description-repositories.schema-v1.json} +0 -0
  84. data/plugins/{schema/v2/system-description-repositories.schema.json → repositories/schema/system-description-repositories.schema-v2.json} +0 -0
  85. data/plugins/{schema/v3/system-description-repositories.schema.json → repositories/schema/system-description-repositories.schema-v3.json} +0 -0
  86. data/plugins/{schema/v1/system-description-services.schema.json → services/schema/system-description-services.schema-v1.json} +0 -0
  87. data/plugins/{schema/v2/system-description-services.schema.json → services/schema/system-description-services.schema-v2.json} +0 -0
  88. data/plugins/{schema/v3/system-description-services.schema.json → services/schema/system-description-services.schema-v3.json} +0 -0
  89. data/plugins/{docs → services}/services.md +0 -0
  90. data/plugins/{inspect → services}/services_inspector.rb +13 -1
  91. data/plugins/{model → services}/services_model.rb +1 -1
  92. data/plugins/{show → services}/services_renderer.rb +0 -0
  93. data/plugins/{schema/v1/system-description-unmanaged-files.schema.json → unmanaged_files/schema/system-description-unmanaged-files.schema-v1.json} +0 -0
  94. data/plugins/{schema/v2/system-description-unmanaged-files.schema.json → unmanaged_files/schema/system-description-unmanaged-files.schema-v2.json} +0 -0
  95. data/plugins/{schema/v3/system-description-unmanaged-files.schema.json → unmanaged_files/schema/system-description-unmanaged-files.schema-v3.json} +6 -0
  96. data/plugins/{docs → unmanaged_files}/unmanaged_files.md +0 -0
  97. data/plugins/{inspect → unmanaged_files}/unmanaged_files_inspector.rb +19 -32
  98. data/plugins/{model → unmanaged_files}/unmanaged_files_model.rb +1 -3
  99. data/plugins/{show → unmanaged_files}/unmanaged_files_renderer.rb +0 -0
  100. data/plugins/{schema/v1/system-description-users.schema.json → users/schema/system-description-users.schema-v1.json} +0 -0
  101. data/plugins/{schema/v2/system-description-users.schema.json → users/schema/system-description-users.schema-v2.json} +0 -0
  102. data/plugins/{schema/v3/system-description-users.schema.json → users/schema/system-description-users.schema-v3.json} +0 -0
  103. data/plugins/{docs → users}/users.md +0 -0
  104. data/plugins/{inspect → users}/users_inspector.rb +2 -0
  105. data/plugins/{model → users}/users_model.rb +1 -1
  106. data/plugins/{show → users}/users_renderer.rb +0 -0
  107. data/schema/{v1/system-description-global.schema.json → system-description-global.schema-v1.json} +0 -0
  108. data/schema/{v2/system-description-global.schema.json → system-description-global.schema-v2.json} +0 -0
  109. data/schema/{v3/system-description-global.schema.json → system-description-global.schema-v3.json} +0 -0
  110. metadata +158 -153
  111. data/html/assets/hogan-3.0.2.min.mustache.js +0 -5
@@ -0,0 +1,65 @@
1
+ angular.module("machinery-show", ["ngSanitize"]);
2
+
3
+ angular.module("machinery-show")
4
+ .config(function($locationProvider) {
5
+ $locationProvider.html5Mode({enabled: true, requireBase: false});
6
+ })
7
+ .controller("showController", function($scope) {
8
+ $scope.description = getDescription();
9
+
10
+
11
+ $scope.description.meta_info = {};
12
+ angular.forEach($scope.description, function(index, scope) {
13
+ if($scope.description.meta[scope]) {
14
+ $scope.description.meta_info[scope] = " (" +
15
+ "inspected host: '" + $scope.description.meta[scope].hostname + "', " +
16
+ "at: " + new Date($scope.description.meta[scope].modified).toLocaleString() + ")";
17
+ }
18
+ });
19
+ })
20
+ .directive("scopeHeader", function(){
21
+ return {
22
+ restrict: "E",
23
+ scope: {
24
+ summary: "=summary",
25
+ logo: "=logo",
26
+ singular: "=singular",
27
+ plural: "=plural",
28
+ title: "=title",
29
+ meta: "=meta",
30
+ count: "=count",
31
+ additionalSummary: "=additionalSummary"
32
+ },
33
+ template:
34
+ "<div class='row'>" +
35
+ "<div class='col-xs-1'>" +
36
+ "<img class='over scope_logo_big' data-content='<p>{{summary}}</p>' data-toggle='popover' src='{{logo}}' title='' data-original-title='{{title}}' style='top: 125px;'>" +
37
+ "<span class='toggle' title='Collapse/Expand'></span>" +
38
+ "</div>" +
39
+ "<div class='col-xs-11'>" +
40
+ "<h2>" +
41
+ "{{title}}" +
42
+ "&nbsp;<div class='scope-summary'>" +
43
+ "{{additionalSummary}}" +
44
+ "<ng-pluralize count='count' when=\"{'1': '1 {{singular}}', 'other': '{} {{plural}}'}\"></ng-pluralize>" +
45
+ " (" +
46
+ "inspected host: '{{meta.hostname}}', " +
47
+ "at: {{meta.modified | date:'medium'}}" +
48
+ ")" +
49
+ "</div>" +
50
+ "</h2>" +
51
+ "</div>" +
52
+ "</div>"
53
+ }
54
+ })
55
+ .directive("metaInfo", function(){
56
+ return {
57
+ restrict: "E",
58
+ scope: { meta: "=data"},
59
+ template:
60
+ " (" +
61
+ "inspected host: '{{meta.hostname}}', " +
62
+ "at: {{meta.modified | date:'medium'}}" +
63
+ ")"
64
+ }
65
+ });
@@ -1,89 +1,7 @@
1
1
  $(document).ready(function () {
2
- // Render the system description
3
- var description = getDescription();
4
-
5
- templates = {};
6
- scopes = [
7
- "os",
8
- "changed_managed_files",
9
- "config_files",
10
- "unmanaged_files",
11
- "groups",
12
- "users",
13
- "packages",
14
- "patterns",
15
- "repositories",
16
- "services"
17
- ];
18
-
19
-
20
- // Enrich description with meta information summaries
21
- description.meta_info = {};
22
- $.each(scopes, function(index, scope) {
23
- if(description.meta[scope]) {
24
- description.meta_info[scope] = " (" +
25
- "inspected host: '" + description.meta[scope].hostname + "', " +
26
- "at: " + new Date(description.meta[scope].modified).toLocaleString() + ")";
27
- }
28
- });
29
-
30
- $.each(scopes, function(index, scope) {
31
- templates[scope] = Hogan.compile($("#scope_" + scope).html());
32
- });
33
- templates["inspection_details_template"] =
34
- Hogan.compile($("#inspection_details_template").html());
35
- template = Hogan.compile($("#content").html());
36
- $("#content_container").html(
37
- template.render(description, templates)
38
- );
39
-
40
- // Implement filter functionality
41
- var run_when_done_typing = (function(){
42
- var timer = 0;
43
- return function(callback, timeout){
44
- clearTimeout(timer);
45
- timer = setTimeout(callback, timeout);
46
- };
47
- })();
48
-
49
- var filterdocument = function() {
50
- window.scrollTo(0, 0);
51
- var rows = $("body").find("tr");
52
- if($("#filter").val() == "") {
53
- rows.show();
54
- return;
55
- }
56
-
57
- var filters = $("#filter").val().split(" ");
58
-
59
- rows
60
- .hide()
61
- .filter(function() {
62
- var $t = $(this);
63
- for(var i = 0; i < filters.length; ++i) {
64
- if($t.is(":contains('" + filters[i] + "')")) {
65
- return true;
66
- }
67
- }
68
- return false;
69
- })
70
- .show();
71
- };
72
-
73
- $("#filter").keyup(function() {
74
- run_when_done_typing(function() {
75
- filterdocument();
76
- }, 500);
77
- });
78
-
79
- clearFilter = function() {
80
- $("#filter").val("");
81
- filterdocument();
82
- };
83
-
84
2
  // Align content below floating menu
85
3
  var header_height = $("#nav-bar").height() + 20;
86
- $("#content_container").css("margin-top", header_height);
4
+ $("#content_container, #angular-content").css("margin-top", header_height);
87
5
  $("a.scope_anchor").css("height", header_height);
88
6
  $("a.scope_anchor").css("margin-top", -header_height);
89
7
 
@@ -191,4 +109,13 @@ $(document).ready(function () {
191
109
  $("td.systemd_disabled").attr("title", "Unit file is not enabled.");
192
110
  $("td.sysvinit_on").attr("title", "Service is enabled");
193
111
  $("td.sysvinit_off").attr("title", "Service is disabled");
112
+
113
+ // Show title on cut-off table elements
114
+ $('.scope td').bind('mouseenter', function(){
115
+ var $this = $(this);
116
+
117
+ if(this.offsetWidth < this.scrollWidth && !$this.attr('title')){
118
+ $this.attr('title', $this.text());
119
+ }
120
+ });
194
121
  });
@@ -0,0 +1,613 @@
1
+ !!!
2
+ - description_a = diff[:meta][:description_a]
3
+ - description_b = diff[:meta][:description_b]
4
+ %html{"ng-app" => "machinery-compare"}
5
+ %head
6
+ %title
7
+ Machinery System Description Comparison
8
+ %meta{:charset => 'utf-8'}/
9
+ %meta{:name => "viewport", :content => "width=device-width, initial-scale=1"}
10
+ %link{:href => "assets/machinery-base.css", :rel => "stylesheet", :type => "text/css"}/
11
+ %link{:href => "assets/machinery.css", :rel => "stylesheet", :type => "text/css"}/
12
+ %script{:src => "assets/angular.min.js"}
13
+ %script{:src => "assets/compare/machinery-compare.js"}
14
+ %script{:src => "assets/jquery-2.1.1.min.js"}
15
+ %script{:src => "assets/transition.js"}
16
+ %script{:src => "assets/collapse.js"}
17
+
18
+ %script#scope_os_partial{:type => "text/ng-template"}
19
+ %table.table.table-striped.table-condensed
20
+ %tr
21
+ %th Name
22
+ %td {{object.name}}
23
+ %tr
24
+ %th Version
25
+ %td {{object.version}}
26
+ %tr
27
+ %th Architecture
28
+ %td {{object.architecture}}
29
+
30
+ %script#scope_os.partial{:type => "text/ng-template"}
31
+ %a.scope_anchor{:id => "os"}
32
+ #os_container.scope
33
+ .row
34
+ .col-xs-1
35
+ %a{:href => "#os"}
36
+ %img.scope_logo_big{:src => "assets/logo-os.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Operating System", :"data-content"=>"#{scope_help('os')}"}/
37
+ %span.toggle{:title => "Collapse/Expand"}
38
+ .col-xs-11
39
+ %h2
40
+ Operating System
41
+ .row.scope_content.collapse.in
42
+ .row
43
+ .col-xs-1
44
+ .col-xs-5{"ng-show" => "diff.os[0]"}
45
+ %only-in-a
46
+ %render-template{:template => "scope_os_partial", :object => "diff.os[0]"}
47
+ .col-xs-1
48
+ .col-xs-5{"ng-show" => "diff.os[1]"}
49
+ %only-in-b
50
+ %render-template{:template => "scope_os_partial", :object => "diff.os[1]"}
51
+ .row
52
+ .col-xs-1
53
+ .col-xs-11{"ng-show" => "diff.os[2]"}
54
+ %in-both
55
+ %render-template{:template => "scope_os_partial", :object => "diff.os[2]"}
56
+
57
+ %script#scope_packages_partial{:type => "text/ng-template"}
58
+ %table.table.table-striped.table-hover.table-condensed
59
+ %thead
60
+ %tr
61
+ %th Name
62
+ %th.small Version
63
+ %th.small.visible-md.visible-lg Release
64
+ %th.small.visible-md.visible-lg Arch
65
+ %th.visible-lg Vendor
66
+ %th.visible-lg Checksum
67
+ %th.tiny.hidden-lg
68
+ %tbody
69
+ %tr{"ng-repeat" => "package in object"}
70
+ %td {{package.name}}
71
+ %td {{package.version}}
72
+ %td.visible-md.visible-lg {{package.release}}
73
+ %td.visible-md.visible-lg {{package.arch}}
74
+ %td.visible-lg {{package.vendor}}
75
+ %td.visible-lg {{package.checksum}}
76
+ %td.hidden-lg{:title => "Name: {{package.name}}\nVersion: {{package.version}}\nRelease: {{package.release}}\n" |
77
+ "Architecture: {{package.arch}}\nVendor: {{package.vendor}}\nChecksum: {{package.checksum}}"} ... |
78
+
79
+ %script#scope_packages.partial{:type => "text/ng-template"}
80
+ %a.scope_anchor{:id => "packages"}
81
+ #packages_container.scope
82
+ .row
83
+ .col-xs-1
84
+ %a{:href => "#packages"}
85
+ %img.scope_logo_big{:src => "assets/logo-packages.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Packages", :"data-content"=>"#{scope_help('packages')}"}/
86
+ %span.toggle{:title => "Collapse/Expand"}
87
+ .col-xs-11
88
+ %h2
89
+ Packages
90
+ .scope-summary
91
+ %span.summary-part{"ng-show" => "diff.packages[0]"}
92
+ {{diff.meta.description_a}}: {{diff.packages[0].length}} packages
93
+ %span.summary-part{"ng-show" => "diff.packages[1]"}
94
+ {{diff.meta.description_b}}: {{diff.packages[1].length}} packages
95
+ %span.summary-part{"ng-show" => "diff.packages[2]"}
96
+ %a{href: "#packages_both"}
97
+ both
98
+ = ": {{diff.packages[2].length}} packages"
99
+ .row.scope_content.collapse.in
100
+ .row
101
+ .col-xs-1
102
+ .col-xs-5.table_container{"ng-show" => "diff.packages[0]"}
103
+ %only-in-a
104
+ %render-template{:template => "scope_packages_partial", :object => "diff.packages[0]"}
105
+ .col-xs-1
106
+ .col-xs-5.table_container{"ng-show" => "diff.packages[1]"}
107
+ %only-in-b
108
+ %render-template{:template => "scope_packages_partial", :object => "diff.packages[1]"}
109
+ %a.both_anchor{id: "packages_both"}
110
+ .row{"ng-show" => "diff.packages[2]"}
111
+ .col-xs-1
112
+ .col-xs-11.table_container
113
+ %in-both
114
+ %render-template{:template => "scope_packages_partial", :object => "diff.packages[2]"}
115
+
116
+ %script#scope_patterns_partial{:type => "text/ng-template"}
117
+ %table.table.table-striped.table-hover.table-condensed
118
+ %thead
119
+ %tr
120
+ %th Name
121
+ %th Version
122
+ %th Release
123
+ %tbody
124
+ %tr{"ng-repeat" => "pattern in object"}
125
+ %td {{pattern.name}}
126
+ %td {{pattern.version}}
127
+ %td {{pattern.release}}
128
+
129
+ %script#scope_patterns.partial{:type => "text/ng-template"}
130
+ %a.scope_anchor{:id => "patterns"}
131
+ #patterns_container.scope
132
+ .row
133
+ .col-xs-1
134
+ %a{:href => "#patterns"}
135
+ %img.scope_logo_big{:src => "assets/logo-patterns.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Patterns", :"data-content"=>"#{scope_help('patterns')}"}/
136
+ %span.toggle{:title => "Collapse/Expand"}
137
+ .col-xs-11
138
+ %h2
139
+ Patterns
140
+ .scope-summary
141
+ %span.summary-part{"ng-show" => "diff.patterns[0]"}
142
+ {{diff.meta.description_a}}: {{diff.patterns[0].length}} patterns
143
+ %span.summary-part{"ng-show" => "diff.patterns[1]"}
144
+ {{diff.meta.description_b}}: {{diff.patterns[1].length}} patterns
145
+ %span.summary-part{"ng-show" => "diff.patterns[2]"}
146
+ %a{href: "#patterns_both"}
147
+ both
148
+ = ": {{diff.patterns[2].length}} patterns"
149
+ .row.scope_content.collapse.in
150
+ .row
151
+ .col-xs-1
152
+ .col-xs-5{"ng-show" => "diff.patterns[0]"}
153
+ %only-in-a
154
+ %render-template{:template => "scope_patterns_partial", :object => "diff.patterns[0]"}
155
+ .col-xs-5{"ng-show" => "diff.patterns[1]"}
156
+ %only-in-b
157
+ %render-template{:template => "scope_patterns_partial", :object => "diff.patterns[1]"}
158
+ %a.both_anchor{id: "patterns_both"}
159
+ .row{"ng-show" => "diff.patterns[2]"}
160
+ .col-xs-1
161
+ .col-xs-11
162
+ %in-both
163
+ %render-template{:template => "scope_patterns_partial", :object => "diff.patterns[2]"}
164
+
165
+
166
+
167
+ %script#scope_users_partial{:type => "text/ng-template"}
168
+ %table.table.table-striped.table-hover.table-condensed
169
+ %thead
170
+ %tr
171
+ %th Name
172
+ %th.small UID
173
+ %th.small GID
174
+ %th Comment
175
+ %th Home
176
+ %th.small Shell
177
+ %tbody
178
+ %tr{"ng-repeat" => "user in object"}
179
+ %td {{user.name}}
180
+ %td {{user.uid}}
181
+ %td {{user.gid}}
182
+ %td {{user.comment}}
183
+ %td {{user.home}}
184
+ %td {{user.shell}}
185
+ %script#scope_users{:type => "text/ng-template"}
186
+ %a.scope_anchor{:id => "users"}
187
+ #users_container.scope
188
+ .row
189
+ .col-xs-1
190
+ %a{:href => "#users"}
191
+ %img.scope_logo_big{:src => "assets/logo-users.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Users", :"data-content"=>"#{scope_help('users')}"}/
192
+ %span.toggle{:title => "Collapse/Expand"}
193
+ .col-xs-11
194
+ %h2
195
+ Users
196
+ .scope-summary
197
+ %span.summary-part{"ng-show" => "diff.users[0]"}
198
+ {{diff.meta.description_a}}: {{diff.users[0].length}} users
199
+ %span.summary-part{"ng-show" => "diff.users[1]"}
200
+ {{diff.meta.description_b}}: {{diff.users[1].length}} users
201
+ %span.summary-part{"ng-show" => "diff.users[2]"}
202
+ %a{href: "#users_both"}
203
+ both
204
+ = ": {{diff.users[2].length}} users"
205
+ .row.scope_content.collapse.in
206
+ .row
207
+ .col-xs-1
208
+ .col-xs-5{"ng-show" => "diff.users[0]"}
209
+ %only-in-a
210
+ %render-template{:template => "scope_users_partial", :object => "diff.users[0]"}
211
+ .col-xs-1
212
+ .col-xs-5{"ng-show" => "diff.users[1]"}
213
+ %only-in-b
214
+ %render-template{:template => "scope_users_partial", :object => "diff.users[1]"}
215
+ %a.both_anchor{id: "users_both"}
216
+ .row{"ng-show" => "diff.users[2]"}
217
+ .col-xs-1
218
+ .col-xs-11
219
+ %in-both
220
+ %render-template{:template => "scope_users_partial", :object => "diff.users[2]"}
221
+
222
+ %script#scope_unmanaged_files_partial{:type => "text/ng-template"}
223
+ %p
224
+ <strong>Files extracted:</strong> {{object.extracted}}
225
+ %table.table.table-striped.table-hover.table-condensed.files-table{{"ng-show" => "object.files"}}
226
+ %thead
227
+ %tr
228
+ %th Name
229
+ %th Type
230
+ %tbody
231
+ %tr{"ng-repeat" => "file in object.files"}
232
+ %td {{file.name}}
233
+ %td {{file.type}}
234
+ %script#scope_unmanaged_files.partial{:type => "text/ng-template"}
235
+ %a.scope_anchor{:id => "unmanaged_files"}
236
+ #unmanaged_files_container.scope
237
+ .row
238
+ .col-xs-1
239
+ %a{:href => "#unmanaged_files"}
240
+ %img.scope_logo_big{:src => "assets/logo-unmanaged-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Unmanaged Files", :"data-content"=>"#{scope_help('unmanaged_files')}"}/
241
+ %span.toggle{:title => "Collapse/Expand"}
242
+ .col-xs-11
243
+ %h2
244
+ Unmanaged Files
245
+ .scope-summary
246
+ %span.summary-part{"ng-show" => "diff.unmanaged_files[0]"}
247
+ {{diff.meta.description_a}}: {{diff.unmanaged_files[0].files.length || 0}} files
248
+ %span.summary-part{"ng-show" => "diff.unmanaged_files[1]"}
249
+ {{diff.meta.description_b}}: {{diff.unmanaged_files[1].files.length || 0}} files
250
+ %span.summary-part{"ng-show" => "diff.unmanaged_files[2]"}
251
+ %a{href: "#unmanaged_files_both"}
252
+ both
253
+ = ": {{diff.unmanaged_files[2].files.length}} files"
254
+ .row.scope_content.collapse.in
255
+ .row
256
+ .col-xs-1
257
+ .col-xs-5
258
+ %only-in-a
259
+ %render-template{:template => "scope_unmanaged_files_partial", :object => "diff.unmanaged_files[0]"}
260
+ .col-xs-1
261
+ .col-xs-5
262
+ %only-in-b
263
+ %render-template{:template => "scope_unmanaged_files_partial", :object => "diff.unmanaged_files[1]"}
264
+ %a.both_anchor{id: "unmanaged_files_both"}
265
+ .row
266
+ .col-xs-1
267
+ .col-xs-11
268
+ %in-both
269
+ %render-template{:template => "scope_unmanaged_files_partial", :object => "diff.unmanaged_files[2]"}
270
+
271
+ %script#scope_groups_partial{:type => "text/ng-template"}
272
+ %table.table.table-striped.table-hover.table-condensed
273
+ %thead
274
+ %tr
275
+ %th Name
276
+ %th GID
277
+ %th Password
278
+ %th Users
279
+ %tbody
280
+ %tr{"ng-repeat" => "group in object"}
281
+ %td {{group.name}}
282
+ %td {{group.gid}}
283
+ %td {{group.password}}
284
+ %td {{group.users.join(",")}}
285
+ %script#scope_groups{:type => "text/ng-template"}
286
+ %a.scope_anchor{:id => "groups"}
287
+ #groups_container.scope
288
+ .row
289
+ .col-xs-1
290
+ %a{:href => "#groups"}
291
+ %img.scope_logo_big{:src => "assets/logo-groups.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Groups", :"data-content"=>"#{scope_help('groups')}"}/
292
+ %span.toggle{:title => "Collapse/Expand"}
293
+ .col-xs-11
294
+ %h2
295
+ Groups
296
+ .scope-summary
297
+ %span.summary-part{"ng-show" => "diff.groups[0]"}
298
+ {{diff.meta.description_a}}: {{diff.groups[0].length}} groups
299
+ %span.summary-part{"ng-show" => "diff.groups[1]"}
300
+ {{diff.meta.description_b}}: {{diff.groups[1].length}} groups
301
+ %span.summary-part{"ng-show" => "diff.groups[2]"}
302
+ %a{href: "#groups_both"}
303
+ both
304
+ = ": {{diff.groups[2].length}} groups"
305
+ .row.scope_content.collapse.in
306
+ .row
307
+ .col-xs-1
308
+ .col-xs-5{"ng-show" => "diff.groups[0]"}
309
+ %only-in-a
310
+ %render-template{:template => "scope_groups_partial", :object => "diff.groups[0]"}
311
+ .col-xs-1
312
+ .col-xs-5{"ng-show" => "diff.groups[1]"}
313
+ %only-in-b
314
+ %render-template{:template => "scope_groups_partial", :object => "diff.groups[1]"}
315
+ %a.both_anchor{id: "groups_both"}
316
+ .row{"ng-show" => "diff.groups[2]"}
317
+ .col-xs-1
318
+ .col-xs-11
319
+ %in-both
320
+ %render-template{:template => "scope_groups_partial", :object => "diff.groups[2]"}
321
+
322
+ %script#scope_repositories_partial{:type => "text/ng-template"}
323
+ %table.table.table-striped.table-hover.table-condensed
324
+ %thead
325
+ %tr
326
+ %th Name
327
+ %th Alias
328
+ %th URL
329
+ %th.small Type
330
+ %th.small Enabled
331
+ %th.small.visible-lg Autorefresh
332
+ %th.small.visible-lg GPG Check
333
+ %th.small.visible-lg Priority
334
+ %th.tiny.hidden-lg
335
+ %tbody
336
+ %tr{"ng-repeat" => "repo in object"}
337
+ %td {{repo.name}}
338
+ %td {{repo.alias}}
339
+ %td
340
+ %a{:href => "{{repo.url}}" } {{repo.url}}
341
+ %td {{repo.type}}
342
+ %td {{repo.enabled}}
343
+ %td.visible-lg {{repo.autorefresh}}
344
+ %td.visible-lg {{repo.gpgcheck}}
345
+ %td.visible-lg {{repo.priority}}
346
+ %td.hidden-lg{:title => "Name: {{repo.name}}\nAlias: {{repo.alias}}\nUrl: {{repo.url}}\n" |
347
+ "Type: {{repo.type}}\nEnabled: {{repo.enabled}}\nAutorefresh: {{repo.autorefresh}}\n" |
348
+ "GPG Check: {{repo.gpgcheck}}\nPriority: {{repo.priority}}"} ... |
349
+ %script#scope_repositories.partial{:type => "text/ng-template"}
350
+ %a.scope_anchor{:id => "repositories"}
351
+ #repositories_container.scope
352
+ .row
353
+ .col-xs-1
354
+ %a{:href => "#repositories"}
355
+ %img.scope_logo_big{:src => "assets/logo-repositories.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Repositories", :"data-content"=>"#{scope_help('repositories')}"}/
356
+ %span.toggle{:title => "Collapse/Expand"}
357
+ .col-xs-11
358
+ %h2
359
+ Repositories
360
+ .scope-summary
361
+ %span.summary-part{"ng-show" => "diff.repositories[0]"}
362
+ {{diff.meta.description_a}}: {{diff.repositories[0].length}} repos
363
+ %span.summary-part{"ng-show" => "diff.repositories[1]"}
364
+ {{diff.meta.description_b}}: {{diff.repositories[1].length}} repos
365
+ %span.summary-part{"ng-show" => "diff.repositories[2]"}
366
+ %a{href: "#repositories_both"}
367
+ both
368
+ = ": {{diff.repositories[2].length}} repos"
369
+ .row.scope_content.collapse.in
370
+ .row
371
+ .col-xs-1
372
+ .col-xs-5{"ng-show" => "diff.repositories[0]"}
373
+ %only-in-a
374
+ %render-template{:template => "scope_repositories_partial", :object => "diff.repositories[0]"}
375
+ .col-xs-1
376
+ .col-xs-5{"ng-show" => "diff.repositories[1]"}
377
+ %only-in-b
378
+ %render-template{:template => "scope_repositories_partial", :object => "diff.repositories[1]"}
379
+ %a.both_anchor{id: "repositories_both"}
380
+ .row{"ng-show" => "diff.repositories[2]"}
381
+ .col-xs-1
382
+ .col-xs-11
383
+ %in-both
384
+ %render-template{:template => "scope_repositories_partial", :object => "diff.repositories[2]"}
385
+
386
+ %script#scope_changed_managed_files_partial{:type => "text/ng-template"}
387
+ %p
388
+ <strong>Files extracted:</strong> {{object.extracted}}
389
+ %table.table.table-striped.table-hover.table-condensed.files-table{{"ng-show" => "object.files"}}
390
+ %thead
391
+ %tr
392
+ %th Name
393
+ %th Package Name
394
+ %th Package Version
395
+ %th.small Changes
396
+ %th.small Mode
397
+ %th.small User
398
+ %th.small Group
399
+ %tbody
400
+ %tr{"ng-repeat" => "file in object.files"}
401
+ %td {{file.name}}
402
+ %td {{file.package_name}}
403
+ %td {{file.package_version}}
404
+ %td {{file.changes.join(",")}}
405
+ %span{"ng-show" => "file.error_message", :title => "{{file.error_message}}"} (details)
406
+ %td {{file.mode}}
407
+ %td {{file.user}}
408
+ %td {{file.group}}
409
+ %script#scope_changed_managed_files.partial{:type => "text/ng-template"}
410
+ %a.scope_anchor{:id => "changed_managed_files"}
411
+ #changed_managed_files_container.scope
412
+ .row
413
+ .col-xs-1
414
+ %a{:href => "#changed_managed_files"}
415
+ %img.scope_logo_big{:src => "assets/logo-changed-managed-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Changed Managed Files", :"data-content"=>"#{scope_help('changed_managed_files')}"}/
416
+ %span.toggle{:title => "Collapse/Expand"}
417
+ .col-xs-11
418
+ %h2
419
+ Changed Managed Files
420
+ .scope-summary
421
+ %span.summary-part{"ng-show" => "diff.changed_managed_files[0]"}
422
+ {{diff.meta.description_a}}: {{diff.changed_managed_files[0].files.length || 0}} files
423
+ %span.summary-part{"ng-show" => "diff.changed_managed_files[1]"}
424
+ {{diff.meta.description_b}}: {{diff.changed_managed_files[1].files.length || 0}} files
425
+ %span.summary-part{"ng-show" => "diff.changed_managed_files[2]"}
426
+ %a{href: "#changed_managed_files_both"}
427
+ both
428
+ = ": {{diff.changed_managed_files[2].files.length}} files"
429
+ .row.scope_content.collapse.in
430
+ .row
431
+ .col-xs-1
432
+ .col-xs-5{"ng-show" => "diff.changed_managed_files[0]"}
433
+ %only-in-a
434
+ %render-template{:template => "scope_changed_managed_files_partial", :object => "diff.changed_managed_files[0]"}
435
+ .col-xs-1
436
+ .col-xs-5{"ng-show" => "diff.changed_managed_files[1]"}
437
+ %only-in-b
438
+ %render-template{:template => "scope_changed_managed_files_partial", :object => "diff.changed_managed_files[1]"}
439
+ %a.both_anchor{id: "changed_managed_files_both"}
440
+ .row{"ng-show" => "diff.changed_managed_files[2]"}
441
+ .col-xs-1
442
+ .col-xs-11
443
+ %in-both
444
+ %render-template{:template => "scope_changed_managed_files_partial", :object => "diff.changed_managed_files[2]"}
445
+
446
+ %script#scope_config_files_partial{:type => "text/ng-template"}
447
+ %p
448
+ <strong>Files extracted:</strong> {{object.extracted}}
449
+ %table.table.table-striped.table-hover.table-condensed.files-table{{"ng-show" => "object.files"}}
450
+ %thead
451
+ %tr
452
+ %th Name
453
+ %th Package Name
454
+ %th Package Version
455
+ %th Changes
456
+ %th Mode
457
+ %th User
458
+ %th Group
459
+ %tbody
460
+ %tr{"ng-repeat" => "file in object.files"}
461
+ %td {{file.name}}
462
+ %td {{file.package_name}}
463
+ %td {{file.package_version}}
464
+ %td
465
+ {{file.changes.join(",")}}
466
+ %span{"ng-show" => "file.error_message", :title => "{{file.error_message}}"} (details)
467
+ %td {{file.mode}}
468
+ %td {{file.user}}
469
+ %td {{file.group}}
470
+
471
+ %script#scope_config_files.partial{:type => "text/ng-template"}
472
+ %a.scope_anchor{:id => "config_files"}
473
+ #config_files_container.scope
474
+ .row
475
+ .col-xs-1
476
+ %a{:href => "#config_files"}
477
+ %img.scope_logo_big{:src => "assets/logo-config-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Config Files", :"data-content"=>"#{scope_help('config_files')}"}/
478
+ %span.toggle{:title => "Collapse/Expand"}
479
+ .col-xs-11
480
+ %h2
481
+ Config Files
482
+ .scope-summary
483
+ %span.summary-part{"ng-show" => "diff.config_files[0]"}
484
+ {{diff.meta.description_a}}: {{diff.config_files[0].files.length || 0}} files
485
+ %span.summary-part{"ng-show" => "diff.config_files[1]"}
486
+ {{diff.meta.description_b}}: {{diff.config_files[1].files.length || 0}} files
487
+ %span.summary-part{"ng-show" => "diff.config_files[2]"}
488
+ %a{href: "#config_files_both"}
489
+ both
490
+ = ": {{diff.config_files[2].files.length}} files"
491
+ .row.scope_content.collapse.in
492
+ .row
493
+ .col-xs-1
494
+ .col-xs-5{"ng-show" => "diff.config_files[0]"}
495
+ %only-in-a
496
+ %render-template{:template => "scope_config_files_partial", :object => "diff.config_files[0]"}
497
+ .col-xs-1
498
+ .col-xs-5{"ng-show" => "diff.config_files[1]"}
499
+ %only-in-b
500
+ %render-template{:template => "scope_config_files_partial", :object => "diff.config_files[1]"}
501
+ %a.both_anchor{id: "config_files_both"}
502
+ .row{"ng-show" => "diff.config_files[2]"}
503
+ .col-xs-1
504
+ .col-xs-11
505
+ %in-both
506
+ %render-template{:template => "scope_config_files_partial", :object => "diff.config_files[2]"}
507
+
508
+ %script#scope_services_partial{:type => "text/ng-template"}
509
+ %table.table.table-striped.table-hover.table-condensed
510
+ %thead
511
+ %tr
512
+ %th Name
513
+ %th State
514
+ %tbody
515
+ %tr{"ng-repeat" => "service in object.services"}
516
+ %td {{service.name}}
517
+ %td{:class=>"{{object.init_system}}_{{service.state}}"}
518
+ {{service.state}}
519
+ %script#scope_services.partial{:type => "text/ng-template"}
520
+ %a.scope_anchor{:id => "services"}
521
+ #services_container.scope
522
+ .row
523
+ .col-xs-1
524
+ %a{:href => "#services"}
525
+ %img.scope_logo_big{:src => "assets/logo-services.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Services", :"data-content"=>"#{scope_help('services')}"}/
526
+ %span.toggle{:title => "Collapse/Expand"}
527
+ .col-xs-11
528
+ %h2
529
+ Services
530
+ .scope-summary
531
+ %span.summary-part{"ng-show" => "diff.services[0]"}
532
+ {{diff.meta.description_a}}: {{diff.services[0].services.length || 0}} services ({{diff.services[0].init_system}})
533
+ %span.summary-part{"ng-show" => "diff.services[1]"}
534
+ {{diff.meta.description_b}}: {{diff.services[1].services.length || 0}} services ({{diff.services[1].init_system}})
535
+ %span.summary-part{"ng-show" => "diff.services[2]"}
536
+ %a{href: "#services_both"}
537
+ both
538
+ = ": {{diff.services[2].services.length}} services ({{diff.services[2].init_system}})"
539
+ .row.scope_content.collapse.in
540
+ .row
541
+ .col-xs-1
542
+ .col-xs-5{"ng-show" => "diff.services[0]"}
543
+ %only-in-a
544
+ %render-template{:template => "scope_services_partial", :object => "diff.services[0]"}
545
+ .col-xs-1
546
+ .col-xs-5{"ng-show" => "diff.services[1]"}
547
+ %only-in-b
548
+ %render-template{:template => "scope_services_partial", :object => "diff.services[1]"}
549
+ %a.both_anchor{id: "services_both"}
550
+ .row{"ng-show" => "diff.services[2]"}
551
+ .col-xs-1
552
+ .col-xs-11
553
+ %in-both
554
+ %render-template{:template => "scope_services_partial", :object => "diff.services[2]"}
555
+
556
+ %script{:src => "assets/diff.js"}
557
+ %script{:src => "assets/compare/machinery.js"}
558
+ %script{:src => "assets/bootstrap-tooltip.js"}
559
+ %script{:src => "assets/bootstrap-popover.js"}
560
+
561
+ %body
562
+ .container-fluid
563
+ #nav-bar
564
+ .row
565
+ .col-xs-1
566
+ .col-xs-10
567
+ %h1
568
+ Comparing '#{description_a}' with '#{description_b}'
569
+ %span.scope-navigation
570
+ Scopes:
571
+ %a{:href => "#os", :title => "Operating System"}
572
+ %img{:src => "assets/logo-os-small.png"}/
573
+ %a{:href => "#packages", :title => "Packages"}
574
+ %img{:src => "assets/logo-packages-small.png"}/
575
+ %a{:href => "#patterns", :title => "Patterns"}
576
+ %img{:src => "assets/logo-patterns-small.png"}/
577
+ %a{:href => "#users", :title => "Users"}
578
+ %img{:src => "assets/logo-users-small.png"}/
579
+ %a{:href => "#groups", :title => "Groups"}
580
+ %img{:src => "assets/logo-groups-small.png"}/
581
+ %a{:href => "#repositories", :title => "Repositories"}
582
+ %img{:src => "assets/logo-repositories-small.png"}/
583
+ %a{:href => "#unmanaged_files", :title => "Unmanaged Files"}
584
+ %img{:src => "assets/logo-unmanaged-files-small.png"}/
585
+ %a{:href => "#changed_managed_files", :title => "Changed Managed Files"}
586
+ %img{:src => "assets/logo-changed-managed-files-small.png"}/
587
+ %a{:href => "#config_files", :title => "Config Files"}
588
+ %img{:src => "assets/logo-config-files-small.png"}/
589
+ %a{:href => "#services", :title => "Services"}
590
+ %img{:src => "assets/logo-services-small.png"}/
591
+ .row
592
+ .col-xs-1
593
+ %a#expand-all{:href => "#", :style => "display: none"}
594
+ Expand all
595
+ %a#collapse-all{:href => "#"}
596
+ Collapse all
597
+ .col-xs-10
598
+ %small.pull-right.pad-top
599
+ created by
600
+ %a{:href => "http://machinery-project.org", :target => "_blank"}
601
+ Machinery
602
+
603
+ #content_container{"ng-controller" => "compareController"}
604
+ %div{"src" => "'scope_os'", "ng-include" => true}
605
+ %div{"src" => "'scope_packages'", "ng-include" => true}
606
+ %div{"src" => "'scope_patterns'", "ng-include" => true}
607
+ %div{"src" => "'scope_users'", "ng-include" => true}
608
+ %div{"src" => "'scope_groups'", "ng-include" => true}
609
+ %div{"src" => "'scope_repositories'", "ng-include" => true}
610
+ %div{"src" => "'scope_unmanaged_files'", "ng-include" => true}
611
+ %div{"src" => "'scope_changed_managed_files'", "ng-include" => true}
612
+ %div{"src" => "'scope_config_files'", "ng-include" => true}
613
+ %div{"src" => "'scope_services'", "ng-include" => true}