mybot 0.0.4 → 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.
Files changed (53) hide show
  1. data/Botfile +7 -61
  2. data/CHANGELOG.md +2 -25
  3. data/README.md +72 -189
  4. data/lib/mybot.rb +20 -21
  5. data/lib/mybot/base.rb +6 -2
  6. data/lib/mybot/cli.rb +45 -5
  7. data/lib/mybot/command.rb +37 -28
  8. data/lib/mybot/fmt.rb +143 -52
  9. data/lib/mybot/helpers.rb +24 -0
  10. data/lib/mybot/installer.rb +31 -0
  11. data/lib/mybot/lib.rb +20 -59
  12. data/lib/mybot/libs.rb +31 -28
  13. data/lib/mybot/loader.rb +25 -0
  14. data/lib/mybot/node.rb +100 -47
  15. data/lib/mybot/nodes.rb +16 -0
  16. data/lib/mybot/tasks.rb +47 -11
  17. data/lib/mybot/template.rb +8 -8
  18. data/lib/mybot/templates.rb +15 -0
  19. data/lib/mybot/version.rb +1 -1
  20. data/vendor/lib/{core/.gitkeep → .gitkeep} +0 -0
  21. data/vendor/{recipes → plugins}/.gitkeep +0 -0
  22. data/vendor/{tpl/core → tasks}/.gitkeep +0 -0
  23. data/vendor/tpl/.gitkeep +0 -0
  24. metadata +11 -34
  25. data/lib/mybot/aws.rb +0 -54
  26. data/lib/mybot/commands.rb +0 -108
  27. data/lib/mybot/core-ext/array.rb +0 -9
  28. data/lib/mybot/core-ext/class.rb +0 -53
  29. data/lib/mybot/core-ext/kernel.rb +0 -21
  30. data/lib/mybot/messages.rb +0 -30
  31. data/lib/mybot/recipes.rb +0 -25
  32. data/lib/mybot/result.rb +0 -26
  33. data/lib/mybot/utils.rb +0 -7
  34. data/vendor/lib/core/fs.rb +0 -191
  35. data/vendor/lib/core/osx/git.rb +0 -31
  36. data/vendor/lib/core/osx/rails.rb +0 -31
  37. data/vendor/lib/core/osx/static.rb +0 -31
  38. data/vendor/lib/core/ubuntu/apache.rb +0 -42
  39. data/vendor/lib/core/ubuntu/apt.rb +0 -57
  40. data/vendor/lib/core/ubuntu/git.rb +0 -48
  41. data/vendor/lib/core/ubuntu/mysql.rb +0 -214
  42. data/vendor/lib/core/ubuntu/nginx.rb +0 -43
  43. data/vendor/lib/core/ubuntu/passenger.rb +0 -55
  44. data/vendor/lib/core/ubuntu/php.rb +0 -76
  45. data/vendor/lib/core/ubuntu/rails.rb +0 -105
  46. data/vendor/lib/core/ubuntu/ruby.rb +0 -166
  47. data/vendor/lib/core/ubuntu/service.rb +0 -30
  48. data/vendor/lib/core/ubuntu/static.rb +0 -50
  49. data/vendor/lib/core/ubuntu/users.rb +0 -76
  50. data/vendor/lib/core/ubuntu/vim.rb +0 -31
  51. data/vendor/tpl/core/ubuntu/apache/apache2.conf.erb +0 -80
  52. data/vendor/tpl/core/ubuntu/nginx/nginx.conf.erb +0 -72
  53. data/vendor/tpl/core/ubuntu/php/php.ini.erb +0 -1818
@@ -1,7 +0,0 @@
1
- module Mybot
2
- module Utils
3
- def lib_to_path(lib)
4
- lib.split("::").map{ |l| l.downcase }.join("/")
5
- end
6
- end
7
- end
@@ -1,191 +0,0 @@
1
- module Core
2
- class Fs < Mybot::Lib
3
- def initialize(node)
4
- @node = node
5
- end
6
-
7
- def exists?(options = {})
8
- unless options[:file] || options[:dir]
9
- error "file or dir is required"
10
- end
11
-
12
- if options[:file]
13
- options[:cmd] = "test -e #{options[:file]} && echo EXISTS"
14
- elsif options[:dir]
15
- options[:cmd] = "test -e #{options[:dir]} && echo EXISTS"
16
- end
17
- @node.run(options).stdout.include?("EXISTS") ? true : false
18
- end
19
-
20
- def create(options = {})
21
- unless options[:file] || options[:dir]
22
- error "file or dir is required"
23
- end
24
-
25
- if options[:file]
26
- options[:pattern] = "/tmp/mybot.XXXXX"
27
- tmp = mktemp(options)
28
-
29
- options[:content] ||= ""
30
- @node.sftp.file.open(tmp, "w") { |f| f.write options[:content] }
31
- options[:cmd] = "mv #{tmp} #{options[:file]}"
32
- @node.run(options)
33
- else
34
- options[:cmd] = "mkdir -p #{options[:dir]}"
35
- @node.run(options)
36
- end
37
- end
38
-
39
- def mktemp(options = {})
40
- error "pattern required" unless options[:pattern]
41
-
42
- options[:cmd] = "mktemp #{options[:pattern]}"
43
- sudo = options[:sudo]
44
- options[:sudo] = false
45
- tmp = @node.run(options).stdout
46
- options[:sudo] = sudo
47
- tmp.strip
48
- end
49
-
50
- def remove(options = {})
51
- unless options[:file] || options[:dir]
52
- error "file or dir is required"
53
- end
54
-
55
- if options[:file]
56
- options[:cmd] = "rm -f #{options[:file]}"
57
- else
58
- options[:cmd] = "rm -rf #{options[:dir]}"
59
- end
60
-
61
- @node.run(options)
62
- end
63
-
64
- def read(options = {})
65
- error "file is required" unless options[:file]
66
-
67
- options[:cmd] = "cat #{options[:file]}"
68
- @node.run(options) do |cmd|
69
- cmd.on "No such file or directory" do
70
- @node.fmt.error "read: file '#{options[:file]}' does not exists"
71
- return ""
72
- end
73
- end.stdout
74
- end
75
-
76
- def upload(options = {})
77
- error "from is required" unless options[:from]
78
- error "to is required" unless options[:to]
79
- @node.fmt.upload(options[:from], options[:to])
80
-
81
- @node.sftp.upload!(options[:from],
82
- options[:to]) do |event, uploader, *args|
83
- case event
84
- when :put
85
- n = (args[1].to_f * 100 / args[0].size.to_f).to_i
86
- @node.fmt.progress(n)
87
- when :finish
88
- @node.fmt.progress(100)
89
- end
90
- end
91
- end
92
-
93
- def download(options = {})
94
- error "from is required" unless options[:from]
95
- error "to is required" unless options[:to]
96
- @node.fmt.download(options[:from], options[:to])
97
-
98
- @node.sftp.download!(options[:from],
99
- options[:to]) do |event, uploader, *args|
100
- case event
101
- when :get
102
- size = 0
103
- if args[0].size
104
- size = args[0].size
105
- else
106
- size = @node.sftp.stat!(options[:from]).size
107
- end
108
- n = (args[1].to_f * 100 / size.to_f).to_i
109
- @node.fmt.progress(n)
110
- when :finish
111
- @node.fmt.progress(100)
112
- end
113
- end
114
- end
115
-
116
- def compress(options = {})
117
- error "from is required" unless options[:from]
118
- error "to is required" unless options[:to]
119
-
120
- options[:compressor] ||= "gz"
121
-
122
- unless ["gz", "bzip2"].include?(options[:compressor])
123
- error "invalid compressor"
124
- end
125
-
126
- options[:cmd] = "tar c"
127
-
128
- if options[:compressor] == "gz"
129
- options[:cmd] += "z"
130
- elsif options[:compressor] == "bzip2"
131
- options[:cmd] += "j"
132
- end
133
-
134
- from = options[:from].split("/")
135
- from_name = from.pop
136
- from_path = from.join("/")
137
-
138
- options[:cmd] += "f #{options[:to]} #{from_name}"
139
- options[:cwd] = from_path
140
- @node.run(options)
141
- end
142
-
143
- def extract(options = {})
144
- error "from is required" unless options[:from]
145
- error "to is required" unless options[:to]
146
-
147
- options[:compressor] ||= "gz"
148
-
149
- unless ["gz", "bzip2"].include?(options[:compressor])
150
- error "invalid compressor"
151
- end
152
-
153
- options[:cmd] = "tar x"
154
-
155
- if options[:compressor] == "gz"
156
- options[:cmd] += "z"
157
- elsif options[:compressor] == "bzip2"
158
- options[:cmd] += "j"
159
- end
160
-
161
- options[:cmd] += "f #{options[:from]} -C #{options[:to]}"
162
- @node.run(options)
163
- end
164
-
165
- def link(options = {})
166
- error "from is required" unless options[:from]
167
- error "to is required" unless options[:to]
168
-
169
- options[:cmd] = "ln -s #{options[:from]} #{options[:to]}"
170
- @node.run(options)
171
- end
172
-
173
- def chown(options = {})
174
- error "dir is required" unless options[:dir]
175
- error "user is required" unless options[:user]
176
- error "group is required" unless options[:group]
177
-
178
- options[:cmd] = "chown -R #{options[:user]}:#{options[:group]} "
179
- options[:cmd] += "#{options[:dir]}"
180
-
181
- @node.run(options)
182
- end
183
-
184
- def touch(options = {})
185
- error "file is required" unless options[:file]
186
-
187
- options[:cmd] = "touch #{options[:file]}"
188
- @node.run(options)
189
- end
190
- end
191
- end
@@ -1,31 +0,0 @@
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
@@ -1,31 +0,0 @@
1
- module Core
2
- module Osx
3
- class Rails < Mybot::Lib
4
- def initialize(node)
5
- @node = node
6
- @node.use [
7
- "core/fs",
8
- "core/osx/git"
9
- ]
10
- end
11
-
12
- def prepare_release(options = {})
13
- error "repo is required" unless options[:repo]
14
- error "release is required" unless options[:release]
15
-
16
- options[:dir] = "/tmp/#{options[:release]}"
17
- @node.fs.remove(options)
18
-
19
- options[:file] = "/tmp/#{options[:release]}.tar.gz"
20
- @node.fs.remove(options)
21
-
22
- options[:dest] = "/tmp/#{options[:release]}"
23
- @node.git.clone(options)
24
-
25
- options[:from] = "/tmp/#{options[:release]}"
26
- options[:to] = "/tmp/#{options[:release]}.tar.gz"
27
- @node.fs.compress(options)
28
- end
29
- end
30
- end
31
- end
@@ -1,31 +0,0 @@
1
- module Core
2
- module Osx
3
- class Static < Mybot::Lib
4
- def initialize(node)
5
- @node = node
6
- @node.use [
7
- "core/fs",
8
- "core/osx/git"
9
- ]
10
- end
11
-
12
- def prepare_release(options = {})
13
- error "repo is required" unless options[:repo]
14
- error "release is required" unless options[:release]
15
-
16
- options[:dir] = "/tmp/#{options[:release]}"
17
- @node.fs.remove(options)
18
-
19
- options[:file] = "/tmp/#{options[:release]}.tar.gz"
20
- @node.fs.remove(options)
21
-
22
- options[:dest] = "/tmp/#{options[:release]}"
23
- @node.git.clone(options)
24
-
25
- options[:from] = "/tmp/#{options[:release]}"
26
- options[:to] = "/tmp/#{options[:release]}.tar.gz"
27
- @node.fs.compress(options)
28
- end
29
- end
30
- end
31
- end
@@ -1,42 +0,0 @@
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
@@ -1,57 +0,0 @@
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) do |cmd|
13
- cmd.on "dpkg was interrupted" do
14
- dpkg_reconfigure(options)
15
- end
16
-
17
- cmd.on "Could not get lock" do
18
- error "Cannot update"
19
- end
20
- end
21
- end
22
-
23
- def upgrade(options = {})
24
- options[:cmd] = "#{DF} apt-get upgrade -y"
25
- @node.run(options)
26
- end
27
-
28
- def dist_upgrade(options = {})
29
- options[:cmd] = "#{DF} apt-get dist-upgrade -y"
30
- @node.run(options)
31
- end
32
-
33
- def install(options = {})
34
- error "pkg not specified" unless options[:pkg]
35
-
36
- options[:cmd] = "#{DF} apt-get install -y #{options[:pkg]}"
37
- @node.run(options) do |cmd|
38
- cmd.on "dpkg was interrupted" do
39
- dpkg_reconfigure(options)
40
- end
41
- end
42
- end
43
-
44
- def remove(options = {})
45
- error "pkg not specified" unless options[:pkg]
46
-
47
- options[:cmd] = "#{DF} apt-get --purge autoremove -y #{options[:pkg]}"
48
- @node.run(options)
49
- end
50
-
51
- def dpkg_reconfigure(options = {})
52
- options[:cmd] = "#{DF} dpkg --configure -a"
53
- @node.run(options)
54
- end
55
- end
56
- end
57
- end
@@ -1,48 +0,0 @@
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
-
35
- def init(options = {})
36
- error "repo not specified" unless options[:repo]
37
-
38
- options[:cmd] = "git init #{options[:repo]}"
39
-
40
- if options[:bare]
41
- options[:cmd] += " --bare"
42
- end
43
-
44
- @node.run(options)
45
- end
46
- end
47
- end
48
- end