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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0ecc7e8c551b4a94ba94c921c02e198882eb6b85
4
- data.tar.gz: 156530beeec1101c895e4ebb6cfb27cf393893fd
3
+ metadata.gz: 5c00eaca55ecc5e08f71d08727977495e8e323a7
4
+ data.tar.gz: a5fbe828a941ad0d80d00e7fdd3ab6d0faa4e9af
5
5
  SHA512:
6
- metadata.gz: 9822b03a132a39c6209325c5bfd36963c90f17c8171770d98b2ac351bbca875dd53c1c3bc019ccd394fe16d6775f9c7b993b8dbaff81d2cbc6e7fdbf7767f8d0
7
- data.tar.gz: 43af578c434b7956a6480dec62ccd3e2678719d345102f03a57b8c6b9cdc15404f92e52b35e53b462f24a135e4978928b5e6df7ac11743ada2ea6bd389bcc6fb
6
+ metadata.gz: c4166a79a449b345f5a910c0f6f96058952cd7b609dc999733249f315058b00192e6cffd87f462f3f09d27dc162286925433efb2464a319857cdf542345bf817
7
+ data.tar.gz: a8ab3cdd686c51759c28fd3361d6729cb7d1012f929656c077454aee5d51924d302641cf5899f093c43c15eb5b9e178efa656a102ac493ae82d62f0d07c273d0
@@ -1 +1 @@
1
- 4afb989b21b401f983686603e6521c112630cac9
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
 
@@ -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,10 @@
1
+ $(document).ready(function () {
2
+ // Set up filter
3
+ $(".filterable").searcher({
4
+ inputSelector: "#filter"
5
+ });
6
+ $("#reset-filter").click(function () {
7
+ $("#filter").val("").change()
8
+ });
9
+
10
+ })
@@ -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(", ")
@@ -0,0 +1,9 @@
1
+ - if @errors
2
+ .scope#alert_container
3
+ .row
4
+ .col-xs-10.col-xs-offset-1
5
+ .well
6
+ %span.text-right.dismiss{ title: "Collapse/Expand" }
7
+ - @errors.each do |error|
8
+ %p
9
+ = error
@@ -18,6 +18,7 @@
18
18
  class AnalyzeConfigFileDiffsTask
19
19
  def analyze(description)
20
20
  description.assert_scopes("os")
21
+ LocalSystem.validate_existence_of_packages(["zypper"])
21
22
  description.validate_analysis_compatibility
22
23
  description.assert_scopes(
23
24
  "repositories",
@@ -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, options)
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 webserver serving an HTML view of a system description"
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 for the given system description.
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: Machinery::Config.new.http_server_port,
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(description, ip, options[:port])
921
+ task.serve(
922
+ system_description_store, port: options[:port], public: options[:public]
923
+ )
934
924
  end
935
925
  end
936
926
 
@@ -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
@@ -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
- key = normalize_key(key)
57
- ensure_config_exists(key)
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
- # Check if data type is correct. true and false are not of the same type which makes the check complex
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
@@ -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
- LocalSystem.validate_build_compatibility(description)
22
+ description.validate_build_compatibility
23
23
 
24
24
  if !File.exists?(cloud_config)
25
25
  raise(Machinery::Errors::DeployFailed,
@@ -46,9 +46,15 @@ module Machinery
46
46
  end
47
47
 
48
48
  def to_s
49
- "The system description '#{@name}' has an incompatible data " \
50
- "format and can not be read.\n" \
51
- "Try '#{Hint.program_name} upgrade-format #{name}' to upgrade it to the current version.\n"
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
 
@@ -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] &&
@@ -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
@@ -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
- Server.set :system_description_store, system_description_store
24
- Server.set :port, opts[:port] || Machinery::Config.new.http_server_port
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
- if opts[:ip] != "localhost" && opts[:ip] != "127.0.0.1"
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 is listening on all configured IP addresses.
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
- else
37
- Machinery::Ui.puts <<EOF
35
+ elsif opts[:ip] == "0.0.0.0"
36
+ Machinery::Ui.warn <<-EOF.chomp
38
37
  Warning:
39
- You specified an IP address other than '127.0.0.1', your server may be reachable from the network.
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
- end
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
@@ -181,26 +181,8 @@ suseSetupProduct
181
181
  suseImportBuildKey
182
182
  suseConfig
183
183
  EOF
184
- case @system_description.os
185
- when OsOpenSuse13_2
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_(image: "vmx", filesystem: "ext3", installiso: "true",
222
- boot: boot, format: "qcow2", bootloader: bootloader)
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
@@ -17,77 +17,100 @@
17
17
 
18
18
  class ListTask
19
19
  def list(store, system_descriptions, options = {})
20
- if system_descriptions.empty?
21
- descriptions = store.list
20
+ if options[:html]
21
+ list_html(store, options)
22
22
  else
23
- descriptions = system_descriptions.sort
24
- end
25
- has_incompatible_version = false
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
- if options[:short]
55
- Machinery::Ui.puts name
56
- else
57
- scopes = []
58
-
59
- system_description.scopes.each do |scope|
60
- entry = Machinery::Ui.internal_scope_list_to_string(scope)
61
- if SystemDescription::EXTRACTABLE_SCOPES.include?(scope)
62
- if system_description.scope_extracted?(scope)
63
- entry += " (extracted)"
64
- else
65
- entry += " (not extracted)"
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
- if options[:verbose]
70
- meta = system_description[scope].meta
71
- if meta
72
- time = Time.parse(meta.modified).getlocal
73
- date = time.strftime "%Y-%m-%d %H:%M:%S"
74
- hostname = meta.hostname
75
- else
76
- date = "unknown"
77
- hostname = "Unknown hostname"
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
- entry += "\n Host: [#{hostname}]"
80
- entry += "\n Date: (#{date})"
78
+
79
+ scopes << entry
81
80
  end
82
81
 
83
- scopes << entry
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
- Hint.print(:upgrade_system_description) if has_incompatible_version
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
@@ -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
@@ -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(description, ip, port)
20
- url = "http://#{ip}:#{port}/#{CGI.escape(description.name)}"
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 the description on #{url}
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(description.store, port: port, ip: ip)
36
+ server = Html.run_server(system_description_store, port: opts[:port], public: opts[:public])
30
37
 
31
38
  server.join
32
39
  end
@@ -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)
@@ -154,16 +154,21 @@ class SystemDescription < Machinery::Object
154
154
  end
155
155
 
156
156
  def validate_analysis_compatibility
157
- if !os.can_be_analyzed?
158
- raise Machinery::Errors::AnalysisFailed.new("Analysis of operating " +
159
- "system '#{os.display_name}' is not supported.")
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 validate_export_compatibility
164
- if !os.can_be_exported?
165
- raise Machinery::Errors::ExportFailed.new("Export of operating " +
166
- "system '#{os.display_name}' is not supported.")
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
@@ -17,6 +17,6 @@
17
17
 
18
18
  module Machinery
19
19
 
20
- VERSION = "1.16.2"
20
+ VERSION = "1.16.3"
21
21
 
22
22
  end
@@ -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)
@@ -2,4 +2,4 @@
2
2
 
3
3
  package main
4
4
 
5
- const VERSION = "4afb989b21b401f983686603e6521c112630cac9"
5
+ const VERSION = "e830c7c80abc78b74a40826ade55255c311f92b2"
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-A-System-Description-Using-A-Web-Server">serve — Serve A System Description Using A Web Server</a>
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-vmbxoot</code>.</p></li>
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-A-System-Description-Using-A-Web-Server">serve — Serve A System Description Using A Web Server</h2>
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] NAME</p>
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 and serves a stored system description on
1176
- it.
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
- <dl>
1183
- <dt><code>NAME</code> (required)</dt><dd>Use specified system description.</dd>
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 system description: Default: 7585</p>
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>Serve the system description taken from the last inspection, saved as <code>earth</code>:</dt><dd><p></p>
1201
+ <dt>Start the server with default options:</dt><dd><p></p>
1203
1202
 
1204
- <p>$ <code>machinery</code> serve earth</p></dd>
1205
- <dt>Make the system description available to other machines on the network on port 3000:</dt><dd><p></p>
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 earth --public --port 3000</p></dd>
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'>November 2015</li>
1382
+ <li class='tc'>January 2016</li>
1384
1383
  <li class='tr'>machinery(1)</li>
1385
1384
  </ol>
1386
1385
 
@@ -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 can_be_analyzed?
111
- true
112
- end
113
-
114
- def can_be_exported?
115
- true
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 self.buildable_systems
191
- [OsOpenSuse13_2, OsOpenSuseTumbleweed, OsOpenSuseLeap]
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 self.buildable_systems
205
- [OsOpenSuse13_1, OsOpenSuse13_2, OsOpenSuseLeap, OsOpenSuseTumbleweed, OsSles12, OsSles11]
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.2
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: 2015-11-24 00:00:00.000000000 Z
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.3
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.3
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