boxgrinder-build 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +165 -0
- data/README +4 -0
- data/appliances/jeos.appl +22 -0
- data/appliances/meta.appl +41 -0
- data/bin/boxgrinder +23 -0
- data/docs/examples/appliances/appliances-appliance/appliances-appliance.appl +6 -0
- data/docs/examples/appliances/appliances-appliance/appliances-appliance.pp +16 -0
- data/docs/examples/appliances/minimal-appliance/minimal-appliance.appl +2 -0
- data/docs/examples/appliances/minimal-appliance/minimal-appliance.pp +16 -0
- data/docs/examples/appliances/mix-appliance/mix-appliance.appl +9 -0
- data/docs/examples/appliances/mix-appliance/mix-appliance.pp +16 -0
- data/docs/examples/appliances/packages-appliance/packages-appliance.appl +6 -0
- data/docs/examples/appliances/packages-appliance/packages-appliance.pp +16 -0
- data/docs/node-info/pom.xml +31 -0
- data/docs/node-info/src/main/webapp/META-INF/MANIFEST.MF +3 -0
- data/docs/node-info/src/main/webapp/WEB-INF/web.xml +7 -0
- data/docs/node-info/src/main/webapp/index.jsp +70 -0
- data/extras/sign-rpms +12 -0
- data/lib/boxgrinder-build/appliance-kickstart.rb +159 -0
- data/lib/boxgrinder-build/appliance.rb +52 -0
- data/lib/boxgrinder-build/boxgrinder.rb +92 -0
- data/lib/boxgrinder-build/erb/appliance.ks.erb +44 -0
- data/lib/boxgrinder-build/helpers/appliance-customize-helper.rb +92 -0
- data/lib/boxgrinder-build/helpers/aws-helper.rb +75 -0
- data/lib/boxgrinder-build/helpers/guestfs-helper.rb +86 -0
- data/lib/boxgrinder-build/helpers/rake-helper.rb +71 -0
- data/lib/boxgrinder-build/helpers/release-helper.rb +135 -0
- data/lib/boxgrinder-build/helpers/ssh-helper.rb +140 -0
- data/lib/boxgrinder-build/images/ec2-image.rb +301 -0
- data/lib/boxgrinder-build/images/raw-image.rb +137 -0
- data/lib/boxgrinder-build/images/vmware-image.rb +214 -0
- data/lib/boxgrinder-build/models/ssh-config.rb +44 -0
- data/lib/boxgrinder-build/validators/appliance-config-parameter-validator.rb +37 -0
- data/lib/boxgrinder-build/validators/appliance-definition-validator.rb +89 -0
- data/lib/boxgrinder-build/validators/appliance-dependency-validator.rb +163 -0
- data/lib/boxgrinder-build/validators/appliance-validator.rb +84 -0
- data/lib/boxgrinder-build/validators/aws-validator.rb +58 -0
- data/lib/boxgrinder-build/validators/config-validator.rb +67 -0
- data/lib/boxgrinder-build/validators/ssh-validator.rb +35 -0
- data/lib/boxgrinder-build/validators/validator.rb +91 -0
- data/lib/boxgrinder-build.rb +48 -0
- data/lib/progressbar/progressbar.rb +236 -0
- data/src/README.vmware +38 -0
- data/src/base.repo +4 -0
- data/src/base.vmdk +19 -0
- data/src/base.vmx +45 -0
- data/src/ec2/fstab_32bit +8 -0
- data/src/ec2/fstab_64bit +8 -0
- data/src/ec2/ifcfg-eth0 +7 -0
- data/src/ec2/rc_local +32 -0
- data/src/f12/yum.conf +24 -0
- data/src/motd.init +21 -0
- data/src/oddthesis/RPM-GPG-KEY-oddthesis +30 -0
- data/src/oddthesis/oddthesis.repo +23 -0
- metadata +197 -0
@@ -0,0 +1,58 @@
|
|
1
|
+
# JBoss, Home of Professional Open Source
|
2
|
+
# Copyright 2009, Red Hat Middleware LLC, and individual contributors
|
3
|
+
# by the @authors tag. See the copyright.txt in the distribution for a
|
4
|
+
# full listing of individual contributors.
|
5
|
+
#
|
6
|
+
# This is free software; you can redistribute it and/or modify it
|
7
|
+
# under the terms of the GNU Lesser General Public License as
|
8
|
+
# published by the Free Software Foundation; either version 2.1 of
|
9
|
+
# the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This software is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
17
|
+
# License along with this software; if not, write to the Free
|
18
|
+
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
19
|
+
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
20
|
+
|
21
|
+
require 'boxgrinder-core/validators/errors'
|
22
|
+
|
23
|
+
module BoxGrinder
|
24
|
+
class AWSValidator
|
25
|
+
|
26
|
+
def initialize( config )
|
27
|
+
@config = config
|
28
|
+
end
|
29
|
+
|
30
|
+
def validate_aws_config( config )
|
31
|
+
secure_permissions = "600"
|
32
|
+
|
33
|
+
raise ValidationError, "Please specify aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config.nil?
|
34
|
+
|
35
|
+
raise ValidationError, "Please specify path to cert in aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config['cert_file'].nil?
|
36
|
+
raise ValidationError, "Certificate file '#{config['cert_file']}' specified in configuration file (#{@config.config_file}) doesn't exists. Please check your path. #{DEFAULT_HELP_TEXT[:general]}" unless File.exists?( config['cert_file'] )
|
37
|
+
cert_permission = sprintf( "%o", File.stat( config['cert_file'] ).mode )[ 3, 5 ]
|
38
|
+
raise ValidationError, "Certificate file '#{config['cert_file']}' specified in aws section in configuration file (#{@config.config_file}) has wrong permissions (#{cert_permission}), please correct it, run: 'chmod #{secure_permissions} #{config['cert_file']}'." unless cert_permission.eql?( secure_permissions )
|
39
|
+
|
40
|
+
raise ValidationError, "Please specify path to private key in aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config['key_file'].nil?
|
41
|
+
raise ValidationError, "Private key file '#{config['key_file']}' specified in aws section in configuration file (#{@config.config_file}) doesn't exists. Please check your path." unless File.exists?( config['key_file'] )
|
42
|
+
key_permission = sprintf( "%o", File.stat( config['key_file'] ).mode )[ 3, 5 ]
|
43
|
+
raise ValidationError, "Private key file '#{config['key_file']}' specified in aws section in configuration file (#{@config.config_file}) has wrong permissions (#{key_permission}), please correct it, run: 'chmod #{secure_permissions} #{config['key_file']}'." unless key_permission.eql?( secure_permissions )
|
44
|
+
|
45
|
+
raise ValidationError, "Please specify account number in aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config['account_number'].nil?
|
46
|
+
raise ValidationError, "Please specify access key in aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config['access_key'].nil?
|
47
|
+
raise ValidationError, "Please specify secret access key in aws section in configuration file (#{@config.config_file}). #{DEFAULT_HELP_TEXT[:general]}" if config['secret_access_key'].nil?
|
48
|
+
end
|
49
|
+
|
50
|
+
# TODO we're using this?
|
51
|
+
def validate_aws_release_config( config )
|
52
|
+
return if config.nil?
|
53
|
+
|
54
|
+
raise ValidationError, "No 's3' subsection in 'release' section in configuration file (#{@config.config_file})." if config['s3'].nil?
|
55
|
+
raise ValidationError, "Please specify bucket name in 's3' subsection in configuration file (#{@config.config_file})." if config['s3']['bucket_name'].nil? or config['s3']['bucket_name'].length == 0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# JBoss, Home of Professional Open Source
|
2
|
+
# Copyright 2009, Red Hat Middleware LLC, and individual contributors
|
3
|
+
# by the @authors tag. See the copyright.txt in the distribution for a
|
4
|
+
# full listing of individual contributors.
|
5
|
+
#
|
6
|
+
# This is free software; you can redistribute it and/or modify it
|
7
|
+
# under the terms of the GNU Lesser General Public License as
|
8
|
+
# published by the Free Software Foundation; either version 2.1 of
|
9
|
+
# the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This software is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
17
|
+
# License along with this software; if not, write to the Free
|
18
|
+
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
19
|
+
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
20
|
+
|
21
|
+
require 'boxgrinder-core/validators/errors'
|
22
|
+
|
23
|
+
module BoxGrinder
|
24
|
+
class ConfigValidator
|
25
|
+
def initialize( config, options = {} )
|
26
|
+
@config = config
|
27
|
+
@log = options[:log] || Logger.new(STDOUT)
|
28
|
+
end
|
29
|
+
|
30
|
+
def validate
|
31
|
+
validate_common
|
32
|
+
validate_vmware_files
|
33
|
+
validate_appliance_dir
|
34
|
+
end
|
35
|
+
|
36
|
+
def validate_common
|
37
|
+
secure_permissions = "600"
|
38
|
+
|
39
|
+
if File.exists?( @config.config_file )
|
40
|
+
conf_file_permissions = sprintf( "%o", File.stat( @config.config_file ).mode )[ 3, 5 ]
|
41
|
+
raise ValidationError, "Configuration file (#{@config.config_file}) has wrong permissions (#{conf_file_permissions}), please correct it, run: 'chmod #{secure_permissions} #{@config.config_file}'." unless conf_file_permissions.eql?( secure_permissions )
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def validate_appliance_dir
|
46
|
+
raise ValidationError, "Appliances directory '#{@config.dir.appliances}' doesn't exists, please create it: 'mkdir -p #{@config.dir.appliances}'." if !File.exists?(File.dirname( @config.dir.appliances )) && !File.directory?(File.dirname( @config.dir.appliances ))
|
47
|
+
end
|
48
|
+
|
49
|
+
def validate_vmware_files
|
50
|
+
if File.exists?( "#{@config.dir.src}/base.vmdk" )
|
51
|
+
@config.files.base_vmdk = "#{@config.dir.src}/base.vmdk"
|
52
|
+
else
|
53
|
+
@config.files.base_vmdk = "#{@config.dir.base}/src/base.vmdk"
|
54
|
+
end
|
55
|
+
|
56
|
+
raise ValidationError, "base.vmdk file doesn't exists, please check you configuration)" unless File.exists?( @config.files.base_vmdk )
|
57
|
+
|
58
|
+
if File.exists?( "#{@config.dir.src}/base.vmx" )
|
59
|
+
@config.files.base_vmx = "#{@config.dir.src}/base.vmx"
|
60
|
+
else
|
61
|
+
@config.files.base_vmx = "#{@config.dir.base}/src/base.vmx"
|
62
|
+
end
|
63
|
+
|
64
|
+
raise ValidationError, "base.vmx file doesn't exists, please check you configuration)" unless File.exists?( @config.files.base_vmx )
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# JBoss, Home of Professional Open Source
|
2
|
+
# Copyright 2009, Red Hat Middleware LLC, and individual contributors
|
3
|
+
# by the @authors tag. See the copyright.txt in the distribution for a
|
4
|
+
# full listing of individual contributors.
|
5
|
+
#
|
6
|
+
# This is free software; you can redistribute it and/or modify it
|
7
|
+
# under the terms of the GNU Lesser General Public License as
|
8
|
+
# published by the Free Software Foundation; either version 2.1 of
|
9
|
+
# the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This software is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
17
|
+
# License along with this software; if not, write to the Free
|
18
|
+
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
19
|
+
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
20
|
+
|
21
|
+
module BoxGrinder
|
22
|
+
class SSHValidator
|
23
|
+
def initialize( config )
|
24
|
+
@config = config
|
25
|
+
end
|
26
|
+
|
27
|
+
def validate
|
28
|
+
raise ValidationError, "Specified configuration file (#{@config.config_file}) doesn't exists. #{DEFAULT_HELP_TEXT[:general]}" unless File.exists?( @config.config_file )
|
29
|
+
raise ValidationError, "No 'ssh' section in config file in configuration file '#{@config.config_file}'. #{DEFAULT_HELP_TEXT[:general]}" if @config.data['ssh'].nil?
|
30
|
+
raise ValidationError, "Host not specified in configuration file '#{@config.config_file}'. #{DEFAULT_HELP_TEXT[:general]}" if @config.data['ssh']['host'].nil?
|
31
|
+
raise ValidationError, "Username not specified in configuration file '#{@config.config_file}'. #{DEFAULT_HELP_TEXT[:general]}" if @config.data['ssh']['username'].nil?
|
32
|
+
raise ValidationError, "Remote release packages path (remote_release_path) not specified in ssh section in configuration file '#{@config.config_file}'. #{DEFAULT_HELP_TEXT[:general]}" if @config.data['ssh']['remote_rpm_path'].nil?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# JBoss, Home of Professional Open Source
|
2
|
+
# Copyright 2009, Red Hat Middleware LLC, and individual contributors
|
3
|
+
# by the @authors tag. See the copyright.txt in the distribution for a
|
4
|
+
# full listing of individual contributors.
|
5
|
+
#
|
6
|
+
# This is free software; you can redistribute it and/or modify it
|
7
|
+
# under the terms of the GNU Lesser General Public License as
|
8
|
+
# published by the Free Software Foundation; either version 2.1 of
|
9
|
+
# the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This software is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# Lesser General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Lesser General Public
|
17
|
+
# License along with this software; if not, write to the Free
|
18
|
+
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
19
|
+
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
20
|
+
|
21
|
+
require 'boxgrinder-core/validators/errors'
|
22
|
+
require 'boxgrinder-build/validators/appliance-validator'
|
23
|
+
require 'boxgrinder-build/validators/config-validator'
|
24
|
+
require 'rake/tasklib'
|
25
|
+
|
26
|
+
module BoxGrinder
|
27
|
+
class Validator < Rake::TaskLib
|
28
|
+
|
29
|
+
def initialize( config, options = {} )
|
30
|
+
@config = config
|
31
|
+
@log = options[:log] || Logger.new(STDOUT)
|
32
|
+
|
33
|
+
define_tasks
|
34
|
+
end
|
35
|
+
|
36
|
+
def define_tasks
|
37
|
+
|
38
|
+
desc "Validate appliance files definitions"
|
39
|
+
task "validate:definitions" do
|
40
|
+
validate_definitions
|
41
|
+
end
|
42
|
+
|
43
|
+
desc "Validate configuration"
|
44
|
+
task "validate:config" do
|
45
|
+
validate_configuration
|
46
|
+
end
|
47
|
+
|
48
|
+
desc "Validate everything"
|
49
|
+
task "validate:all" => [ "validate:definitions", "validate:config" ]
|
50
|
+
end
|
51
|
+
|
52
|
+
def validate_definitions
|
53
|
+
@log.debug "Validating appliance definitions..."
|
54
|
+
|
55
|
+
begin
|
56
|
+
raise ValidationError, "Appliance directory '#{@config.dir.appliances}' doesn't exists, please check your Rakefile" if @config.dir.appliances.nil? or !File.exists?(File.dirname( @config.dir.appliances )) or !File.directory?(File.dirname( @config.dir.appliances ))
|
57
|
+
|
58
|
+
appliances = Dir[ "#{@config.dir.appliances}/*/*.appl" ]
|
59
|
+
|
60
|
+
appliances.each do |appliance_def|
|
61
|
+
ApplianceValidator.new( @config.dir.appliances, appliance_def ).validate
|
62
|
+
end
|
63
|
+
|
64
|
+
if appliances.size == 0
|
65
|
+
@log.debug "No appliance definitions found in '#{@config.dir.appliances}' directory"
|
66
|
+
else
|
67
|
+
@log.debug "All #{appliances.size} appliances definitions are valid"
|
68
|
+
end
|
69
|
+
rescue ApplianceValidationError => appliance_validation_error
|
70
|
+
raise "Error while validating appliance definition: #{appliance_validation_error}"
|
71
|
+
rescue ValidationError => validation_error
|
72
|
+
raise "Error while validating appliance definitions: #{validation_error}"
|
73
|
+
rescue => exception
|
74
|
+
raise "Something went wrong: #{exception}"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def validate_configuration
|
79
|
+
@log.debug "Validating configuration..."
|
80
|
+
begin
|
81
|
+
ConfigValidator.new( @config, :log => @log).validate
|
82
|
+
rescue ValidationError => validation_error
|
83
|
+
raise "Error while validating configuration: #{validation_error}"
|
84
|
+
rescue => exception
|
85
|
+
raise "Something went wrong: #{exception}"
|
86
|
+
end
|
87
|
+
|
88
|
+
@log.debug "Configuration is valid"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# JBoss, Home of Professional Open Source
|
4
|
+
# Copyright 2009, Red Hat Middleware LLC, and individual contributors
|
5
|
+
# by the @authors tag. See the copyright.txt in the distribution for a
|
6
|
+
# full listing of individual contributors.
|
7
|
+
#
|
8
|
+
# This is free software; you can redistribute it and/or modify it
|
9
|
+
# under the terms of the GNU Lesser General Public License as
|
10
|
+
# published by the Free Software Foundation; either version 2.1 of
|
11
|
+
# the License, or (at your option) any later version.
|
12
|
+
#
|
13
|
+
# This software is distributed in the hope that it will be useful,
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
16
|
+
# Lesser General Public License for more details.
|
17
|
+
#
|
18
|
+
# You should have received a copy of the GNU Lesser General Public
|
19
|
+
# License along with this software; if not, write to the Free
|
20
|
+
# Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
21
|
+
# 02110-1301 USA, or see the FSF site: http://www.fsf.org.
|
22
|
+
|
23
|
+
require 'rubygems'
|
24
|
+
|
25
|
+
gem 'boxgrinder-core', '>= 0.0.1'
|
26
|
+
gem 'aws-s3', '>= 0.6.2'
|
27
|
+
gem 'amazon-ec2', '>= 0.9.6'
|
28
|
+
gem 'net-sftp', '>= 2.0.4'
|
29
|
+
gem 'net-ssh', '>= 2.0.20'
|
30
|
+
gem 'rake', '>= 0.8.7'
|
31
|
+
|
32
|
+
require 'boxgrinder-build/helpers/rake-helper'
|
33
|
+
|
34
|
+
begin
|
35
|
+
require 'rake'
|
36
|
+
rescue LoadError
|
37
|
+
require 'rubygems'
|
38
|
+
require 'rake'
|
39
|
+
end
|
40
|
+
|
41
|
+
task :default do
|
42
|
+
puts "Run '#{Rake.application.name} -T' to get list of all available commands."
|
43
|
+
end
|
44
|
+
|
45
|
+
BoxGrinder::RakeHelper.new
|
46
|
+
|
47
|
+
Rake.application.init('boxgrinder')
|
48
|
+
Rake.application.top_level
|
@@ -0,0 +1,236 @@
|
|
1
|
+
#
|
2
|
+
# Ruby/ProgressBar - a text progress bar library
|
3
|
+
#
|
4
|
+
# Copyright (C) 2001-2005 Satoru Takabayashi <satoru@namazu.org>
|
5
|
+
# All rights reserved.
|
6
|
+
# This is free software with ABSOLUTELY NO WARRANTY.
|
7
|
+
#
|
8
|
+
# You can redistribute it and/or modify it under the terms
|
9
|
+
# of Ruby's license.
|
10
|
+
#
|
11
|
+
|
12
|
+
class ProgressBar
|
13
|
+
VERSION = "0.9"
|
14
|
+
|
15
|
+
def initialize (title, total, out = STDERR)
|
16
|
+
@title = title
|
17
|
+
@total = total
|
18
|
+
@out = out
|
19
|
+
@terminal_width = 80
|
20
|
+
@bar_mark = "o"
|
21
|
+
@current = 0
|
22
|
+
@previous = 0
|
23
|
+
@finished_p = false
|
24
|
+
@start_time = Time.now
|
25
|
+
@previous_time = @start_time
|
26
|
+
@title_width = 14
|
27
|
+
@format = "%-#{@title_width}s %3d%% %s %s"
|
28
|
+
@format_arguments = [:title, :percentage, :bar, :stat]
|
29
|
+
clear
|
30
|
+
show
|
31
|
+
end
|
32
|
+
attr_reader :title
|
33
|
+
attr_reader :current
|
34
|
+
attr_reader :total
|
35
|
+
attr_accessor :start_time
|
36
|
+
|
37
|
+
private
|
38
|
+
def fmt_bar
|
39
|
+
bar_width = do_percentage * @terminal_width / 100
|
40
|
+
sprintf("|%s%s|",
|
41
|
+
@bar_mark * bar_width,
|
42
|
+
" " * (@terminal_width - bar_width))
|
43
|
+
end
|
44
|
+
|
45
|
+
def fmt_percentage
|
46
|
+
do_percentage
|
47
|
+
end
|
48
|
+
|
49
|
+
def fmt_stat
|
50
|
+
if @finished_p then elapsed else eta end
|
51
|
+
end
|
52
|
+
|
53
|
+
def fmt_stat_for_file_transfer
|
54
|
+
if @finished_p then
|
55
|
+
sprintf("%s %s %s", bytes, transfer_rate, elapsed)
|
56
|
+
else
|
57
|
+
sprintf("%s %s %s", bytes, transfer_rate, eta)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def fmt_title
|
62
|
+
@title[0,(@title_width - 1)] + ":"
|
63
|
+
end
|
64
|
+
|
65
|
+
def convert_bytes (bytes)
|
66
|
+
if bytes < 1024
|
67
|
+
sprintf("%6dB", bytes)
|
68
|
+
elsif bytes < 1024 * 1000 # 1000kb
|
69
|
+
sprintf("%5.1fKB", bytes.to_f / 1024)
|
70
|
+
elsif bytes < 1024 * 1024 * 1000 # 1000mb
|
71
|
+
sprintf("%5.1fMB", bytes.to_f / 1024 / 1024)
|
72
|
+
else
|
73
|
+
sprintf("%5.1fGB", bytes.to_f / 1024 / 1024 / 1024)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def transfer_rate
|
78
|
+
bytes_per_second = @current.to_f / (Time.now - @start_time)
|
79
|
+
sprintf("%s/s", convert_bytes(bytes_per_second))
|
80
|
+
end
|
81
|
+
|
82
|
+
def bytes
|
83
|
+
convert_bytes(@current)
|
84
|
+
end
|
85
|
+
|
86
|
+
def format_time (t)
|
87
|
+
t = t.to_i
|
88
|
+
sec = t % 60
|
89
|
+
min = (t / 60) % 60
|
90
|
+
hour = t / 3600
|
91
|
+
sprintf("%02d:%02d:%02d", hour, min, sec);
|
92
|
+
end
|
93
|
+
|
94
|
+
# ETA stands for Estimated Time of Arrival.
|
95
|
+
def eta
|
96
|
+
if @current == 0
|
97
|
+
"ETA: --:--:--"
|
98
|
+
else
|
99
|
+
elapsed = Time.now - @start_time
|
100
|
+
eta = elapsed * @total / @current - elapsed;
|
101
|
+
sprintf("ETA: %s", format_time(eta))
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def elapsed
|
106
|
+
elapsed = Time.now - @start_time
|
107
|
+
sprintf("Time: %s", format_time(elapsed))
|
108
|
+
end
|
109
|
+
|
110
|
+
def eol
|
111
|
+
if @finished_p then "\n" else "\r" end
|
112
|
+
end
|
113
|
+
|
114
|
+
def do_percentage
|
115
|
+
if @total.zero?
|
116
|
+
100
|
117
|
+
else
|
118
|
+
@current * 100 / @total
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def get_width
|
123
|
+
# FIXME: I don't know how portable it is.
|
124
|
+
default_width = 80
|
125
|
+
begin
|
126
|
+
tiocgwinsz = 0x5413
|
127
|
+
data = [0, 0, 0, 0].pack("SSSS")
|
128
|
+
if @out.ioctl(tiocgwinsz, data) >= 0 then
|
129
|
+
rows, cols, xpixels, ypixels = data.unpack("SSSS")
|
130
|
+
if cols >= 0 then cols else default_width end
|
131
|
+
else
|
132
|
+
default_width
|
133
|
+
end
|
134
|
+
rescue Exception
|
135
|
+
default_width
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def show
|
140
|
+
arguments = @format_arguments.map {|method|
|
141
|
+
method = sprintf("fmt_%s", method)
|
142
|
+
send(method)
|
143
|
+
}
|
144
|
+
line = sprintf(@format, *arguments)
|
145
|
+
|
146
|
+
width = get_width
|
147
|
+
if line.length == width - 1
|
148
|
+
@out.print(line + eol)
|
149
|
+
@out.flush
|
150
|
+
elsif line.length >= width
|
151
|
+
@terminal_width = [@terminal_width - (line.length - width + 1), 0].max
|
152
|
+
if @terminal_width == 0 then @out.print(line + eol) else show end
|
153
|
+
else # line.length < width - 1
|
154
|
+
@terminal_width += width - line.length + 1
|
155
|
+
show
|
156
|
+
end
|
157
|
+
@previous_time = Time.now
|
158
|
+
end
|
159
|
+
|
160
|
+
def show_if_needed
|
161
|
+
if @total.zero?
|
162
|
+
cur_percentage = 100
|
163
|
+
prev_percentage = 0
|
164
|
+
else
|
165
|
+
cur_percentage = (@current * 100 / @total).to_i
|
166
|
+
prev_percentage = (@previous * 100 / @total).to_i
|
167
|
+
end
|
168
|
+
|
169
|
+
# Use "!=" instead of ">" to support negative changes
|
170
|
+
if cur_percentage != prev_percentage ||
|
171
|
+
Time.now - @previous_time >= 1 || @finished_p
|
172
|
+
show
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
public
|
177
|
+
def clear
|
178
|
+
@out.print "\r"
|
179
|
+
@out.print(" " * (get_width - 1))
|
180
|
+
@out.print "\r"
|
181
|
+
end
|
182
|
+
|
183
|
+
def finish
|
184
|
+
@current = @total
|
185
|
+
@finished_p = true
|
186
|
+
show
|
187
|
+
end
|
188
|
+
|
189
|
+
def finished?
|
190
|
+
@finished_p
|
191
|
+
end
|
192
|
+
|
193
|
+
def file_transfer_mode
|
194
|
+
@format_arguments = [:title, :percentage, :bar, :stat_for_file_transfer]
|
195
|
+
end
|
196
|
+
|
197
|
+
def format= (format)
|
198
|
+
@format = format
|
199
|
+
end
|
200
|
+
|
201
|
+
def format_arguments= (arguments)
|
202
|
+
@format_arguments = arguments
|
203
|
+
end
|
204
|
+
|
205
|
+
def halt
|
206
|
+
@finished_p = true
|
207
|
+
show
|
208
|
+
end
|
209
|
+
|
210
|
+
def inc (step = 1)
|
211
|
+
@current += step
|
212
|
+
@current = @total if @current > @total
|
213
|
+
show_if_needed
|
214
|
+
@previous = @current
|
215
|
+
end
|
216
|
+
|
217
|
+
def set (count)
|
218
|
+
if count < 0 || count > @total
|
219
|
+
raise "invalid count: #{count} (total: #{@total})"
|
220
|
+
end
|
221
|
+
@current = count
|
222
|
+
show_if_needed
|
223
|
+
@previous = @current
|
224
|
+
end
|
225
|
+
|
226
|
+
def inspect
|
227
|
+
"#<ProgressBar:#{@current}/#{@total}>"
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
class ReversedProgressBar < ProgressBar
|
232
|
+
def do_percentage
|
233
|
+
100 - super
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
data/src/README.vmware
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
#NAME# version #VERSION#
|
2
|
+
|
3
|
+
This package contains #APPLIANCE_NAME# image for VMware.
|
4
|
+
|
5
|
+
VMware Personal (VMware Fusion, VMware Server, VMware Player)
|
6
|
+
=============================================================
|
7
|
+
|
8
|
+
Required files:
|
9
|
+
---------------
|
10
|
+
|
11
|
+
#APPLIANCE_NAME#-sda.raw
|
12
|
+
personal/#APPLIANCE_NAME#.vmx
|
13
|
+
personal/#APPLIANCE_NAME#.vmdk
|
14
|
+
|
15
|
+
Required steps:
|
16
|
+
---------------
|
17
|
+
|
18
|
+
1. Extract #APPLIANCE_NAME#-sda.raw file and all files from personal/ directory into one directory.
|
19
|
+
2. Add #APPLIANCE_NAME#.vmx to inventory.
|
20
|
+
3. Run appliance.
|
21
|
+
|
22
|
+
VMware Enterprise (VMware ESX/ESXi/, VMware vSphere)
|
23
|
+
====================================================
|
24
|
+
|
25
|
+
Required files:
|
26
|
+
---------------
|
27
|
+
|
28
|
+
#APPLIANCE_NAME#-sda.raw
|
29
|
+
enterprise/#APPLIANCE_NAME#.vmx
|
30
|
+
enterprise/#APPLIANCE_NAME#.vmdk
|
31
|
+
|
32
|
+
Required steps:
|
33
|
+
---------------
|
34
|
+
|
35
|
+
1. Extract #APPLIANCE_NAME#-sda.raw file and all files from enterprise/ directory into one directory.
|
36
|
+
2. Upload all files to ESX server using vSpehere/VI client.
|
37
|
+
3. Add #APPLIANCE_NAME#.vmx to inventory.
|
38
|
+
4. Run appliance.
|
data/src/base.repo
ADDED
data/src/base.vmdk
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# Disk DescriptorFile
|
2
|
+
version=1
|
3
|
+
CID=fffffffe
|
4
|
+
parentCID=ffffffff
|
5
|
+
createType="#TYPE#"
|
6
|
+
|
7
|
+
# Extent description
|
8
|
+
RW #TOTAL_SECTORS# #EXTENT_TYPE# "#NAME#-sda.raw" #NUMBER#
|
9
|
+
|
10
|
+
# The Disk Data Base
|
11
|
+
#DDB
|
12
|
+
|
13
|
+
ddb.toolsVersion = "0"
|
14
|
+
ddb.adapterType = "lsilogic"
|
15
|
+
ddb.geometry.sectors = "#SECTORS#"
|
16
|
+
ddb.geometry.heads = "#HEADS#"
|
17
|
+
ddb.geometry.cylinders = "#CYLINDERS#"
|
18
|
+
ddb.encoding = "UTF-8"
|
19
|
+
ddb.virtualHWVersion = "#HW_VERSION#"
|
data/src/base.vmx
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
|
2
|
+
#!/usr/bin/vmware
|
3
|
+
|
4
|
+
config.version = "8"
|
5
|
+
virtualHW.version = "4"
|
6
|
+
guestOS = "#GUESTOS#"
|
7
|
+
displayName = "#NAME#"
|
8
|
+
annotation = "#SUMMARY# | Version: #VERSION# | Built by: #BUILDER#"
|
9
|
+
guestinfo.vmware.product.long = "#NAME#"
|
10
|
+
guestinfo.vmware.product.url = "http://www.jboss.org/stormgrind/projects/boxgrinder.html"
|
11
|
+
guestinfo.vmware.product.class = "virtual machine"
|
12
|
+
numvcpus = "#VCPU#"
|
13
|
+
memsize = "#MEM_SIZE#"
|
14
|
+
MemAllowAutoScaleDown = "FALSE"
|
15
|
+
MemTrimRate = "-1"
|
16
|
+
uuid.action = "create"
|
17
|
+
tools.remindInstall = "TRUE"
|
18
|
+
hints.hideAll = "TRUE"
|
19
|
+
tools.syncTime = "TRUE"
|
20
|
+
serial0.present = "FALSE"
|
21
|
+
serial1.present = "FALSE"
|
22
|
+
parallel0.present = "FALSE"
|
23
|
+
logging = "TRUE"
|
24
|
+
log.fileName = "#NAME#.log"
|
25
|
+
log.append = "TRUE"
|
26
|
+
log.keepOld = "3"
|
27
|
+
isolation.tools.hgfs.disable = "FALSE"
|
28
|
+
isolation.tools.dnd.disable = "FALSE"
|
29
|
+
isolation.tools.copy.enable = "TRUE"
|
30
|
+
isolation.tools.paste.enabled = "TRUE"
|
31
|
+
floppy0.present = "FALSE"
|
32
|
+
|
33
|
+
scsi0:0.present = "TRUE"
|
34
|
+
scsi0:0.fileName = "#NAME#.vmdk"
|
35
|
+
scsi0:0.mode = "persistent"
|
36
|
+
scsi0:0.startConnected = "TRUE"
|
37
|
+
scsi0:0.writeThrough = "TRUE"
|
38
|
+
scsi0.present = "TRUE"
|
39
|
+
scsi0.virtualDev = "lsilogic"
|
40
|
+
|
41
|
+
ethernet0.present = "TRUE"
|
42
|
+
ethernet0.connectionType = "nat"
|
43
|
+
ethernet0.addressType = "generated"
|
44
|
+
ethernet0.generatedAddressOffset = "0"
|
45
|
+
ethernet0.autoDetect = "TRUE"
|
data/src/ec2/fstab_32bit
ADDED
data/src/ec2/fstab_64bit
ADDED