superhosting 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +11 -0
  5. data/Gemfile +5 -0
  6. data/Gemfile.lock +117 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +23 -0
  9. data/Rakefile +6 -0
  10. data/Vagrantfile +10 -0
  11. data/bin/sx +10 -0
  12. data/bootstrap.sh +31 -0
  13. data/lib/superhosting.rb +40 -0
  14. data/lib/superhosting/base.rb +37 -0
  15. data/lib/superhosting/cli/base.rb +227 -0
  16. data/lib/superhosting/cli/cmd/admin_add.rb +11 -0
  17. data/lib/superhosting/cli/cmd/admin_container_add.rb +16 -0
  18. data/lib/superhosting/cli/cmd/admin_container_delete.rb +16 -0
  19. data/lib/superhosting/cli/cmd/admin_container_list.rb +12 -0
  20. data/lib/superhosting/cli/cmd/admin_delete.rb +11 -0
  21. data/lib/superhosting/cli/cmd/admin_passwd.rb +16 -0
  22. data/lib/superhosting/cli/cmd/container_add.rb +21 -0
  23. data/lib/superhosting/cli/cmd/container_admin_add.rb +16 -0
  24. data/lib/superhosting/cli/cmd/container_admin_delete.rb +16 -0
  25. data/lib/superhosting/cli/cmd/container_admin_list.rb +12 -0
  26. data/lib/superhosting/cli/cmd/container_change.rb +21 -0
  27. data/lib/superhosting/cli/cmd/container_delete.rb +11 -0
  28. data/lib/superhosting/cli/cmd/container_list.rb +9 -0
  29. data/lib/superhosting/cli/cmd/container_reconfig.rb +11 -0
  30. data/lib/superhosting/cli/cmd/container_restore.rb +24 -0
  31. data/lib/superhosting/cli/cmd/container_save.rb +14 -0
  32. data/lib/superhosting/cli/cmd/container_update.rb +11 -0
  33. data/lib/superhosting/cli/cmd/mysql_db_add.rb +9 -0
  34. data/lib/superhosting/cli/cmd/mysql_db_delete.rb +9 -0
  35. data/lib/superhosting/cli/cmd/mysql_db_dump.rb +9 -0
  36. data/lib/superhosting/cli/cmd/mysql_db_sql.rb +9 -0
  37. data/lib/superhosting/cli/cmd/mysql_grant.rb +9 -0
  38. data/lib/superhosting/cli/cmd/mysql_user_add.rb +12 -0
  39. data/lib/superhosting/cli/cmd/mysql_user_delete.rb +9 -0
  40. data/lib/superhosting/cli/cmd/site_add.rb +16 -0
  41. data/lib/superhosting/cli/cmd/site_alias_add.rb +16 -0
  42. data/lib/superhosting/cli/cmd/site_alias_delete.rb +16 -0
  43. data/lib/superhosting/cli/cmd/site_delete.rb +11 -0
  44. data/lib/superhosting/cli/cmd/site_rename.rb +16 -0
  45. data/lib/superhosting/cli/cmd/user_add.rb +24 -0
  46. data/lib/superhosting/cli/cmd/user_change.rb +24 -0
  47. data/lib/superhosting/cli/cmd/user_delete.rb +16 -0
  48. data/lib/superhosting/cli/cmd/user_list.rb +9 -0
  49. data/lib/superhosting/cli/cmd/user_passwd.rb +16 -0
  50. data/lib/superhosting/cli/error/ambiguous_command.rb +11 -0
  51. data/lib/superhosting/cli/error/base.rb +8 -0
  52. data/lib/superhosting/cli/error/controller.rb +8 -0
  53. data/lib/superhosting/controller/admin.rb +21 -0
  54. data/lib/superhosting/controller/admin/container.rb +24 -0
  55. data/lib/superhosting/controller/container.rb +174 -0
  56. data/lib/superhosting/controller/container/admin.rb +24 -0
  57. data/lib/superhosting/controller/mysql.rb +17 -0
  58. data/lib/superhosting/controller/mysql/db.rb +23 -0
  59. data/lib/superhosting/controller/mysql/user.rb +15 -0
  60. data/lib/superhosting/controller/site.rb +106 -0
  61. data/lib/superhosting/controller/site/alias.rb +21 -0
  62. data/lib/superhosting/controller/user.rb +25 -0
  63. data/lib/superhosting/docker_api.rb +31 -0
  64. data/lib/superhosting/helpers.rb +30 -0
  65. data/lib/superhosting/script_executor/base.rb +26 -0
  66. data/lib/superhosting/script_executor/container.rb +36 -0
  67. data/lib/superhosting/script_executor/site.rb +13 -0
  68. data/lib/superhosting/version.rb +3 -0
  69. data/superhosting.gemspec +32 -0
  70. metadata +341 -0
@@ -0,0 +1,21 @@
1
+ module Superhosting
2
+ module Controller
3
+ class Site
4
+ class Alias < Base
5
+ def initialize(name:, **kvargs)
6
+ raise NetStatus::Exception, { error: :logical_error, message: "Site '#{name}' doesn't exists." } unless @site_descriptor = Site.new(kvargs).site_index[name]
7
+ super(kvargs)
8
+ end
9
+
10
+ def add(name:)
11
+ return { error: :input_error, message: "Invalid alias name '#{name}' - only '#{Site::DOMAIN_NAME_FORMAT}' are allowed" } if name !~ Site::DOMAIN_NAME_FORMAT
12
+ write_if_not_exist(@site_descriptor[:site].aliases._path, name)
13
+ end
14
+
15
+ def delete(name:)
16
+ remove_line_from_file(@site_descriptor[:site].aliases._path, name)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ module Superhosting
2
+ module Controller
3
+ class User < Base
4
+ def list
5
+
6
+ end
7
+
8
+ def add(name:, container_name:, no_ssh: false, no_ftp: false)
9
+
10
+ end
11
+
12
+ def passwd(generate:)
13
+
14
+ end
15
+
16
+ def delete(name:, container_name:)
17
+
18
+ end
19
+
20
+ def change(name:, container_name:, no_ssh: false, no_ftp: false)
21
+
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ module Superhosting
2
+ class DockerApi
3
+ def initialize(**kwargs)
4
+ @socket = kwargs[:socket] || '/var/run/docker.sock'
5
+ end
6
+
7
+ def raw_connection
8
+ Excon.new('unix:///', socket: @socket)
9
+ end
10
+
11
+ def resp_if_success(resp)
12
+ JSON.load(resp.body) if resp.status == 200
13
+ end
14
+
15
+ def container_info(name)
16
+ resp_if_success raw_connection.request(method: :get, path: "/containers/#{name}/json")
17
+ end
18
+
19
+ def container_kill(name)
20
+ resp_if_success raw_connection.request(method: :post, path: "/containers/#{name}/kill")
21
+ end
22
+
23
+ def container_rm(name)
24
+ resp_if_success raw_connection.request(method: :delete, path: "/containers/#{name}")
25
+ end
26
+
27
+ def container_list
28
+ resp_if_success raw_connection.request(method: :get, path: '/containers/json')
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,30 @@
1
+ module Superhosting
2
+ module Helpers
3
+ def instance_variables_to_hash(obj)
4
+ obj.instance_variables.map do |name|
5
+ [name.to_s[1..-1].to_sym, obj.instance_variable_get(name)]
6
+ end.to_h
7
+ end
8
+
9
+ def create_conf(path, conf)
10
+ File.open(path, 'w') {|f| f.write(conf) }
11
+ end
12
+
13
+ def write_if_not_exist(path, line)
14
+ File.open(path, 'a+') do |f|
15
+ f.puts(line) unless f.each_line.any? { |l| l =~ Regexp.new(line) }
16
+ end
17
+ end
18
+
19
+ def remove_line_from_file(path, line)
20
+ lines = File.readlines(path).select {|l| l !~ Regexp.new(line) }
21
+ File.open(path, 'w') {|f| f.write lines.join('') }
22
+ end
23
+
24
+ def erb(node, vars)
25
+ ERB.new(node).result(OpenStruct.new(vars).instance_eval { binding })
26
+ rescue Exception => e
27
+ raise NetStatus::Exception, e.net_status.merge!( message: "#{e.backtrace.first.sub! '(erb)', node._path}: #{e.message}")
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ module Superhosting
2
+ module ScriptExecutor
3
+ class Base
4
+ include Helpers
5
+
6
+ attr_accessor :commands
7
+ attr_accessor :model, :lib, :config
8
+
9
+ def initialize(model:, lib:, config:, **kwargs)
10
+ kwargs.each do |k, v|
11
+ instance_variable_set("@#{k}", v)
12
+ self.class.class_eval("attr_accessor :#{k}")
13
+ end
14
+
15
+ self.commands = []
16
+ self.model = model
17
+ self.lib = lib
18
+ self.config = config
19
+ end
20
+
21
+ def execute(script)
22
+ self.instance_eval(script)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,36 @@
1
+ module Superhosting
2
+ module ScriptExecutor
3
+ class Container < Base
4
+ attr_accessor :container, :container_name, :container_lib, :registry_path, :on_reconfig_only
5
+
6
+ def initialize(container:, container_name:, container_lib:, registry_path:, on_reconfig_only: false, **kwargs)
7
+ self.container = container
8
+ self.container_name = container_name
9
+ self.container_lib = container_lib
10
+ self.registry_path = registry_path
11
+ self.on_reconfig_only = on_reconfig_only
12
+ super(**kwargs)
13
+ end
14
+
15
+ def config(save_to, script, **options)
16
+ unless self.on_reconfig_only
17
+ script_mapper = self.container.f(script, default: self.model.f(script))
18
+ raise NetStatus::Exception.new(error: :error, message: 'File does not exist') if script_mapper.nil?
19
+ opts = instance_variables_to_hash(self).merge(options)
20
+ FileUtils.mkdir_p File.dirname(save_to)
21
+ File.open(save_to, 'w') {|f| f.write(erb(script_mapper, **opts)) }
22
+ create_conf(self.registry_path, save_to)
23
+ end
24
+ end
25
+
26
+ # def container_config(save_to, script, **options)
27
+ # raise NetStatus::Exception.new(error: :error, message: "File '#{save_to}' has incorrect name format") if save_to.include? File::SEPARATOR
28
+ # config(File.join(self.lib_configs._path, save_to), script, options)
29
+ # end
30
+
31
+ def on_reconfig(cmd)
32
+ self.commands << cmd
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,13 @@
1
+ module Superhosting
2
+ module ScriptExecutor
3
+ class Site < Container
4
+ attr_accessor :site, :site_name
5
+
6
+ def initialize(site:, site_name:, **kwargs)
7
+ self.site = site
8
+ self.site_name = site_name
9
+ super(**kwargs)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module Superhosting
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,32 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'superhosting/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "superhosting"
7
+ spec.version = Superhosting::VERSION
8
+ spec.authors = ["Алексей Игрычев"]
9
+ spec.email = ["alexey.igrychev@flant.ru"]
10
+
11
+ spec.summary = "The tool for web hosting using docker containers"
12
+ spec.description = "#{spec.summary}."
13
+ spec.license = "MIT"
14
+ spec.homepage = "https://github.com/flant/path_mapper"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.executables = ['sx']
18
+
19
+ spec.add_dependency 'mixlib-cli', '>= 1.5.0', '< 2.0'
20
+ spec.add_dependency 'mixlib-shellout', '>= 2.2.6', '< 3.0'
21
+ spec.add_dependency 'path_mapper', '>= 0.0.1', '< 1.0'
22
+ spec.add_dependency 'net_status', '>= 0.0.1', '< 1.0'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.7'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 3.4', '>= 3.4.0'
27
+ spec.add_development_dependency 'excon', '>= 0.45.4', '< 1.0'
28
+ spec.add_development_dependency 'pry', '>= 0.10.3', '< 1.0'
29
+ spec.add_development_dependency 'pry-byebug', '>= 3.3.0', '< 4.0'
30
+ spec.add_development_dependency 'pry-stack_explorer', '>= 0.4.9.2', '< 1.0'
31
+ spec.add_development_dependency 'travis', '~> 1.8', '>= 1.8.2'
32
+ end
metadata ADDED
@@ -0,0 +1,341 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: superhosting
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Алексей Игрычев
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-03-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mixlib-cli
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: 1.5.0
20
+ - - <
21
+ - !ruby/object:Gem::Version
22
+ version: '2.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.5.0
30
+ - - <
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: mixlib-shellout
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: 2.2.6
40
+ - - <
41
+ - !ruby/object:Gem::Version
42
+ version: '3.0'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ! '>='
48
+ - !ruby/object:Gem::Version
49
+ version: 2.2.6
50
+ - - <
51
+ - !ruby/object:Gem::Version
52
+ version: '3.0'
53
+ - !ruby/object:Gem::Dependency
54
+ name: path_mapper
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: 0.0.1
60
+ - - <
61
+ - !ruby/object:Gem::Version
62
+ version: '1.0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 0.0.1
70
+ - - <
71
+ - !ruby/object:Gem::Version
72
+ version: '1.0'
73
+ - !ruby/object:Gem::Dependency
74
+ name: net_status
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: 0.0.1
80
+ - - <
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
83
+ type: :runtime
84
+ prerelease: false
85
+ version_requirements: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.0.1
90
+ - - <
91
+ - !ruby/object:Gem::Version
92
+ version: '1.0'
93
+ - !ruby/object:Gem::Dependency
94
+ name: bundler
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ~>
98
+ - !ruby/object:Gem::Version
99
+ version: '1.7'
100
+ type: :development
101
+ prerelease: false
102
+ version_requirements: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ~>
105
+ - !ruby/object:Gem::Version
106
+ version: '1.7'
107
+ - !ruby/object:Gem::Dependency
108
+ name: rake
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ~>
112
+ - !ruby/object:Gem::Version
113
+ version: '10.0'
114
+ type: :development
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ~>
119
+ - !ruby/object:Gem::Version
120
+ version: '10.0'
121
+ - !ruby/object:Gem::Dependency
122
+ name: rspec
123
+ requirement: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ~>
126
+ - !ruby/object:Gem::Version
127
+ version: '3.4'
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: 3.4.0
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ~>
136
+ - !ruby/object:Gem::Version
137
+ version: '3.4'
138
+ - - ! '>='
139
+ - !ruby/object:Gem::Version
140
+ version: 3.4.0
141
+ - !ruby/object:Gem::Dependency
142
+ name: excon
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ! '>='
146
+ - !ruby/object:Gem::Version
147
+ version: 0.45.4
148
+ - - <
149
+ - !ruby/object:Gem::Version
150
+ version: '1.0'
151
+ type: :development
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: 0.45.4
158
+ - - <
159
+ - !ruby/object:Gem::Version
160
+ version: '1.0'
161
+ - !ruby/object:Gem::Dependency
162
+ name: pry
163
+ requirement: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ! '>='
166
+ - !ruby/object:Gem::Version
167
+ version: 0.10.3
168
+ - - <
169
+ - !ruby/object:Gem::Version
170
+ version: '1.0'
171
+ type: :development
172
+ prerelease: false
173
+ version_requirements: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ! '>='
176
+ - !ruby/object:Gem::Version
177
+ version: 0.10.3
178
+ - - <
179
+ - !ruby/object:Gem::Version
180
+ version: '1.0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: pry-byebug
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ! '>='
186
+ - !ruby/object:Gem::Version
187
+ version: 3.3.0
188
+ - - <
189
+ - !ruby/object:Gem::Version
190
+ version: '4.0'
191
+ type: :development
192
+ prerelease: false
193
+ version_requirements: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ! '>='
196
+ - !ruby/object:Gem::Version
197
+ version: 3.3.0
198
+ - - <
199
+ - !ruby/object:Gem::Version
200
+ version: '4.0'
201
+ - !ruby/object:Gem::Dependency
202
+ name: pry-stack_explorer
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ! '>='
206
+ - !ruby/object:Gem::Version
207
+ version: 0.4.9.2
208
+ - - <
209
+ - !ruby/object:Gem::Version
210
+ version: '1.0'
211
+ type: :development
212
+ prerelease: false
213
+ version_requirements: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ! '>='
216
+ - !ruby/object:Gem::Version
217
+ version: 0.4.9.2
218
+ - - <
219
+ - !ruby/object:Gem::Version
220
+ version: '1.0'
221
+ - !ruby/object:Gem::Dependency
222
+ name: travis
223
+ requirement: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ~>
226
+ - !ruby/object:Gem::Version
227
+ version: '1.8'
228
+ - - ! '>='
229
+ - !ruby/object:Gem::Version
230
+ version: 1.8.2
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ~>
236
+ - !ruby/object:Gem::Version
237
+ version: '1.8'
238
+ - - ! '>='
239
+ - !ruby/object:Gem::Version
240
+ version: 1.8.2
241
+ description: The tool for web hosting using docker containers.
242
+ email:
243
+ - alexey.igrychev@flant.ru
244
+ executables:
245
+ - sx
246
+ extensions: []
247
+ extra_rdoc_files: []
248
+ files:
249
+ - .gitignore
250
+ - .rspec
251
+ - .travis.yml
252
+ - Gemfile
253
+ - Gemfile.lock
254
+ - LICENSE.txt
255
+ - README.md
256
+ - Rakefile
257
+ - Vagrantfile
258
+ - bin/sx
259
+ - bootstrap.sh
260
+ - lib/superhosting.rb
261
+ - lib/superhosting/base.rb
262
+ - lib/superhosting/cli/base.rb
263
+ - lib/superhosting/cli/cmd/admin_add.rb
264
+ - lib/superhosting/cli/cmd/admin_container_add.rb
265
+ - lib/superhosting/cli/cmd/admin_container_delete.rb
266
+ - lib/superhosting/cli/cmd/admin_container_list.rb
267
+ - lib/superhosting/cli/cmd/admin_delete.rb
268
+ - lib/superhosting/cli/cmd/admin_passwd.rb
269
+ - lib/superhosting/cli/cmd/container_add.rb
270
+ - lib/superhosting/cli/cmd/container_admin_add.rb
271
+ - lib/superhosting/cli/cmd/container_admin_delete.rb
272
+ - lib/superhosting/cli/cmd/container_admin_list.rb
273
+ - lib/superhosting/cli/cmd/container_change.rb
274
+ - lib/superhosting/cli/cmd/container_delete.rb
275
+ - lib/superhosting/cli/cmd/container_list.rb
276
+ - lib/superhosting/cli/cmd/container_reconfig.rb
277
+ - lib/superhosting/cli/cmd/container_restore.rb
278
+ - lib/superhosting/cli/cmd/container_save.rb
279
+ - lib/superhosting/cli/cmd/container_update.rb
280
+ - lib/superhosting/cli/cmd/mysql_db_add.rb
281
+ - lib/superhosting/cli/cmd/mysql_db_delete.rb
282
+ - lib/superhosting/cli/cmd/mysql_db_dump.rb
283
+ - lib/superhosting/cli/cmd/mysql_db_sql.rb
284
+ - lib/superhosting/cli/cmd/mysql_grant.rb
285
+ - lib/superhosting/cli/cmd/mysql_user_add.rb
286
+ - lib/superhosting/cli/cmd/mysql_user_delete.rb
287
+ - lib/superhosting/cli/cmd/site_add.rb
288
+ - lib/superhosting/cli/cmd/site_alias_add.rb
289
+ - lib/superhosting/cli/cmd/site_alias_delete.rb
290
+ - lib/superhosting/cli/cmd/site_delete.rb
291
+ - lib/superhosting/cli/cmd/site_rename.rb
292
+ - lib/superhosting/cli/cmd/user_add.rb
293
+ - lib/superhosting/cli/cmd/user_change.rb
294
+ - lib/superhosting/cli/cmd/user_delete.rb
295
+ - lib/superhosting/cli/cmd/user_list.rb
296
+ - lib/superhosting/cli/cmd/user_passwd.rb
297
+ - lib/superhosting/cli/error/ambiguous_command.rb
298
+ - lib/superhosting/cli/error/base.rb
299
+ - lib/superhosting/cli/error/controller.rb
300
+ - lib/superhosting/controller/admin.rb
301
+ - lib/superhosting/controller/admin/container.rb
302
+ - lib/superhosting/controller/container.rb
303
+ - lib/superhosting/controller/container/admin.rb
304
+ - lib/superhosting/controller/mysql.rb
305
+ - lib/superhosting/controller/mysql/db.rb
306
+ - lib/superhosting/controller/mysql/user.rb
307
+ - lib/superhosting/controller/site.rb
308
+ - lib/superhosting/controller/site/alias.rb
309
+ - lib/superhosting/controller/user.rb
310
+ - lib/superhosting/docker_api.rb
311
+ - lib/superhosting/helpers.rb
312
+ - lib/superhosting/script_executor/base.rb
313
+ - lib/superhosting/script_executor/container.rb
314
+ - lib/superhosting/script_executor/site.rb
315
+ - lib/superhosting/version.rb
316
+ - superhosting.gemspec
317
+ homepage: https://github.com/flant/path_mapper
318
+ licenses:
319
+ - MIT
320
+ metadata: {}
321
+ post_install_message:
322
+ rdoc_options: []
323
+ require_paths:
324
+ - lib
325
+ required_ruby_version: !ruby/object:Gem::Requirement
326
+ requirements:
327
+ - - ! '>='
328
+ - !ruby/object:Gem::Version
329
+ version: '0'
330
+ required_rubygems_version: !ruby/object:Gem::Requirement
331
+ requirements:
332
+ - - ! '>='
333
+ - !ruby/object:Gem::Version
334
+ version: '0'
335
+ requirements: []
336
+ rubyforge_project:
337
+ rubygems_version: 2.4.5
338
+ signing_key:
339
+ specification_version: 4
340
+ summary: The tool for web hosting using docker containers
341
+ test_files: []