machinery-tool 1.0.2

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 (157) hide show
  1. checksums.yaml +7 -0
  2. data/COPYING +674 -0
  3. data/NEWS +143 -0
  4. data/bin/machinery +29 -0
  5. data/helpers/changed_managed_files.sh +32 -0
  6. data/helpers/filter-packages-for-build.yaml +6 -0
  7. data/html/assets/arrow_down.png +0 -0
  8. data/html/assets/arrow_up.png +0 -0
  9. data/html/assets/bootstrap-popover.js +113 -0
  10. data/html/assets/bootstrap-tooltip.js +457 -0
  11. data/html/assets/bootstrap.min.css +5 -0
  12. data/html/assets/collapse.js +174 -0
  13. data/html/assets/hogan-3.0.2.min.mustache.js +5 -0
  14. data/html/assets/jquery-2.1.1.min.js +4 -0
  15. data/html/assets/logo-changed-managed-files-small.png +0 -0
  16. data/html/assets/logo-changed-managed-files.png +0 -0
  17. data/html/assets/logo-config-files-small.png +0 -0
  18. data/html/assets/logo-config-files.png +0 -0
  19. data/html/assets/logo-groups-small.png +0 -0
  20. data/html/assets/logo-groups.png +0 -0
  21. data/html/assets/logo-os-small.png +0 -0
  22. data/html/assets/logo-os.png +0 -0
  23. data/html/assets/logo-packages-small.png +0 -0
  24. data/html/assets/logo-packages.png +0 -0
  25. data/html/assets/logo-patterns-small.png +0 -0
  26. data/html/assets/logo-patterns.png +0 -0
  27. data/html/assets/logo-repositories-small.png +0 -0
  28. data/html/assets/logo-repositories.png +0 -0
  29. data/html/assets/logo-services-small.png +0 -0
  30. data/html/assets/logo-services.png +0 -0
  31. data/html/assets/logo-unmanaged-files-small.png +0 -0
  32. data/html/assets/logo-unmanaged-files.png +0 -0
  33. data/html/assets/logo-users-small.png +0 -0
  34. data/html/assets/logo-users.png +0 -0
  35. data/html/assets/machinery-base.css +5767 -0
  36. data/html/assets/machinery.css +131 -0
  37. data/html/assets/machinery.js +148 -0
  38. data/html/assets/transition.js +59 -0
  39. data/html/assets/wheels_horizontal.png +0 -0
  40. data/html/index.html.haml +468 -0
  41. data/kiwi_helpers/kiwi_export_readme.md +22 -0
  42. data/kiwi_helpers/merge_users_and_groups.pl.erb +231 -0
  43. data/kiwi_helpers/unmanaged_files_build_excludes +5 -0
  44. data/lib/analyze_config_file_diffs_task.rb +130 -0
  45. data/lib/array.rb +98 -0
  46. data/lib/build_task.rb +124 -0
  47. data/lib/changed_rpm_files_helper.rb +96 -0
  48. data/lib/cli.rb +600 -0
  49. data/lib/compare_task.rb +68 -0
  50. data/lib/config.rb +33 -0
  51. data/lib/config_base.rb +117 -0
  52. data/lib/config_task.rb +56 -0
  53. data/lib/constants.rb +24 -0
  54. data/lib/copy_task.rb +22 -0
  55. data/lib/current_user.rb +23 -0
  56. data/lib/deploy_task.rb +89 -0
  57. data/lib/exceptions.rb +113 -0
  58. data/lib/generate_html_task.rb +22 -0
  59. data/lib/helper.rb +22 -0
  60. data/lib/hint.rb +39 -0
  61. data/lib/html.rb +103 -0
  62. data/lib/inspect_task.rb +93 -0
  63. data/lib/inspector.rb +65 -0
  64. data/lib/kiwi_config.rb +356 -0
  65. data/lib/kiwi_export_task.rb +36 -0
  66. data/lib/list_task.rb +64 -0
  67. data/lib/local_system.rb +127 -0
  68. data/lib/logged_cheetah.rb +25 -0
  69. data/lib/machinery.rb +85 -0
  70. data/lib/machinery_logger.rb +47 -0
  71. data/lib/migration.rb +128 -0
  72. data/lib/mountpoints.rb +72 -0
  73. data/lib/object.rb +138 -0
  74. data/lib/os.rb +78 -0
  75. data/lib/remote_system.rb +114 -0
  76. data/lib/remove_task.rb +43 -0
  77. data/lib/renderer.rb +243 -0
  78. data/lib/renderer_helper.rb +26 -0
  79. data/lib/rpm.rb +52 -0
  80. data/lib/scope_mixin.rb +38 -0
  81. data/lib/show_task.rb +65 -0
  82. data/lib/system.rb +81 -0
  83. data/lib/system_description.rb +228 -0
  84. data/lib/system_description_store.rb +167 -0
  85. data/lib/system_description_validator.rb +216 -0
  86. data/lib/tarball.rb +82 -0
  87. data/lib/ui.rb +74 -0
  88. data/lib/upgrade_format_task.rb +55 -0
  89. data/lib/validate_task.rb +23 -0
  90. data/lib/version.rb +22 -0
  91. data/lib/zypper.rb +70 -0
  92. data/man/generated/machinery.1.gz +0 -0
  93. data/man/generated/machinery.1.html +1056 -0
  94. data/plugins/docs/changed_managed_files.md +2 -0
  95. data/plugins/docs/config_files.md +5 -0
  96. data/plugins/docs/groups.md +2 -0
  97. data/plugins/docs/os.md +2 -0
  98. data/plugins/docs/packages.md +2 -0
  99. data/plugins/docs/patterns.md +5 -0
  100. data/plugins/docs/repositories.md +24 -0
  101. data/plugins/docs/services.md +6 -0
  102. data/plugins/docs/unmanaged_files.md +13 -0
  103. data/plugins/docs/users.md +3 -0
  104. data/plugins/inspect/changed_managed_files_inspector.rb +109 -0
  105. data/plugins/inspect/config_files_inspector.rb +117 -0
  106. data/plugins/inspect/groups_inspector.rb +46 -0
  107. data/plugins/inspect/os_inspector.rb +116 -0
  108. data/plugins/inspect/packages_inspector.rb +46 -0
  109. data/plugins/inspect/patterns_inspector.rb +67 -0
  110. data/plugins/inspect/repositories_inspector.rb +107 -0
  111. data/plugins/inspect/services_inspector.rb +88 -0
  112. data/plugins/inspect/unmanaged_files_inspector.rb +393 -0
  113. data/plugins/inspect/users_inspector.rb +87 -0
  114. data/plugins/model/changed_managed_files_model.rb +29 -0
  115. data/plugins/model/config_files_model.rb +29 -0
  116. data/plugins/model/groups_model.rb +26 -0
  117. data/plugins/model/os_model.rb +20 -0
  118. data/plugins/model/packages_model.rb +26 -0
  119. data/plugins/model/patterns_model.rb +26 -0
  120. data/plugins/model/repositories_model.rb +26 -0
  121. data/plugins/model/services_model.rb +48 -0
  122. data/plugins/model/unmanaged_files_model.rb +29 -0
  123. data/plugins/model/users_model.rb +26 -0
  124. data/plugins/schema/v1/system-description-changed-managed-files.schema.json +83 -0
  125. data/plugins/schema/v1/system-description-config-files.schema.json +83 -0
  126. data/plugins/schema/v1/system-description-groups.schema.json +30 -0
  127. data/plugins/schema/v1/system-description-os.schema.json +21 -0
  128. data/plugins/schema/v1/system-description-packages.schema.json +34 -0
  129. data/plugins/schema/v1/system-description-patterns.schema.json +24 -0
  130. data/plugins/schema/v1/system-description-repositories.schema.json +41 -0
  131. data/plugins/schema/v1/system-description-services.schema.json +30 -0
  132. data/plugins/schema/v1/system-description-unmanaged-files.schema.json +105 -0
  133. data/plugins/schema/v1/system-description-users.schema.json +61 -0
  134. data/plugins/schema/v2/system-description-changed-managed-files.schema.json +92 -0
  135. data/plugins/schema/v2/system-description-config-files.schema.json +92 -0
  136. data/plugins/schema/v2/system-description-groups.schema.json +30 -0
  137. data/plugins/schema/v2/system-description-os.schema.json +21 -0
  138. data/plugins/schema/v2/system-description-packages.schema.json +34 -0
  139. data/plugins/schema/v2/system-description-patterns.schema.json +24 -0
  140. data/plugins/schema/v2/system-description-repositories.schema.json +41 -0
  141. data/plugins/schema/v2/system-description-services.schema.json +30 -0
  142. data/plugins/schema/v2/system-description-unmanaged-files.schema.json +138 -0
  143. data/plugins/schema/v2/system-description-users.schema.json +61 -0
  144. data/plugins/show/changed_managed_files_renderer.rb +46 -0
  145. data/plugins/show/config_files_renderer.rb +62 -0
  146. data/plugins/show/groups_renderer.rb +36 -0
  147. data/plugins/show/os_renderer.rb +31 -0
  148. data/plugins/show/packages_renderer.rb +32 -0
  149. data/plugins/show/patterns_renderer.rb +32 -0
  150. data/plugins/show/repositories_renderer.rb +38 -0
  151. data/plugins/show/services_renderer.rb +32 -0
  152. data/plugins/show/unmanaged_files_renderer.rb +42 -0
  153. data/plugins/show/users_renderer.rb +35 -0
  154. data/schema/migrations/migrate1to2.rb +56 -0
  155. data/schema/v1/system-description-global.schema.json +31 -0
  156. data/schema/v2/system-description-global.schema.json +31 -0
  157. metadata +370 -0
@@ -0,0 +1,131 @@
1
+ body {
2
+ background: #e9e0d6;
3
+ }
4
+
5
+ #nav-bar {
6
+ background: #e9e0d6 url('wheels_horizontal.png') no-repeat 112% -105px;
7
+ position: fixed;
8
+ top: 0;
9
+ left: 0;
10
+ z-index: 1;
11
+ width: 100%;
12
+ padding-left: 15px;
13
+ border-bottom-style: solid;
14
+ border-bottom-width: 1px;
15
+ }
16
+
17
+ #nav-bar a:hover {
18
+ text-decoration: none;
19
+ }
20
+
21
+ a.scope_anchor {
22
+ display: block;
23
+ visibility: hidden;
24
+ }
25
+
26
+ .scope-summary {
27
+ display: inline;
28
+ font-weight: normal;
29
+ line-height: 1;
30
+ color: #999999;
31
+ font-size: 65%;
32
+ }
33
+
34
+ .scope-navigation {
35
+ font-size: 60%;
36
+ margin-left: 30px;
37
+ }
38
+
39
+
40
+ .filter-input {
41
+ margin-bottom: 10px;
42
+ }
43
+
44
+ .filter-input input {
45
+ width: 250px;
46
+ }
47
+
48
+ .fixed {
49
+ position: fixed;
50
+ }
51
+
52
+ span.toggle {
53
+ float: right;
54
+ width: 24px;
55
+ height: 24px;
56
+ background: url("arrow_up.png");
57
+ cursor: pointer;
58
+ }
59
+
60
+ span.toggle.collapsed {
61
+ background :url("arrow_down.png");
62
+ }
63
+
64
+ .popover{
65
+ min-width: 500px;
66
+ max-width: 800px;
67
+ }
68
+
69
+ h1 {
70
+ color: #3D3A38;
71
+ }
72
+
73
+ h2 {
74
+ color: #67635E;
75
+ }
76
+
77
+ a, a:hover {
78
+ color: #7A7570;
79
+ }
80
+
81
+ .pad-top {
82
+ margin-top: 10px;
83
+ }
84
+
85
+ .diff-toggle {
86
+ float: right;
87
+ }
88
+
89
+ table.diff {
90
+ background: #e6e6e6;
91
+ }
92
+
93
+ table.diff td {
94
+ padding-right: 5px;
95
+ padding-left: 5px;
96
+ }
97
+
98
+ table.diff tr.deletion {
99
+ background: #FFC0C0;
100
+ }
101
+
102
+ table.diff tr.addition {
103
+ background: #AEFFA8;
104
+ }
105
+
106
+ table.diff tr.common {
107
+ background: #EEEEEE;
108
+ }
109
+
110
+ table.diff tr.header {
111
+ background: #999999;
112
+ }
113
+
114
+ table.diff tr.deletion td.active {
115
+ border-color: #E5ADAD;
116
+ }
117
+
118
+ table.diff tr.addition td.active {
119
+ border-color: #95DA90;
120
+ }
121
+
122
+ table.diff td.linenumber {
123
+ color: #777777;
124
+ border-right: solid 1px #cccccc;
125
+ }
126
+
127
+ .diff-popover .popover-content {
128
+ max-height: 500px;
129
+ overflow-y: auto;
130
+ font-family: monospace;
131
+ }
@@ -0,0 +1,148 @@
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
+ template = Hogan.compile($('#content').html())
34
+ $("#content_container").html(
35
+ template.render(description, templates)
36
+ )
37
+
38
+ // Implement filter functionality
39
+ var run_when_done_typing = (function(){
40
+ var timer = 0;
41
+ return function(callback, timeout){
42
+ clearTimeout(timer);
43
+ timer = setTimeout(callback, timeout);
44
+ };
45
+ })()
46
+
47
+ $("#filter").keyup(function() {
48
+ run_when_done_typing(function() {
49
+ window.scrollTo(0, 0)
50
+ var rows = $("body").find("tr");
51
+ if($("#filter").val() == "") {
52
+ rows.show();
53
+ return;
54
+ }
55
+
56
+ var filters = $("#filter").val().split(" ");
57
+
58
+ rows
59
+ .hide()
60
+ .filter(function() {
61
+ var $t = $(this);
62
+ for(var i = 0; i < filters.length; ++i) {
63
+ if($t.is(":contains('" + filters[i] + "')")) {
64
+ return true;
65
+ }
66
+ }
67
+ return false;
68
+ })
69
+ .show();
70
+ }, 500)
71
+ })
72
+
73
+ // Align content below floating menu
74
+ var header_height = $("#nav-bar").height() + 20
75
+ $("#content_container").css("margin-top", header_height)
76
+ $("a.scope_anchor").css("height", header_height)
77
+ $("a.scope_anchor").css("margin-top", -header_height)
78
+
79
+ $('.scope_logo_big').each(function(){
80
+ var icon = $(this)
81
+ $(window).scroll(function() {
82
+ icon.removeClass('fixed');
83
+ var pos = icon.offset()
84
+ var top_pos = $(this).scrollTop() + header_height;
85
+ console.log(pos, top_pos)
86
+ if(top_pos >= pos.top && icon.css('position') == 'static') {
87
+ icon.addClass('fixed').css("top", header_height);
88
+ } else if(top_pos <= pos.top && icon.hasClass('fixed')) {
89
+ icon.removeClass('fixed');
90
+ }
91
+ })
92
+ })
93
+
94
+ // Hook up the toggle links
95
+ $('.toggle').click(function(){
96
+ $(this).closest('.scope').find('.scope_content').collapse('toggle')
97
+ $(this).toggleClass("collapsed")
98
+ })
99
+
100
+ $("#collapse-all").click(function(){
101
+ $(".scope_content").collapse('hide')
102
+ $(".toggle").addClass("collapsed")
103
+ $(this).hide()
104
+ $("#expand-all").show()
105
+ })
106
+
107
+ $("#expand-all").click(function(){
108
+ $(".scope_content").collapse('show')
109
+ $(".toggle").removeClass("collapsed")
110
+ $(this).hide()
111
+ $("#collapse-all").show()
112
+ })
113
+
114
+ $("img").popover({
115
+ trigger: "hover",
116
+ html: true
117
+ });
118
+ var counter;
119
+ $(".diff-toggle").popover({
120
+ trigger: "mouseenter",
121
+ html: true,
122
+ template: '<div class="popover diff-popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>',
123
+ content: function() {
124
+ file = $(this).data("config-file")
125
+ return $('*[data-config-file-diff="' + file + '"]').html()
126
+ },
127
+ title: function() {
128
+ return "Changes for '" + $(this).data("config-file") + "'"
129
+ }
130
+ }).on("mouseenter",function () {
131
+ clearTimeout(counter);
132
+ var _this = this;
133
+ $('.diff-toggle').not(_this).popover('hide');
134
+
135
+ counter = setTimeout(function(){
136
+ $(_this).popover("show");
137
+ $(".diff-popover").on("mouseleave", function () {
138
+ $('.diff-toggle').popover('hide');
139
+ });
140
+ }, 100);
141
+ }).on("mouseleave", function () {
142
+ counter = setTimeout(function(){
143
+ if (!$(".diff-popover:hover").length) {
144
+ $('.diff-toggle').popover('hide');
145
+ }
146
+ }, 500);
147
+ });
148
+ })
@@ -0,0 +1,59 @@
1
+ /* ========================================================================
2
+ * Bootstrap: transition.js v3.2.0
3
+ * http://getbootstrap.com/javascript/#transitions
4
+ * ========================================================================
5
+ * Copyright 2011-2014 Twitter, Inc.
6
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
+ * ======================================================================== */
8
+
9
+
10
+ +function ($) {
11
+ 'use strict';
12
+
13
+ // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
14
+ // ============================================================
15
+
16
+ function transitionEnd() {
17
+ var el = document.createElement('bootstrap')
18
+
19
+ var transEndEventNames = {
20
+ WebkitTransition : 'webkitTransitionEnd',
21
+ MozTransition : 'transitionend',
22
+ OTransition : 'oTransitionEnd otransitionend',
23
+ transition : 'transitionend'
24
+ }
25
+
26
+ for (var name in transEndEventNames) {
27
+ if (el.style[name] !== undefined) {
28
+ return { end: transEndEventNames[name] }
29
+ }
30
+ }
31
+
32
+ return false // explicit for ie8 ( ._.)
33
+ }
34
+
35
+ // http://blog.alexmaccaw.com/css-transitions
36
+ $.fn.emulateTransitionEnd = function (duration) {
37
+ var called = false
38
+ var $el = this
39
+ $(this).one('bsTransitionEnd', function () { called = true })
40
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
41
+ setTimeout(callback, duration)
42
+ return this
43
+ }
44
+
45
+ $(function () {
46
+ $.support.transition = transitionEnd()
47
+
48
+ if (!$.support.transition) return
49
+
50
+ $.event.special.bsTransitionEnd = {
51
+ bindType: $.support.transition.end,
52
+ delegateType: $.support.transition.end,
53
+ handle: function (e) {
54
+ if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
55
+ }
56
+ }
57
+ })
58
+
59
+ }(jQuery);
Binary file
@@ -0,0 +1,468 @@
1
+ !!!
2
+ %html
3
+ %head
4
+ %title
5
+ = description.name + " - Machinery System Description"
6
+ %link{:href => "assets/machinery-base.css", :rel => "stylesheet", :type => "text/css"}/
7
+ %link{:href => "assets/machinery.css", :rel => "stylesheet", :type => "text/css"}/
8
+ %script{:src => "assets/jquery-2.1.1.min.js"}
9
+ %script{:src => "assets/hogan-3.0.2.min.mustache.js"}
10
+ %script{:src => "assets/transition.js"}
11
+ %script{:src => "assets/collapse.js"}
12
+
13
+ %script#content{:type => "text/html"}
14
+ {{>os}}
15
+ {{>packages}}
16
+ {{>patterns}}
17
+ {{>users}}
18
+ {{>groups}}
19
+ {{>repositories}}
20
+ {{>unmanaged_files}}
21
+ {{>changed_managed_files}}
22
+ {{>config_files}}
23
+ {{>services}}
24
+
25
+ %script#scope_os.partial{:type => "text/html"}
26
+ {{#os}}
27
+ %a.scope_anchor{:id => "os"}
28
+ #os_container.scope
29
+ .row
30
+ .col-xs-1
31
+ %a{:href => "#os"}
32
+ %img.scope_logo_big{:src => "assets/logo-os.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Operating System", :"data-content"=>"#{scope_help('os')}"}/
33
+ %span.toggle{:title => "Collapse/Expand"}
34
+ .col-xs-11
35
+ %h2
36
+ Operating System
37
+ .scope-summary
38
+ {{meta_info.os}}
39
+ .col-xs-1
40
+ .col-xs-3.scope_content.collapse.in
41
+ %table.table.table-striped.table-condensed
42
+ %tr
43
+ %th Name
44
+ %td {{os.name}}
45
+ %tr
46
+ %th Version
47
+ %td {{os.version}}
48
+ %tr
49
+ %th Architecture
50
+ %td {{os.architecture}}
51
+ {{/os}}
52
+
53
+ %script#scope_packages.partial{:type => "text/html"}
54
+ {{#packages.length}}
55
+ %a.scope_anchor{:id => "packages"}
56
+ #packages_container.scope
57
+ .row
58
+ .col-xs-1
59
+ %a{:href => "#packages"}
60
+ %img.scope_logo_big{:src => "assets/logo-packages.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Packages", :"data-content"=>"#{scope_help('packages')}"}/
61
+ %span.toggle{:title => "Collapse/Expand"}
62
+ .col-xs-11
63
+ %h2
64
+ Packages
65
+ .scope-summary
66
+ {{packages.length}} packages
67
+ {{meta_info.packages}}
68
+ .row.scope_content.collapse.in
69
+ .col-xs-1
70
+ .col-xs-11
71
+ %table.table.table-striped.table-hover.table-condensed
72
+ %thead
73
+ %tr
74
+ %th Name
75
+ %th Version
76
+ %th Release
77
+ %th Arch
78
+ %th Vendor
79
+ %th Checksum
80
+ %tbody
81
+ {{#packages}}
82
+ %tr
83
+ %td {{name}}
84
+ %td {{version}}
85
+ %td {{release}}
86
+ %td {{arch}}
87
+ %td {{vendor}}
88
+ %td {{checksum}}
89
+ {{/packages}}
90
+ {{/packages.length}}
91
+
92
+ %script#scope_patterns.partial{:type => "text/html"}
93
+ {{#patterns.length}}
94
+ %a.scope_anchor{:id => "patterns"}
95
+ #patterns_container.scope
96
+ .row
97
+ .col-xs-1
98
+ %a{:href => "#patterns"}
99
+ %img.scope_logo_big{:src => "assets/logo-patterns.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Patterns", :"data-content"=>"#{scope_help('patterns')}"}/
100
+ %span.toggle{:title => "Collapse/Expand"}
101
+ .col-xs-11
102
+ %h2
103
+ Patterns
104
+ .scope-summary
105
+ {{patterns.length}} patterns
106
+ {{meta_info.patterns}}
107
+ .row.scope_content.collapse.in
108
+ .col-xs-1
109
+ .col-xs-11
110
+ %table.table.table-striped.table-hover.table-condensed
111
+ %thead
112
+ %tr
113
+ %th Name
114
+ %th Version
115
+ %th Release
116
+ %tbody
117
+ {{#patterns}}
118
+ %tr
119
+ %td {{name}}
120
+ %td {{version}}
121
+ %td {{release}}
122
+ {{/patterns}}
123
+ {{/patterns.length}}
124
+
125
+ %script#scope_users{:type => "text/html"}
126
+ {{#users.length}}
127
+ %a.scope_anchor{:id => "users"}
128
+ #users_container.scope
129
+ .row
130
+ .col-xs-1
131
+ %a{:href => "#users"}
132
+ %img.scope_logo_big{:src => "assets/logo-users.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Users", :"data-content"=>"#{scope_help('users')}"}/
133
+ %span.toggle{:title => "Collapse/Expand"}
134
+ .col-xs-11
135
+ %h2
136
+ Users
137
+ .scope-summary
138
+ {{users.length}} users
139
+ {{meta_info.users}}
140
+ .row.scope_content.collapse.in
141
+ .col-xs-1
142
+ .col-xs-11
143
+ %table.table.table-striped.table-hover.table-condensed
144
+ %thead
145
+ %tr
146
+ %th Name
147
+ %th UID
148
+ %th GID
149
+ %th Comment
150
+ %th Home
151
+ %th Shell
152
+ %tbody
153
+ {{#users}}
154
+ %tr
155
+ %td {{name}}
156
+ %td {{uid}}
157
+ %td {{gid}}
158
+ %td {{comment}}
159
+ %td {{home}}
160
+ %td {{shell}}
161
+ {{/users}}
162
+ {{/users.length}}
163
+
164
+ %script#scope_unmanaged_files.partial{:type => "text/html"}
165
+ {{#unmanaged_files.files.length}}
166
+ %a.scope_anchor{:id => "unmanaged_files"}
167
+ #unmanaged_files_container.scope
168
+ .row
169
+ .col-xs-1
170
+ %a{:href => "#unmanaged_files"}
171
+ %img.scope_logo_big{:src => "assets/logo-unmanaged-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Unmanaged Files", :"data-content"=>"#{scope_help('unmanaged_files')}"}/
172
+ %span.toggle{:title => "Collapse/Expand"}
173
+ .col-xs-11
174
+ %h2
175
+ Unmanaged Files
176
+ .scope-summary
177
+ {{unmanaged_files.files.length}} files
178
+ {{meta_info.unmanaged_files}}
179
+ .row.scope_content.collapse.in
180
+ .col-xs-1
181
+ .col-xs-11
182
+ %table.table.table-striped.table-hover.table-condensed.files-table
183
+ %thead
184
+ %tr
185
+ %th Name
186
+ %th Type
187
+ %tbody
188
+ {{#unmanaged_files.files}}
189
+ %tr
190
+ %td {{name}}
191
+ %td {{type}}
192
+ {{/unmanaged_files.files}}
193
+ {{/unmanaged_files.files.length}}
194
+
195
+ %script#scope_groups{:type => "text/html"}
196
+ {{#groups.length}}
197
+ %a.scope_anchor{:id => "groups"}
198
+ #groups_container.scope
199
+ .row
200
+ .col-xs-1
201
+ %a{:href => "#groups"}
202
+ %img.scope_logo_big{:src => "assets/logo-groups.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Groups", :"data-content"=>"#{scope_help('groups')}"}/
203
+ %span.toggle{:title => "Collapse/Expand"}
204
+ .col-xs-11
205
+ %h2
206
+ Groups
207
+ .scope-summary
208
+ {{groups.length}} groups
209
+ {{meta_info.groups}}
210
+ .row.scope_content.collapse.in
211
+ .col-xs-1
212
+ .col-xs-11
213
+ %table.table.table-striped.table-hover.table-condensed
214
+ %thead
215
+ %tr
216
+ %th Name
217
+ %th GID
218
+ %th Password
219
+ %th Users
220
+ %tbody
221
+ {{#groups}}
222
+ %tr
223
+ %td {{name}}
224
+ %td {{gid}}
225
+ %td {{password}}
226
+ %td {{users}}
227
+ {{/groups}}
228
+ {{/groups.length}}
229
+
230
+ %script#scope_repositories.partial{:type => "text/html"}
231
+ {{#repositories.length}}
232
+ %a.scope_anchor{:id => "repositories"}
233
+ #repositories_container.scope
234
+ .row
235
+ .col-xs-1
236
+ %a{:href => "#repositories"}
237
+ %img.scope_logo_big{:src => "assets/logo-repositories.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Repositories", :"data-content"=>"#{scope_help('repositories')}"}/
238
+ %span.toggle{:title => "Collapse/Expand"}
239
+ .col-xs-11
240
+ %h2
241
+ Repositories
242
+ .scope-summary
243
+ {{repositories.length}} repositories
244
+ {{meta_info.repositories}}
245
+ .row.scope_content.collapse.in
246
+ .col-xs-1
247
+ .col-xs-11
248
+ %table.table.table-striped.table-hover.table-condensed
249
+ %thead
250
+ %tr
251
+ %th Name
252
+ %th Alias
253
+ %th Type
254
+ %th URL
255
+ %th Enabled
256
+ %th Autorefresh
257
+ %th GPG Check
258
+ %th Priority
259
+ %tbody
260
+ {{#repositories}}
261
+ %tr
262
+ %td {{name}}
263
+ %td {{alias}}
264
+ %td {{type}}
265
+ %td {{url}}
266
+ %td {{enabled}}
267
+ %td {{autorefresh}}
268
+ %td {{gpgcheck}}
269
+ %td {{priority}}
270
+ {{/repositories}}
271
+ {{/repositories.length}}
272
+
273
+ %script#scope_changed_managed_files.partial{:type => "text/html"}
274
+ {{#changed_managed_files.files.length}}
275
+ %a.scope_anchor{:id => "changed_managed_files"}
276
+ #changed_managed_files_container.scope
277
+ .row
278
+ .col-xs-1
279
+ %a{:href => "#changed_managed_files"}
280
+ %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')}"}/
281
+ %span.toggle{:title => "Collapse/Expand"}
282
+ .col-xs-11
283
+ %h2
284
+ Changed Managed Files
285
+ .scope-summary
286
+ {{changed_managed_files.files.length}} files
287
+ {{meta_info.changed_managed_files}}
288
+ .row.scope_content.collapse.in
289
+ .col-xs-1
290
+ .col-xs-11
291
+ %table.table.table-striped.table-hover.table-condensed.files-table
292
+ %thead
293
+ %tr
294
+ %th Name
295
+ %th Package Name
296
+ %th Package Version
297
+ %th Changes
298
+ %th Mode
299
+ %th User
300
+ %th Group
301
+ %tbody
302
+ {{#changed_managed_files.files}}
303
+ %tr
304
+ %td {{name}}
305
+ %td {{package_name}}
306
+ %td {{package_version}}
307
+ {{#changes.length}}
308
+ %td {{changes}}
309
+ {{/changes.length}}
310
+ {{#error_message}}
311
+ %td{:title => "{{error_message}}"} Error
312
+ {{/error_message}}
313
+ %td {{mode}}
314
+ %td {{user}}
315
+ %td {{group}}
316
+ {{/changed_managed_files.files}}
317
+ {{/changed_managed_files.files.length}}
318
+
319
+ %script#scope_config_files.partial{:type => "text/html"}
320
+ {{#config_files.files.length}}
321
+ %a.scope_anchor{:id => "config_files"}
322
+ #config_files_container.scope
323
+ .row
324
+ .col-xs-1
325
+ %a{:href => "#config_files"}
326
+ %img.scope_logo_big{:src => "assets/logo-config-files.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Config Files", :"data-content"=>"#{scope_help('config_files')}"}/
327
+ %span.toggle{:title => "Collapse/Expand"}
328
+ .col-xs-11
329
+ %h2
330
+ Config Files
331
+ .scope-summary
332
+ {{config_files.files.length}} files
333
+ {{meta_info.config_files}}
334
+ .row.scope_content.collapse.in
335
+
336
+ {{#config_files.files}}
337
+ {{#diff}}
338
+ .diff{:style => "display: none", :"data-config-file-diff" => "{{file}}"}
339
+ %span.diff-summary
340
+ {{additions}} additions & {{deletions}} deletions
341
+ %table.diff
342
+ {{#lines}}
343
+ %tr{:class => "{{type}}"}
344
+ %td.active.linenumber {{original_line_number}}
345
+ %td.linenumber {{new_line_number}}
346
+ %td {{{content}}}
347
+ {{/lines}}
348
+ {{/diff}}
349
+ {{/config_files.files}}
350
+ .col-xs-1
351
+ .col-xs-11
352
+ %table.table.table-striped.table-hover.table-condensed.files-table
353
+ %thead
354
+ %tr
355
+ %th Name
356
+ %th Package Name
357
+ %th Package Version
358
+ %th Changes
359
+ %th Mode
360
+ %th User
361
+ %th Group
362
+ %tbody
363
+ {{#config_files.files}}
364
+ %tr
365
+ {{#diff}}
366
+ %td
367
+ {{name}}
368
+ %a.diff-toggle{:"data-config-file" => "{{name}}", :"data-toggle" => "popover"}
369
+ Show diff
370
+ {{/diff}}
371
+ {{^diff}}
372
+ %td {{name}}
373
+ {{/diff}}
374
+ %td {{package_name}}
375
+ %td {{package_version}}
376
+ {{#changes.length}}
377
+ %td {{changes}}
378
+ {{/changes.length}}
379
+ {{#error_message}}
380
+ %td{:title => "{{error_message}}"} Error
381
+ {{/error_message}}
382
+ %td {{mode}}
383
+ %td {{user}}
384
+ %td {{group}}
385
+ {{/config_files.files}}
386
+ {{/config_files.files.length}}
387
+
388
+ %script#scope_services.partial{:type => "text/html"}
389
+ {{#services.services.length}}
390
+ %a.scope_anchor{:id => "services"}
391
+ #services_container.scope
392
+ .row
393
+ .col-xs-1
394
+ %a{:href => "#services"}
395
+ %img.scope_logo_big{:src => "assets/logo-services.png", :class=>"over", :"data-toggle"=>"popover", :title=>"Services", :"data-content"=>"#{scope_help('services')}"}/
396
+ %span.toggle{:title => "Collapse/Expand"}
397
+ .col-xs-11
398
+ %h2
399
+ Services
400
+ .scope-summary
401
+ Init System: {{services.init_system}},
402
+ {{services.services.length}} services
403
+ {{meta_info.services}}
404
+ .row.scope_content.collapse.in
405
+ .col-xs-1
406
+ .col-xs-11
407
+ %table.table.table-striped.table-hover.table-condensed
408
+ %thead
409
+ %tr
410
+ %th Name
411
+ %th State
412
+ %tbody
413
+ {{#services.services}}
414
+ %tr
415
+ %td {{name}}
416
+ %td {{state}}
417
+ {{/services.services}}
418
+ {{/services.services.length}}
419
+
420
+ %script{:src => "assets/description.js"}
421
+ %script{:src => "assets/machinery.js"}
422
+ %script{:src => "assets/bootstrap-tooltip.js"}
423
+ %script{:src => "assets/bootstrap-popover.js"}
424
+
425
+ %body
426
+ .container-fluid
427
+ #nav-bar
428
+ .row
429
+ .col-xs-1
430
+ .col-xs-10
431
+ %h1
432
+ System '#{description.name}'
433
+ %span.scope-navigation
434
+ Scopes:
435
+ %a{:href => "#os", :title => "Operating System"}
436
+ %img{:src => "assets/logo-os-small.png"}/
437
+ %a{:href => "#packages", :title => "Packages"}
438
+ %img{:src => "assets/logo-packages-small.png"}/
439
+ %a{:href => "#patterns", :title => "Patterns"}
440
+ %img{:src => "assets/logo-patterns-small.png"}/
441
+ %a{:href => "#users", :title => "Users"}
442
+ %img{:src => "assets/logo-users-small.png"}/
443
+ %a{:href => "#groups", :title => "Groups"}
444
+ %img{:src => "assets/logo-groups-small.png"}/
445
+ %a{:href => "#repositories", :title => "Repositories"}
446
+ %img{:src => "assets/logo-repositories-small.png"}/
447
+ %a{:href => "#unmanaged_files", :title => "Unmanaged Files"}
448
+ %img{:src => "assets/logo-unmanaged-files-small.png"}/
449
+ %a{:href => "#changed_managed_files", :title => "Changed Managed Files"}
450
+ %img{:src => "assets/logo-changed-managed-files-small.png"}/
451
+ %a{:href => "#config_files", :title => "Config Files"}
452
+ %img{:src => "assets/logo-config-files-small.png"}/
453
+ %a{:href => "#services", :title => "Services"}
454
+ %img{:src => "assets/logo-services-small.png"}/
455
+ .row
456
+ .col-xs-1
457
+ %a#expand-all{:style => "display: none"}
458
+ Expand all
459
+ %a#collapse-all
460
+ Collapse all
461
+ .col-xs-10
462
+ %small.pull-right.pad-top
463
+ created by
464
+ %a{:href => "http://machinery-project.org", :target => "_blank"}
465
+ Machinery
466
+ .filter-input
467
+ %input#filter{:placeholder => "Type To Filter"}/
468
+ #content_container