syncwrap 2.5.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 081970fc00b932bd2296f5a2678b029a2ce0d89d
4
- data.tar.gz: 74a6e24b78b9983bc8b54c2486d997a62b08efd4
3
+ metadata.gz: 00df7a5da1c7959e0e8536ef2c2365b834d2fa8d
4
+ data.tar.gz: 95e52e386b6f40581e445b4385ee1396159cf219
5
5
  SHA512:
6
- metadata.gz: 1831e1c8dfeae16ee2b24d56bfb6388bbd468cbb381e974d05adf6b7c198495f8b2c6d30a9d75f58ab19c4da1f715fe3e84500b5ed098a55fe8c0c477a5f3252
7
- data.tar.gz: 459cbbf8efd87fef6fa95692caa6ab72886b4d72f70c6e65d72af351452dae89de978c1e04fd267bf211de1080764a40b84a36f9ce6cc276c605fbe143ca4f1c
6
+ metadata.gz: 7b558fac6b8e8e7c8a5797c5762efbfa2380671d35b061353aa4a04b5fb918eea2c9a92b74458c078dca2c22ad08dfc0b94d2b5c4d45a5984e6b6d42b3a4f590
7
+ data.tar.gz: 68c4f6387575c2ecabc185799949f545975c3786013f06343052d64330cfc6ad30fdc06676e93db585595b16a10a7e18762a589fe81513334d94d7ba95e07645
data/History.rdoc CHANGED
@@ -1,3 +1,22 @@
1
+ === 2.6.0 (2015-11-13)
2
+ * Add SyncWrap::LVMCache component, with
3
+ SyncWrap::Distro#unmount_device moved from MDRaid.
4
+ * Add SyncWrap::Space#compose (and main) utility for sync file inline
5
+ components.
6
+ * Add systemd support for all distros: Arch, RHEL/CentOS 7+, and by
7
+ default, Debian 8+ and Ubuntu 15.04+ via the SyncWrap::SystemD
8
+ module. See also various updates in SyncWrap::Distro.
9
+ * Add SyncWrap::Iyyov systemd service unit file and install support.
10
+ * Add SyncWrap::Puma systemd service unit file and install support.
11
+ * Add cryptographic hash verification support to SyncWrap::CRubyVM,
12
+ SyncWrap::JRubyVM, SyncWrap::Hashdot, and SyncWrap::CommercialJDK.
13
+ * Add -R/--components-in-role flag support in CLI to limit components
14
+ executed to those contained by one or more roles.
15
+ * Upgrade SyncWrap::JRubyVM default version to 1.7.22
16
+ * Upgrade SyncWrap::CRubyVM default version to 2.1.7
17
+ * Move AmazonEC2.ec2_user_data to SyncWrap::UserData module for
18
+ broader use.
19
+
1
20
  === 2.5.1 (2015-10-19)
2
21
  * Add SyncWrap::RHEL#dist_uninstall :succeed flag for removing
3
22
  packages which may not exist
data/Manifest.txt CHANGED
@@ -24,12 +24,15 @@ lib/syncwrap/context.rb
24
24
  lib/syncwrap/distro.rb
25
25
  lib/syncwrap/formatter.rb
26
26
  lib/syncwrap/git_help.rb
27
+ lib/syncwrap/hash_support.rb
27
28
  lib/syncwrap/host.rb
28
29
  lib/syncwrap/main.rb
29
30
  lib/syncwrap/path_util.rb
30
31
  lib/syncwrap/rsync.rb
31
32
  lib/syncwrap/ruby_support.rb
32
33
  lib/syncwrap/shell.rb
34
+ lib/syncwrap/systemd.rb
35
+ lib/syncwrap/user_data.rb
33
36
  lib/syncwrap/version_support.rb
34
37
  lib/syncwrap/components/amazon_linux.rb
35
38
  lib/syncwrap/components/arch.rb
@@ -46,6 +49,7 @@ lib/syncwrap/components/hashdot.rb
46
49
  lib/syncwrap/components/iyyov.rb
47
50
  lib/syncwrap/components/iyyov_daemon.rb
48
51
  lib/syncwrap/components/jruby_vm.rb
52
+ lib/syncwrap/components/lvm_cache.rb
49
53
  lib/syncwrap/components/mdraid.rb
50
54
  lib/syncwrap/components/network.rb
51
55
  lib/syncwrap/components/open_jdk.rb
@@ -67,6 +71,8 @@ sync/etc/init.d/iyyov.erb
67
71
  sync/etc/init.d/qpidd
68
72
  sync/etc/sysconfig/pgsql/postgresql.erb
69
73
  sync/etc/sysctl.d/61-postgresql-shm.conf.erb
74
+ sync/etc/systemd/system/iyyov.service.erb
75
+ sync/etc/systemd/system/puma.service.erb
70
76
  sync/jruby/bin/jgem
71
77
  sync/postgresql/environment
72
78
  sync/postgresql/pg_ctl.conf
data/README.rdoc CHANGED
@@ -91,7 +91,8 @@ like dist_install and other distribution-specific behaviors:
91
91
 
92
92
  Components implementing \#install:
93
93
 
94
- * SyncWrap::MDRaid - Software raid, lvm volumes, filesystems, mounts
94
+ * SyncWrap::MDRaid, SyncWrap::LVMCache - Software raid, lvm volumes,
95
+ lvm cache, filesystems, mounts
95
96
 
96
97
  * SyncWrap::Network and SyncWrap::EtcHosts - hostname, static names,
97
98
  resolver config
@@ -127,14 +128,14 @@ Components implementing \#install:
127
128
  The above only represents my more recent project needs. Pull requests
128
129
  to add, for example, the following would be well received:
129
130
 
130
- * Bluepill
131
- * Rails (extra credit: without git fetch or per-host asset compile)
131
+ * Rails (based on SourceTree, Bundle and ideally without per-host
132
+ asset compile)
132
133
  * Nginx
133
134
  * Mongo
134
135
  * Redis
135
136
 
136
- \SyncWrap makes it reasonable to implement any of the above in the
137
- privacy of your own office.
137
+ \SyncWrap makes it reasonable to implement any of the above
138
+ yourself.
138
139
 
139
140
  == License
140
141
 
@@ -20,6 +20,7 @@ require 'securerandom'
20
20
  require 'syncwrap/amazon_ws'
21
21
  require 'syncwrap/path_util'
22
22
  require 'syncwrap/host'
23
+ require 'syncwrap/user_data'
23
24
 
24
25
  module SyncWrap
25
26
 
@@ -37,6 +38,7 @@ module SyncWrap
37
38
  class AmazonEC2
38
39
  include AmazonWS
39
40
  include PathUtil
41
+ include UserData
40
42
 
41
43
  # FIXME: Interim strategy: use AmazonWS and defer deciding final
42
44
  # organization.
@@ -128,7 +130,7 @@ module SyncWrap
128
130
  # overrides (like for :availability_zone)?
129
131
 
130
132
  if profile[ :user_data ] == :ec2_user_sudo
131
- profile[ :user_data ] = ec2_user_data
133
+ profile[ :user_data ] = no_tty_sudoer( 'ec2-user' )
132
134
  end
133
135
 
134
136
  dname = profile.delete( :default_name )
@@ -278,17 +280,6 @@ module SyncWrap
278
280
  end
279
281
  end
280
282
 
281
- def ec2_user_data( user = 'ec2-user' )
282
- #FIXME: Utility module for this (+ Users sudoers)?
283
- script = <<-SH
284
- #!/bin/sh -e
285
- echo '#{user} ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/#{user}
286
- echo 'Defaults:#{user} !requiretty' >> /etc/sudoers.d/#{user}
287
- chmod 440 /etc/sudoers.d/#{user}
288
- SH
289
- script.split( "\n" ).map( &:strip ).join( "\n" )
290
- end
291
-
292
283
  end
293
284
 
294
285
  end
data/lib/syncwrap/base.rb CHANGED
@@ -15,7 +15,7 @@
15
15
  #++
16
16
 
17
17
  module SyncWrap
18
- VERSION='2.5.1'
18
+ VERSION='2.6.0'
19
19
 
20
20
  GEM_ROOT = File.dirname(File.dirname(File.dirname(__FILE__))) # :nodoc:
21
21
  end
data/lib/syncwrap/cli.rb CHANGED
@@ -31,6 +31,7 @@ module SyncWrap
31
31
  @list_components = false
32
32
  @component_plan = []
33
33
  @roles = []
34
+ @comp_roles = []
34
35
  @host_patterns = []
35
36
  @create_plan = []
36
37
  @image_plan = []
@@ -69,6 +70,11 @@ TEXT
69
70
  @roles << r.sub(/^:/,'').to_sym
70
71
  end
71
72
 
73
+ opts.on( "-R", "--components-in-role ROLE",
74
+ "Constrain components by ROLE (may use multiple)" ) do |r|
75
+ @comp_roles << r.sub(/^:/,'').to_sym
76
+ end
77
+
72
78
  opts.on( "-t", "--threads N",
73
79
  "The number of hosts to process concurrently",
74
80
  "(default: all hosts)",
@@ -270,6 +276,10 @@ TEXT
270
276
 
271
277
  exit( 0 ) if lists > 0
272
278
 
279
+ unless @comp_roles.empty?
280
+ @options[ :comp_roles ] = @comp_roles
281
+ end
282
+
273
283
  success = space.execute( @hosts, @component_plan, @options )
274
284
  exit( success ? 0 : 1 )
275
285
  end
@@ -16,12 +16,18 @@
16
16
 
17
17
  require 'syncwrap/component'
18
18
  require 'syncwrap/distro'
19
+ require 'syncwrap/systemd'
19
20
 
20
21
  module SyncWrap
21
22
 
22
23
  # \Arch Linux distro, partial implementation for pacman.
23
24
  class Arch < Component
24
- include SyncWrap::Distro
25
+ include Distro
26
+ include SystemD
27
+
28
+ def systemd?
29
+ true
30
+ end
25
31
 
26
32
  def dist_install( *pkgs )
27
33
  opts = pkgs.last.is_a?( Hash ) && pkgs.pop || {}
@@ -33,6 +39,7 @@ module SyncWrap
33
39
  sudo "pacman -R --noconfirm #{pkgs.join ' '}"
34
40
  end
35
41
 
42
+ alias_method :dist_service, :dist_service_via_systemctl
36
43
  end
37
44
 
38
45
  end
@@ -15,6 +15,7 @@
15
15
  #++
16
16
 
17
17
  require 'syncwrap/component'
18
+ require 'syncwrap/hash_support'
18
19
 
19
20
  module SyncWrap
20
21
 
@@ -30,6 +31,7 @@ module SyncWrap
30
31
  #
31
32
  # Host component dependencies: <Distro>
32
33
  class CommercialJDK < Component
34
+ include HashSupport
33
35
 
34
36
  # HTTP URL to repo base directory. Note that the default
35
37
  # (http://localhost/repo) is unlikely to work here.
@@ -40,10 +42,15 @@ module SyncWrap
40
42
  # directory when unpackaged.
41
43
  attr_accessor :jdk_name
42
44
 
45
+ # An optional cryptographic hash value (hexadecimal, some standard
46
+ # length) to use for verifying the 'jdk_name.tar.gz' package.
47
+ # Default: nil (no verification)
48
+ attr_accessor :hash
49
+
43
50
  def initialize( opts = {} )
44
51
  @java_repo_base_url = 'http://localhost/repo'
45
52
  @jdk_name = 'jrs-ora-1.7.0_51-x64'
46
-
53
+ @hash = nil
47
54
  super
48
55
  end
49
56
 
@@ -58,17 +65,25 @@ module SyncWrap
58
65
  end
59
66
 
60
67
  def install
68
+ distro = "/tmp/#{jdk_name}.tar.gz"
61
69
  bins = %w[ java jmap jstack jstat jps jinfo jhat javac ].
62
70
  map { |b| "../lib/java/bin/#{b}" }.
63
71
  join( ' ' )
64
72
 
65
- sudo <<-SH
66
- if [ ! -d #{jdk_dir} ]; then
67
- curl -sSL #{jdk_url} | tar -C #{local_root}/lib -zxf -
73
+ sudo( "if [ ! -d #{jdk_dir} ]; then", close: "fi" ) do
74
+ sudo <<-SH
75
+ curl -sSL -o #{distro} #{jdk_url}
76
+ SH
77
+
78
+ hash_verify( hash, distro, user: :root ) if hash
79
+
80
+ sudo <<-SH
81
+ tar -C #{local_root}/lib -zxf #{distro}
82
+ rm -f #{distro}
68
83
  cd #{local_root}/lib && ln -sfn #{jdk_name} java
69
84
  cd #{local_root}/bin && ln -sfn #{bins} .
70
- fi
71
- SH
85
+ SH
86
+ end
72
87
  end
73
88
 
74
89
  end
@@ -18,6 +18,7 @@ require 'syncwrap/component'
18
18
  require 'syncwrap/components/rhel'
19
19
  require 'syncwrap/ruby_support'
20
20
  require 'syncwrap/version_support'
21
+ require 'syncwrap/hash_support'
21
22
 
22
23
  module SyncWrap
23
24
 
@@ -43,13 +44,21 @@ module SyncWrap
43
44
  class CRubyVM < Component
44
45
  include VersionSupport
45
46
  include RubySupport
47
+ include HashSupport
48
+
49
+ # Default version of #ruby_version to install
50
+ DEFAULT_VERSION = '2.1.7'
51
+
52
+ # SHA256 #hash for DEFAULT_VERSION
53
+ DEFAULT_VERSION_HASH =
54
+ 'f59c1596ac39cc7e60126e7d3698c19f482f04060674fdfe0124e1752ba6dd81'
46
55
 
47
56
  # The ruby version to install, as it appears in source packages
48
57
  # from ruby-lang.org. Note that starting with 2.1.0, the patch
49
58
  # release (p#) no longer appears in package names.
50
- # (Default: 2.1.5)
59
+ # (Default: DEFAULT_VERSION)
51
60
  #
52
- # Example values: '2.0.0-p481', '2.1.5'
61
+ # Example values: '2.0.0-p481', '2.1.7'
53
62
  attr_accessor :ruby_version
54
63
 
55
64
  # If true, attempt to uninstall any pre-existing distro packaged
@@ -57,13 +66,21 @@ module SyncWrap
57
66
  # (Default: true)
58
67
  attr_accessor :do_uninstall_distro_ruby
59
68
 
69
+ # A cryptographic hash value (hexadecimal, some standard length)
70
+ # to use for verifying the 'source.tar.gz' package.
71
+ attr_writer :hash
72
+
60
73
  def initialize( opts = {} )
61
- @ruby_version = "2.1.5"
74
+ @ruby_version = DEFAULT_VERSION
62
75
  @do_uninstall_distro_ruby = true
63
-
76
+ @hash = nil
64
77
  super
65
78
  end
66
79
 
80
+ def hash
81
+ @hash || ( ruby_version == DEFAULT_VERSION && DEFAULT_VERSION_HASH )
82
+ end
83
+
67
84
  def install
68
85
  install_ruby
69
86
  install_gemrc # from RubySupport
@@ -134,11 +151,19 @@ module SyncWrap
134
151
  # Arguably all but the final install should be run by an
135
152
  # unprivileged user. But its more likely merged this way, and if
136
153
  # "configure" or "make" can be exploited, so can "make install".
154
+ sfile = File.basename( src_url )
137
155
  sudo <<-SH
138
156
  [ -e /tmp/src ] && rm -rf /tmp/src || true
139
157
  mkdir -p /tmp/src/ruby
140
158
  cd /tmp/src/ruby
141
- curl -sSL #{src_url} | tar -zxf -
159
+ curl -sSL -o #{sfile} #{src_url}
160
+ SH
161
+
162
+ hash_verify( hash, sfile, user: :root ) if hash
163
+
164
+ sudo <<-SH
165
+ tar -zxf #{sfile}
166
+ rm -f #{sfile}
142
167
  cd ruby-#{ruby_version}
143
168
  ./configure --prefix=#{local_root} #{redirect?}
144
169
  make #{redirect?}
@@ -17,24 +17,38 @@
17
17
  require 'syncwrap/component'
18
18
  require 'syncwrap/distro'
19
19
  require 'syncwrap/version_support'
20
+ require 'syncwrap/systemd'
20
21
 
21
22
  module SyncWrap
22
23
 
23
24
  # Customizations for \Debian and possibly other deb packaged
24
25
  # derivatives. Specific distros/versions may further specialize.
25
26
  class Debian < Component
26
- include SyncWrap::Distro
27
- include SyncWrap::VersionSupport
27
+ include Distro
28
+ include VersionSupport
29
+ include SystemD
28
30
 
29
31
  # Debian version, i.e. '7.6' No default value.
30
32
  attr_accessor :debian_version
31
33
 
32
34
  alias :distro_version :debian_version
33
35
 
36
+ protected
37
+
38
+ # Set true/false to override the default, distro version based
39
+ # determination of whether systemd is PID 1 on the system.
40
+ attr_writer :systemd
41
+
42
+ public
43
+
34
44
  def initialize( opts = {} )
35
45
  super
36
46
  end
37
47
 
48
+ def systemd?
49
+ @systemd ||= version_gte?( debian_version, [8] )
50
+ end
51
+
38
52
  # Install the specified package names. The first time this is
39
53
  # applied to any given host, an "apt-get update" is issued as
40
54
  # well. A trailing hash is interpreted as options, see below.
@@ -63,15 +77,25 @@ module SyncWrap
63
77
  sudo "/usr/sbin/update-rc.d #{name} defaults"
64
78
  end
65
79
 
66
- # Enable the System V style init.d service
80
+ # Enable a service by (short) name either via Debian/System V
81
+ # `update-rc.d` or systemd `systemctl enable`.
67
82
  def dist_enable_init_service( name )
68
- sudo "/usr/sbin/update-rc.d #{name} enable"
83
+ if systemd?
84
+ systemctl( 'enable', dot_service( name ) )
85
+ else
86
+ sudo "/usr/sbin/update-rc.d #{name} enable"
87
+ end
69
88
  end
70
89
 
71
- # Run via sudo, the service command typically supporting 'start',
72
- # 'stop', 'restart', 'status', etc. arguments.
90
+ # Run the service command typically supporting 'start', 'stop',
91
+ # 'restart', 'status', etc. actions.
92
+ # Arguments are in order: shortname, action
73
93
  def dist_service( *args )
74
- sudo( [ '/usr/sbin/service', *args ].join( ' ' ) )
94
+ if systemd?
95
+ dist_service_via_systemctl( *args )
96
+ else
97
+ sudo( [ '/usr/sbin/service', *args ].join( ' ' ) )
98
+ end
75
99
  end
76
100
 
77
101
  protected
@@ -15,9 +15,11 @@
15
15
  #++
16
16
 
17
17
  require 'syncwrap/component'
18
+ require 'syncwrap/hash_support'
18
19
 
19
20
  # For distro class comparison only (pre-load for safety)
20
21
  require 'syncwrap/components/debian'
22
+ require 'syncwrap/components/rhel'
21
23
 
22
24
  module SyncWrap
23
25
 
@@ -26,16 +28,32 @@ module SyncWrap
26
28
  #
27
29
  # Host component dependencies: <Distro>, <JDK>, JRubyVM
28
30
  class Hashdot < Component
31
+ include HashSupport
29
32
 
30
- # Hashdot version (default: 1.4.0)
33
+ # Default version of #hashdot_version to install
34
+ DEFAULT_VERSION = '1.4.0'
35
+
36
+ # SHA256 #hash for DEFAULT_VERSION
37
+ DEFAULT_VERSION_HASH =
38
+ '131e01b4ee2c6f63c4850bbcb71a83f902646436b4791a8717cc76efe26afab7'
39
+
40
+ # Hashdot version (default: DEFAULT_VERSION)
31
41
  attr_accessor :hashdot_version
32
42
 
33
- def initialize( opts = {} )
34
- @hashdot_version = '1.4.0'
43
+ # A cryptographic hash value (hexadecimal, some standard length)
44
+ # to use for verifying the 'hashdot-*-src.tar.gz' package.
45
+ attr_writer :hash
35
46
 
47
+ def initialize( opts = {} )
48
+ @hashdot_version = DEFAULT_VERSION
49
+ @hash = nil
36
50
  super
37
51
  end
38
52
 
53
+ def hash
54
+ @hash || ( hashdot_version == DEFAULT_VERSION && DEFAULT_VERSION_HASH )
55
+ end
56
+
39
57
  def hashdot_bin_url
40
58
  [ 'http://downloads.sourceforge.net/project/hashdot/hashdot',
41
59
  hashdot_version,
@@ -92,11 +110,18 @@ module SyncWrap
92
110
  def install_hashdot
93
111
  src_root = '/tmp/src/hashdot'
94
112
  src = "#{src_root}/hashdot-#{hashdot_version}"
113
+ sfile = "#{src_root}/hashdot-#{hashdot_version}-src.tar.gz"
95
114
 
96
115
  sh <<-SH
97
116
  sudo rm -rf /tmp/src
98
117
  mkdir -p #{src_root}
99
- curl -sSL #{hashdot_bin_url} | tar -C #{src_root} -zxf -
118
+ curl -sSL -o #{sfile} #{hashdot_bin_url}
119
+ SH
120
+
121
+ hash_verify( hash, sfile ) if hash
122
+
123
+ sh <<-SH
124
+ tar -C #{src_root} -zxf #{sfile}
100
125
  SH
101
126
 
102
127
  rput( 'src/hashdot/', "#{src}/", :excludes => :dev )
@@ -105,6 +130,7 @@ module SyncWrap
105
130
  cd #{src}
106
131
  make
107
132
  sudo make install
133
+ rm -rf #{src_root}
108
134
  SH
109
135
 
110
136
  end
@@ -37,7 +37,8 @@ module SyncWrap
37
37
  super
38
38
  end
39
39
 
40
- # Deploy iyyov gem, init.d/iyyov and at least an empty jobs.rb.
40
+ # Deploy iyyov gem, init.d script or systemd unit, and at least an
41
+ # empty jobs.rb.
41
42
  def install
42
43
  # Shorten if the desired iyyov version is already running
43
44
  pid, ver = capture_running_version( 'iyyov' )
@@ -130,18 +131,23 @@ module SyncWrap
130
131
  SH
131
132
  end
132
133
 
133
- # Ensure install of same gem version as init.d/iyyov script
134
+ # Ensure install of same gem version as init.d script or unit file
134
135
  def install_iyyov_gem
135
136
  jruby_gem_install( 'iyyov', version: iyyov_version )
136
137
  end
137
138
 
138
- # Install iyyov daemon init.d script and add to init daemons
139
+ # Install iyyov daemon init.d script or service unit
139
140
  def install_iyyov_init
140
- rput( 'etc/init.d/iyyov', user: :root,
141
- erb_vars: { lsb: distro.kind_of?( Debian ) } )
141
+ if systemd?
142
+ changes = rput( 'etc/systemd/system/iyyov.service', user: :root )
143
+ systemctl( 'enable', 'iyyov.service' )
144
+ else
145
+ rput( 'etc/init.d/iyyov', user: :root,
146
+ erb_vars: { lsb: distro.kind_of?( Debian ) } )
142
147
 
143
- # Add to init.d
144
- dist_install_init_service( 'iyyov' )
148
+ # Add to init.d
149
+ dist_install_init_service( 'iyyov' )
150
+ end
145
151
  end
146
152
 
147
153
  def iyyov_start
@@ -17,6 +17,7 @@
17
17
  require 'syncwrap/component'
18
18
  require 'syncwrap/ruby_support'
19
19
  require 'syncwrap/version_support'
20
+ require 'syncwrap/hash_support'
20
21
 
21
22
  module SyncWrap
22
23
 
@@ -28,17 +29,33 @@ module SyncWrap
28
29
  class JRubyVM < Component
29
30
  include VersionSupport
30
31
  include RubySupport
32
+ include HashSupport
31
33
 
32
- # JRuby version to install (default: 1.7.19)
34
+ # Default version of #jruby_version to install
35
+ DEFAULT_VERSION = '1.7.22'
36
+
37
+ # The #hash for DEFAULT_VERSION. Prefer sha256 but sha1 is what is
38
+ # currently published.
39
+ DEFAULT_VERSION_HASH = '6b9e310a04ad8173d0d6dbe299da04c0ef85fc15'
40
+
41
+ # JRuby version to install (default: DEFAULT_VERSION)
33
42
  attr_accessor :jruby_version
34
43
 
35
- def initialize( opts = {} )
36
- @jruby_version = '1.7.19'
44
+ # A cryptographic hash value (hexadecimal, some standard length)
45
+ # to use for verifying the 'jruby-bin-*.tar.gz' package.
46
+ attr_writer :hash
37
47
 
48
+ def initialize( opts = {} )
49
+ @jruby_version = DEFAULT_VERSION
50
+ @hash = nil
38
51
  super( { ruby_command: 'jruby',
39
52
  gem_command: 'jgem' }.merge( opts ) )
40
53
  end
41
54
 
55
+ def hash
56
+ @hash || ( jruby_version == DEFAULT_VERSION && DEFAULT_VERSION_HASH )
57
+ end
58
+
42
59
  def jruby_dist_path
43
60
  "#{local_root}/lib/jruby/jruby-#{jruby_version}"
44
61
  end
@@ -67,12 +84,20 @@ module SyncWrap
67
84
  def jruby_install
68
85
 
69
86
  root = "#{local_root}/lib/jruby"
87
+ distro = "/tmp/jruby-bin-#{jruby_version}.tar.gz"
70
88
 
71
89
  sudo <<-SH
72
90
  if [ ! -d #{jruby_dist_path} ]; then
73
91
  mkdir -p #{root}
74
92
  mkdir -p #{root}/gems
75
- curl -sSL #{jruby_bin_url} | tar -C #{root} -zxf -
93
+ curl -sSL -o #{distro} #{jruby_bin_url}
94
+ SH
95
+
96
+ hash_verify( hash, distro, user: :root ) if hash
97
+
98
+ sudo <<-SH
99
+ tar -C #{root} -zxf #{distro}
100
+ rm -f #{distro}
76
101
  mkdir -p #{gemrc_path}
77
102
  cd #{root} && ln -sfn jruby-#{jruby_version} jruby
78
103
  cd #{local_root}/bin && ln -sf ../lib/jruby/jruby/bin/jirb .