syncwrap 1.5.2 → 2.0.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 +7 -0
- data/History.rdoc +19 -0
- data/Manifest.txt +82 -34
- data/README.rdoc +96 -48
- data/Rakefile +0 -65
- data/bin/syncwrap +27 -0
- data/examples/LAYOUT.rdoc +70 -0
- data/examples/Rakefile +16 -0
- data/examples/ec2.rb +44 -0
- data/examples/hello.rb +14 -0
- data/examples/hello_binding.rb +27 -0
- data/examples/jruby.rb +11 -0
- data/examples/private/aws.json +4 -0
- data/examples/rput.rb +24 -0
- data/examples/sync/home/bob/.ssh/authorized_keys +1 -0
- data/examples/sync/tmp/sample.erb +3 -0
- data/lib/syncwrap/amazon_ec2.rb +236 -0
- data/lib/syncwrap/amazon_ws.rb +308 -0
- data/lib/syncwrap/base.rb +4 -2
- data/lib/syncwrap/cli.rb +328 -0
- data/lib/syncwrap/component.rb +443 -0
- data/lib/syncwrap/components/commercial_jdk.rb +76 -0
- data/lib/syncwrap/components/cruby_vm.rb +144 -0
- data/lib/syncwrap/components/etc_hosts.rb +44 -0
- data/lib/syncwrap/{geminabox.rb → components/geminabox.rb} +12 -17
- data/lib/syncwrap/components/hashdot.rb +97 -0
- data/lib/syncwrap/components/iyyov.rb +144 -0
- data/lib/syncwrap/components/iyyov_daemon.rb +125 -0
- data/lib/syncwrap/components/jruby_vm.rb +122 -0
- data/lib/syncwrap/components/mdraid.rb +204 -0
- data/lib/syncwrap/components/network.rb +99 -0
- data/lib/syncwrap/components/open_jdk.rb +70 -0
- data/lib/syncwrap/components/postgresql.rb +159 -0
- data/lib/syncwrap/components/qpid.rb +303 -0
- data/lib/syncwrap/components/rhel.rb +71 -0
- data/lib/syncwrap/components/run_user.rb +99 -0
- data/lib/syncwrap/components/ubuntu.rb +85 -0
- data/lib/syncwrap/components/users.rb +200 -0
- data/lib/syncwrap/context.rb +260 -0
- data/lib/syncwrap/distro.rb +53 -60
- data/lib/syncwrap/formatter.rb +149 -0
- data/lib/syncwrap/host.rb +134 -0
- data/lib/syncwrap/main.rb +62 -0
- data/lib/syncwrap/path_util.rb +55 -0
- data/lib/syncwrap/rsync.rb +227 -0
- data/lib/syncwrap/ruby_support.rb +110 -0
- data/lib/syncwrap/shell.rb +207 -0
- data/lib/syncwrap.rb +367 -1
- data/{etc → sync/etc}/gemrc +1 -3
- data/sync/etc/hosts.erb +8 -0
- data/{etc/init.d/iyyov → sync/etc/init.d/iyyov.erb} +35 -7
- data/sync/etc/sysconfig/pgsql/postgresql.erb +2 -0
- data/sync/src/hashdot/Makefile.erb +98 -0
- data/sync/src/hashdot/profiles/default.hdp.erb +25 -0
- data/sync/src/hashdot/profiles/jruby-common.hdp +28 -0
- data/sync/src/hashdot/profiles/jruby-shortlived.hdp +9 -0
- data/sync/src/hashdot/profiles/jruby.hdp.erb +13 -0
- data/sync/src/hashdot/profiles/shortlived.hdp +6 -0
- data/sync/var/iyyov/default/config.rb +1 -0
- data/sync/var/iyyov/default/daemon.rb.erb +15 -0
- data/sync/var/iyyov/jobs.rb.erb +4 -0
- data/test/muddled_sync.rb +13 -0
- data/test/setup.rb +39 -0
- data/test/sync/d1/bar +1 -0
- data/test/sync/d1/foo.erb +1 -0
- data/test/sync/d3/d2/bar +1 -0
- data/test/sync/d3/d2/foo.erb +1 -0
- data/test/test_components.rb +108 -0
- data/test/test_context.rb +107 -0
- data/test/test_context_rput.rb +289 -0
- data/test/test_rsync.rb +138 -0
- data/test/test_shell.rb +233 -0
- data/test/test_space.rb +218 -0
- data/test/test_space_main.rb +40 -0
- data/test/zfile +1 -0
- metadata +204 -71
- data/etc/sysconfig/pgsql/postgresql +0 -2
- data/lib/syncwrap/aws.rb +0 -448
- data/lib/syncwrap/common.rb +0 -161
- data/lib/syncwrap/ec2.rb +0 -59
- data/lib/syncwrap/hashdot.rb +0 -70
- data/lib/syncwrap/iyyov.rb +0 -139
- data/lib/syncwrap/java.rb +0 -61
- data/lib/syncwrap/jruby.rb +0 -118
- data/lib/syncwrap/postgresql.rb +0 -135
- data/lib/syncwrap/qpid.rb +0 -251
- data/lib/syncwrap/remote_task.rb +0 -199
- data/lib/syncwrap/rhel.rb +0 -67
- data/lib/syncwrap/ubuntu.rb +0 -78
- data/lib/syncwrap/user_run.rb +0 -102
- data/test/test_syncwrap.rb +0 -202
- data/var/iyyov/jobs.rb +0 -11
- /data/{etc → sync/etc}/corosync/corosync.conf +0 -0
- /data/{etc → sync/etc}/corosync/uidgid.d/qpid +0 -0
- /data/{etc → sync/etc}/init.d/qpidd +0 -0
- /data/{etc → sync/etc}/sysctl.d/61-postgresql-shm.conf +0 -0
- /data/{usr/local → sync/jruby}/bin/jgem +0 -0
- /data/{postgresql → sync/postgresql}/rhel/pg_hba.conf +0 -0
- /data/{postgresql → sync/postgresql}/rhel/pg_ident.conf +0 -0
- /data/{postgresql → sync/postgresql}/rhel/postgresql.conf +0 -0
- /data/{postgresql → sync/postgresql}/ubuntu/environment +0 -0
- /data/{postgresql → sync/postgresql}/ubuntu/pg_ctl.conf +0 -0
- /data/{postgresql → sync/postgresql}/ubuntu/pg_hba.conf +0 -0
- /data/{postgresql → sync/postgresql}/ubuntu/pg_ident.conf +0 -0
- /data/{postgresql → sync/postgresql}/ubuntu/postgresql.conf +0 -0
- /data/{postgresql → sync/postgresql}/ubuntu/start.conf +0 -0
- /data/{usr → sync/usr}/local/etc/qpidd.conf +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011-2014 David Kellum
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
|
5
|
+
# may not use this file except in compliance with the License. You may
|
|
6
|
+
# obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
13
|
+
# implied. See the License for the specific language governing
|
|
14
|
+
# permissions and limitations under the License.
|
|
15
|
+
#++
|
|
16
|
+
|
|
17
|
+
require 'syncwrap/component'
|
|
18
|
+
|
|
19
|
+
module SyncWrap
|
|
20
|
+
|
|
21
|
+
# Provision/update an RFC 952 /etc/hosts file for "internal"
|
|
22
|
+
# intra-Space host resolution. This can be used for simple internal
|
|
23
|
+
# network resolution instead of DNS.
|
|
24
|
+
#
|
|
25
|
+
# Host component dependencies: none
|
|
26
|
+
class EtcHosts < Component
|
|
27
|
+
|
|
28
|
+
def initialize( opts = {} )
|
|
29
|
+
super
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def install
|
|
33
|
+
rput( "etc/hosts", user: :root )
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def etc_host_table
|
|
37
|
+
host.space.hosts.map do |h|
|
|
38
|
+
[ h[ :internal_ip ] || "# internal_ip?", [ h[ :name ] ] ]
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#--
|
|
2
|
-
# Copyright (c) 2011-
|
|
2
|
+
# Copyright (c) 2011-2014 David Kellum
|
|
3
3
|
#
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
|
5
5
|
# may not use this file except in compliance with the License. You may
|
|
@@ -14,26 +14,21 @@
|
|
|
14
14
|
# permissions and limitations under the License.
|
|
15
15
|
#++
|
|
16
16
|
|
|
17
|
-
require 'syncwrap/
|
|
18
|
-
require 'syncwrap/jruby'
|
|
17
|
+
require 'syncwrap/components/iyyov_daemon'
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
# {boxed-geminabox}[https://github.com/dekellum/boxed-geminabox/]
|
|
22
|
-
# gem server.
|
|
23
|
-
module SyncWrap::Geminabox
|
|
24
|
-
include SyncWrap::UserRun
|
|
25
|
-
include SyncWrap::JRuby
|
|
19
|
+
module SyncWrap
|
|
26
20
|
|
|
27
|
-
|
|
21
|
+
# Provision the
|
|
22
|
+
# {boxed-geminabox}[https://github.com/dekellum/boxed-geminabox/]
|
|
23
|
+
# gem server as a simple specialization of IyyovDaemon.
|
|
24
|
+
#
|
|
25
|
+
# Host component dependencies: <Distro>, JrubyVM, RunUser, Iyyov
|
|
26
|
+
class Geminabox < IyyovDaemon
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
end
|
|
28
|
+
def initialize( opts = {} )
|
|
29
|
+
super( { name: 'boxed-geminabox', version: '1.1.0' }.merge( opts ) )
|
|
30
|
+
end
|
|
33
31
|
|
|
34
|
-
def geminabox_install
|
|
35
|
-
jruby_install_gem( 'boxed-geminabox', :version => "=#{geminabox_version}" )
|
|
36
|
-
user_run_service_dir_setup( 'boxed-geminabox' )
|
|
37
32
|
end
|
|
38
33
|
|
|
39
34
|
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011-2014 David Kellum
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
|
5
|
+
# may not use this file except in compliance with the License. You may
|
|
6
|
+
# obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
13
|
+
# implied. See the License for the specific language governing
|
|
14
|
+
# permissions and limitations under the License.
|
|
15
|
+
#++
|
|
16
|
+
|
|
17
|
+
require 'syncwrap/component'
|
|
18
|
+
|
|
19
|
+
module SyncWrap
|
|
20
|
+
|
|
21
|
+
# Provision the {Hashdot}[http://hashdot.sourceforge.net/] JVM/script
|
|
22
|
+
# launcher by building it with gcc on the target host.
|
|
23
|
+
#
|
|
24
|
+
# Host component dependencies: <Distro>, <JDK>, JRubyVM
|
|
25
|
+
class Hashdot < Component
|
|
26
|
+
|
|
27
|
+
# Hashdot version (default: 1.4.0)
|
|
28
|
+
attr_accessor :hashdot_version
|
|
29
|
+
|
|
30
|
+
def initialize( opts = {} )
|
|
31
|
+
@hashdot_version = '1.4.0'
|
|
32
|
+
|
|
33
|
+
super
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def hashdot_bin_url
|
|
37
|
+
[ 'http://downloads.sourceforge.net/project/hashdot/hashdot',
|
|
38
|
+
hashdot_version,
|
|
39
|
+
"hashdot-#{hashdot_version}-src.tar.gz" ].join( '/' )
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Install hashdot if the binary version doesn't match, otherwise
|
|
43
|
+
# just update the profile config files.
|
|
44
|
+
def install
|
|
45
|
+
if !test_hashdot_binary || dryrun?
|
|
46
|
+
install_system_deps
|
|
47
|
+
install_hashdot
|
|
48
|
+
else
|
|
49
|
+
# Just update config as needed.
|
|
50
|
+
rput( 'src/hashdot/profiles/',
|
|
51
|
+
"#{local_root}/lib/hashdot/profiles/",
|
|
52
|
+
excludes: :dev, user: :root )
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def install_system_deps
|
|
57
|
+
dist_install( %w[ make gcc apr apr-devel ] )
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def test_hashdot_binary
|
|
61
|
+
binary = "#{local_root}/bin/hashdot"
|
|
62
|
+
code,_ = capture( <<-SH, accept: [0,91,92] )
|
|
63
|
+
if [ -x #{binary} ]; then
|
|
64
|
+
cver=`#{binary} 2>&1 | grep -o -E '([0-9]\.?){2,}'`
|
|
65
|
+
if [ "$cver" = "#{hashdot_version}" ]; then
|
|
66
|
+
exit 0
|
|
67
|
+
fi
|
|
68
|
+
exit 92
|
|
69
|
+
fi
|
|
70
|
+
exit 91
|
|
71
|
+
SH
|
|
72
|
+
(code == 0)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def install_hashdot
|
|
76
|
+
src_root = '/tmp/src/hashdot'
|
|
77
|
+
src = "#{src_root}/hashdot-#{hashdot_version}"
|
|
78
|
+
|
|
79
|
+
sh <<-SH
|
|
80
|
+
sudo rm -rf /tmp/src
|
|
81
|
+
mkdir -p #{src_root}
|
|
82
|
+
curl -sSL #{hashdot_bin_url} | tar -C #{src_root} -zxf -
|
|
83
|
+
SH
|
|
84
|
+
|
|
85
|
+
rput( 'src/hashdot/', "#{src}/", :excludes => :dev )
|
|
86
|
+
|
|
87
|
+
sh <<-SH
|
|
88
|
+
cd #{src}
|
|
89
|
+
make
|
|
90
|
+
sudo make install
|
|
91
|
+
SH
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011-2014 David Kellum
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
|
5
|
+
# may not use this file except in compliance with the License. You may
|
|
6
|
+
# obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
13
|
+
# implied. See the License for the specific language governing
|
|
14
|
+
# permissions and limitations under the License.
|
|
15
|
+
#++
|
|
16
|
+
|
|
17
|
+
require 'syncwrap/component'
|
|
18
|
+
|
|
19
|
+
# For distro class comparison only (pre-load for safety)
|
|
20
|
+
require 'syncwrap/components/ubuntu'
|
|
21
|
+
|
|
22
|
+
module SyncWrap
|
|
23
|
+
|
|
24
|
+
# Provision the {Iyyov}[http://rubydoc.info/gems/iyyov/] job
|
|
25
|
+
# scheduler and process monitor via jruby_gem_install. The
|
|
26
|
+
# installation setup and configuration templates assume use of a
|
|
27
|
+
# jobs.d directory, as supported in \Iyyov 1.3.0.
|
|
28
|
+
#
|
|
29
|
+
# Host component dependencies: <Distro>, JRubyVM, RunUser
|
|
30
|
+
class Iyyov < Component
|
|
31
|
+
|
|
32
|
+
attr_accessor :iyyov_version
|
|
33
|
+
|
|
34
|
+
def initialize( opts = {} )
|
|
35
|
+
@iyyov_version = '1.3.0'
|
|
36
|
+
|
|
37
|
+
super
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Deploy iyyov gem, init.d/iyyov and at least an empty jobs.rb.
|
|
41
|
+
def install
|
|
42
|
+
# Shorten if the desired iyyov version is already running
|
|
43
|
+
pid, ver = capture_running_version( 'iyyov' )
|
|
44
|
+
unless ver == iyyov_version
|
|
45
|
+
install_run_dir #as root
|
|
46
|
+
install_iyyov_gem #as root
|
|
47
|
+
install_iyyov_init #as root
|
|
48
|
+
iyyov_restart #as root
|
|
49
|
+
true
|
|
50
|
+
end
|
|
51
|
+
false
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Given name(-instance), check for name.pid in service_dir and
|
|
55
|
+
# extract the version number from the associated cmdline. If this
|
|
56
|
+
# is running out of installed gem directory (Iyyov itself,
|
|
57
|
+
# standard Iyyov daemons) then cmdline should reference the gem
|
|
58
|
+
# version. Returns [pid, version] or nil if not found running
|
|
59
|
+
def capture_running_version( name, instance = nil )
|
|
60
|
+
sdir = service_dir( name, instance )
|
|
61
|
+
code, out = capture( <<-SH, user: run_user, accept:[0,1,91] )
|
|
62
|
+
pid=$(< #{sdir}/#{name}.pid)
|
|
63
|
+
if [[ $(< /proc/$pid/cmdline) =~ -(([0-9]+)(\\.[0-9A-Za-z]+)+)[-/] ]]; then
|
|
64
|
+
echo $pid ${BASH_REMATCH[1]}
|
|
65
|
+
exit 0
|
|
66
|
+
fi
|
|
67
|
+
exit 91
|
|
68
|
+
SH
|
|
69
|
+
# Above accepts exit 1 as from $(< missing-file), since it would
|
|
70
|
+
# be a race to pre-check. Note '\\' escape is for this
|
|
71
|
+
# ruby here-doc.
|
|
72
|
+
|
|
73
|
+
if code == 0
|
|
74
|
+
pid, ver = out.strip.split( ' ' )
|
|
75
|
+
[ pid.to_i, ver ]
|
|
76
|
+
else
|
|
77
|
+
nil
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Update remote (run_dir/) iyyov/jobs.rb. If force is true, touch
|
|
82
|
+
# root jobs.rb even if it was not changed: forcing an iyyov config
|
|
83
|
+
# reload. Returns any changes in the rput change format,
|
|
84
|
+
# including any forced mtime update.
|
|
85
|
+
def iyyov_install_jobs( force = false )
|
|
86
|
+
|
|
87
|
+
changes = rput( 'var/iyyov/jobs.rb', iyyov_run_dir, user: run_user )
|
|
88
|
+
|
|
89
|
+
if force && changes.empty?
|
|
90
|
+
rudo "touch #{iyyov_run_dir}/jobs.rb"
|
|
91
|
+
changes << [ '.f..T......', "#{iyyov_run_dir}/jobs.rb" ]
|
|
92
|
+
end
|
|
93
|
+
changes
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def iyyov_run_dir
|
|
97
|
+
"#{run_dir}/iyyov"
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Create iyyov run directory and make sure there is at minimum an
|
|
101
|
+
# empty jobs file. Avoid touching it if already present.
|
|
102
|
+
def install_run_dir
|
|
103
|
+
# Run as root for merging with the other install fragments.
|
|
104
|
+
sudo <<-SH
|
|
105
|
+
mkdir -p #{iyyov_run_dir}
|
|
106
|
+
mkdir -p #{iyyov_run_dir}/jobs.d
|
|
107
|
+
SH
|
|
108
|
+
chown_run_user( '-R', iyyov_run_dir )
|
|
109
|
+
sudo <<-SH
|
|
110
|
+
if [ ! -e #{iyyov_run_dir}/jobs.rb ]; then
|
|
111
|
+
su #{run_user} -c "touch #{iyyov_run_dir}/jobs.rb"
|
|
112
|
+
fi
|
|
113
|
+
SH
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Ensure install of same gem version as init.d/iyyov script
|
|
117
|
+
def install_iyyov_gem
|
|
118
|
+
jruby_gem_install( 'iyyov', version: iyyov_version )
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Install iyyov daemon init.d script and add to init daemons
|
|
122
|
+
def install_iyyov_init
|
|
123
|
+
rput( 'etc/init.d/iyyov', user: :root,
|
|
124
|
+
erb_vars: { lsb: distro.kind_of?( Ubuntu ) } )
|
|
125
|
+
|
|
126
|
+
# Add to init.d
|
|
127
|
+
dist_install_init_service( 'iyyov' )
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def iyyov_start
|
|
131
|
+
dist_service( 'iyyov', 'start' )
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def iyyov_stop
|
|
135
|
+
dist_service( 'iyyov', 'stop' )
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def iyyov_restart
|
|
139
|
+
dist_service( 'iyyov', 'restart' )
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011-2014 David Kellum
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
|
5
|
+
# may not use this file except in compliance with the License. You may
|
|
6
|
+
# obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
13
|
+
# implied. See the License for the specific language governing
|
|
14
|
+
# permissions and limitations under the License.
|
|
15
|
+
#++
|
|
16
|
+
|
|
17
|
+
require 'syncwrap/component'
|
|
18
|
+
|
|
19
|
+
module SyncWrap
|
|
20
|
+
|
|
21
|
+
# Provision a gem installed, Iyyov launched and monitored jruby
|
|
22
|
+
# daemon using a standard set of conventions. Can be used directly
|
|
23
|
+
# in the common case, or sub-classed as needed.
|
|
24
|
+
#
|
|
25
|
+
# Two :sync_paths files are searched for deployment: a config.rb and
|
|
26
|
+
# a jobs.d/<name>.rb. If concrete or .erb variants of these are not
|
|
27
|
+
# found than an (empty) default/config.rb and a generic
|
|
28
|
+
# default/daemon.rb.erb is used. Again, these will work in the common
|
|
29
|
+
# case.
|
|
30
|
+
#
|
|
31
|
+
# Host component dependencies: <Distro>, JRubyVM, RunUser, Iyyov
|
|
32
|
+
class IyyovDaemon < Component
|
|
33
|
+
|
|
34
|
+
# The daemon process name, also used for service_dir (along with any
|
|
35
|
+
# instance) and as the default gem_name. (required)
|
|
36
|
+
attr_accessor :name
|
|
37
|
+
|
|
38
|
+
# Name of the gem (set if different than name)
|
|
39
|
+
attr_writer :gem_name
|
|
40
|
+
|
|
41
|
+
# The (gem) version String (required)
|
|
42
|
+
attr_accessor :version
|
|
43
|
+
|
|
44
|
+
# An optional secondary instance name, useful if running more than
|
|
45
|
+
# one of 'name' on a host (default: nil)
|
|
46
|
+
attr_accessor :instance
|
|
47
|
+
|
|
48
|
+
def initialize( opts = {} )
|
|
49
|
+
@gem_version = nil
|
|
50
|
+
@gem_name = nil
|
|
51
|
+
@daemon_name = nil
|
|
52
|
+
@instance = nil
|
|
53
|
+
|
|
54
|
+
super
|
|
55
|
+
|
|
56
|
+
raise "IyyovDaemon#name property not set" unless name
|
|
57
|
+
raise "IyyovDaemon#version property not set" unless version
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def gem_name
|
|
61
|
+
@gem_name || @name
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def install
|
|
65
|
+
standard_install
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
protected
|
|
69
|
+
|
|
70
|
+
def standard_install
|
|
71
|
+
|
|
72
|
+
create_service_dir( name, instance )
|
|
73
|
+
changes = rput_service_config
|
|
74
|
+
|
|
75
|
+
# Shorten if the desired versioned process is already running.
|
|
76
|
+
pid, ver = capture_running_version( name, instance )
|
|
77
|
+
if ver != version
|
|
78
|
+
gem_install( gem_name, version: version )
|
|
79
|
+
changes += rput( job_source,
|
|
80
|
+
"#{iyyov_run_dir}/jobs.d/#{name_instance}.rb",
|
|
81
|
+
user: run_user )
|
|
82
|
+
changes += iyyov_install_jobs
|
|
83
|
+
elsif !changes.empty?
|
|
84
|
+
rudo( "kill #{pid} || true" ) # ..and let Iyyov restart it
|
|
85
|
+
end
|
|
86
|
+
changes
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def rput_service_config
|
|
90
|
+
rput( config_source, "#{daemon_service_dir}/config.rb", user: run_user )
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def daemon_service_dir
|
|
94
|
+
service_dir( name, instance )
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def name_instance
|
|
98
|
+
[ name, instance ].compact.join( '-' )
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def job_source
|
|
102
|
+
sjob = "var/iyyov/jobs.d/#{name_instance}.rb"
|
|
103
|
+
unless find_source( sjob )
|
|
104
|
+
sjob = "var/iyyov/jobs.d/#{name}.rb"
|
|
105
|
+
unless find_source( sjob )
|
|
106
|
+
sjob = "var/iyyov/default/daemon.rb.erb"
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
sjob
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def config_source
|
|
113
|
+
sconf = "var/#{name_instance}/config.rb"
|
|
114
|
+
unless find_source( sconf )
|
|
115
|
+
sconf = "var/#{name}/config.rb"
|
|
116
|
+
unless find_source( sconf )
|
|
117
|
+
sconf = 'var/iyyov/default/config.rb'
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
sconf
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Copyright (c) 2011-2014 David Kellum
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
|
5
|
+
# may not use this file except in compliance with the License. You may
|
|
6
|
+
# obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
13
|
+
# implied. See the License for the specific language governing
|
|
14
|
+
# permissions and limitations under the License.
|
|
15
|
+
#++
|
|
16
|
+
|
|
17
|
+
require 'syncwrap/component'
|
|
18
|
+
require 'syncwrap/ruby_support'
|
|
19
|
+
|
|
20
|
+
module SyncWrap
|
|
21
|
+
|
|
22
|
+
# Provision JRuby (jruby.org - Ruby on the Java Virtual Machine) by
|
|
23
|
+
# direct download from public S3 repo. Includes utility methods for
|
|
24
|
+
# checking and installing JRuby gems.
|
|
25
|
+
#
|
|
26
|
+
# Host component dependencies: <Distro>
|
|
27
|
+
class JRubyVM < Component
|
|
28
|
+
include RubySupport
|
|
29
|
+
|
|
30
|
+
# JRuby version to install (default: 1.7.10)
|
|
31
|
+
attr_accessor :jruby_version
|
|
32
|
+
|
|
33
|
+
def initialize( opts = {} )
|
|
34
|
+
@jruby_version = '1.7.10'
|
|
35
|
+
|
|
36
|
+
super( { gem_command: 'jgem' }.merge( opts ) )
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def jruby_dist_path
|
|
40
|
+
"#{local_root}/lib/jruby/jruby-#{jruby_version}"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def gemrc_path
|
|
44
|
+
"#{jruby_dist_path}/etc"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def jruby_gem_home
|
|
48
|
+
"#{local_root}/lib/jruby/gems"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Install jruby if the jruby_version is not already present.
|
|
52
|
+
def install
|
|
53
|
+
jruby_install
|
|
54
|
+
install_gemrc
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def jruby_bin_url
|
|
58
|
+
[ 'http://jruby.org.s3.amazonaws.com/downloads',
|
|
59
|
+
jruby_version,
|
|
60
|
+
"jruby-bin-#{jruby_version}.tar.gz" ].join( '/' )
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Install jruby, including usr/local/bin local contents
|
|
64
|
+
def jruby_install
|
|
65
|
+
|
|
66
|
+
root = "#{local_root}/lib/jruby"
|
|
67
|
+
|
|
68
|
+
sudo <<-SH
|
|
69
|
+
if [ ! -d #{jruby_dist_path} ]; then
|
|
70
|
+
mkdir -p #{root}
|
|
71
|
+
mkdir -p #{root}/gems
|
|
72
|
+
curl -sSL #{jruby_bin_url} | tar -C #{root} -zxf -
|
|
73
|
+
mkdir -p #{gemrc_path}
|
|
74
|
+
cd #{root} && ln -sfn jruby-#{jruby_version} jruby
|
|
75
|
+
cd #{local_root}/bin && ln -sf ../lib/jruby/jruby/bin/jirb .
|
|
76
|
+
fi
|
|
77
|
+
SH
|
|
78
|
+
|
|
79
|
+
rput( 'jruby/bin/', "#{local_root}/bin/", excludes: :dev, user: :root )
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# See RubySupport#gem_install for usage.
|
|
83
|
+
#
|
|
84
|
+
# The jruby jgem command tends to be slow on virtual hardware.
|
|
85
|
+
# This implementation adds a faster short-circuit when an exact,
|
|
86
|
+
# single :version is given that avoids calling gem if the rubygems
|
|
87
|
+
# same version gemspec file is found.
|
|
88
|
+
def gem_install( gem, opts = {} )
|
|
89
|
+
version = Array( opts[ :version ] )
|
|
90
|
+
ver = (version.length == 1) && version[0] =~ /^=?\s*([0-9]\S+)/ && $1
|
|
91
|
+
|
|
92
|
+
unless ( opts[:check] || opts[:user_install] ||
|
|
93
|
+
opts[:minimize] == false || opts[:spec_check] == false ||
|
|
94
|
+
!version )
|
|
95
|
+
|
|
96
|
+
specs = [ "#{jruby_gem_home}/specifications/#{gem}-#{ver}-java.gemspec",
|
|
97
|
+
"#{jruby_gem_home}/specifications/#{gem}-#{ver}.gemspec" ]
|
|
98
|
+
|
|
99
|
+
sudo( "if [ ! -e '#{specs[0]}' -a ! -e '#{specs[1]}' ]; then",
|
|
100
|
+
close: "fi" ) do
|
|
101
|
+
super
|
|
102
|
+
end
|
|
103
|
+
else
|
|
104
|
+
super
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
alias :jruby_gem_install :gem_install
|
|
110
|
+
|
|
111
|
+
def min_deps_supported?
|
|
112
|
+
varray = jruby_version.split('.').map { |n| n.to_i }
|
|
113
|
+
( varray <=> [1, 7, 5] ) >= 0
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def jruby_gem_version_flags( reqs )
|
|
117
|
+
Array( reqs ).flatten.compact.map { |req| "-v'#{req}'" }
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|