machinery-tool 1.16.2 → 1.16.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.git_revision +1 -1
- data/NEWS +12 -0
- data/bin/machinery +0 -1
- data/html/assets/landing_page/landing_page.js +10 -0
- data/html/landing_page.html.haml +59 -0
- data/html/partials/landing_page/alert.html.haml +9 -0
- data/lib/analyze_config_file_diffs_task.rb +1 -0
- data/lib/build_task.rb +1 -1
- data/lib/cli.rb +26 -36
- data/lib/config.rb +4 -4
- data/lib/config_base.rb +22 -10
- data/lib/deploy_task.rb +1 -1
- data/lib/exceptions.rb +9 -3
- data/lib/export_task.rb +0 -1
- data/lib/helper.rb +4 -0
- data/lib/html.rb +25 -15
- data/lib/kiwi_config.rb +9 -22
- data/lib/list_task.rb +82 -59
- data/lib/local_system.rb +0 -28
- data/lib/serve_html_task.rb +12 -5
- data/lib/server.rb +36 -0
- data/lib/system_description.rb +22 -7
- data/lib/version.rb +1 -1
- data/lib/zypper.rb +6 -0
- data/machinery-helper/version.go +1 -1
- data/man/generated/machinery.1.gz +0 -0
- data/man/generated/machinery.1.html +27 -28
- data/plugins/os/os_model.rb +28 -46
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c00eaca55ecc5e08f71d08727977495e8e323a7
|
4
|
+
data.tar.gz: a5fbe828a941ad0d80d00e7fdd3ab6d0faa4e9af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4166a79a449b345f5a910c0f6f96058952cd7b609dc999733249f315058b00192e6cffd87f462f3f09d27dc162286925433efb2464a319857cdf542345bf817
|
7
|
+
data.tar.gz: a8ab3cdd686c51759c28fd3361d6729cb7d1012f929656c077454aee5d51924d302641cf5899f093c43c15eb5b9e178efa656a102ac493ae82d62f0d07c273d0
|
data/.git_revision
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
e830c7c80abc78b74a40826ade55255c311f92b2
|
data/NEWS
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
# Machinery Release Notes
|
2
2
|
|
3
3
|
|
4
|
+
## Version 1.16.3 - Thu Jan 07 17:57:27 CET 2016 - thardeck@suse.de
|
5
|
+
|
6
|
+
* Remove concept of "supported systems" in favor of letting Machinery run
|
7
|
+
everywhere. Whether a system can be built, exported, etc will be validated
|
8
|
+
from its related task by checking if the propper tooling is installed
|
9
|
+
(Fixes bnc#959558)
|
10
|
+
* Remove hint for `show`, when `inspect-container` is run with `--show` option
|
11
|
+
* Rephrase the startup messages and warn messages when starting the HTTP
|
12
|
+
server for compare, show, or serve system descriptions
|
13
|
+
* Change `serve` command to always list all system descriptions
|
14
|
+
|
4
15
|
## Version 1.16.2 - Tue Nov 24 13:17:18 CET 2015 - thardeck@suse.de
|
5
16
|
|
6
17
|
* Fix crash when the user does not have enough permissions to create the image
|
@@ -19,6 +30,7 @@
|
|
19
30
|
* Fix Autoyast export on openSUSE Leap and Tumbleweed (gh#SUSE/machinery#1627)
|
20
31
|
* Allow building of openSUSE Leap and Tumbleweed on openSUSE Leap and Tumbleweed
|
21
32
|
* Allow building of SLES11 and SLES12 on openSUSE Leap
|
33
|
+
* Add HTML landing page, which lists all system descriptions on your system
|
22
34
|
|
23
35
|
## Version 1.16.1 - Mon Nov 09 17:55:15 CET 2015 - thardeck@suse.de
|
24
36
|
|
data/bin/machinery
CHANGED
@@ -26,7 +26,6 @@ begin
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
LocalSystem.validate_machinery_compatibility
|
30
29
|
Machinery.initialize_logger(ENV["MACHINERY_LOG_FILE"] || Machinery::DEFAULT_LOG_FILE)
|
31
30
|
command_log = "Executing (Version #{Machinery::VERSION}) '#{$PROGRAM_NAME} #{ARGV.join(" ")}'"
|
32
31
|
command_log += " (store: #{ENV["MACHINERY_DIR"]})" if ENV["MACHINERY_DIR"]
|
@@ -0,0 +1,59 @@
|
|
1
|
+
!!!
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title
|
5
|
+
Machinery System Descriptions
|
6
|
+
%meta{ :charset => 'utf-8' }
|
7
|
+
%link{ :href => "assets/machinery-base.css", :rel => "stylesheet", :type => "text/css" }
|
8
|
+
%link{ :href => "assets/machinery.css", :rel => "stylesheet", :type => "text/css" }
|
9
|
+
%script{ :src => "assets/jquery-2.1.1.min.js" }
|
10
|
+
%script{ :src => "assets/jquery.searcher.min.js" }
|
11
|
+
%script{ :src => "assets/machinery-base.js" }
|
12
|
+
%script{ :src => "assets/show/machinery.js" }
|
13
|
+
%script{ :src => "assets/bootstrap-tooltip.js" }
|
14
|
+
%script{ :src => "assets/bootstrap-popover.js" }
|
15
|
+
|
16
|
+
%body
|
17
|
+
.container-fluid
|
18
|
+
#nav-bar
|
19
|
+
.row
|
20
|
+
.col-xs-1
|
21
|
+
.col-xs-10
|
22
|
+
%h1
|
23
|
+
System Descriptions
|
24
|
+
.row
|
25
|
+
.filter-input.col-md-3.col-md-offset-1
|
26
|
+
%input.col-md-8#filter{ :placeholder => "Type to Filter" }
|
27
|
+
%a.btn.btn-default.btn-reset{ :href => "#", :title => "Reset Filter" }
|
28
|
+
%span Reset
|
29
|
+
|
30
|
+
.col-xs-6.nav-buttons
|
31
|
+
%small.pull-right.pad-top
|
32
|
+
created by
|
33
|
+
%a{ :href => "http://machinery-project.org", :target => "_blank" }
|
34
|
+
Machinery
|
35
|
+
|
36
|
+
|
37
|
+
#content_container
|
38
|
+
= render_partial "landing_page/alert"
|
39
|
+
- if @all_descriptions.empty?
|
40
|
+
%p.col-md-5.col-md-offset-1
|
41
|
+
%strong
|
42
|
+
No system descriptions available on your machine.
|
43
|
+
- else
|
44
|
+
%table.table.table-striped.table-condensed.filterable
|
45
|
+
%thead
|
46
|
+
%tr
|
47
|
+
%th Name
|
48
|
+
%th Last update
|
49
|
+
%th Scopes
|
50
|
+
%th Host
|
51
|
+
%tbody
|
52
|
+
- @all_descriptions.each do |key, value|
|
53
|
+
%tr
|
54
|
+
%td
|
55
|
+
%a{ :href => "/#{key}" }
|
56
|
+
#{key}
|
57
|
+
%td= value["date"]
|
58
|
+
%td= value["scopes"].join(", ")
|
59
|
+
%td= value["host"].join(", ")
|
data/lib/build_task.rb
CHANGED
@@ -18,8 +18,8 @@
|
|
18
18
|
class BuildTask
|
19
19
|
def build(system_description, output_path, options = {})
|
20
20
|
LocalSystem.validate_architecture("x86_64")
|
21
|
-
LocalSystem.validate_build_compatibility(system_description)
|
22
21
|
LocalSystem.validate_existence_of_packages(["kiwi", "kiwi-desc-vmxboot"])
|
22
|
+
system_description.validate_build_compatibility
|
23
23
|
|
24
24
|
tmp_config_dir = Dir.mktmpdir("machinery-config", "/tmp")
|
25
25
|
tmp_image_dir = Dir.mktmpdir("machinery-image", "/tmp")
|
data/lib/cli.rb
CHANGED
@@ -75,16 +75,6 @@ class Cli
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
-
def self.buildable_distributions
|
79
|
-
distribution_string = ""
|
80
|
-
Os.supported_host_systems.each do |distribution|
|
81
|
-
distribution_string += "* #{distribution.canonical_name}\n\n"
|
82
|
-
distribution_string += distribution.buildable_systems.map(&:canonical_name).join(", ")
|
83
|
-
distribution_string += "\n\n"
|
84
|
-
end
|
85
|
-
distribution_string
|
86
|
-
end
|
87
|
-
|
88
78
|
def self.handle_error(e)
|
89
79
|
Machinery::Ui.kill_pager
|
90
80
|
|
@@ -312,10 +302,6 @@ class Cli
|
|
312
302
|
long_desc <<-LONGDESC
|
313
303
|
Build image from a given system description and store it to the given
|
314
304
|
location.
|
315
|
-
|
316
|
-
The following combinations of build hosts and targets are supported:
|
317
|
-
|
318
|
-
#{buildable_distributions}
|
319
305
|
LONGDESC
|
320
306
|
arg "NAME"
|
321
307
|
command "build" do |c|
|
@@ -663,8 +649,7 @@ class Cli
|
|
663
649
|
system.stop
|
664
650
|
end
|
665
651
|
|
666
|
-
|
667
|
-
Hint.print(:show_data, name: name)
|
652
|
+
Hint.print(:show_data, name: name) unless options[:show]
|
668
653
|
|
669
654
|
if !options["extract-files"] || Inspector.all_scopes.count != scope_list.count
|
670
655
|
Hint.print(:do_complete_inspection, name: name, docker_container: image)
|
@@ -688,10 +673,26 @@ class Cli
|
|
688
673
|
desc: "Display additional information about origin of scopes"
|
689
674
|
c.switch :short, required: false, negatable: false,
|
690
675
|
desc: "List only description names"
|
676
|
+
c.switch :html, required: false, negatable: false,
|
677
|
+
desc: "Open overview of all system descriptions in HTML format in your web browser"
|
691
678
|
|
692
679
|
c.action do |global_options,options,args|
|
680
|
+
if options[:html]
|
681
|
+
begin
|
682
|
+
check_port_validity(@config.http_server_port)
|
683
|
+
rescue Machinery::Errors::ServerPortError => e
|
684
|
+
raise Machinery::Errors::InvalidCommandLine.new(e.message + " The port can be " \
|
685
|
+
"specified in the 'http_server_port' section of the configuration file.")
|
686
|
+
end
|
687
|
+
end
|
688
|
+
|
689
|
+
opts = {
|
690
|
+
ip: "127.0.0.1",
|
691
|
+
port: @config.http_server_port
|
692
|
+
}.merge(options)
|
693
|
+
|
693
694
|
task = ListTask.new
|
694
|
-
task.list(system_description_store, args,
|
695
|
+
task.list(system_description_store, args, opts)
|
695
696
|
end
|
696
697
|
end
|
697
698
|
|
@@ -883,7 +884,7 @@ class Cli
|
|
883
884
|
value = args[1]
|
884
885
|
end
|
885
886
|
|
886
|
-
task = ConfigTask.new
|
887
|
+
task = ConfigTask.new(@config)
|
887
888
|
task.config(key, value)
|
888
889
|
|
889
890
|
if key == "hints" && (value == "false" || value == "off")
|
@@ -893,14 +894,14 @@ class Cli
|
|
893
894
|
end
|
894
895
|
end
|
895
896
|
|
896
|
-
desc "Start a
|
897
|
+
desc "Start a web server for viewing system descriptions"
|
897
898
|
long_desc <<-LONGDESC
|
898
|
-
Starts a web server which serves an HTML view
|
899
|
+
Starts a web server which serves an HTML view of all system descriptions and
|
900
|
+
an overview page listing all descriptions.
|
899
901
|
LONGDESC
|
900
|
-
arg "NAME"
|
901
902
|
command "serve" do |c|
|
902
903
|
c.flag [:port, :p], type: Integer, required: false,
|
903
|
-
default_value:
|
904
|
+
default_value: @config.http_server_port,
|
904
905
|
desc: "Listen on port PORT. Ports can be selected in a range between 2-65535. Ports between
|
905
906
|
2 and 1023 can only be chosen when `machinery` will be executed as `root` user.",
|
906
907
|
arg_name: "PORT"
|
@@ -908,8 +909,6 @@ class Cli
|
|
908
909
|
desc: "Makes the server reachable from all IP addresses."
|
909
910
|
|
910
911
|
c.action do |_global_options, options, args|
|
911
|
-
name = shift_arg(args, "NAME")
|
912
|
-
|
913
912
|
begin
|
914
913
|
check_port_validity(options[:port])
|
915
914
|
rescue Machinery::Errors::ServerPortError => e
|
@@ -918,19 +917,10 @@ class Cli
|
|
918
917
|
"or via the --port option.")
|
919
918
|
end
|
920
919
|
|
921
|
-
if options[:public]
|
922
|
-
ip = "0.0.0.0"
|
923
|
-
|
924
|
-
Machinery::Ui.warn("The --public option makes ALL of your system descriptions publicly " \
|
925
|
-
"available. Take care if there are system descriptions that should not be read by " \
|
926
|
-
"others!\n\n")
|
927
|
-
else
|
928
|
-
ip = "127.0.0.1"
|
929
|
-
end
|
930
|
-
|
931
|
-
description = SystemDescription.load(name, system_description_store)
|
932
920
|
task = ServeHtmlTask.new
|
933
|
-
task.serve(
|
921
|
+
task.serve(
|
922
|
+
system_description_store, port: options[:port], public: options[:public]
|
923
|
+
)
|
934
924
|
end
|
935
925
|
end
|
936
926
|
|
data/lib/config.rb
CHANGED
@@ -40,14 +40,14 @@ module Machinery
|
|
40
40
|
description: "Enable experimental features. See " \
|
41
41
|
"https://github.com/SUSE/machinery/wiki/Experimental-Features for more details"
|
42
42
|
)
|
43
|
-
entry("perform_support_check",
|
44
|
-
default: true,
|
45
|
-
description: "Check whether the current platform is supported by Machinery"
|
46
|
-
)
|
47
43
|
entry("http_server_port",
|
48
44
|
default: 7585,
|
49
45
|
description: "TCP port used by the HTTP server for the HTML view"
|
50
46
|
)
|
51
47
|
end
|
48
|
+
|
49
|
+
def deprecated_entries
|
50
|
+
["perform_support_check"]
|
51
|
+
end
|
52
52
|
end
|
53
53
|
end
|
data/lib/config_base.rb
CHANGED
@@ -32,6 +32,7 @@ class ConfigBase
|
|
32
32
|
abstract_method :default_config_files
|
33
33
|
|
34
34
|
abstract_method :define_entries
|
35
|
+
abstract_method :deprecated_entries
|
35
36
|
|
36
37
|
def entry(key, parameters = {})
|
37
38
|
key = normalize_key(key)
|
@@ -53,18 +54,23 @@ class ConfigBase
|
|
53
54
|
end
|
54
55
|
|
55
56
|
def set(key, value, options = {auto_save: true} )
|
56
|
-
|
57
|
-
|
57
|
+
if deprecated?(key)
|
58
|
+
@entries.delete(key)
|
59
|
+
else
|
60
|
+
key = normalize_key(key)
|
61
|
+
ensure_config_exists(key)
|
62
|
+
|
63
|
+
# Check if data type is correct. true and false are not of the same type which makes the
|
64
|
+
# check complex
|
65
|
+
if value.class != @entries[key][:value].class &&
|
66
|
+
!(boolean?(value) && boolean?(@entries[key][:value]))
|
67
|
+
raise Machinery::Errors::MachineryError,
|
68
|
+
"The value '#{value}' for configuration key '#{key}' is of an invalid data type."
|
69
|
+
end
|
58
70
|
|
59
|
-
|
60
|
-
if value.class != @entries[key][:value].class &&
|
61
|
-
!(boolean?(value) && boolean?(@entries[key][:value]))
|
62
|
-
raise Machinery::Errors::MachineryError,
|
63
|
-
"The value '#{value}' for configuration key '#{key}' is of an invalid data type."
|
71
|
+
@entries[key][:value] = value
|
64
72
|
end
|
65
73
|
|
66
|
-
@entries[key][:value] = value
|
67
|
-
|
68
74
|
save if options[:auto_save]
|
69
75
|
end
|
70
76
|
|
@@ -77,7 +83,7 @@ class ConfigBase
|
|
77
83
|
def save
|
78
84
|
config_table_stripped = {}
|
79
85
|
@entries.each do |key,value|
|
80
|
-
config_table_stripped[key] = value[:value]
|
86
|
+
config_table_stripped[key] = value[:value] unless deprecated?(key)
|
81
87
|
end
|
82
88
|
|
83
89
|
FileUtils.mkdir_p(File.dirname(file))
|
@@ -94,6 +100,8 @@ class ConfigBase
|
|
94
100
|
content = read_config_file(file) || []
|
95
101
|
|
96
102
|
content.each do |key, value|
|
103
|
+
next if deprecated?(key)
|
104
|
+
|
97
105
|
begin
|
98
106
|
set(key, value, :auto_save => false )
|
99
107
|
rescue => e
|
@@ -129,4 +137,8 @@ class ConfigBase
|
|
129
137
|
def unnormalize_key(key)
|
130
138
|
key.gsub("_", "-")
|
131
139
|
end
|
140
|
+
|
141
|
+
def deprecated?(key)
|
142
|
+
deprecated_entries.include?(key)
|
143
|
+
end
|
132
144
|
end
|
data/lib/deploy_task.rb
CHANGED
@@ -19,7 +19,7 @@ class DeployTask
|
|
19
19
|
def deploy(description, cloud_config, options = {})
|
20
20
|
LocalSystem.validate_architecture("x86_64")
|
21
21
|
LocalSystem.validate_existence_of_packages(["python-glanceclient", "kiwi", "kiwi-desc-vmxboot"])
|
22
|
-
|
22
|
+
description.validate_build_compatibility
|
23
23
|
|
24
24
|
if !File.exists?(cloud_config)
|
25
25
|
raise(Machinery::Errors::DeployFailed,
|
data/lib/exceptions.rb
CHANGED
@@ -46,9 +46,15 @@ module Machinery
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def to_s
|
49
|
-
|
50
|
-
|
51
|
-
|
49
|
+
if !@format_version
|
50
|
+
"#{@name}: incompatible format version. Can not be upgraded."
|
51
|
+
elsif @format_version < SystemDescription::CURRENT_FORMAT_VERSION
|
52
|
+
"#{@name}: format version #{@format_version}, needs to be upgraded. " \
|
53
|
+
"Try '#{Hint.program_name} upgrade-format #{name}' to upgrade it to the current version."
|
54
|
+
else
|
55
|
+
"#{@name}: format version #{@format_version}. " \
|
56
|
+
"Please upgrade Machinery to the latest version."
|
57
|
+
end
|
52
58
|
end
|
53
59
|
end
|
54
60
|
|
data/lib/export_task.rb
CHANGED
@@ -22,7 +22,6 @@ class ExportTask
|
|
22
22
|
|
23
23
|
def export(output_dir, options)
|
24
24
|
@exporter.system_description.assert_scopes("os")
|
25
|
-
@exporter.system_description.validate_export_compatibility
|
26
25
|
|
27
26
|
["unmanaged_files", "changed_managed_files", "config_files"].each do |scope|
|
28
27
|
if @exporter.system_description[scope] &&
|
data/lib/helper.rb
CHANGED
@@ -22,6 +22,10 @@ module Machinery
|
|
22
22
|
|
23
23
|
def self.content_is_binary?(content)
|
24
24
|
!Cheetah.run("file", "-b", "-", stdout: :capture, stdin: content).include?(" text")
|
25
|
+
# newer versions of file exit != 0 when some ELF files are sliced
|
26
|
+
# the file type is still provided besides the exit code
|
27
|
+
rescue Cheetah::ExecutionFailed => e
|
28
|
+
!e.stdout.include?(" text")
|
25
29
|
end
|
26
30
|
|
27
31
|
# Implementation of String#scrub for Ruby < 2.1. Assumes the string is in
|
data/lib/html.rb
CHANGED
@@ -19,29 +19,39 @@ class Html
|
|
19
19
|
# Creates a new thread running a sinatra webserver which serves the local system descriptions
|
20
20
|
# The Thread object is returned so that the caller can `.join` it until it's finished.
|
21
21
|
def self.run_server(system_description_store, opts, &block)
|
22
|
+
if opts[:public] && opts[:ip]
|
23
|
+
raise RuntimeError.new("It's only possible to use either an IP address or the 'public' " \
|
24
|
+
"flag bot not both.")
|
25
|
+
end
|
26
|
+
|
22
27
|
Thread.new do
|
23
|
-
|
24
|
-
|
25
|
-
Server.set :bind, opts[:ip] || "localhost"
|
26
|
-
Server.set :public_folder, File.join(Machinery::ROOT, "html")
|
27
|
-
Server.set :static_cache_control, "no-cache"
|
28
|
+
if opts[:public]
|
29
|
+
opts[:ip] = "0.0.0.0"
|
28
30
|
|
29
|
-
|
30
|
-
if opts[:ip] == "0.0.0.0"
|
31
|
-
Machinery::Ui.puts <<EOF
|
31
|
+
Machinery::Ui.warn <<-EOF.chomp
|
32
32
|
Warning:
|
33
|
-
The server
|
34
|
-
This could lead to confidential data like passwords or private keys being readable by others.
|
33
|
+
The --public option makes the HTTP server listen on all configured IP addresses. Everyone who has access to one of those IP addresses can access all of your system descriptions stored in '~/.machinery'. Be careful if there are sensible information (such as private keys) stored in one of your descriptions.
|
35
34
|
EOF
|
36
|
-
|
37
|
-
|
35
|
+
elsif opts[:ip] == "0.0.0.0"
|
36
|
+
Machinery::Ui.warn <<-EOF.chomp
|
38
37
|
Warning:
|
39
|
-
|
40
|
-
This could lead to confidential data like passwords or private keys being readable by others.
|
38
|
+
The server is listening on all configured IP addresses. Everyone who has access to one of those IP addresses can access all of your system descriptions stored in '~/.machinery'. Be careful if there are sensible information (such as private keys) stored in one of your descriptions.
|
41
39
|
EOF
|
42
|
-
|
40
|
+
elsif opts[:ip] && opts[:ip] != "localhost" && opts[:ip] != "127.0.0.1"
|
41
|
+
Machinery::Ui.warn <<-EOF.chomp
|
42
|
+
Warning:
|
43
|
+
You specified an IP address other than '127.0.0.1', your server may be reachable from the network. Everyone who can access that network can access your system descriptions stored in '~/.machinery'. Be careful if there are sensible information (such as private keys) stored in one of your descriptions.
|
44
|
+
EOF
|
45
|
+
elsif !opts[:ip]
|
46
|
+
opts[:ip] = "127.0.0.1"
|
43
47
|
end
|
44
48
|
|
49
|
+
Server.set :system_description_store, system_description_store
|
50
|
+
Server.set :port, opts[:port] || Machinery::Config.new.http_server_port
|
51
|
+
Server.set :bind, opts[:ip]
|
52
|
+
Server.set :public_folder, File.join(Machinery::ROOT, "html")
|
53
|
+
Server.set :static_cache_control, "no-cache"
|
54
|
+
|
45
55
|
begin
|
46
56
|
setup_output_redirection
|
47
57
|
begin
|
data/lib/kiwi_config.rb
CHANGED
@@ -181,26 +181,8 @@ suseSetupProduct
|
|
181
181
|
suseImportBuildKey
|
182
182
|
suseConfig
|
183
183
|
EOF
|
184
|
-
|
185
|
-
|
186
|
-
boot = "vmxboot/suse-13.2"
|
187
|
-
bootloader = "grub2"
|
188
|
-
when OsOpenSuse13_1
|
189
|
-
boot = "vmxboot/suse-13.1"
|
190
|
-
bootloader = "grub2"
|
191
|
-
when OsSles12
|
192
|
-
boot = "vmxboot/suse-SLES12"
|
193
|
-
bootloader = "grub2"
|
194
|
-
when OsSles11
|
195
|
-
boot = "vmxboot/suse-SLES11"
|
196
|
-
bootloader = "grub"
|
197
|
-
when OsOpenSuseTumbleweed
|
198
|
-
boot = "vmxboot/suse-tumbleweed"
|
199
|
-
bootloader = "grub2"
|
200
|
-
when OsOpenSuseLeap
|
201
|
-
boot = "vmxboot/suse-leap42.1"
|
202
|
-
bootloader = "grub2"
|
203
|
-
else
|
184
|
+
|
185
|
+
unless @system_description.os.is_a?(OsSuse)
|
204
186
|
raise Machinery::Errors::ExportFailed.new(
|
205
187
|
"Export is not possible because the operating system " \
|
206
188
|
"'#{@system_description.os.display_name}' is not supported."
|
@@ -218,8 +200,13 @@ EOF
|
|
218
200
|
xml.preferences do
|
219
201
|
xml.packagemanager "zypper"
|
220
202
|
xml.version "0.0.1"
|
221
|
-
xml.type_(
|
222
|
-
|
203
|
+
xml.type_(
|
204
|
+
image: "vmx",
|
205
|
+
filesystem: "ext3",
|
206
|
+
installiso: "true",
|
207
|
+
boot: @system_description.os.kiwi_boot,
|
208
|
+
format: "qcow2", bootloader: @system_description.os.kiwi_bootloader
|
209
|
+
)
|
223
210
|
end
|
224
211
|
|
225
212
|
xml.users(group: "root") do
|
data/lib/list_task.rb
CHANGED
@@ -17,77 +17,100 @@
|
|
17
17
|
|
18
18
|
class ListTask
|
19
19
|
def list(store, system_descriptions, options = {})
|
20
|
-
if
|
21
|
-
|
20
|
+
if options[:html]
|
21
|
+
list_html(store, options)
|
22
22
|
else
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
descriptions.each do |name|
|
28
|
-
begin
|
29
|
-
system_description = SystemDescription.load(name, store, skip_validation: true)
|
30
|
-
rescue Machinery::Errors::SystemDescriptionIncompatible => e
|
31
|
-
if !e.format_version
|
32
|
-
show_error("#{name}: incompatible format version. Can not be upgraded.\n", options)
|
33
|
-
elsif e.format_version < SystemDescription::CURRENT_FORMAT_VERSION
|
34
|
-
show_error("#{name}: format version #{e.format_version}, " \
|
35
|
-
"needs to be upgraded.", options)
|
36
|
-
has_incompatible_version = true
|
37
|
-
else
|
38
|
-
show_error("#{name}: format version #{e.format_version}. " \
|
39
|
-
"Please upgrade Machinery to the latest version.", options)
|
40
|
-
end
|
41
|
-
next
|
42
|
-
rescue Machinery::Errors::SystemDescriptionNotFound
|
43
|
-
show_error("#{name}: Couldn't find a system description with the name '#{name}'.", options)
|
44
|
-
next
|
45
|
-
rescue Machinery::Errors::SystemDescriptionValidationFailed
|
46
|
-
show_error("#{name}: This description is broken. Use " \
|
47
|
-
"`#{Hint.program_name} validate #{name}` to see the error message.", options)
|
48
|
-
next
|
49
|
-
rescue Machinery::Errors::SystemDescriptionError
|
50
|
-
show_error("#{name}: This description is broken.", options)
|
51
|
-
next
|
23
|
+
if system_descriptions.empty?
|
24
|
+
descriptions = store.list
|
25
|
+
else
|
26
|
+
descriptions = system_descriptions.sort
|
52
27
|
end
|
28
|
+
has_incompatible_version = false
|
53
29
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
30
|
+
descriptions.each do |name|
|
31
|
+
begin
|
32
|
+
system_description = SystemDescription.load(name, store, skip_validation: true)
|
33
|
+
rescue Machinery::Errors::SystemDescriptionIncompatible => e
|
34
|
+
show_error("#{e}\n", options)
|
35
|
+
next
|
36
|
+
rescue Machinery::Errors::SystemDescriptionNotFound
|
37
|
+
show_error(
|
38
|
+
"#{name}: Couldn't find a system description with the name '#{name}'.", options
|
39
|
+
)
|
40
|
+
next
|
41
|
+
rescue Machinery::Errors::SystemDescriptionValidationFailed
|
42
|
+
show_error("#{name}: This description is broken. Use " \
|
43
|
+
"`#{Hint.program_name} validate #{name}` to see the error message.", options)
|
44
|
+
next
|
45
|
+
rescue Machinery::Errors::SystemDescriptionError
|
46
|
+
show_error("#{name}: This description is broken.", options)
|
47
|
+
next
|
48
|
+
end
|
49
|
+
|
50
|
+
if options[:short]
|
51
|
+
Machinery::Ui.puts name
|
52
|
+
else
|
53
|
+
scopes = []
|
54
|
+
|
55
|
+
system_description.scopes.each do |scope|
|
56
|
+
entry = Machinery::Ui.internal_scope_list_to_string(scope)
|
57
|
+
if SystemDescription::EXTRACTABLE_SCOPES.include?(scope)
|
58
|
+
if system_description.scope_extracted?(scope)
|
59
|
+
entry += " (extracted)"
|
60
|
+
else
|
61
|
+
entry += " (not extracted)"
|
62
|
+
end
|
66
63
|
end
|
67
|
-
end
|
68
64
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
65
|
+
if options[:verbose]
|
66
|
+
meta = system_description[scope].meta
|
67
|
+
if meta
|
68
|
+
time = Time.parse(meta.modified).getlocal
|
69
|
+
date = time.strftime "%Y-%m-%d %H:%M:%S"
|
70
|
+
hostname = meta.hostname
|
71
|
+
else
|
72
|
+
date = "unknown"
|
73
|
+
hostname = "Unknown hostname"
|
74
|
+
end
|
75
|
+
entry += "\n Host: [#{hostname}]"
|
76
|
+
entry += "\n Date: (#{date})"
|
78
77
|
end
|
79
|
-
|
80
|
-
|
78
|
+
|
79
|
+
scopes << entry
|
81
80
|
end
|
82
81
|
|
83
|
-
scopes
|
82
|
+
Machinery::Ui.puts " #{name}:\n * " + scopes .join("\n * ") + "\n"
|
84
83
|
end
|
85
|
-
|
86
|
-
Machinery::Ui.puts " #{name}:\n * " + scopes .join("\n * ") + "\n"
|
87
84
|
end
|
85
|
+
|
86
|
+
Hint.print(:upgrade_system_description) if has_incompatible_version
|
88
87
|
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def list_html(store, options)
|
91
|
+
begin
|
92
|
+
LocalSystem.validate_existence_of_command("xdg-open", "xdg-utils")
|
93
|
+
|
94
|
+
url = "http://#{options[:ip]}:#{options[:port]}/"
|
89
95
|
|
90
|
-
|
96
|
+
Machinery::Ui.use_pager = false
|
97
|
+
Machinery::Ui.puts <<EOF
|
98
|
+
Trying to start a web server for serving the descriptions on #{url}.
|
99
|
+
|
100
|
+
The server can be closed with Ctrl+C.
|
101
|
+
EOF
|
102
|
+
|
103
|
+
server = Html.run_server(store, port: options[:port], ip: options[:ip]) do
|
104
|
+
LoggedCheetah.run("xdg-open", url)
|
105
|
+
end
|
106
|
+
|
107
|
+
server.join # Wait until the user cancelled the blocking webserver
|
108
|
+
rescue Cheetah::ExecutionFailed => e
|
109
|
+
raise Machinery::Errors::OpenInBrowserFailed.new(
|
110
|
+
"Could not open system descriptions in the web browser.\n" \
|
111
|
+
"Error: #{e}\n"
|
112
|
+
)
|
113
|
+
end
|
91
114
|
end
|
92
115
|
|
93
116
|
private
|
data/lib/local_system.rb
CHANGED
@@ -77,34 +77,6 @@ You can install it by running `zypper install #{package}`.
|
|
77
77
|
raise(Machinery::Errors::MissingRequirement.new(output))
|
78
78
|
end
|
79
79
|
|
80
|
-
def validate_machinery_compatibility
|
81
|
-
return if !Machinery::Config.new.perform_support_check || os.can_run_machinery?
|
82
|
-
|
83
|
-
supported_oses = Os.supported_host_systems.map { |o| o.canonical_name }.sort.join(", ")
|
84
|
-
message = <<EOF
|
85
|
-
You are running Machinery on a platform we do not explicitly support and test.
|
86
|
-
It still could work very well. If you run into issues or would like to provide us feedback, you are welcome to file an issue at https://github.com/SUSE/machinery/issues/new or write an email to machinery@lists.suse.com.
|
87
|
-
Officially supported operating systems are: '#{supported_oses}'
|
88
|
-
|
89
|
-
To disable this message in the machinery configuration use 'machinery config perform-support-check=false'
|
90
|
-
EOF
|
91
|
-
|
92
|
-
Machinery::Ui.warn message
|
93
|
-
end
|
94
|
-
|
95
|
-
def validate_build_compatibility(system_description)
|
96
|
-
if !os.can_build?(system_description.os)
|
97
|
-
message = "Building '#{system_description.os.display_name}' is " \
|
98
|
-
"not supported on this distribution.\n" \
|
99
|
-
"Check the 'BUILD SUPPORT MATRIX' by running `#{Hint.program_name} build --help` for " \
|
100
|
-
"further information which build targets are supported.\n" \
|
101
|
-
"You are only able to build the architecture you are running " \
|
102
|
-
"(#{LocalSystem.os.architecture})."
|
103
|
-
|
104
|
-
raise(Machinery::Errors::BuildFailed.new(message))
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
80
|
def matches_architecture?(arch)
|
109
81
|
os.architecture == arch
|
110
82
|
end
|
data/lib/serve_html_task.rb
CHANGED
@@ -16,17 +16,24 @@
|
|
16
16
|
# you may find current contact information at www.suse.com
|
17
17
|
|
18
18
|
class ServeHtmlTask
|
19
|
-
def serve(
|
20
|
-
url = "http
|
21
|
-
|
19
|
+
def serve(system_description_store, opts)
|
20
|
+
url = "http://127.0.0.1:#{opts[:port]}/"
|
22
21
|
Machinery::Ui.use_pager = false
|
23
22
|
Machinery::Ui.puts <<EOF
|
24
|
-
Trying to start a web server for
|
23
|
+
Trying to start a web server for serving a view on all system descriptions.
|
24
|
+
|
25
|
+
The overview of all descriptions is accessible at:
|
26
|
+
|
27
|
+
#{url}
|
28
|
+
|
29
|
+
A specific descriptions with the name NAME is accessible at:
|
30
|
+
|
31
|
+
#{url}NAME
|
25
32
|
|
26
33
|
The web server can be closed with Ctrl+C.
|
27
34
|
EOF
|
28
35
|
|
29
|
-
server = Html.run_server(
|
36
|
+
server = Html.run_server(system_description_store, port: opts[:port], public: opts[:public])
|
30
37
|
|
31
38
|
server.join
|
32
39
|
end
|
data/lib/server.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
# Copyright (c) 2013-2015 SUSE LLC
|
2
3
|
#
|
3
4
|
# This program is free software; you can redistribute it and/or
|
@@ -214,6 +215,41 @@ class Server < Sinatra::Base
|
|
214
215
|
content
|
215
216
|
end
|
216
217
|
|
218
|
+
get "/" do
|
219
|
+
descriptions = settings.system_description_store.list
|
220
|
+
@all_descriptions = Hash.new
|
221
|
+
|
222
|
+
descriptions.each do |name|
|
223
|
+
scopes = []
|
224
|
+
begin
|
225
|
+
system_description = SystemDescription.load(
|
226
|
+
name, settings.system_description_store, skip_validation: true
|
227
|
+
)
|
228
|
+
@all_descriptions[name] = Hash.new
|
229
|
+
@all_descriptions[name]["date"] = system_description.latest_update
|
230
|
+
@all_descriptions[name]["host"] = system_description.host
|
231
|
+
system_description.scopes.each do |scope|
|
232
|
+
entry = Machinery::Ui.internal_scope_list_to_string(scope)
|
233
|
+
if SystemDescription::EXTRACTABLE_SCOPES.include?(scope)
|
234
|
+
if system_description.scope_extracted?(scope)
|
235
|
+
entry += " (extracted)"
|
236
|
+
else
|
237
|
+
entry += " (not extracted)"
|
238
|
+
end
|
239
|
+
end
|
240
|
+
scopes << entry
|
241
|
+
end
|
242
|
+
@all_descriptions[name]["scopes"] = scopes
|
243
|
+
rescue Machinery::Errors::SystemDescriptionIncompatible,
|
244
|
+
Machinery::Errors::SystemDescriptionError => e
|
245
|
+
@errors ||= Array.new
|
246
|
+
@errors.push(e)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
haml File.read(File.join(Machinery::ROOT, "html/landing_page.html.haml"))
|
251
|
+
end
|
252
|
+
|
217
253
|
get "/compare/:a/:b" do
|
218
254
|
@description_a = SystemDescription.load(params[:a], settings.system_description_store)
|
219
255
|
@description_b = SystemDescription.load(params[:b], settings.system_description_store)
|
data/lib/system_description.rb
CHANGED
@@ -154,16 +154,21 @@ class SystemDescription < Machinery::Object
|
|
154
154
|
end
|
155
155
|
|
156
156
|
def validate_analysis_compatibility
|
157
|
-
|
158
|
-
|
159
|
-
|
157
|
+
Zypper.isolated(arch: os.architecture) do |zypper|
|
158
|
+
major, minor, patch = zypper.version
|
159
|
+
if major <= 1 && minor <= 11 && patch < 4
|
160
|
+
raise Machinery::Errors::AnalysisFailed.new("Analyzing command requires zypper 1.11.4 " \
|
161
|
+
"or grater to be installed.")
|
162
|
+
end
|
160
163
|
end
|
161
164
|
end
|
162
165
|
|
163
|
-
def
|
164
|
-
|
165
|
-
|
166
|
-
|
166
|
+
def validate_build_compatibility
|
167
|
+
kiwi_template_path = "/usr/share/kiwi/image/#{os.kiwi_boot}"
|
168
|
+
unless Dir.exist?(kiwi_template_path)
|
169
|
+
raise Machinery::Errors::BuildFailed.new("The execution of the build script failed. " \
|
170
|
+
"Building of operating system '#{os.display_name}' can't be accomplished because the " \
|
171
|
+
"kiwi template file in `#{kiwi_template_path}` does not exist.")
|
167
172
|
end
|
168
173
|
end
|
169
174
|
|
@@ -265,6 +270,16 @@ class SystemDescription < Machinery::Object
|
|
265
270
|
end
|
266
271
|
end
|
267
272
|
|
273
|
+
def latest_update
|
274
|
+
attributes.keys.map { |scope| self[scope].meta.try(:[], "modified") }
|
275
|
+
.compact.map { |t| Time.parse(t) }.sort.last
|
276
|
+
end
|
277
|
+
|
278
|
+
def host
|
279
|
+
all_hosts = attributes.keys.map { |scope| self[scope].meta.try(:[], "hostname") }
|
280
|
+
all_hosts.uniq.compact
|
281
|
+
end
|
282
|
+
|
268
283
|
def description_path
|
269
284
|
@store.description_path(name)
|
270
285
|
end
|
data/lib/version.rb
CHANGED
data/lib/zypper.rb
CHANGED
@@ -80,6 +80,12 @@ class Zypper
|
|
80
80
|
xml.xpath("//localfile/@path").to_s
|
81
81
|
end
|
82
82
|
|
83
|
+
def version
|
84
|
+
version = call_zypper "--version", stdout: :capture
|
85
|
+
found = version.match(/zypper (\d+)\.(\d+)\.(\d+)/)
|
86
|
+
[found[1].to_i, found[2].to_i, found[3].to_i] if found
|
87
|
+
end
|
88
|
+
|
83
89
|
private
|
84
90
|
|
85
91
|
def call_zypper(*args)
|
data/machinery-helper/version.go
CHANGED
Binary file
|
@@ -72,7 +72,7 @@
|
|
72
72
|
<a href="#man-Shows-Man-Page">man — Shows Man Page</a>
|
73
73
|
<a href="#move-Move-System-Description">move — Move System Description</a>
|
74
74
|
<a href="#remove-Remove-System-Descriptions">remove — Remove System Descriptions</a>
|
75
|
-
<a href="#serve-Serve-
|
75
|
+
<a href="#serve-Serve-System-Descriptions-Using-A-Web-Server">serve — Serve System Descriptions Using A Web Server</a>
|
76
76
|
<a href="#show-Show-System-Description">show — Show System Description</a>
|
77
77
|
<a href="#upgrade-format-Upgrade-System-Description">upgrade-format — Upgrade System Description</a>
|
78
78
|
<a href="#validate-Validate-System-Description">validate — Validate System Description</a>
|
@@ -493,19 +493,16 @@ built image. The list of filters is shown at the beginning of the build.</p>
|
|
493
493
|
<h3 id="PREREQUISITES">PREREQUISITES</h3>
|
494
494
|
|
495
495
|
<ul>
|
496
|
-
<li><p>The <code>build</code> command requires the packages <code>kiwi</code> and <code>kiwi-desc-
|
496
|
+
<li><p>The <code>build</code> command requires the packages <code>kiwi</code> and <code>kiwi-desc-vmxboot</code>.</p></li>
|
497
|
+
<li><p>The necessary vmxboot template for the machinery being built must be
|
498
|
+
installed (i.e. if you want to build an openSUSE Leap machine then the
|
499
|
+
template <code>/usr/share/kiwi/image/vmxboot/suse-leap42.1</code> is required)</p></li>
|
497
500
|
<li><p>All repositories in the system description must be accessible from the
|
498
501
|
build machine on which <code>machinery build</code> is called.</p></li>
|
502
|
+
<li><p>Machinery can only build x86_64 images on x86_64 systems at the moment.</p></li>
|
499
503
|
</ul>
|
500
504
|
|
501
505
|
|
502
|
-
<h3 id="BUILD-SUPPORT-MATRIX">BUILD SUPPORT MATRIX</h3>
|
503
|
-
|
504
|
-
<p>Machinery only supports building x86_64 images on x86_64 systems.</p>
|
505
|
-
|
506
|
-
<p>To see the list of supported combinations of build hosts and targets run
|
507
|
-
<code>machinery build --help</code>.</p>
|
508
|
-
|
509
506
|
<h3 id="EXAMPLES">EXAMPLES</h3>
|
510
507
|
|
511
508
|
<ul>
|
@@ -1040,8 +1037,7 @@ by adding an '@' before the path, e.g.</p>
|
|
1040
1037
|
|
1041
1038
|
<h3 id="SYNOPSIS">SYNOPSIS</h3>
|
1042
1039
|
|
1043
|
-
<p><code>machinery list</code>
|
1044
|
-
[NAME[,NAME2[,NAME3]]]</p>
|
1040
|
+
<p><code>machinery list</code> [OPTIONS] [NAME[,NAME2[,NAME3]]]</p>
|
1045
1041
|
|
1046
1042
|
<p><code>machinery</code> help list</p>
|
1047
1043
|
|
@@ -1058,6 +1054,8 @@ scopes for each system.</p>
|
|
1058
1054
|
<dt><code>--verbose</code> (optional)</dt><dd>Print additional information about the origin of scopes.
|
1059
1055
|
Currently displays [HOSTNAME] and (DATE).</dd>
|
1060
1056
|
<dt><code>--short</code> (optional)</dt><dd>List only descripton names.</dd>
|
1057
|
+
<dt><code>--html</code> (optional)</dt><dd>Run a web server and open the list of system descriptions in HTML format in
|
1058
|
+
your web browser using the <code>xdg-open</code> command.</dd>
|
1061
1059
|
</dl>
|
1062
1060
|
|
1063
1061
|
|
@@ -1076,6 +1074,9 @@ Currently displays [HOSTNAME] and (DATE).</dd>
|
|
1076
1074
|
<dt>Lists all available system description names without any additional details:</dt><dd><p></p>
|
1077
1075
|
|
1078
1076
|
<p>$ <code>machinery</code> list --short</p></dd>
|
1077
|
+
<dt>Opens HTML view of list of all available system descriptions in web browser:</dt><dd><p></p>
|
1078
|
+
|
1079
|
+
<p>$ <code>machinery</code> list --html</p></dd>
|
1079
1080
|
</dl>
|
1080
1081
|
|
1081
1082
|
|
@@ -1162,32 +1163,30 @@ Currently displays [HOSTNAME] and (DATE).</dd>
|
|
1162
1163
|
</dl>
|
1163
1164
|
|
1164
1165
|
|
1165
|
-
<h2 id="serve-Serve-
|
1166
|
+
<h2 id="serve-Serve-System-Descriptions-Using-A-Web-Server">serve — Serve System Descriptions Using A Web Server</h2>
|
1166
1167
|
|
1167
1168
|
<h3 id="SYNOPSIS">SYNOPSIS</h3>
|
1168
1169
|
|
1169
|
-
<p><code>machinery serve</code> [-p PORT | --port=PORT] [--public]
|
1170
|
+
<p><code>machinery serve</code> [-p PORT | --port=PORT] [--public]</p>
|
1170
1171
|
|
1171
1172
|
<p><code>machinery</code> help serve</p>
|
1172
1173
|
|
1173
1174
|
<h3 id="DESCRIPTION">DESCRIPTION</h3>
|
1174
1175
|
|
1175
|
-
<p>The <code>serve</code> command spawns a web server
|
1176
|
-
|
1177
|
-
By default the description is available from http://127.0.0.1:7585 but both the
|
1178
|
-
IP address and the port can be configured using the according options.</p>
|
1179
|
-
|
1180
|
-
<h3 id="ARGUMENTS">ARGUMENTS</h3>
|
1176
|
+
<p>The <code>serve</code> command spawns a web server to view system descriptions as an HTML
|
1177
|
+
view.</p>
|
1181
1178
|
|
1182
|
-
<
|
1183
|
-
|
1184
|
-
</dl>
|
1179
|
+
<p>By default the server is available from http://127.0.0.1:7585 but both the
|
1180
|
+
IP address and the port can be configured using the according options.</p>
|
1185
1181
|
|
1182
|
+
<p>Specific descriptions are available from http://127.0.0.1:7585/NAME, where NAME
|
1183
|
+
is the name of the system description. If no name is specified in the URL an
|
1184
|
+
overview of all descriptions is served.</p>
|
1186
1185
|
|
1187
1186
|
<h3 id="OPTIONS">OPTIONS</h3>
|
1188
1187
|
|
1189
1188
|
<dl>
|
1190
|
-
<dt><code>-p PORT</code>, <code>--port=PORT</code> (optional)</dt><dd><p>Specify the port on which the web server will serve the
|
1189
|
+
<dt><code>-p PORT</code>, <code>--port=PORT</code> (optional)</dt><dd><p>Specify the port on which the web server will serve the HTML view: Default: 7585</p>
|
1191
1190
|
|
1192
1191
|
<p>Ports can be selected in a range between 2-65535. Ports between 2 and 1023 can only be
|
1193
1192
|
chosen when <code>machinery</code> will be executed as <code>root</code> user.</p></dd>
|
@@ -1199,12 +1198,12 @@ the server will only listen on the localhost IP address 127.0.0.1</p></dd>
|
|
1199
1198
|
<h3 id="EXAMPLES">EXAMPLES</h3>
|
1200
1199
|
|
1201
1200
|
<dl>
|
1202
|
-
<dt>
|
1201
|
+
<dt>Start the server with default options:</dt><dd><p></p>
|
1203
1202
|
|
1204
|
-
<p>$ <code>machinery</code> serve
|
1205
|
-
<dt>Make the
|
1203
|
+
<p>$ <code>machinery</code> serve</p></dd>
|
1204
|
+
<dt>Make the server available to other machines on the network on port 3000:</dt><dd><p></p>
|
1206
1205
|
|
1207
|
-
<p>$ <code>machinery</code> serve
|
1206
|
+
<p>$ <code>machinery</code> serve --public --port 3000</p></dd>
|
1208
1207
|
</dl>
|
1209
1208
|
|
1210
1209
|
|
@@ -1380,7 +1379,7 @@ manually editing it.</p>
|
|
1380
1379
|
|
1381
1380
|
<ol class='man-decor man-foot man foot'>
|
1382
1381
|
<li class='tl'></li>
|
1383
|
-
<li class='tc'>
|
1382
|
+
<li class='tc'>January 2016</li>
|
1384
1383
|
<li class='tr'>machinery(1)</li>
|
1385
1384
|
</ol>
|
1386
1385
|
|
data/plugins/os/os_model.rb
CHANGED
@@ -36,6 +36,11 @@ class Os < Machinery::Object
|
|
36
36
|
return os
|
37
37
|
end
|
38
38
|
end
|
39
|
+
if os_name.match(/SUSE Linux|openSUSE/)
|
40
|
+
os = OsSuse.new
|
41
|
+
os.name = os_name
|
42
|
+
return os
|
43
|
+
end
|
39
44
|
os = OsUnknown.new
|
40
45
|
os.name = os_name
|
41
46
|
os
|
@@ -51,10 +56,6 @@ class Os < Machinery::Object
|
|
51
56
|
"os"
|
52
57
|
end
|
53
58
|
|
54
|
-
def self.buildable_systems
|
55
|
-
[]
|
56
|
-
end
|
57
|
-
|
58
59
|
def self.module_dependencies
|
59
60
|
{}
|
60
61
|
end
|
@@ -71,18 +72,6 @@ class Os < Machinery::Object
|
|
71
72
|
self.class.can_run_machinery?
|
72
73
|
end
|
73
74
|
|
74
|
-
def can_build?(os)
|
75
|
-
self.class.buildable_systems.include?(os.class) && os.architecture == "x86_64"
|
76
|
-
end
|
77
|
-
|
78
|
-
def can_be_analyzed?
|
79
|
-
false
|
80
|
-
end
|
81
|
-
|
82
|
-
def can_be_exported?
|
83
|
-
false
|
84
|
-
end
|
85
|
-
|
86
75
|
def module_required_by_package(package)
|
87
76
|
self.class.module_dependencies[package]
|
88
77
|
end
|
@@ -100,19 +89,24 @@ class OsUnknown < Os
|
|
100
89
|
def self.canonical_name
|
101
90
|
"Unknown OS"
|
102
91
|
end
|
103
|
-
|
104
|
-
def self.can_run_machinery?
|
105
|
-
false
|
106
|
-
end
|
107
92
|
end
|
108
93
|
|
109
94
|
class OsSuse < Os
|
110
|
-
def
|
111
|
-
|
112
|
-
end
|
113
|
-
|
114
|
-
def
|
115
|
-
|
95
|
+
def kiwi_bootloader
|
96
|
+
"grub2"
|
97
|
+
end
|
98
|
+
|
99
|
+
def kiwi_boot
|
100
|
+
os_version = version.match(/(\d+)+\.?(\d+)?/)
|
101
|
+
os_id = case name
|
102
|
+
when /SUSE Linux Enterprise Server/
|
103
|
+
"SLES#{os_version[1]}"
|
104
|
+
when /SUSE Linux Enterprise Desktop/
|
105
|
+
"SLED#{os_version[1]}"
|
106
|
+
when /openSUSE/
|
107
|
+
"#{os_version[1]}.#{os_version[2]}"
|
108
|
+
end
|
109
|
+
"vmxboot/suse-#{os_id}"
|
116
110
|
end
|
117
111
|
end
|
118
112
|
|
@@ -130,6 +124,10 @@ class OsSles11 < OsSuse
|
|
130
124
|
sp = $1
|
131
125
|
"#{name} #{sp} (#{architecture})"
|
132
126
|
end
|
127
|
+
|
128
|
+
def kiwi_bootloader
|
129
|
+
"grub"
|
130
|
+
end
|
133
131
|
end
|
134
132
|
|
135
133
|
class OsSles12 < OsSuse
|
@@ -137,10 +135,6 @@ class OsSles12 < OsSuse
|
|
137
135
|
"SUSE Linux Enterprise Server 12"
|
138
136
|
end
|
139
137
|
|
140
|
-
def self.buildable_systems
|
141
|
-
[OsSles12]
|
142
|
-
end
|
143
|
-
|
144
138
|
def self.module_dependencies
|
145
139
|
{ "python-glanceclient" => "Public Cloud Module" }
|
146
140
|
end
|
@@ -162,20 +156,12 @@ class OsOpenSuse13_1 < OsOpenSuse
|
|
162
156
|
def self.canonical_name
|
163
157
|
"openSUSE 13.1 (Bottle)"
|
164
158
|
end
|
165
|
-
|
166
|
-
def self.buildable_systems
|
167
|
-
[OsSles11, OsOpenSuse13_1]
|
168
|
-
end
|
169
159
|
end
|
170
160
|
|
171
161
|
class OsOpenSuse13_2 < OsOpenSuse
|
172
162
|
def self.canonical_name
|
173
163
|
"openSUSE 13.2 (Harlequin)"
|
174
164
|
end
|
175
|
-
|
176
|
-
def self.buildable_systems
|
177
|
-
[OsSles11, OsOpenSuse13_1, OsOpenSuse13_2]
|
178
|
-
end
|
179
165
|
end
|
180
166
|
|
181
167
|
class OsOpenSuseTumbleweed < OsSuse
|
@@ -187,8 +173,8 @@ class OsOpenSuseTumbleweed < OsSuse
|
|
187
173
|
"openSUSE Tumbleweed"
|
188
174
|
end
|
189
175
|
|
190
|
-
def
|
191
|
-
|
176
|
+
def kiwi_boot
|
177
|
+
"vmxboot/suse-tumbleweed"
|
192
178
|
end
|
193
179
|
end
|
194
180
|
|
@@ -201,8 +187,8 @@ class OsOpenSuseLeap < OsSuse
|
|
201
187
|
"openSUSE Leap"
|
202
188
|
end
|
203
189
|
|
204
|
-
def
|
205
|
-
|
190
|
+
def kiwi_boot
|
191
|
+
"vmxboot/suse-leap42.1"
|
206
192
|
end
|
207
193
|
end
|
208
194
|
|
@@ -210,8 +196,4 @@ class Rhel < Os
|
|
210
196
|
def self.canonical_name
|
211
197
|
"Red Hat Enterprise Linux Server"
|
212
198
|
end
|
213
|
-
|
214
|
-
def self.can_run_machinery?
|
215
|
-
false
|
216
|
-
end
|
217
199
|
end
|
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.16.
|
4
|
+
version: 1.16.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SUSE
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cheetah
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.6.
|
61
|
+
version: 1.6.1
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.6.
|
68
|
+
version: 1.6.1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: gli
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -254,6 +254,7 @@ files:
|
|
254
254
|
- html/assets/file_loader.gif
|
255
255
|
- html/assets/jquery-2.1.1.min.js
|
256
256
|
- html/assets/jquery.searcher.min.js
|
257
|
+
- html/assets/landing_page/landing_page.js
|
257
258
|
- html/assets/machinery-base.css
|
258
259
|
- html/assets/machinery-base.js
|
259
260
|
- html/assets/machinery.css
|
@@ -264,6 +265,7 @@ files:
|
|
264
265
|
- html/assets/wheels_horizontal.png
|
265
266
|
- html/comparison.html.haml
|
266
267
|
- html/index.html.haml
|
268
|
+
- html/landing_page.html.haml
|
267
269
|
- html/partials/changed_managed_files.html.haml
|
268
270
|
- html/partials/compare/alert.html.haml
|
269
271
|
- html/partials/compare/changed_managed_file_list.html.haml
|
@@ -290,6 +292,7 @@ files:
|
|
290
292
|
- html/partials/compare/users.html.haml
|
291
293
|
- html/partials/config_files.html.haml
|
292
294
|
- html/partials/groups.html.haml
|
295
|
+
- html/partials/landing_page/alert.html.haml
|
293
296
|
- html/partials/os.html.haml
|
294
297
|
- html/partials/packages.html.haml
|
295
298
|
- html/partials/patterns.html.haml
|