mybot 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Botfile +9 -9
- data/CHANGELOG.md +7 -0
- data/README.md +294 -18
- data/lib/mybot.rb +3 -0
- data/lib/mybot/cli.rb +2 -1
- data/lib/mybot/command.rb +23 -4
- data/lib/mybot/commands.rb +5 -5
- data/lib/mybot/core-ext/kernel.rb +21 -0
- data/lib/mybot/fmt.rb +3 -7
- data/lib/mybot/lib.rb +9 -0
- data/lib/mybot/messages.rb +12 -6
- data/lib/mybot/node.rb +62 -68
- data/lib/mybot/recipes.rb +4 -2
- data/lib/mybot/tasks.rb +2 -1
- data/lib/mybot/version.rb +1 -1
- data/mybot.gemspec +1 -1
- data/vendor/lib/{mybot → core}/.gitkeep +0 -0
- data/vendor/lib/core/fs.rb +185 -0
- data/vendor/lib/core/osx/git.rb +31 -0
- data/vendor/lib/core/ubuntu/apache.rb +42 -0
- data/vendor/lib/core/ubuntu/apt.rb +40 -0
- data/vendor/lib/core/ubuntu/git.rb +36 -0
- data/vendor/lib/core/ubuntu/mysql.rb +83 -0
- data/vendor/lib/core/ubuntu/passenger.rb +55 -0
- data/vendor/lib/core/ubuntu/ruby.rb +165 -0
- data/vendor/lib/core/ubuntu/service.rb +30 -0
- data/vendor/lib/core/ubuntu/users.rb +76 -0
- data/vendor/lib/core/ubuntu/vim.rb +31 -0
- data/vendor/{tasks → recipes}/.gitkeep +0 -0
- data/vendor/tpl/{mybot → core}/.gitkeep +0 -0
- data/vendor/tpl/core/ubuntu/apache/apache2.conf.erb +80 -0
- metadata +21 -6
@@ -0,0 +1,31 @@
|
|
1
|
+
module Core
|
2
|
+
module Osx
|
3
|
+
class Git < Mybot::Lib
|
4
|
+
def initialize(node)
|
5
|
+
@node = node
|
6
|
+
end
|
7
|
+
|
8
|
+
def installed?(options = {})
|
9
|
+
options[:file] = "/usr/bin/git"
|
10
|
+
@node.exists?(options)
|
11
|
+
end
|
12
|
+
|
13
|
+
def clone(options = {})
|
14
|
+
error "repo not specified" unless options[:repo]
|
15
|
+
|
16
|
+
options[:dest] ||= ""
|
17
|
+
options[:key_passphrase] ||= ""
|
18
|
+
options[:cmd] = "git clone #{options[:repo]} #{options[:dest]}"
|
19
|
+
@node.run(options) do |cmd|
|
20
|
+
cmd.on "Are you sure you want to continue connecting (yes/no)?" do
|
21
|
+
cmd.write "yes"
|
22
|
+
end
|
23
|
+
|
24
|
+
cmd.on "Enter passphrase for key" do
|
25
|
+
cmd.write options[:key_passphrase]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Core
|
2
|
+
module Ubuntu
|
3
|
+
class Apache < Mybot::Lib
|
4
|
+
def initialize(node)
|
5
|
+
@node = node
|
6
|
+
@node.use [
|
7
|
+
"core/fs",
|
8
|
+
"core/ubuntu/apt",
|
9
|
+
"core/ubuntu/service"
|
10
|
+
]
|
11
|
+
@apache2conf_tpl = tpl_file "core/ubuntu/apache/apache2.conf.erb"
|
12
|
+
end
|
13
|
+
|
14
|
+
def installed?(options = {})
|
15
|
+
@node.fs.exists?({ :file => "/usr/sbin/apache2"} )
|
16
|
+
end
|
17
|
+
|
18
|
+
def install(options = {})
|
19
|
+
options[:pkg] = "apache2"
|
20
|
+
@node.apt.install(options)
|
21
|
+
end
|
22
|
+
|
23
|
+
def remove(options = {})
|
24
|
+
options[:pkg] = "apache2"
|
25
|
+
@node.apt.remove(options)
|
26
|
+
end
|
27
|
+
|
28
|
+
def reconfigure(options = {})
|
29
|
+
error "config is required" unless options[:config]
|
30
|
+
|
31
|
+
options[:file] = "/etc/apache2/apache2.conf"
|
32
|
+
@node.fs.remove(options)
|
33
|
+
|
34
|
+
options[:content] = @apache2conf_tpl.render(options[:config])
|
35
|
+
@node.fs.create(options)
|
36
|
+
|
37
|
+
options[:service] = "apache2"
|
38
|
+
@node.service.restart(options)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Core
|
2
|
+
module Ubuntu
|
3
|
+
class Apt < Mybot::Lib
|
4
|
+
DF = "DEBIAN_FRONTEND=noninteractive"
|
5
|
+
|
6
|
+
def initialize(node)
|
7
|
+
@node = node
|
8
|
+
end
|
9
|
+
|
10
|
+
def update(options = {})
|
11
|
+
options[:cmd] = "#{DF} apt-get update"
|
12
|
+
@node.run(options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def upgrade(options = {})
|
16
|
+
options[:cmd] = "#{DF} apt-get upgrade -y"
|
17
|
+
@node.run(options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def dist_upgrade(options = {})
|
21
|
+
options[:cmd] = "#{DF} apt-get dist-upgrade -y"
|
22
|
+
@node.run(options)
|
23
|
+
end
|
24
|
+
|
25
|
+
def install(options = {})
|
26
|
+
error "pkg not specified" unless options[:pkg]
|
27
|
+
|
28
|
+
options[:cmd] = "#{DF} apt-get install -y #{options[:pkg]}"
|
29
|
+
@node.run(options)
|
30
|
+
end
|
31
|
+
|
32
|
+
def remove(options = {})
|
33
|
+
error "pkg not specified" unless options[:pkg]
|
34
|
+
|
35
|
+
options[:cmd] = "#{DF} apt-get --purge autoremove -y #{options[:pkg]}"
|
36
|
+
@node.run(options)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Core
|
2
|
+
module Ubuntu
|
3
|
+
class Git < Mybot::Lib
|
4
|
+
def initialize(node)
|
5
|
+
@node = node
|
6
|
+
@node.use [
|
7
|
+
"core/fs",
|
8
|
+
"core/ubuntu/apt"
|
9
|
+
]
|
10
|
+
end
|
11
|
+
|
12
|
+
def installed?(options = {})
|
13
|
+
options[:file] = "/usr/bin/git"
|
14
|
+
@node.fs.exists?(options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def install(options = {})
|
18
|
+
options[:pkg] = "git"
|
19
|
+
@node.apt.install(options)
|
20
|
+
end
|
21
|
+
|
22
|
+
def remove(options = {})
|
23
|
+
options[:pkg] = "git"
|
24
|
+
@node.apt.remove(options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def clone(options = {})
|
28
|
+
error "repo not specified" unless options[:repo]
|
29
|
+
|
30
|
+
options[:dest] ||= ""
|
31
|
+
options[:cmd] = "git clone #{options[:repo]} #{options[:dest]}"
|
32
|
+
@node.run(options)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Core
|
2
|
+
module Ubuntu
|
3
|
+
class Mysql < Mybot::Lib
|
4
|
+
|
5
|
+
def initialize(node)
|
6
|
+
@node = node
|
7
|
+
@node.use [
|
8
|
+
"core/fs",
|
9
|
+
"core/ubuntu/apt",
|
10
|
+
"core/ubuntu/service"
|
11
|
+
]
|
12
|
+
end
|
13
|
+
|
14
|
+
def installed?(options = {})
|
15
|
+
options[:file] = "/etc/init.d/mysql"
|
16
|
+
@node.fs.exists?(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def install(options = {})
|
20
|
+
error "root_password is required" unless options[:root_password]
|
21
|
+
|
22
|
+
options[:pkg] = "mysql-server"
|
23
|
+
@node.apt.install(options)
|
24
|
+
|
25
|
+
options[:service] = "mysql"
|
26
|
+
@node.service.restart(options)
|
27
|
+
|
28
|
+
options[:cmd] = "mysql_secure_installation"
|
29
|
+
@node.run(options) do |cmd|
|
30
|
+
cmd.on "Enter current password for root (enter for none):" do
|
31
|
+
cmd.write ""
|
32
|
+
end
|
33
|
+
|
34
|
+
cmd.on "Set root password? [Y/n]" do
|
35
|
+
cmd.write "Y"
|
36
|
+
end
|
37
|
+
|
38
|
+
cmd.on "Change the root password? [Y/n]" do
|
39
|
+
cmd.write "Y"
|
40
|
+
end
|
41
|
+
|
42
|
+
cmd.on "New password:" do
|
43
|
+
cmd.write options[:root_password]
|
44
|
+
end
|
45
|
+
|
46
|
+
cmd.on "Re-enter new password:" do
|
47
|
+
cmd.write options[:root_password]
|
48
|
+
end
|
49
|
+
|
50
|
+
cmd.on "Remove anonymous users? [Y/n]" do
|
51
|
+
cmd.write "Y"
|
52
|
+
end
|
53
|
+
|
54
|
+
cmd.on "Disallow root login remotely? [Y/n]" do
|
55
|
+
cmd.write "Y"
|
56
|
+
end
|
57
|
+
|
58
|
+
cmd.on "Remove test database and access to it? [Y/n]" do
|
59
|
+
cmd.write "Y"
|
60
|
+
end
|
61
|
+
|
62
|
+
cmd.on "Reload privilege tables now? [Y/n]" do
|
63
|
+
cmd.write "Y"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def remove(options = {})
|
69
|
+
options[:service] = "mysql"
|
70
|
+
@node.service.stop(options)
|
71
|
+
|
72
|
+
options[:pkg] = "mysql-server"
|
73
|
+
@node.apt.remove(options)
|
74
|
+
|
75
|
+
options[:dir] = "/etc/mysql"
|
76
|
+
@node.fs.remove(options)
|
77
|
+
|
78
|
+
options[:dir] = "/var/lib/mysql"
|
79
|
+
@node.fs.remove(options)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Core
|
2
|
+
module Ubuntu
|
3
|
+
class Passenger < Mybot::Lib
|
4
|
+
def initialize(node)
|
5
|
+
@node = node
|
6
|
+
@node.use [
|
7
|
+
"core/ubuntu/ruby",
|
8
|
+
"core/ubuntu/apache"
|
9
|
+
]
|
10
|
+
end
|
11
|
+
|
12
|
+
def installed?(options = {})
|
13
|
+
error "ruby_version is required" unless options[:ruby_version]
|
14
|
+
|
15
|
+
options[:gem_name] = "passenger"
|
16
|
+
@node.ruby.rbenv_gem_installed?(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def install(options = {})
|
20
|
+
error "server is required" unless options[:server]
|
21
|
+
unless options[:server] == "apache" || options[:server] == "nginx"
|
22
|
+
error "invalid server, allowed are: 'apache' and 'nginx'"
|
23
|
+
end
|
24
|
+
|
25
|
+
options[:pkg] = "libcurl4-openssl-dev"
|
26
|
+
@node.apt.install(options)
|
27
|
+
|
28
|
+
options[:pkg] = "apache2-prefork-dev"
|
29
|
+
@node.apt.install(options)
|
30
|
+
|
31
|
+
options[:pkg] = "libapr1-dev"
|
32
|
+
@node.apt.install(options)
|
33
|
+
|
34
|
+
options[:pkg] = "libaprutil1-dev"
|
35
|
+
@node.apt.install(options)
|
36
|
+
|
37
|
+
options[:gem_name] = "passenger"
|
38
|
+
@node.ruby.rbenv_gem_install(options)
|
39
|
+
|
40
|
+
if options[:server] == "apache"
|
41
|
+
options[:cmd] = "passenger-install-apache2-module -a"
|
42
|
+
else
|
43
|
+
options[:cmd] = "passenger-install-nginx-module -a"
|
44
|
+
end
|
45
|
+
|
46
|
+
@node.ruby.rbenv_exec(options)
|
47
|
+
end
|
48
|
+
|
49
|
+
def remove(options = {})
|
50
|
+
options[:gem_name] = "passenger"
|
51
|
+
@node.ruby.rbenv_gem_remove(options)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
module Core
|
2
|
+
module Ubuntu
|
3
|
+
class Ruby < Mybot::Lib
|
4
|
+
RBENV_ROOT = "/usr/local/rbenv"
|
5
|
+
|
6
|
+
def initialize(node)
|
7
|
+
@node = node
|
8
|
+
@node.use [
|
9
|
+
"core/fs",
|
10
|
+
"core/ubuntu/apt"
|
11
|
+
]
|
12
|
+
end
|
13
|
+
|
14
|
+
def system_installed?(options = {})
|
15
|
+
options[:file] = "/usr/bin/ruby"
|
16
|
+
@node.fs.exists?(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def system_install(options = {})
|
20
|
+
options[:pkg] = "ruby"
|
21
|
+
@node.apt.install(options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def system_remove(options = {})
|
25
|
+
options[:pkg] = "ruby"
|
26
|
+
@node.apt.remove(options)
|
27
|
+
end
|
28
|
+
|
29
|
+
def rbenv_installed?(options = {})
|
30
|
+
options[:file] = "/usr/bin/rbenv"
|
31
|
+
@node.fs.exists?(options)
|
32
|
+
end
|
33
|
+
|
34
|
+
def rbenv_install(options = {})
|
35
|
+
options[:pkg] = "rbenv"
|
36
|
+
@node.apt.install(options)
|
37
|
+
|
38
|
+
options[:pkg] = "ruby-build"
|
39
|
+
@node.apt.install(options)
|
40
|
+
|
41
|
+
options[:dir] = RBENV_ROOT
|
42
|
+
@node.fs.create(options)
|
43
|
+
end
|
44
|
+
|
45
|
+
def rbenv_remove(options = {})
|
46
|
+
options[:pkg] = "rbenv"
|
47
|
+
@node.apt.remove(options)
|
48
|
+
|
49
|
+
options[:pkg] = "ruby-build"
|
50
|
+
@node.apt.remove(options)
|
51
|
+
|
52
|
+
options[:dir] = RBENV_ROOT
|
53
|
+
@node.fs.remove(options)
|
54
|
+
end
|
55
|
+
|
56
|
+
def rbenv_version_list(options = {})
|
57
|
+
options[:env] ||= {
|
58
|
+
"RBENV_ROOT" => RBENV_ROOT
|
59
|
+
}
|
60
|
+
options[:cmd] = "rbenv versions"
|
61
|
+
versions = @node.run(options)
|
62
|
+
versions.split("\r\n").map { |v| v.strip }
|
63
|
+
end
|
64
|
+
|
65
|
+
def rbenv_version_installed?(options = {})
|
66
|
+
error "ruby_version is required" unless options[:ruby_version]
|
67
|
+
|
68
|
+
rbenv_version_list(options).include?(options[:ruby_version])
|
69
|
+
end
|
70
|
+
|
71
|
+
def rbenv_version_install(options = {})
|
72
|
+
error "ruby_version is required" unless options[:ruby_version]
|
73
|
+
|
74
|
+
options[:env] ||= {
|
75
|
+
"RBENV_ROOT" => RBENV_ROOT
|
76
|
+
}
|
77
|
+
|
78
|
+
if options[:ruby_version].include?("1.8.7")
|
79
|
+
options[:env]["CFLAGS"] = "-O2 "
|
80
|
+
options[:env]["CFLAGS"] += "-fno-tree-dce "
|
81
|
+
options[:env]["CFLAGS"] += "-fno-optimize-sibling-calls"
|
82
|
+
end
|
83
|
+
|
84
|
+
options[:cmd] = "rbenv install #{options[:ruby_version]}"
|
85
|
+
@node.run(options)
|
86
|
+
end
|
87
|
+
|
88
|
+
def rbenv_version_remove(options = {})
|
89
|
+
error "ruby_version is required" unless options[:ruby_version]
|
90
|
+
|
91
|
+
options[:dir] = "#{RBENV_ROOT}/versions/#{options[:ruby_version]}"
|
92
|
+
@node.fs.remove(options)
|
93
|
+
end
|
94
|
+
|
95
|
+
def rbenv_exec(options = {})
|
96
|
+
error "ruby_version is required" unless options[:ruby_version]
|
97
|
+
error "cmd is required" unless options[:cmd]
|
98
|
+
|
99
|
+
options[:env] ||= {
|
100
|
+
"RBENV_ROOT" => RBENV_ROOT,
|
101
|
+
"RBENV_VERSION" => options[:ruby_version]
|
102
|
+
}
|
103
|
+
|
104
|
+
options[:cmd] = "rbenv exec #{options[:cmd]}"
|
105
|
+
@node.run(options)
|
106
|
+
end
|
107
|
+
|
108
|
+
def rbenv_gem_list(options = {})
|
109
|
+
options[:cmd] = "gem list"
|
110
|
+
gems = rbenv_exec(options)
|
111
|
+
gems = gems.split("\r\n").reject do |g|
|
112
|
+
g == "" || g == "*** LOCAL GEMS ***"
|
113
|
+
end.map do |g|
|
114
|
+
parts = g.split("(")
|
115
|
+
{
|
116
|
+
:gem_name => parts[0].strip,
|
117
|
+
:gem_versions => parts[1].split(",").map do |v|
|
118
|
+
v.gsub(")", "").strip
|
119
|
+
end
|
120
|
+
}
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def rbenv_gem_installed?(options = {})
|
125
|
+
error "gem_name is required" unless options[:gem_name]
|
126
|
+
|
127
|
+
rbenv_gem_list(options).each do |g|
|
128
|
+
if g[:gem_name] == options[:gem_name]
|
129
|
+
if options[:gem_version]
|
130
|
+
if g[:gem_versions].include?(options[:gem_version])
|
131
|
+
return true
|
132
|
+
end
|
133
|
+
else
|
134
|
+
return true
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
false
|
140
|
+
end
|
141
|
+
|
142
|
+
def rbenv_gem_install(options = {})
|
143
|
+
error "gem_name is required" unless options[:gem_name]
|
144
|
+
|
145
|
+
options[:cmd] = "gem install #{options[:gem_name]} --no-ri --no-rdoc"
|
146
|
+
if options[:gem_version]
|
147
|
+
options[:cmd] += " -v=#{options[:gem_version]}"
|
148
|
+
end
|
149
|
+
|
150
|
+
rbenv_exec(options)
|
151
|
+
end
|
152
|
+
|
153
|
+
def rbenv_gem_remove(options = {})
|
154
|
+
error "gem is required" unless options[:gem_name]
|
155
|
+
|
156
|
+
options[:cmd] = "gem uninstall #{options[:gem]} -Iax"
|
157
|
+
if options[:gem_version]
|
158
|
+
options[:cmd] += " -v=#{options[:gem_version]}"
|
159
|
+
end
|
160
|
+
|
161
|
+
rbenv_exec(options)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|