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,204 @@
|
|
|
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
|
+
# Handles assembling mdraid (Linux Software RAID) arrays, lvm
|
|
22
|
+
# volumes, creating and mounting filesystems from previously
|
|
23
|
+
# attached raw devices.
|
|
24
|
+
#
|
|
25
|
+
# Host component dependencies: <Distro>
|
|
26
|
+
class MDRaid < Component
|
|
27
|
+
|
|
28
|
+
# An instance number used for mdraid and volume group
|
|
29
|
+
# names. Increment this when applying multiple components of this
|
|
30
|
+
# type to the same host. Default: 0
|
|
31
|
+
attr_accessor :instance
|
|
32
|
+
|
|
33
|
+
# A number, range, or array of raw device names. See #raw_devices=
|
|
34
|
+
# for interpretation. Software raid is only used for >1 raw
|
|
35
|
+
# device. Default: 0
|
|
36
|
+
attr_reader :raw_devices
|
|
37
|
+
|
|
38
|
+
# Block device read-ahead setting for the raw devices, in 512-byte
|
|
39
|
+
# blocks. Default: 32
|
|
40
|
+
attr_accessor :raw_read_ahead
|
|
41
|
+
|
|
42
|
+
# Attempt to unmount and remove from fstab any existing mount of
|
|
43
|
+
# the specified raw devices. _WARNING:_ this may increase the
|
|
44
|
+
# danger of data loss!
|
|
45
|
+
# (Default: false)
|
|
46
|
+
attr_accessor :do_unmount
|
|
47
|
+
|
|
48
|
+
# Numeric RAID level.
|
|
49
|
+
# (Default: 10 if there are at least 4 raw devices, otherwise 0.)
|
|
50
|
+
attr_accessor :raid_level
|
|
51
|
+
|
|
52
|
+
# RAID md device read-ahead setting, in 512-byte blocks.
|
|
53
|
+
# Default: 64
|
|
54
|
+
attr_accessor :raid_read_ahead
|
|
55
|
+
|
|
56
|
+
# RAID chunk size in KB
|
|
57
|
+
# Default: 256
|
|
58
|
+
attr_accessor :raid_chunk
|
|
59
|
+
|
|
60
|
+
# A table of [ slice, path (,name) ] rows where; slice is a
|
|
61
|
+
# floating point ratio in range (0.0,1.0], path is the mount
|
|
62
|
+
# point, and name is the lvm name, defaulting if omitted to the
|
|
63
|
+
# last path element. The sum of all slice values in the table
|
|
64
|
+
# should be 1.0. Default: [ [ 1.0, '/data' ] ]
|
|
65
|
+
attr_accessor :lvm_volumes
|
|
66
|
+
|
|
67
|
+
# File System Type. Default: 'ext4'
|
|
68
|
+
attr_accessor :fs_type
|
|
69
|
+
|
|
70
|
+
# Array of FS specific options to pass as mkfs -t fs_type _OPTS_
|
|
71
|
+
# Default: [] (none)
|
|
72
|
+
attr_accessor :fs_opts
|
|
73
|
+
|
|
74
|
+
# Mount options Array
|
|
75
|
+
# Default: [ defaults auto noatime nodiratime ]
|
|
76
|
+
attr_accessor :mount_opts
|
|
77
|
+
|
|
78
|
+
def initialize( opts = {} )
|
|
79
|
+
@instance = 0 #FIXME: Or compute from existing volumes?
|
|
80
|
+
|
|
81
|
+
@raw_devices = []
|
|
82
|
+
@raw_read_ahead = 32 #512B blocks
|
|
83
|
+
@do_unmount = false
|
|
84
|
+
|
|
85
|
+
@raid_level = nil #default_raid_level
|
|
86
|
+
@raid_read_ahead = 64 #512B blocks
|
|
87
|
+
@raid_chunk = 256 #K
|
|
88
|
+
|
|
89
|
+
@lvm_volumes = [ [ 1.0, '/data' ] ]
|
|
90
|
+
@fs_type = 'ext4'
|
|
91
|
+
@fs_opts = []
|
|
92
|
+
@mount_opts = %w[ defaults auto noatime nodiratime ]
|
|
93
|
+
|
|
94
|
+
super
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Set raw devices to assemble.
|
|
98
|
+
# * Interprets an Integer val as a count of N devices with names
|
|
99
|
+
# /dev/xvdh1 to /dev/xvdhN.
|
|
100
|
+
# * Interprets a Range value as /dev/xvdhN for each N
|
|
101
|
+
# in range.
|
|
102
|
+
# * Interprets an Array as the actual device path strings.
|
|
103
|
+
def raw_devices=( val )
|
|
104
|
+
@raw_devices = case val
|
|
105
|
+
when Integer
|
|
106
|
+
val.times.map { |i| "/dev/xvdh#{i+1}" }
|
|
107
|
+
when Range
|
|
108
|
+
val.map { |i| "/dev/xvdh#{i}" }
|
|
109
|
+
when Array
|
|
110
|
+
val
|
|
111
|
+
else
|
|
112
|
+
raise "Unsupported raw_devices setting #{val.inspect}"
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Install only if _all_ lvm_volumes paths do not yet exist.
|
|
117
|
+
def install
|
|
118
|
+
return if raw_devices.empty? || lvm_volumes.empty?
|
|
119
|
+
|
|
120
|
+
paths = lvm_volumes.map { |r| r[1] }
|
|
121
|
+
test = paths.map { |p| "! -e #{p}" }.join( " -a " )
|
|
122
|
+
|
|
123
|
+
sudo( "if [ #{test} ]; then", close: "fi" ) do
|
|
124
|
+
|
|
125
|
+
dist_install( "mdadm", "lvm2", minimal: true )
|
|
126
|
+
|
|
127
|
+
raw_devices.each do |d|
|
|
128
|
+
unmount_device( d ) if do_unmount
|
|
129
|
+
sudo "blockdev --setra #{raw_read_ahead} #{d}"
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
if raw_devices.count > 1
|
|
133
|
+
dev = "/dev/md#{instance}"
|
|
134
|
+
create_raid( dev )
|
|
135
|
+
else
|
|
136
|
+
dev = raw_devices.first
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
create_volumes( dev )
|
|
140
|
+
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
private
|
|
145
|
+
|
|
146
|
+
def unmount_device( dev )
|
|
147
|
+
sudo <<-SH
|
|
148
|
+
if mount | grep -q '^#{dev} '; then
|
|
149
|
+
umount #{dev}
|
|
150
|
+
sed -r -i '\\|^#{dev}\\s|d' /etc/fstab
|
|
151
|
+
fi
|
|
152
|
+
SH
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def create_raid( md )
|
|
156
|
+
rlevel = raid_level || default_raid_level
|
|
157
|
+
|
|
158
|
+
sudo <<-SH
|
|
159
|
+
mdadm --create #{md} --level=#{rlevel} --chunk=#{raid_chunk} \
|
|
160
|
+
--raid-devices=#{raw_devices.count} #{raw_devices.join ' '}
|
|
161
|
+
touch /etc/mdadm.conf
|
|
162
|
+
echo "DEVICE #{raw_devices.join ' '}" >> /etc/mdadm.conf
|
|
163
|
+
mdadm --detail --scan >> /etc/mdadm.conf
|
|
164
|
+
blockdev --setra #{raid_read_ahead} #{md}
|
|
165
|
+
SH
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def create_volumes( dev )
|
|
169
|
+
vg = "vg#{instance}"
|
|
170
|
+
sudo <<-SH
|
|
171
|
+
dd if=/dev/zero of=#{dev} bs=512 count=1
|
|
172
|
+
pvcreate #{dev}
|
|
173
|
+
vgcreate #{vg} #{dev}
|
|
174
|
+
SH
|
|
175
|
+
|
|
176
|
+
lvm_volumes.each do |v|
|
|
177
|
+
create_volume( *v )
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def create_volume( slice, path, name = nil )
|
|
182
|
+
name ||= File.basename( path )
|
|
183
|
+
vg = "vg#{instance}"
|
|
184
|
+
sudo <<-SH
|
|
185
|
+
lvcreate -l #{(slice * 100).round}%vg -n #{name} #{vg}
|
|
186
|
+
mkfs -t #{fs_type} #{fs_opts.join ' '} /dev/#{vg}/#{name}
|
|
187
|
+
mkdir -p #{path}
|
|
188
|
+
echo '/dev/#{vg}/#{name} #{path} #{fs_type} #{mount_opts.join ','} 0 0' \
|
|
189
|
+
>> /etc/fstab
|
|
190
|
+
mount #{path}
|
|
191
|
+
SH
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def default_raid_level
|
|
195
|
+
if raw_devices.count >= 4
|
|
196
|
+
10
|
|
197
|
+
else
|
|
198
|
+
0
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
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
|
+
require 'syncwrap/components/ubuntu'
|
|
20
|
+
require 'syncwrap/components/rhel'
|
|
21
|
+
|
|
22
|
+
module SyncWrap
|
|
23
|
+
|
|
24
|
+
# Make updates to system configration for hostname and name
|
|
25
|
+
# resolution. These changes are distro specific.
|
|
26
|
+
#
|
|
27
|
+
# Host component dependencies: <Distro>
|
|
28
|
+
class Network < Component
|
|
29
|
+
|
|
30
|
+
# A default DNS domain name to use for name search, for addition
|
|
31
|
+
# to /etc/resolver.conf, etc. (default: nil)
|
|
32
|
+
attr_accessor :dns_domain
|
|
33
|
+
|
|
34
|
+
def initialize( opts = {} )
|
|
35
|
+
@dns_domain = nil
|
|
36
|
+
super
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def install
|
|
40
|
+
update_hostname
|
|
41
|
+
update_resolver
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def update_hostname
|
|
45
|
+
name = host.name
|
|
46
|
+
|
|
47
|
+
case distro
|
|
48
|
+
when RHEL
|
|
49
|
+
# If HOSTNAME not already set correctly in network file,
|
|
50
|
+
# backup, delete old line, append new line.
|
|
51
|
+
sudo <<-SH
|
|
52
|
+
if ! grep -q '^HOSTNAME=#{name}$' /etc/sysconfig/network; then
|
|
53
|
+
cp -f /etc/sysconfig/network /etc/sysconfig/network~
|
|
54
|
+
sed -i '/^HOSTNAME=.*/d' /etc/sysconfig/network
|
|
55
|
+
echo 'HOSTNAME=#{name}' >> /etc/sysconfig/network
|
|
56
|
+
hostname #{name}
|
|
57
|
+
fi
|
|
58
|
+
SH
|
|
59
|
+
when Ubuntu
|
|
60
|
+
sudo <<-SH
|
|
61
|
+
if [ ! -e /etc/hostname -o "$(< /etc/hostname)" != "#{name}" ]; then
|
|
62
|
+
echo #{name} > /etc/hostname
|
|
63
|
+
hostname #{name}
|
|
64
|
+
fi
|
|
65
|
+
SH
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def update_resolver
|
|
70
|
+
if dns_domain
|
|
71
|
+
# (Temporary) inclusion direct to resolver.conf
|
|
72
|
+
sudo <<-SH
|
|
73
|
+
if ! grep -q 'search.* #{dns_domain}' /etc/resolver.conf; then
|
|
74
|
+
cp -f /etc/resolver.conf /etc/resolver.conf~
|
|
75
|
+
sed -i '/^search/d' /etc/resolver.conf
|
|
76
|
+
echo 'search #{dns_domain}' >> /etc/resolver.conf
|
|
77
|
+
fi
|
|
78
|
+
SH
|
|
79
|
+
|
|
80
|
+
case distro
|
|
81
|
+
when RHEL
|
|
82
|
+
# FIXME:
|
|
83
|
+
warn "Network: not sure if resolver.conf change is permanent?"
|
|
84
|
+
when Ubuntu
|
|
85
|
+
f='/etc/network/interfaces'
|
|
86
|
+
sudo <<-SH
|
|
87
|
+
if ! grep -E -q '^\\s*dns-domain #{dns_domain}' #{f}; then
|
|
88
|
+
cp -f #{f} #{f}~
|
|
89
|
+
sed -r -i '/^\\s*dns-domain/d' #{f}
|
|
90
|
+
echo ' dns-domain #{dns_domain}' >> #{f}
|
|
91
|
+
fi
|
|
92
|
+
SH
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
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/rhel'
|
|
21
|
+
require 'syncwrap/components/ubuntu'
|
|
22
|
+
|
|
23
|
+
module SyncWrap
|
|
24
|
+
|
|
25
|
+
# Provision an OpenJDK via Linux distro managed packages.
|
|
26
|
+
#
|
|
27
|
+
# Oracle, Java, and OpenJDK are registered trademarks of Oracle
|
|
28
|
+
# and/or its affiliates.
|
|
29
|
+
# See http://openjdk.java.net/legal/openjdk-trademark-notice.html.
|
|
30
|
+
#
|
|
31
|
+
# Host component dependencies: <Distro>
|
|
32
|
+
class OpenJDK < Component
|
|
33
|
+
|
|
34
|
+
# The JDK major and/or minor version number, i.e "1.7" or "7" is 7.
|
|
35
|
+
# Marketing picked the version scheme.
|
|
36
|
+
attr_accessor :jdk_major_minor
|
|
37
|
+
|
|
38
|
+
def initialize( opts = {} )
|
|
39
|
+
@jdk_major_minor = 7
|
|
40
|
+
|
|
41
|
+
super
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def jdk_dir
|
|
45
|
+
case distro
|
|
46
|
+
when RHEL
|
|
47
|
+
"/usr/lib/jvm/java-1.#{jdk_major_minor}.0"
|
|
48
|
+
when Ubuntu
|
|
49
|
+
"/usr/lib/jvm/java-#{jdk_major_minor}-openjdk-amd64"
|
|
50
|
+
else
|
|
51
|
+
raise ContextError, "Unknown distro jdk_dir"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Install including development headers for things like Hashdot.
|
|
56
|
+
def install
|
|
57
|
+
case distro
|
|
58
|
+
when RHEL
|
|
59
|
+
dist_install( "java-1.#{jdk_major_minor}.0-openjdk",
|
|
60
|
+
"java-1.#{jdk_major_minor}.0-openjdk-devel" )
|
|
61
|
+
when Ubuntu
|
|
62
|
+
dist_install( "openjdk-#{jdk_major_minor}-jdk" )
|
|
63
|
+
else
|
|
64
|
+
raise ContextError, "Unknown distro type"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
@@ -0,0 +1,159 @@
|
|
|
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/rhel'
|
|
21
|
+
require 'syncwrap/components/ubuntu'
|
|
22
|
+
|
|
23
|
+
module SyncWrap
|
|
24
|
+
|
|
25
|
+
# Provisions for install and configuration of PostgreSQL
|
|
26
|
+
#
|
|
27
|
+
# Host component dependencies: <Distro>
|
|
28
|
+
class PostgreSQL < Component
|
|
29
|
+
|
|
30
|
+
# Location of postgresql data dir
|
|
31
|
+
attr_accessor :pg_data_dir
|
|
32
|
+
|
|
33
|
+
# The distro default data dir (set if known to be different than
|
|
34
|
+
# distro-specific default, nil -> computed in accessor)
|
|
35
|
+
attr_writer :pg_default_data_dir
|
|
36
|
+
|
|
37
|
+
def initialize( opts = {} )
|
|
38
|
+
@pg_data_dir = '/pg/data'
|
|
39
|
+
@pg_default_data_dir = nil
|
|
40
|
+
super
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def pg_default_data_dir
|
|
44
|
+
@pg_default_data_dir ||
|
|
45
|
+
case distro
|
|
46
|
+
when RHEL
|
|
47
|
+
'/var/lib/pgsql9/data'
|
|
48
|
+
when Ubuntu
|
|
49
|
+
'/var/lib/postgresql/9.1/main'
|
|
50
|
+
else
|
|
51
|
+
raise ContextError, "Distro #{distro.class.name} not supported"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def pg_deploy_config
|
|
56
|
+
case distro
|
|
57
|
+
when RHEL
|
|
58
|
+
'postgresql/rhel'
|
|
59
|
+
when Ubuntu
|
|
60
|
+
'postgresql/ubuntu'
|
|
61
|
+
else
|
|
62
|
+
raise ContextError, "Distro #{distro.class.name} not supported"
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def pg_config_dir
|
|
67
|
+
case distro
|
|
68
|
+
when RHEL
|
|
69
|
+
pg_data_dir
|
|
70
|
+
when Ubuntu
|
|
71
|
+
'/etc/postgresql/9.1/main'
|
|
72
|
+
else
|
|
73
|
+
raise ContextError, "Distro #{distro.class.name} not supported"
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def install
|
|
78
|
+
package_install
|
|
79
|
+
changes = setup_data_dir
|
|
80
|
+
changes += pg_configure
|
|
81
|
+
if changes.empty?
|
|
82
|
+
pg_start
|
|
83
|
+
else
|
|
84
|
+
pg_restart
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def package_install
|
|
89
|
+
dist_install 'postgresql'
|
|
90
|
+
if distro.is_a?( Ubuntu )
|
|
91
|
+
pg_stop
|
|
92
|
+
rput( 'etc/sysctl.d/61-postgresql-shm.conf', :user => 'root' )
|
|
93
|
+
sudo "sysctl -p /etc/sysctl.d/61-postgresql-shm.conf"
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def setup_data_dir
|
|
98
|
+
changes = []
|
|
99
|
+
|
|
100
|
+
case distro
|
|
101
|
+
|
|
102
|
+
when RHEL
|
|
103
|
+
unless pg_data_dir == pg_default_data_dir
|
|
104
|
+
changes = rput( 'etc/sysconfig/pgsql/postgresql', :user => 'root' )
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
sudo( "if [ ! -d '#{pg_data_dir}/base' ]; then", close: "fi" ) do
|
|
108
|
+
unless pg_data_dir == pg_default_data_dir
|
|
109
|
+
# (Per Amazon Linux)
|
|
110
|
+
# Install PGDATA var override for init.d/postgresql
|
|
111
|
+
sudo <<-SH
|
|
112
|
+
mkdir -p #{pg_data_dir}
|
|
113
|
+
chown postgres:postgres #{pg_data_dir}
|
|
114
|
+
chmod 700 #{pg_data_dir}
|
|
115
|
+
SH
|
|
116
|
+
end
|
|
117
|
+
dist_service( 'postgresql', 'initdb' )
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
when Ubuntu
|
|
121
|
+
unless pg_data_dir == pg_default_data_dir
|
|
122
|
+
sudo <<-SH
|
|
123
|
+
mkdir -p #{pg_data_dir}
|
|
124
|
+
chown postgres:postgres #{pg_data_dir}
|
|
125
|
+
chmod 700 #{pg_data_dir}
|
|
126
|
+
mv #{pg_default_data_dir}/* #{pg_data_dir}/
|
|
127
|
+
SH
|
|
128
|
+
end
|
|
129
|
+
else
|
|
130
|
+
raise ContextError, "Distro #{distro.class.name} not supported"
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
changes
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Update PostgreSQL config files
|
|
137
|
+
def pg_configure
|
|
138
|
+
changes = rput( "#{pg_deploy_config}/", pg_config_dir, :user => 'postgres' )
|
|
139
|
+
if !changes.empty? && pg_config_dir == pg_data_dir
|
|
140
|
+
sudo( "chmod 700 #{pg_data_dir}" )
|
|
141
|
+
end
|
|
142
|
+
changes
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def pg_start
|
|
146
|
+
dist_service( 'postgresql', 'start' )
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def pg_restart
|
|
150
|
+
dist_service( 'postgresql', 'restart' )
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def pg_stop
|
|
154
|
+
dist_service( 'postgresql', 'stop' )
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
end
|