bixby-provision 0.1.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/Gemfile +29 -0
- data/Gemfile.lock +192 -0
- data/Rakefile +13 -0
- data/VERSION +1 -0
- data/Vagrantfile +64 -0
- data/bin/bixby-provision +6 -0
- data/bixby-provision.gemspec +113 -0
- data/lib/bixby-provision.rb +2 -0
- data/lib/bixby/provision.rb +65 -0
- data/lib/bixby/provision/app.rb +34 -0
- data/lib/bixby/provision/dsl.rb +23 -0
- data/lib/bixby/provision/dsl/base.rb +76 -0
- data/lib/bixby/provision/dsl/bundler.rb +18 -0
- data/lib/bixby/provision/dsl/config.rb +124 -0
- data/lib/bixby/provision/dsl/dir.rb +34 -0
- data/lib/bixby/provision/dsl/file.rb +108 -0
- data/lib/bixby/provision/dsl/inventory.rb +18 -0
- data/lib/bixby/provision/dsl/meteor.rb +30 -0
- data/lib/bixby/provision/dsl/nodejs.rb +73 -0
- data/lib/bixby/provision/dsl/npm.rb +18 -0
- data/lib/bixby/provision/dsl/ntp.rb +41 -0
- data/lib/bixby/provision/dsl/packager/apt.rb +46 -0
- data/lib/bixby/provision/dsl/packager/base.rb +11 -0
- data/lib/bixby/provision/dsl/packager/npm.rb +67 -0
- data/lib/bixby/provision/dsl/packager/yum.rb +100 -0
- data/lib/bixby/provision/dsl/packager/yum/epel.rb +71 -0
- data/lib/bixby/provision/dsl/packager/yum/mongodb.rb +43 -0
- data/lib/bixby/provision/dsl/ruby.rb +21 -0
- data/lib/bixby/provision/dsl/run_control.rb +49 -0
- data/lib/bixby/provision/dsl/scm.rb +34 -0
- data/lib/bixby/provision/dsl/scm/base.rb +11 -0
- data/lib/bixby/provision/dsl/scm/git.rb +89 -0
- data/lib/bixby/provision/dsl/scm/svn.rb +11 -0
- data/lib/bixby/provision/dsl/service.rb +56 -0
- data/lib/bixby/provision/dsl/services/base.rb +11 -0
- data/lib/bixby/provision/dsl/services/init.rb +40 -0
- data/lib/bixby/provision/dsl/system.rb +53 -0
- data/lib/bixby/provision/dsl/util/file.rb +100 -0
- data/lib/bixby/provision/dsl/variable.rb +27 -0
- data/lib/bixby/provision/manifest.rb +49 -0
- data/lib/bixby/provision/manifest/dsl_proxy.rb +17 -0
- data/manifest.rb +31 -0
- data/tasks/coverage.rake +2 -0
- data/tasks/jeweler.rake +21 -0
- data/tasks/test.rake +5 -0
- data/tasks/yard.rake +2 -0
- metadata +244 -0
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
module Bixby
|
3
|
+
module Provision
|
4
|
+
|
5
|
+
class Meteor < Base
|
6
|
+
|
7
|
+
EXPORTS = []
|
8
|
+
|
9
|
+
def install(opts={})
|
10
|
+
if File.exists? "/usr/local/bin/meteor" then
|
11
|
+
logger.info "meteor already installed; skipping"
|
12
|
+
return
|
13
|
+
end
|
14
|
+
|
15
|
+
logger.info "[meteor] installing meteor"
|
16
|
+
logged_systemu("curl -sL https://install.meteor.com | sh")
|
17
|
+
end
|
18
|
+
|
19
|
+
# Run meteorite install
|
20
|
+
def mrt(path, opts={})
|
21
|
+
logger.info "[meteor] mrt install"
|
22
|
+
logged_systemu("mrt install", :cwd => File.expand_path(path))
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
register_dsl Meteor
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
|
2
|
+
module Bixby
|
3
|
+
module Provision
|
4
|
+
|
5
|
+
class NodeJS < Base
|
6
|
+
|
7
|
+
EXPORTS = []
|
8
|
+
|
9
|
+
CURRENT_VERSION = "0.10.26"
|
10
|
+
|
11
|
+
def install(opts={})
|
12
|
+
logger.info "nodejs.install"
|
13
|
+
|
14
|
+
version = opts.delete(:version) || CURRENT_VERSION
|
15
|
+
path = opts.delete(:path) || "/usr/local"
|
16
|
+
|
17
|
+
if ubuntu? || opts[:tarball] then
|
18
|
+
install_from_tarball(version, path)
|
19
|
+
elsif amazon? or centos? then
|
20
|
+
sys.package "nodejs"
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def install_from_tarball(version, path)
|
29
|
+
|
30
|
+
version = "v" + version if version !~ /^v/
|
31
|
+
|
32
|
+
bin = File.join(path, "bin", "node")
|
33
|
+
if File.exists?(bin) then
|
34
|
+
installed_ver = systemu("#{bin} --version").stdout.strip
|
35
|
+
if SemVer.parse(installed_ver) == SemVer.parse(version) then
|
36
|
+
logger.info "nodejs #{version} is already installed at #{path}"
|
37
|
+
return
|
38
|
+
elsif SemVer.parse(installed_ver) > SemVer.parse(version) then
|
39
|
+
logger.info "a newer nodejs (#{version}) is already installed at #{path}"
|
40
|
+
return
|
41
|
+
else
|
42
|
+
logger.info "nodejs #{installed_ver} is currently installed; upgrading to #{version}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
url = package_url(version)
|
47
|
+
Dir.mktmpdir("bixby-provision") do |dir|
|
48
|
+
Dir.chdir(dir) do
|
49
|
+
# download
|
50
|
+
logger.info "downloading #{url}"
|
51
|
+
systemu("wget -nv #{url}")
|
52
|
+
|
53
|
+
# install
|
54
|
+
file = File.basename(url)
|
55
|
+
logger.info "installing node-#{version}"
|
56
|
+
systemu("tar -xzf #{file}")
|
57
|
+
systemu("rm -f *.gz")
|
58
|
+
systemu("cd node* && sudo cp -a bin lib include share #{path}/")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def package_url(version)
|
64
|
+
arch = amd64?() ? "x64" : "x86"
|
65
|
+
"http://nodejs.org/dist/v0.10.26/node-#{version}-linux-#{arch}.tar.gz"
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
register_dsl NodeJS, :nodejs
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
module Bixby
|
3
|
+
module Provision
|
4
|
+
|
5
|
+
class NTP < Base
|
6
|
+
|
7
|
+
EXPORTS = []
|
8
|
+
|
9
|
+
DEFAULT_NTP_POOL = "ntp.ubuntu.com"
|
10
|
+
|
11
|
+
def initialize(*args)
|
12
|
+
super
|
13
|
+
@service = if ubuntu? then
|
14
|
+
"ntp"
|
15
|
+
elsif centos? or amazon? then
|
16
|
+
"ntpd"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def set(server=DEFAULT_NTP_POOL)
|
21
|
+
logger.info "ntp.set using #{server}"
|
22
|
+
sys.package "ntpdate"
|
23
|
+
stop
|
24
|
+
logged_sudo("ntpdate #{server}", :env => { "PATH" => PATH } )
|
25
|
+
start
|
26
|
+
end
|
27
|
+
|
28
|
+
def start
|
29
|
+
service.start @service
|
30
|
+
end
|
31
|
+
|
32
|
+
def stop
|
33
|
+
service.stop @service
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
register_dsl NTP
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
|
2
|
+
module Bixby
|
3
|
+
module Provision
|
4
|
+
module Packager
|
5
|
+
|
6
|
+
class Apt < PackagerBase
|
7
|
+
|
8
|
+
def refresh
|
9
|
+
sudo("apt-get -qqy update")
|
10
|
+
end
|
11
|
+
|
12
|
+
def upgrade_system
|
13
|
+
logged_sudo('DEBIAN_FRONTEND=noninteractive dpkg-reconfigure grub-pc', :env => env)
|
14
|
+
logged_sudo('apt-get -qqy -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade', :env => env)
|
15
|
+
logged_sudo('apt-get -qqy autoremove')
|
16
|
+
logged_sudo('apt-get -qqy autoclean')
|
17
|
+
end
|
18
|
+
|
19
|
+
def install(*packages)
|
20
|
+
packages.flatten!
|
21
|
+
logged_sudo("apt-get -qqy install " + packages.join(" "))
|
22
|
+
end
|
23
|
+
|
24
|
+
def install_repo(name, opts={})
|
25
|
+
name.downcase!
|
26
|
+
if name == "epel" then
|
27
|
+
logger.debug "#{name} isn't supported on this distro"
|
28
|
+
return
|
29
|
+
elsif name =~ /^https?.*\.repo$/ then
|
30
|
+
logger.debug "repo files are not supported on this distro: #{name}"
|
31
|
+
return
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def env
|
39
|
+
{ "DEBIAN_FRONTEND" => "noninteractive" }
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
module Bixby
|
3
|
+
module Provision
|
4
|
+
module Packager
|
5
|
+
|
6
|
+
class NPM < PackagerBase
|
7
|
+
|
8
|
+
def install(*packages)
|
9
|
+
if packages.last.kind_of? Hash then
|
10
|
+
opts = packages.pop
|
11
|
+
else
|
12
|
+
opts = {}
|
13
|
+
end
|
14
|
+
packages = packages.flatten.sort
|
15
|
+
|
16
|
+
logger.info "npm install: " + packages.join(" ")
|
17
|
+
|
18
|
+
installed = query_installed_packages(packages, opts)
|
19
|
+
needed = packages.find_all{ |s| !installed.include? s }
|
20
|
+
if needed.empty? then
|
21
|
+
logger.info "[npm] package(s) already installed"
|
22
|
+
return
|
23
|
+
end
|
24
|
+
|
25
|
+
global = opts[:global]
|
26
|
+
if global then
|
27
|
+
cmd = "npm install -g " + packages.join(" ")
|
28
|
+
logged_sudo(cmd, env)
|
29
|
+
else
|
30
|
+
cmd = "npm install " + packages.join(" ")
|
31
|
+
logged_systemu(cmd, env)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def installed?(package, opts={})
|
36
|
+
query_installed_packages(package, opts).include? package
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
|
42
|
+
# Query NPM DB for presence of given packages. Returns a hash for easy lookup
|
43
|
+
#
|
44
|
+
# @param [Array<String>] packages
|
45
|
+
#
|
46
|
+
# @return [Hash<String, 1>]
|
47
|
+
def query_installed_packages(packages, opts={})
|
48
|
+
packages = [ packages ] if not packages.kind_of? Array
|
49
|
+
packages.flatten!
|
50
|
+
|
51
|
+
g = opts[:global] ? "-g" : ""
|
52
|
+
|
53
|
+
installed = {}
|
54
|
+
systemu("npm #{g} ls --parseable --depth 1 " + packages.join(" "), env).
|
55
|
+
stdout.split(/\n/).each{ |s| installed[File.basename(s)] = 1 }
|
56
|
+
|
57
|
+
return installed
|
58
|
+
end
|
59
|
+
|
60
|
+
def env
|
61
|
+
{ :env => { "PATH" => Provision::Base::PATH } }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
|
2
|
+
module Bixby
|
3
|
+
module Provision
|
4
|
+
module Packager
|
5
|
+
|
6
|
+
class Yum < PackagerBase
|
7
|
+
|
8
|
+
YUM_REPOS_D = "/etc/yum.repos.d/"
|
9
|
+
|
10
|
+
REPOS = {}
|
11
|
+
|
12
|
+
def self.register_plugin(mod, method=nil, name=nil)
|
13
|
+
if name.nil? then
|
14
|
+
name = mod.name.split(/::/).last.downcase
|
15
|
+
end
|
16
|
+
if method.nil? then
|
17
|
+
method = "install_#{name}".to_sym
|
18
|
+
end
|
19
|
+
logger.debug "[yum] registered plugin: #{name}"
|
20
|
+
REPOS[name] = method
|
21
|
+
include(mod)
|
22
|
+
end
|
23
|
+
|
24
|
+
def refresh
|
25
|
+
sudo("yum -q clean all")
|
26
|
+
sudo("yum -q -y check-update")
|
27
|
+
end
|
28
|
+
|
29
|
+
def upgrade_system
|
30
|
+
logged_sudo('yum -q -y upgrade')
|
31
|
+
end
|
32
|
+
|
33
|
+
def install_repo(name, opts={})
|
34
|
+
name.downcase!
|
35
|
+
if REPOS.include? name then
|
36
|
+
return self.send(REPOS[name], opts)
|
37
|
+
elsif name =~ /^https?.*\.repo$/ then
|
38
|
+
return install_repo_url(name, opts)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def install(*packages)
|
43
|
+
packages.flatten!
|
44
|
+
|
45
|
+
# only install missing packages
|
46
|
+
installed = query_installed_packages(packages)
|
47
|
+
needed = packages.find_all{ |s| !installed.include? s }
|
48
|
+
return if needed.empty?
|
49
|
+
|
50
|
+
logged_sudo("yum -q -y install " + needed.join(" "))
|
51
|
+
end
|
52
|
+
|
53
|
+
def installed?(package)
|
54
|
+
query_installed_packages(package).include? package
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
# Query RPM DB for presence of given packages. Returns a hash for easy lookup
|
61
|
+
#
|
62
|
+
# @param [Array<String>] packages
|
63
|
+
#
|
64
|
+
# @return [Hash<String, 1>]
|
65
|
+
def query_installed_packages(packages)
|
66
|
+
packages = [ packages ] if not packages.kind_of? Array
|
67
|
+
packages.flatten!
|
68
|
+
|
69
|
+
installed = {}
|
70
|
+
systemu("rpm -qa --queryformat '%{NAME}\n' " + packages.join(" ")).
|
71
|
+
stdout.split(/\n/).each{ |s| installed[s] = 1 }
|
72
|
+
|
73
|
+
return installed
|
74
|
+
end
|
75
|
+
|
76
|
+
def install_repo_url(url, opts)
|
77
|
+
logger.info "installing repo from #{url}"
|
78
|
+
|
79
|
+
if File.exists? File.join(YUM_REPOS_D, File.basename(url)) then
|
80
|
+
logger.debug "repo already exists"
|
81
|
+
return false
|
82
|
+
end
|
83
|
+
|
84
|
+
self.proxy.sys.package "wget"
|
85
|
+
|
86
|
+
if systemu("wget -q #{url}", :cwd => YUM_REPOS_D).fail? then
|
87
|
+
# TODO raise
|
88
|
+
end
|
89
|
+
|
90
|
+
true
|
91
|
+
end
|
92
|
+
|
93
|
+
end # Yum
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
require "bixby/provision/dsl/packager/yum/epel"
|
100
|
+
require "bixby/provision/dsl/packager/yum/mongodb"
|
@@ -0,0 +1,71 @@
|
|
1
|
+
|
2
|
+
module Bixby
|
3
|
+
module Provision
|
4
|
+
module Packager
|
5
|
+
class Yum < PackagerBase
|
6
|
+
|
7
|
+
module EPEL
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def install_epel(opts)
|
12
|
+
|
13
|
+
if amazon? then
|
14
|
+
return install_epel_amazon(opts)
|
15
|
+
end
|
16
|
+
|
17
|
+
if installed? "epel-release" then
|
18
|
+
logger.info "epel repo already installed"
|
19
|
+
return false
|
20
|
+
end
|
21
|
+
|
22
|
+
logger.info "installing epel repo"
|
23
|
+
|
24
|
+
url = if centos_version >= SemVer.parse("v6.0.0") && centos_version < SemVer.parse("v7.0.0") then
|
25
|
+
"http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm"
|
26
|
+
elsif centos_version >= SemVer.parse("v5.0.0") && centos_version < SemVer.parse("v6.0.0") then
|
27
|
+
"http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm"
|
28
|
+
end
|
29
|
+
|
30
|
+
Dir.mktmpdir("bixby-provision") do |dir|
|
31
|
+
Dir.chdir(dir) do
|
32
|
+
logged_sudo("rpm --quiet -iv #{url}")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def install_epel_amazon(opts)
|
40
|
+
logger.info "enabling epel on amazon linux"
|
41
|
+
|
42
|
+
file = "/etc/yum.repos.d/epel.repo"
|
43
|
+
|
44
|
+
buff = File.read(file)
|
45
|
+
out = []
|
46
|
+
found = false
|
47
|
+
buff.split(/\n/).each do |line|
|
48
|
+
if line =~ /^enabled=/ then
|
49
|
+
# always enable the first entry only (leave debug and source repos, for now)
|
50
|
+
found = true
|
51
|
+
out << "enabled=1"
|
52
|
+
else
|
53
|
+
out << line
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
File.open(file, 'w') do |f|
|
58
|
+
f.puts out.join("\n")
|
59
|
+
end
|
60
|
+
|
61
|
+
true
|
62
|
+
end
|
63
|
+
|
64
|
+
end # EPEL
|
65
|
+
|
66
|
+
Yum.register_plugin(EPEL)
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|