machinery-tool 1.11.2 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/NEWS +7 -0
- data/export_helpers/containerize_readme.md +44 -0
- data/helpers/default_filters.json +1 -0
- data/html/index.html.haml +10 -10
- data/lib/build_task.rb +1 -1
- data/lib/cli.rb +16 -3
- data/lib/constants.rb +1 -0
- data/lib/containerize_task.rb +46 -0
- data/lib/exceptions.rb +4 -0
- data/lib/helper.rb +4 -0
- data/lib/local_system.rb +24 -2
- data/lib/logged_cheetah.rb +23 -5
- data/lib/machinery.rb +4 -0
- data/lib/machinery_helper.rb +66 -0
- data/lib/remote_system.rb +31 -1
- data/lib/system.rb +6 -0
- data/lib/system_description.rb +26 -0
- data/lib/version.rb +1 -1
- data/lib/workload_mapper.rb +141 -0
- data/lib/workload_mapper_dsl.rb +54 -0
- data/man/generated/machinery.1.gz +0 -0
- data/man/generated/machinery.1.html +8 -1
- data/plugins/os/os_inspector.rb +1 -5
- data/plugins/repositories/repositories_inspector.rb +4 -0
- data/plugins/unmanaged_files/unmanaged_files_inspector.rb +81 -13
- metadata +214 -209
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59b0cae046e00683fea873260999de11ce3ad562
|
4
|
+
data.tar.gz: 295b43b9d42e832be6f78363cee7f8c91c25a47d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be116d55112cf6d945db98ce6ce4723644df3753904d5811b9c7abe05f0dfc4b4199bb574025d9b3833b4fc642df6132103937b0a4aeb48fe551627a024d0253
|
7
|
+
data.tar.gz: 76221ef972ded4ce554d3b4e7e085477b7071057ef26847a6d40cf20ef94142aced57b5109cad75274135b8a0fe7573c3d815eab092d91066fcfe95131d217a8
|
data/NEWS
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
# Machinery Release Notes
|
2
2
|
|
3
3
|
|
4
|
+
## Version 1.12.0 - Fri Sep 04 16:51:10 CEST 2015 - cschum@suse.de
|
5
|
+
|
6
|
+
* The x86_64 machinery-helper is now shipped with machinery. It speeds up
|
7
|
+
inspection of unmanaged-files when the files are not extracted
|
8
|
+
* Fix for unmanaged-file inspector to not mark directories as unmanaged if they
|
9
|
+
only consist managed sub directories
|
10
|
+
|
4
11
|
## Version 1.11.2 - Thu Jul 30 14:42:44 CEST 2015 - thardeck@suse.de
|
5
12
|
|
6
13
|
* Fix issue with showing HTML view when not all file scopes are inspected
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# README for Docker Containers created by Machinery
|
2
|
+
|
3
|
+
This directory contains a (Docker Compose) Container configuration that was exported by
|
4
|
+
Machinery.
|
5
|
+
|
6
|
+
The user is expected to be familiar with using Docker.
|
7
|
+
Details on Docker can be found at https://www.docker.com/.
|
8
|
+
|
9
|
+
## Requirements
|
10
|
+
|
11
|
+
Docker and docker-compose are required. Packages are available in the Virtualization repository.
|
12
|
+
|
13
|
+
Install on openSUSE 13.2:
|
14
|
+
|
15
|
+
sudo zypper ar -f http://download.opensuse.org/repositories/Virtualization:/containers/openSUSE_13.2/ virt
|
16
|
+
sudo zypper refresh
|
17
|
+
sudo zypper in docker docker-compose
|
18
|
+
sudo usermod -aG docker $(whoami)
|
19
|
+
sudo systemctl start docker
|
20
|
+
|
21
|
+
Log out and in again to refresh the user's group.
|
22
|
+
|
23
|
+
## Managing Docker containers
|
24
|
+
|
25
|
+
Run container:
|
26
|
+
|
27
|
+
docker-compose up
|
28
|
+
|
29
|
+
Run container as daemon in background:
|
30
|
+
|
31
|
+
docker-compose up -d
|
32
|
+
|
33
|
+
Shows list of all running containers:
|
34
|
+
|
35
|
+
docker-compose ps
|
36
|
+
|
37
|
+
Stop the container:
|
38
|
+
|
39
|
+
docker-compose kill
|
40
|
+
|
41
|
+
Remove the container image:
|
42
|
+
|
43
|
+
docker-compose rm -vf
|
44
|
+
|
@@ -7,6 +7,7 @@
|
|
7
7
|
"/unmanaged_files/files/name=/var/tmp",
|
8
8
|
"/unmanaged_files/files/name=/lost+found",
|
9
9
|
"/unmanaged_files/files/name=/var/run",
|
10
|
+
"/unmanaged_files/files/name=/var/lock",
|
10
11
|
"/unmanaged_files/files/name=/var/lib/rpm",
|
11
12
|
"/unmanaged_files/files/name=/.snapshots",
|
12
13
|
"/unmanaged_files/files/name=/proc",
|
data/html/index.html.haml
CHANGED
@@ -433,25 +433,25 @@
|
|
433
433
|
%span.scope-navigation
|
434
434
|
Scopes:
|
435
435
|
%a{:href => "#os", :title => "Operating System"}
|
436
|
-
%img{:src => "assets/logo-os-small.png"}/
|
436
|
+
%img{:src => "assets/logo-os-small.png", :title=>"Operating System", :class=>"over", :"data-toggle"=>"popover", :"data-content"=>"#{scope_help('os')}"}/
|
437
437
|
%a{:href => "#packages", :title => "Packages"}
|
438
|
-
%img{:src => "assets/logo-packages-small.png"}/
|
438
|
+
%img{:src => "assets/logo-packages-small.png", :title => "Packages", :class=>"over", :"data-toggle"=>"popover", :"data-content"=>"#{scope_help('packages')}"}/
|
439
439
|
%a{:href => "#patterns", :title => "Patterns"}
|
440
|
-
%img{:src => "assets/logo-patterns-small.png"}/
|
440
|
+
%img{:src => "assets/logo-patterns-small.png", :title => "Patterns", :class=>"over", :"data-toggle"=>"popover", :"data-content"=>"#{scope_help('patterns')}"}/
|
441
441
|
%a{:href => "#repositories", :title => "Repositories"}
|
442
|
-
%img{:src => "assets/logo-repositories-small.png"}/
|
442
|
+
%img{:src => "assets/logo-repositories-small.png", :title => "Repositories", :class=>"over", :"data-toggle"=>"popover", :"data-content"=>"#{scope_help('repositories')}"}/
|
443
443
|
%a{:href => "#users", :title => "Users"}
|
444
|
-
%img{:src => "assets/logo-users-small.png"}/
|
444
|
+
%img{:src => "assets/logo-users-small.png", :title => "Users", :class=>"over", :"data-toggle"=>"popover", :"data-content"=>"#{scope_help('users')}"}/
|
445
445
|
%a{:href => "#groups", :title => "Groups"}
|
446
|
-
%img{:src => "assets/logo-groups-small.png"}/
|
446
|
+
%img{:src => "assets/logo-groups-small.png", :title => "Groups", :class=>"over", :"data-toggle"=>"popover", :"data-content"=>"#{scope_help('groups')}"}/
|
447
447
|
%a{:href => "#services", :title => "Services"}
|
448
|
-
%img{:src => "assets/logo-services-small.png"}/
|
448
|
+
%img{:src => "assets/logo-services-small.png", :title => "Services", :class=>"over", :"data-toggle"=>"popover", :"data-content"=>"#{scope_help('services')}"}/
|
449
449
|
%a{:href => "#config_files", :title => "Config Files"}
|
450
|
-
%img{:src => "assets/logo-config-files-small.png"}/
|
450
|
+
%img{:src => "assets/logo-config-files-small.png", :title => "Config Files", :class=>"over", :"data-toggle"=>"popover", :"data-content"=>"#{scope_help('config_files')}"}/
|
451
451
|
%a{:href => "#changed_managed_files", :title => "Changed Managed Files"}
|
452
|
-
%img{:src => "assets/logo-changed-managed-files-small.png"}/
|
452
|
+
%img{:src => "assets/logo-changed-managed-files-small.png", :title => "Changed Managed Files", :class=>"over", :"data-toggle"=>"popover", :"data-content"=>"#{scope_help('changed_managed_files')}"}/
|
453
453
|
%a{:href => "#unmanaged_files", :title => "Unmanaged Files"}
|
454
|
-
%img{:src => "assets/logo-unmanaged-files-small.png"}/
|
454
|
+
%img{:src => "assets/logo-unmanaged-files-small.png", :title => "Unmanaged Files", :class=>"over", :"data-toggle"=>"popover", :"data-content"=>"#{scope_help('unmanaged_files')}"}/
|
455
455
|
|
456
456
|
|
457
457
|
#content_container{"ng-controller" => "showController"}
|
data/lib/build_task.rb
CHANGED
data/lib/cli.rb
CHANGED
@@ -87,7 +87,8 @@ class Cli
|
|
87
87
|
Machinery::Ui.error("Option --" + e.message)
|
88
88
|
exit 1
|
89
89
|
when GLI::UnknownCommandArgument, GLI::UnknownGlobalArgument,
|
90
|
-
|
90
|
+
GLI::UnknownCommand, GLI::BadCommandLine,
|
91
|
+
OptionParser::MissingArgument, OptionParser::AmbiguousOption
|
91
92
|
Machinery::Ui.error e.to_s + "\n\n"
|
92
93
|
command = ARGV & @commands.keys.map(&:to_s)
|
93
94
|
Machinery::Ui.error "Run '#{$0} #{command.first} --help' for more information."
|
@@ -105,8 +106,16 @@ class Cli
|
|
105
106
|
Machinery::Ui.error("Error: " + e.message)
|
106
107
|
exit 1
|
107
108
|
else
|
108
|
-
|
109
|
-
"
|
109
|
+
if LocalSystem.os.canonical_name.include? ("SUSE Linux Enterprise")
|
110
|
+
Machinery::Ui.error "Machinery experienced an unexpected error.\n" \
|
111
|
+
"If this impacts your business please file a service request at " \
|
112
|
+
"https://www.suse.com/mysupport\n" \
|
113
|
+
"so that we can assist you on this issue. An active support contract is required.\n"
|
114
|
+
else
|
115
|
+
Machinery::Ui.error "Machinery experienced an unexpected error. Please file a " \
|
116
|
+
"bug report at: https://github.com/SUSE/machinery/issues/new\n"
|
117
|
+
end
|
118
|
+
|
110
119
|
if e.is_a?(Cheetah::ExecutionFailed)
|
111
120
|
result = ""
|
112
121
|
result << "#{e.message}\n"
|
@@ -728,6 +737,10 @@ class Cli
|
|
728
737
|
|
729
738
|
The value of a key is shown when no value argument is passed.
|
730
739
|
If neither the key argument nor the value argument are specified a list of all keys and their values are shown.
|
740
|
+
|
741
|
+
ALTERNATIVE SYNOPSIS:
|
742
|
+
|
743
|
+
machinery [global options] config [KEY][=VALUE]
|
731
744
|
LONGDESC
|
732
745
|
arg "KEY", :optional
|
733
746
|
arg "VALUE", :optional
|
data/lib/constants.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Copyright (c) 2013-2015 SUSE LLC
|
2
|
+
#
|
3
|
+
# This program is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of version 3 of the GNU General Public License as
|
5
|
+
# published by the Free Software Foundation.
|
6
|
+
#
|
7
|
+
# This program is distributed in the hope that it will be useful,
|
8
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
10
|
+
# GNU General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU General Public License
|
13
|
+
# along with this program; if not, contact SUSE LLC.
|
14
|
+
#
|
15
|
+
# To contact SUSE about this file by physical or electronic mail,
|
16
|
+
# you may find current contact information at www.suse.com
|
17
|
+
|
18
|
+
class ContainerizeTask
|
19
|
+
def containerize(description, dir)
|
20
|
+
output_path = File.join(dir, description.name)
|
21
|
+
|
22
|
+
mapper = WorkloadMapper.new
|
23
|
+
workloads = mapper.identify_workloads(description)
|
24
|
+
|
25
|
+
if workloads.empty?
|
26
|
+
Machinery::Ui.puts "No workloads detected."
|
27
|
+
else
|
28
|
+
FileUtils.mkdir_p(output_path)
|
29
|
+
mapper.save(workloads, output_path)
|
30
|
+
mapper.extract(description, workloads, output_path)
|
31
|
+
write_readme_file(output_path)
|
32
|
+
|
33
|
+
workloads.each do |workload|
|
34
|
+
Machinery::Ui.puts "Detected workload '#{workload[0]}'."
|
35
|
+
end
|
36
|
+
Machinery::Ui.puts "\nWrote to #{output_path}."
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def write_readme_file(dir)
|
41
|
+
FileUtils.cp(
|
42
|
+
File.join(Machinery::ROOT, "export_helpers", "containerize_readme.md"),
|
43
|
+
File.join(dir, "README.md")
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
data/lib/exceptions.rb
CHANGED
@@ -135,5 +135,9 @@ module Machinery
|
|
135
135
|
class UnknownConfig < MachineryError; end
|
136
136
|
class UnsupportedArchitecture < MachineryError; end
|
137
137
|
class ServeFailed < MachineryError; end
|
138
|
+
class RemoveFileFailed < MachineryError; end
|
139
|
+
class InjectFileFailed < MachineryError; end
|
140
|
+
class UnexpectedInputData < MachineryError; end
|
141
|
+
class ComposeServiceLink < MachineryError; end
|
138
142
|
end
|
139
143
|
end
|
data/lib/helper.rb
CHANGED
@@ -51,6 +51,10 @@ def with_c_locale(&block)
|
|
51
51
|
with_env "LC_ALL" => "C", &block
|
52
52
|
end
|
53
53
|
|
54
|
+
def with_utf8_locale(&block)
|
55
|
+
with_env "LC_ALL" => "en_US.UTF-8", &block
|
56
|
+
end
|
57
|
+
|
54
58
|
def with_env(env)
|
55
59
|
# ENV isn't a Hash, but a weird Hash-like object. Calling #to_hash on it
|
56
60
|
# will copy its items into a newly created Hash instance. This approach
|
data/lib/local_system.rb
CHANGED
@@ -87,7 +87,9 @@ EOF
|
|
87
87
|
message = "Building '#{system_description.os.display_name}' is " \
|
88
88
|
"not supported on this distribution.\n" \
|
89
89
|
"Check the 'BUILD SUPPORT MATRIX' by running `#{$0} build --help` for " \
|
90
|
-
"further information which build targets are supported
|
90
|
+
"further information which build targets are supported.\n" \
|
91
|
+
"You are only able to build the architecture you are running " \
|
92
|
+
"(#{LocalSystem.os.architecture})."
|
91
93
|
|
92
94
|
raise(Machinery::Errors::BuildFailed.new(message))
|
93
95
|
end
|
@@ -112,7 +114,7 @@ EOF
|
|
112
114
|
else
|
113
115
|
cheetah_class = LoggedCheetah
|
114
116
|
end
|
115
|
-
|
117
|
+
with_utf8_locale do
|
116
118
|
cheetah_class.run(*args)
|
117
119
|
end
|
118
120
|
end
|
@@ -148,4 +150,24 @@ EOF
|
|
148
150
|
# File not found, return nil
|
149
151
|
return
|
150
152
|
end
|
153
|
+
|
154
|
+
# Copies a file to the local system
|
155
|
+
def inject_file(source, destination)
|
156
|
+
FileUtils.copy(source, destination)
|
157
|
+
rescue => e
|
158
|
+
raise Machinery::Errors::InjectFileFailed.new(
|
159
|
+
"Could not inject file '#{source}' to local system.\n" \
|
160
|
+
"Error: #{e}"
|
161
|
+
)
|
162
|
+
end
|
163
|
+
|
164
|
+
# Removes a file from the System
|
165
|
+
def remove_file(file)
|
166
|
+
File.delete(file) if File.exist?(file)
|
167
|
+
rescue => e
|
168
|
+
raise Machinery::Errors::RemoveFileFailed.new(
|
169
|
+
"Could not remove file '#{file}' on local system'.\n" \
|
170
|
+
"Error: #{e}"
|
171
|
+
)
|
172
|
+
end
|
151
173
|
end
|
data/lib/logged_cheetah.rb
CHANGED
@@ -16,12 +16,30 @@
|
|
16
16
|
# you may find current contact information at www.suse.com
|
17
17
|
|
18
18
|
class LoggedCheetah
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
class << self
|
20
|
+
def run(*args)
|
21
|
+
run_overloaded(*args, {})
|
22
|
+
end
|
23
|
+
|
24
|
+
def run_with_c(*args)
|
25
|
+
run_overloaded(*args, with_c_locale: true)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def run_overloaded(*args, options)
|
31
|
+
command = args.select { |e| e.is_a?(String) }.join(" ")
|
32
|
+
Machinery.logger.info("Running '#{command}'")
|
22
33
|
|
23
|
-
|
24
|
-
|
34
|
+
if options[:with_c_locale]
|
35
|
+
with_c_locale do
|
36
|
+
Cheetah.run(*args)
|
37
|
+
end
|
38
|
+
else
|
39
|
+
with_utf8_locale do
|
40
|
+
Cheetah.run(*args)
|
41
|
+
end
|
42
|
+
end
|
25
43
|
end
|
26
44
|
end
|
27
45
|
end
|
data/lib/machinery.rb
CHANGED
@@ -102,6 +102,10 @@ require_relative "serve_html_task"
|
|
102
102
|
require_relative "file_diff"
|
103
103
|
require_relative "server"
|
104
104
|
require_relative "html"
|
105
|
+
require_relative "machinery_helper"
|
106
|
+
require_relative "workload_mapper"
|
107
|
+
require_relative "containerize_task"
|
108
|
+
require_relative "workload_mapper_dsl"
|
105
109
|
|
106
110
|
Dir[File.join(Machinery::ROOT, "plugins", "**", "*.rb")].each { |f| require(f) }
|
107
111
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# Copyright (c) 2015 SUSE LLC
|
2
|
+
#
|
3
|
+
# This program is free software; you can redistribute it and/or
|
4
|
+
# modify it under the terms of version 3 of the GNU General Public License as
|
5
|
+
# published by the Free Software Foundation.
|
6
|
+
#
|
7
|
+
# This program is distributed in the hope that it will be useful,
|
8
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
10
|
+
# GNU General Public License for more details.
|
11
|
+
#
|
12
|
+
# You should have received a copy of the GNU General Public License
|
13
|
+
# along with this program; if not, contact SUSE LLC.
|
14
|
+
#
|
15
|
+
# To contact SUSE about this file by physical or electronic mail,
|
16
|
+
# you may find current contact information at www.suse.com
|
17
|
+
|
18
|
+
# The MachineryHelper class handles the helper binaries Machinery can use to
|
19
|
+
# do inspections. It provides methods to check, if a helper is available, to
|
20
|
+
# inject it to the target machine, run it there, and clean up after it's done.
|
21
|
+
#
|
22
|
+
# The inspection checks, if a binary helper is available on the machine where
|
23
|
+
# the inspection is started. It looks at the location
|
24
|
+
#
|
25
|
+
# /usr/share/machinery/helpers/<arch>/machinery-helper
|
26
|
+
#
|
27
|
+
# where <arch> is the hardware architecture of the target system. Valid values
|
28
|
+
# are x86_64, i586, s390x, and ppcle.
|
29
|
+
|
30
|
+
class MachineryHelper
|
31
|
+
attr_accessor :local_helpers_path
|
32
|
+
|
33
|
+
def initialize(s)
|
34
|
+
@system = s
|
35
|
+
@arch = @system.arch
|
36
|
+
|
37
|
+
@local_helpers_path = "/usr/share/machinery/helpers"
|
38
|
+
end
|
39
|
+
|
40
|
+
def local_helper_path
|
41
|
+
File.join(@local_helpers_path, @arch, "machinery-helper")
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns true, if there is a helper binary matching the architecture of the
|
45
|
+
# inspected system. Return false, if not.
|
46
|
+
def can_help?
|
47
|
+
File.exist?(local_helper_path)
|
48
|
+
end
|
49
|
+
|
50
|
+
def inject_helper
|
51
|
+
@system.inject_file(local_helper_path, Machinery::REMOTE_HELPERS_PATH)
|
52
|
+
end
|
53
|
+
|
54
|
+
def run_helper(scope)
|
55
|
+
json = @system.run_command(
|
56
|
+
File.join(
|
57
|
+
Machinery::REMOTE_HELPERS_PATH, "machinery-helper"
|
58
|
+
), stdout: :capture, stderr: STDERR
|
59
|
+
)
|
60
|
+
scope.set_attributes(JSON.parse(json))
|
61
|
+
end
|
62
|
+
|
63
|
+
def remove_helper
|
64
|
+
@system.remove_file(File.join(Machinery::REMOTE_HELPERS_PATH, "machinery-helper"))
|
65
|
+
end
|
66
|
+
end
|
data/lib/remote_system.rb
CHANGED
@@ -73,7 +73,9 @@ class RemoteSystem < System
|
|
73
73
|
end
|
74
74
|
|
75
75
|
sudo = ["sudo", "-n"] if options[:privileged] && remote_user != "root"
|
76
|
-
cmds = [
|
76
|
+
cmds = [
|
77
|
+
"ssh", "#{remote_user}@#{host}", sudo, "LC_ALL=en_US.utf8", *piped_args, options
|
78
|
+
].compact.flatten
|
77
79
|
cheetah_class.run(*cmds)
|
78
80
|
rescue Cheetah::ExecutionFailed => e
|
79
81
|
if e.stderr.include?("password is required")
|
@@ -140,4 +142,32 @@ class RemoteSystem < System
|
|
140
142
|
raise
|
141
143
|
end
|
142
144
|
end
|
145
|
+
|
146
|
+
# Copies a file to the system
|
147
|
+
def inject_file(source, destination)
|
148
|
+
destination = "#{remote_user}@#{host}:#{destination}"
|
149
|
+
|
150
|
+
cmd = [
|
151
|
+
"scp",
|
152
|
+
source,
|
153
|
+
destination
|
154
|
+
]
|
155
|
+
|
156
|
+
begin
|
157
|
+
LoggedCheetah.run(*cmd)
|
158
|
+
rescue Cheetah::ExecutionFailed => e
|
159
|
+
raise Machinery::Errors::InjectFileFailed.new(
|
160
|
+
"Could not inject file '#{source}' to host '#{host}'.\nError: #{e}"
|
161
|
+
)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Removes a file from the system
|
166
|
+
def remove_file(file)
|
167
|
+
run_command("rm", file, privileged: true)
|
168
|
+
rescue Cheetah::ExecutionFailed => e
|
169
|
+
raise Machinery::Errors::RemoveFileFailed.new(
|
170
|
+
"Could not remove file '#{file}' on host '#{host}'.\nError: #{e}"
|
171
|
+
)
|
172
|
+
end
|
143
173
|
end
|