machinery-tool 1.4.0 → 1.5.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.
- checksums.yaml +4 -4
- data/NEWS +7 -0
- data/bin/machinery +3 -1
- data/helpers/default_filters.json +24 -0
- data/helpers/yum_repositories.py +8 -2
- data/lib/autoyast.rb +8 -3
- data/lib/changed_rpm_files_helper.rb +34 -7
- data/lib/cli.rb +149 -101
- data/lib/element_filter.rb +45 -0
- data/lib/exceptions.rb +3 -2
- data/lib/filter.rb +121 -0
- data/lib/inspect_task.rb +25 -4
- data/lib/kiwi_config.rb +11 -0
- data/lib/list_task.rb +53 -26
- data/lib/local_system.rb +1 -1
- data/lib/machinery.rb +2 -0
- data/lib/manifest.rb +3 -2
- data/lib/migration.rb +2 -2
- data/lib/system_description.rb +33 -4
- data/lib/tarball.rb +5 -5
- data/lib/version.rb +1 -1
- data/lib/zypper.rb +12 -17
- data/man/generated/machinery.1.gz +0 -0
- data/man/generated/machinery.1.html +21 -4
- data/plugins/docs/changed_managed_files.md +3 -1
- data/plugins/docs/config_files.md +3 -2
- data/plugins/inspect/changed_managed_files_inspector.rb +8 -2
- data/plugins/inspect/config_files_inspector.rb +1 -1
- data/plugins/inspect/groups_inspector.rb +3 -1
- data/plugins/inspect/os_inspector.rb +2 -2
- data/plugins/inspect/packages_inspector.rb +1 -1
- data/plugins/inspect/patterns_inspector.rb +1 -1
- data/plugins/inspect/repositories_inspector.rb +1 -1
- data/plugins/inspect/services_inspector.rb +1 -1
- data/plugins/inspect/unmanaged_files_inspector.rb +17 -42
- data/plugins/inspect/users_inspector.rb +1 -1
- data/plugins/schema/v3/system-description-changed-managed-files.schema.json +1 -1
- data/plugins/schema/v3/system-description-config-files.schema.json +1 -1
- data/plugins/schema/v3/system-description-repositories.schema.json +1 -1
- data/schema/v3/system-description-global.schema.json +12 -0
- metadata +5 -2
data/lib/tarball.rb
CHANGED
@@ -25,26 +25,26 @@ class Tarball
|
|
25
25
|
output = LoggedCheetah.run("tar", "tvf", @file, :stdout => :capture)
|
26
26
|
|
27
27
|
output.lines.map do |line|
|
28
|
-
mode, user_and_group, size,
|
28
|
+
mode, user_and_group, size, _date, _time, rest = line.split(" ", 6)
|
29
29
|
|
30
30
|
case mode[0]
|
31
31
|
when "l"
|
32
32
|
type = :link
|
33
33
|
# This may fail for files with "->" in their name, but there is no way
|
34
34
|
# how to avoid this when using "tar".
|
35
|
-
path = rest.
|
35
|
+
path = rest.split(" -> ").first
|
36
36
|
when "h"
|
37
37
|
type = :file
|
38
38
|
# This may fail for files with "link to" in their name, but there is no way
|
39
39
|
# how to avoid this when using "tar" unless we use the parameter
|
40
40
|
# --hard-dereference with tar to get rid of hard links
|
41
|
-
path = rest.
|
41
|
+
path = rest.split(" link to ").first
|
42
42
|
when "d"
|
43
43
|
type = :dir
|
44
|
-
path = rest.
|
44
|
+
path = rest.chomp("/\n")
|
45
45
|
else
|
46
46
|
type = :file
|
47
|
-
path = rest.
|
47
|
+
path = rest.chomp
|
48
48
|
end
|
49
49
|
|
50
50
|
user, group = user_and_group.split("/")
|
data/lib/version.rb
CHANGED
data/lib/zypper.rb
CHANGED
@@ -27,22 +27,21 @@ class Zypper
|
|
27
27
|
|
28
28
|
class <<self
|
29
29
|
def isolated(options = {}, &block)
|
30
|
-
|
31
|
-
|
30
|
+
Dir.mktmpdir("machinery_zypper") do |zypper_base|
|
31
|
+
zypper = Zypper.new
|
32
32
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
zypper.zypper_options = [
|
34
|
+
"--non-interactive",
|
35
|
+
"--no-gpg-checks",
|
36
|
+
"--root", zypper_base
|
37
|
+
]
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
if options[:arch]
|
40
|
+
zypper.zypp_config = create_zypp_config(zypper_base, options[:arch])
|
41
|
+
end
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
cleanup(zypper_base)
|
43
|
+
block.call(zypper)
|
44
|
+
end
|
46
45
|
end
|
47
46
|
|
48
47
|
private
|
@@ -60,10 +59,6 @@ class Zypper
|
|
60
59
|
|
61
60
|
zypp_config
|
62
61
|
end
|
63
|
-
|
64
|
-
def cleanup(base)
|
65
|
-
LoggedCheetah.run("rm", "-r", base)
|
66
|
-
end
|
67
62
|
end
|
68
63
|
|
69
64
|
def add_repo(url, repo_alias)
|
Binary file
|
@@ -240,14 +240,17 @@ scope to <code>packages</code>. This will output only the requested information.
|
|
240
240
|
<li><p>changed-managed-files</p>
|
241
241
|
|
242
242
|
<p>Contains the names and contents of all non-configuration files which have
|
243
|
-
been changed compared to the files in the package
|
243
|
+
been changed compared to the files in the package. A file change is reported
|
244
|
+
if its content or its attributes like Linux permission bits or ownership
|
245
|
+
have changed.</p></li>
|
244
246
|
<li><p>config-files</p>
|
245
247
|
|
246
248
|
<p>Contains all configuration files which have been changed since they were
|
247
249
|
installed.
|
248
250
|
Configuration files are all those files which are marked as such in the
|
249
|
-
package which has installed them. A configuration file is
|
250
|
-
if
|
251
|
+
package which has installed them. A configuration file change is reported
|
252
|
+
if its content or its attributes like Linux permission bits or ownership
|
253
|
+
have changed.</p></li>
|
251
254
|
<li><p>groups</p>
|
252
255
|
|
253
256
|
<p>Contains information about the system groups such as group attributes and the
|
@@ -853,6 +856,16 @@ Shortcut for the combination of <code>--extract-changed-config-files</code>,
|
|
853
856
|
<dt><code>--extract-changed-config-files</code> (optional)</dt><dd><p>Extract changed configuration files from the inspected system.</p></dd>
|
854
857
|
<dt><code>--extract-unmanaged-files</code> (optional)</dt><dd><p>Extract unmanaged files from the inspected system.</p></dd>
|
855
858
|
<dt><code>--extract-changed-managed-files</code> (optional)</dt><dd><p>Extract changed managed files from inspected system.</p></dd>
|
859
|
+
<dt><code>--skip-files</code> (optional)</dt><dd><p>Do not consider given files or directories during inspection. Either provide
|
860
|
+
one file or directory name or a list of names separated by commas. You can
|
861
|
+
also point to a file which contains a list of files to filter (one per line)
|
862
|
+
by adding an '@' before the path, e.g.</p>
|
863
|
+
|
864
|
+
<p> $ <code>machinery</code> inspect --skip-files=@/path/to/filter_file myhost</p>
|
865
|
+
|
866
|
+
<p>If a filename contains a comma it needs to be escaped, e.g.</p>
|
867
|
+
|
868
|
+
<p> $ <code>machinery</code> inspect --skip-files=/file\,with_comma myhost</p></dd>
|
856
869
|
</dl>
|
857
870
|
|
858
871
|
|
@@ -917,6 +930,7 @@ scopes for each system.</p>
|
|
917
930
|
<dl>
|
918
931
|
<dt><code>--verbose</code> (optional)</dt><dd>Print additional information about the origin of scopes.
|
919
932
|
Currently displays [HOSTNAME] and (DATE).</dd>
|
933
|
+
<dt><code>--short</code> (optional)</dt><dd>List only descripton names.</dd>
|
920
934
|
</dl>
|
921
935
|
|
922
936
|
|
@@ -929,6 +943,9 @@ Currently displays [HOSTNAME] and (DATE).</dd>
|
|
929
943
|
<dt>Same as previous command, but additionally prints the date of each scope:</dt><dd><p></p>
|
930
944
|
|
931
945
|
<p>$ <code>machinery</code> list --verbose</p></dd>
|
946
|
+
<dt>Lists all available system description names without any additional details:</dt><dd><p></p>
|
947
|
+
|
948
|
+
<p>$ <code>machinery</code> list --short</p></dd>
|
932
949
|
</dl>
|
933
950
|
|
934
951
|
|
@@ -1145,7 +1162,7 @@ manually editing it.</p>
|
|
1145
1162
|
|
1146
1163
|
<ol class='man-decor man-foot man foot'>
|
1147
1164
|
<li class='tl'></li>
|
1148
|
-
<li class='tc'>
|
1165
|
+
<li class='tc'>March 2015</li>
|
1149
1166
|
<li class='tr'>machinery(1)</li>
|
1150
1167
|
</ol>
|
1151
1168
|
|
@@ -1,2 +1,4 @@
|
|
1
1
|
Contains the names and contents of all non-configuration files which have
|
2
|
-
been changed compared to the files in the package.
|
2
|
+
been changed compared to the files in the package. A file change is reported
|
3
|
+
if its content or its attributes like Linux permission bits or ownership
|
4
|
+
have changed.
|
@@ -1,5 +1,6 @@
|
|
1
1
|
Contains all configuration files which have been changed since they were
|
2
2
|
installed.
|
3
3
|
Configuration files are all those files which are marked as such in the
|
4
|
-
package which has installed them. A configuration file is
|
5
|
-
if
|
4
|
+
package which has installed them. A configuration file change is reported
|
5
|
+
if its content or its attributes like Linux permission bits or ownership
|
6
|
+
have changed.
|
@@ -18,7 +18,7 @@
|
|
18
18
|
class ChangedManagedFilesInspector < Inspector
|
19
19
|
include ChangedRpmFilesHelper
|
20
20
|
|
21
|
-
def inspect(system, description, options = {})
|
21
|
+
def inspect(system, description, _filter, options = {})
|
22
22
|
system.check_requirement("rsync", "--version") if options[:extract_changed_managed_files]
|
23
23
|
|
24
24
|
@system = system
|
@@ -29,7 +29,13 @@ class ChangedManagedFilesInspector < Inspector
|
|
29
29
|
file_store.remove
|
30
30
|
if options[:extract_changed_managed_files]
|
31
31
|
file_store.create
|
32
|
-
|
32
|
+
|
33
|
+
existing_files = changed_files.reject do |f|
|
34
|
+
f.changes.nil? ||
|
35
|
+
f.changes.include?("deleted") ||
|
36
|
+
f.name == "/"
|
37
|
+
end
|
38
|
+
|
33
39
|
system.retrieve_files(existing_files.map(&:name), file_store.path)
|
34
40
|
end
|
35
41
|
|
@@ -82,7 +82,7 @@ class ConfigFilesInspector < Inspector
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
-
def inspect(system, description, options = {})
|
85
|
+
def inspect(system, description, _filter, options = {})
|
86
86
|
do_extract = options[:extract_changed_config_files]
|
87
87
|
check_requirements(system, do_extract)
|
88
88
|
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# you may find current contact information at www.suse.com
|
17
17
|
|
18
18
|
class GroupsInspector < Inspector
|
19
|
-
def inspect(system, description,
|
19
|
+
def inspect(system, description, _filter, _options = {})
|
20
20
|
group_content = system.read_file("/etc/group")
|
21
21
|
|
22
22
|
groups = group_content ? parse_groups(group_content) : []
|
@@ -29,6 +29,8 @@ class GroupsInspector < Inspector
|
|
29
29
|
|
30
30
|
def parse_groups(content)
|
31
31
|
content.lines.map do |line|
|
32
|
+
# prevent split from ignoring the last entry if it is empty and there is no newline
|
33
|
+
line += "\n" if line.end_with?(":")
|
32
34
|
name, password, gid, users = line.split(":").map(&:chomp)
|
33
35
|
|
34
36
|
gid = Machinery::is_int?(gid) ? gid.to_i : nil
|
@@ -38,7 +38,7 @@ class OsInspector < Inspector
|
|
38
38
|
special_version ? " #{special_version.gsub(/[0-9]{1,2}/," \\0")}" : ""
|
39
39
|
end
|
40
40
|
|
41
|
-
def inspect(system, description, _options = {})
|
41
|
+
def inspect(system, description, _filter, _options = {})
|
42
42
|
system.check_requirement("cat", "--version") if system.is_a?(RemoteSystem)
|
43
43
|
|
44
44
|
os = get_os(system)
|
@@ -79,7 +79,7 @@ class OsInspector < Inspector
|
|
79
79
|
return if !os_release
|
80
80
|
|
81
81
|
result = Hash.new
|
82
|
-
key_value_pairs = Hash[os_release.split("\n").map { |l| l.split("=") }]
|
82
|
+
key_value_pairs = Hash[os_release.split("\n").reject(&:empty?).map { |l| l.split("=") }]
|
83
83
|
key_value_pairs.each_pair do |k,v|
|
84
84
|
result[k.downcase] = v.strip.gsub(/^"|"$/,"")
|
85
85
|
end
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# you may find current contact information at www.suse.com
|
17
17
|
|
18
18
|
class PackagesInspector < Inspector
|
19
|
-
def inspect(system, description,
|
19
|
+
def inspect(system, description, _filter, _options = {})
|
20
20
|
system.check_requirement("rpm", "--version")
|
21
21
|
|
22
22
|
packages = Array.new
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# you may find current contact information at www.suse.com
|
17
17
|
|
18
18
|
class PatternsInspector < Inspector
|
19
|
-
def inspect(system, description,
|
19
|
+
def inspect(system, description, _filter, _options = {})
|
20
20
|
if system.has_command?("zypper")
|
21
21
|
inspect_with_zypper(system, description)
|
22
22
|
else
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# you may find current contact information at www.suse.com
|
17
17
|
|
18
18
|
class RepositoriesInspector < Inspector
|
19
|
-
def inspect(system, description,
|
19
|
+
def inspect(system, description, _filter, _options = {})
|
20
20
|
if system.has_command?("zypper")
|
21
21
|
description.repositories, summary = inspect_zypp_repositories(system)
|
22
22
|
elsif system.has_command?("yum")
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# you may find current contact information at www.suse.com
|
17
17
|
|
18
18
|
class ServicesInspector < Inspector
|
19
|
-
def inspect(system, description,
|
19
|
+
def inspect(system, description, _filter, _options = {})
|
20
20
|
if system.has_command?("systemctl")
|
21
21
|
result = ServicesScope.new(
|
22
22
|
init_system: "systemd",
|
@@ -218,7 +218,7 @@ class UnmanagedFilesInspector < Inspector
|
|
218
218
|
3
|
219
219
|
end
|
220
220
|
|
221
|
-
def inspect(system, description, options =
|
221
|
+
def inspect(system, description, filter, options = {})
|
222
222
|
do_extract = options && options[:extract_unmanaged_files]
|
223
223
|
check_requirements(system, do_extract)
|
224
224
|
|
@@ -227,40 +227,6 @@ class UnmanagedFilesInspector < Inspector
|
|
227
227
|
|
228
228
|
mount_points = MountPoints.new(system)
|
229
229
|
|
230
|
-
ignore_list = [
|
231
|
-
"tmp",
|
232
|
-
"var/tmp",
|
233
|
-
"lost+found",
|
234
|
-
"var/run",
|
235
|
-
"var/lib/rpm",
|
236
|
-
".snapshots",
|
237
|
-
description.store.base_path.sub(/^\//, ""),
|
238
|
-
"proc",
|
239
|
-
"boot"
|
240
|
-
]
|
241
|
-
|
242
|
-
# Information about users and groups are extracted by the according inspector
|
243
|
-
ignore_list += [
|
244
|
-
"etc/passwd",
|
245
|
-
"etc/shadow",
|
246
|
-
"etc/group"
|
247
|
-
]
|
248
|
-
|
249
|
-
# Information about services is extracted by the ServicesInspector, so
|
250
|
-
# we ignore the links representing the same information when inspecting
|
251
|
-
# unmanaged files.
|
252
|
-
ignore_list += [
|
253
|
-
"etc/init.d/boot.d",
|
254
|
-
"etc/init.d/rc0.d",
|
255
|
-
"etc/init.d/rc1.d",
|
256
|
-
"etc/init.d/rc2.d",
|
257
|
-
"etc/init.d/rc3.d",
|
258
|
-
"etc/init.d/rc4.d",
|
259
|
-
"etc/init.d/rc5.d",
|
260
|
-
"etc/init.d/rc6.d",
|
261
|
-
"etc/init.d/rcS.d"
|
262
|
-
]
|
263
|
-
|
264
230
|
rpm_files, rpm_dirs = extract_rpm_database(system)
|
265
231
|
|
266
232
|
# Btrfs subvolumes and local mounts need to be inspected separately because
|
@@ -273,9 +239,16 @@ class UnmanagedFilesInspector < Inspector
|
|
273
239
|
unmanaged_links = {}
|
274
240
|
remote_dirs = mount_points.remote
|
275
241
|
special_dirs = mount_points.special
|
276
|
-
|
277
|
-
|
278
|
-
|
242
|
+
|
243
|
+
file_filter = filter.element_filter_for("/unmanaged_files/files/name") if filter
|
244
|
+
file_filter ||= ElementFilter.new("/unmanaged_files/files/name")
|
245
|
+
file_filter.add_matchers(description.store.base_path)
|
246
|
+
|
247
|
+
# Add a recursive pendant to each ignored element
|
248
|
+
file_filter.add_matchers(file_filter.matchers.map { |entry| File.join(entry, "/*") })
|
249
|
+
|
250
|
+
remote_dirs.delete_if { |e| file_filter.matches?(e) }
|
251
|
+
|
279
252
|
excluded_files += remote_dirs
|
280
253
|
excluded_files += special_dirs
|
281
254
|
|
@@ -315,10 +288,12 @@ class UnmanagedFilesInspector < Inspector
|
|
315
288
|
local_filesystems.reject! { |mp| dirs.has_key?(mp) }
|
316
289
|
end
|
317
290
|
if find_dir == "/"
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
291
|
+
dirs.reject! do |dir|
|
292
|
+
file_filter.matches?("/" + dir)
|
293
|
+
end
|
294
|
+
|
295
|
+
files.reject! do |dir|
|
296
|
+
file_filter.matches?("/" + dir)
|
322
297
|
end
|
323
298
|
end
|
324
299
|
managed, unmanaged = dirs.keys.partition{ |d| rpm_dirs.has_key?(find_dir + d) }
|
@@ -16,7 +16,7 @@
|
|
16
16
|
# you may find current contact information at www.suse.com
|
17
17
|
|
18
18
|
class UsersInspector < Inspector
|
19
|
-
def inspect(system, description,
|
19
|
+
def inspect(system, description, _filter, _options = {})
|
20
20
|
passwd = system.read_file("/etc/passwd")
|
21
21
|
shadow = system.read_file("/etc/shadow")
|
22
22
|
|
@@ -51,7 +51,7 @@
|
|
51
51
|
"changes": {
|
52
52
|
"type": "array",
|
53
53
|
"items": {
|
54
|
-
"enum": ["mode", "md5", "
|
54
|
+
"enum": ["size", "mode", "md5", "device_number", "link_path", "user", "group", "time", "capabilities", "replaced", "other_rpm_changes"]
|
55
55
|
},
|
56
56
|
"minItems": 1
|
57
57
|
},
|
@@ -51,7 +51,7 @@
|
|
51
51
|
"changes": {
|
52
52
|
"type": "array",
|
53
53
|
"items": {
|
54
|
-
"enum": ["mode", "md5", "
|
54
|
+
"enum": ["size", "mode", "md5", "device_number", "link_path", "user", "group", "time", "capabilities", "replaced", "other_rpm_changes"]
|
55
55
|
},
|
56
56
|
"minItems": 1
|
57
57
|
},
|
@@ -10,6 +10,18 @@
|
|
10
10
|
"format_version": {
|
11
11
|
"type": "integer",
|
12
12
|
"minimum": 1
|
13
|
+
},
|
14
|
+
"filters": {
|
15
|
+
"type": "object",
|
16
|
+
"required": ["inspect"],
|
17
|
+
"properties": {
|
18
|
+
"inspect": {
|
19
|
+
"type": "array",
|
20
|
+
"items": {
|
21
|
+
"type": "string"
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
13
25
|
}
|
14
26
|
},
|
15
27
|
"additionalProperties": {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: machinery-tool
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SUSE
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cheetah
|
@@ -197,6 +197,7 @@ files:
|
|
197
197
|
- export_helpers/unmanaged_files_autoyast_excludes
|
198
198
|
- export_helpers/unmanaged_files_kiwi_excludes
|
199
199
|
- helpers/changed_managed_files.sh
|
200
|
+
- helpers/default_filters.json
|
200
201
|
- helpers/filter-packages-for-build.yaml
|
201
202
|
- helpers/yum_repositories.py
|
202
203
|
- html/assets/arrow_down.png
|
@@ -248,10 +249,12 @@ files:
|
|
248
249
|
- lib/copy_task.rb
|
249
250
|
- lib/current_user.rb
|
250
251
|
- lib/deploy_task.rb
|
252
|
+
- lib/element_filter.rb
|
251
253
|
- lib/exceptions.rb
|
252
254
|
- lib/export_task.rb
|
253
255
|
- lib/exporter.rb
|
254
256
|
- lib/file_validator.rb
|
257
|
+
- lib/filter.rb
|
255
258
|
- lib/generate_html_task.rb
|
256
259
|
- lib/helper.rb
|
257
260
|
- lib/hint.rb
|