superhosting 0.0.1 → 0.0.2

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 (248) hide show
  1. checksums.yaml +8 -8
  2. data/.gitignore +1 -0
  3. data/.travis.yml +13 -0
  4. data/Gemfile.lock +43 -7
  5. data/LICENSE.txt +4 -1
  6. data/Vagrantfile +6 -3
  7. data/bin/sx +6 -2
  8. data/bootstrap/etc/sx/default_model +1 -0
  9. data/bootstrap/etc/sx/models/base/container/docker/command +1 -0
  10. data/bootstrap/etc/sx/models/base/container/docker/user.erb +1 -0
  11. data/bootstrap/etc/sx/models/base/container/docker/volume.erb +2 -0
  12. data/bootstrap/etc/sx/models/bitrix_l/inherit +3 -0
  13. data/bootstrap/etc/sx/models/bitrix_m/inherit +3 -0
  14. data/bootstrap/etc/sx/models/bitrix_xl/inherit +3 -0
  15. data/bootstrap/etc/sx/models/common_bitrix/abstract +1 -0
  16. data/bootstrap/etc/sx/models/common_bitrix/container/mux +1 -0
  17. data/bootstrap/etc/sx/models/common_bitrix/inherit +1 -0
  18. data/bootstrap/etc/sx/models/common_bitrix/site/php/admin_value +2 -0
  19. data/bootstrap/etc/sx/models/common_bitrix/site/php/flag +1 -0
  20. data/bootstrap/etc/sx/models/common_bitrix/site/php/value +6 -0
  21. data/bootstrap/etc/sx/models/common_fcgi/abstract +1 -0
  22. data/bootstrap/etc/sx/models/common_fcgi/container/config.rb +6 -0
  23. data/bootstrap/etc/sx/models/common_fcgi/container/config_templates/supervisord.conf.erb +16 -0
  24. data/bootstrap/etc/sx/models/common_fcgi/container/docker/image +1 -0
  25. data/bootstrap/etc/sx/models/common_fcgi/container/docker/user.erb +1 -0
  26. data/bootstrap/etc/sx/models/common_fcgi/container/system_users +1 -0
  27. data/bootstrap/etc/sx/models/common_fcgi/site/config.rb +4 -0
  28. data/bootstrap/etc/sx/models/common_fcgi/site/config_templates/nginx_vhost.erb +21 -0
  29. data/bootstrap/etc/sx/models/common_joomla/abstract +1 -0
  30. data/bootstrap/etc/sx/models/common_joomla/site/php/flag +1 -0
  31. data/bootstrap/etc/sx/models/common_joomla/site/php/value +2 -0
  32. data/bootstrap/etc/sx/models/common_joomla_v2/abstract +1 -0
  33. data/bootstrap/etc/sx/models/common_joomla_v2/container/mux +1 -0
  34. data/bootstrap/etc/sx/models/common_joomla_v2/inherit +2 -0
  35. data/bootstrap/etc/sx/models/common_joomla_v3/abstract +1 -0
  36. data/bootstrap/etc/sx/models/common_joomla_v3/container/mux +1 -0
  37. data/bootstrap/etc/sx/models/common_joomla_v3/inherit +2 -0
  38. data/bootstrap/etc/sx/models/common_l/abstract +1 -0
  39. data/bootstrap/etc/sx/models/common_l/container/docker/blkio_weight +1 -0
  40. data/bootstrap/etc/sx/models/common_l/container/docker/cpu_period +1 -0
  41. data/bootstrap/etc/sx/models/common_l/container/docker/cpu_quota +1 -0
  42. data/bootstrap/etc/sx/models/common_l/container/docker/cpu_shares +1 -0
  43. data/bootstrap/etc/sx/models/common_l/container/docker/memory +1 -0
  44. data/bootstrap/etc/sx/models/common_l/container/docker/memory_swap +1 -0
  45. data/bootstrap/etc/sx/models/common_m/abstract +1 -0
  46. data/bootstrap/etc/sx/models/common_m/container/docker/blkio_weight +1 -0
  47. data/bootstrap/etc/sx/models/common_m/container/docker/cpu_period +1 -0
  48. data/bootstrap/etc/sx/models/common_m/container/docker/cpu_quota +1 -0
  49. data/bootstrap/etc/sx/models/common_m/container/docker/cpu_shares +1 -0
  50. data/bootstrap/etc/sx/models/common_m/container/docker/memory +1 -0
  51. data/bootstrap/etc/sx/models/common_m/container/docker/memory_swap +1 -0
  52. data/bootstrap/etc/sx/models/common_mail/abstract +1 -0
  53. data/bootstrap/etc/sx/models/common_mail/container/config.rb +12 -0
  54. data/bootstrap/etc/sx/models/common_mail/container/config_templates/postfwd_rules.erb +12 -0
  55. data/bootstrap/etc/sx/models/common_mail/container/config_templates/ssmtp.conf.erb +6 -0
  56. data/bootstrap/etc/sx/models/common_mail/container/mail/daily_limit +1 -0
  57. data/bootstrap/etc/sx/models/common_mail/container/mail/enabled +1 -0
  58. data/bootstrap/etc/sx/models/common_mail/container/mail/hourly_limit +1 -0
  59. data/bootstrap/etc/sx/models/common_php_l/abstract +1 -0
  60. data/bootstrap/etc/sx/models/common_php_l/container/mail/daily_limit +1 -0
  61. data/bootstrap/etc/sx/models/common_php_l/container/mail/hourly_limit +1 -0
  62. data/bootstrap/etc/sx/models/common_php_l/inherit +1 -0
  63. data/bootstrap/etc/sx/models/common_php_l/site/php/pm +1 -0
  64. data/bootstrap/etc/sx/models/common_php_l/site/php/pm_max_children +1 -0
  65. data/bootstrap/etc/sx/models/common_php_l/site/php/pm_max_spare_servers +1 -0
  66. data/bootstrap/etc/sx/models/common_php_l/site/php/pm_min_spare_servers +1 -0
  67. data/bootstrap/etc/sx/models/common_php_l/site/php/pm_start_servers +1 -0
  68. data/bootstrap/etc/sx/models/common_php_m/abstract +1 -0
  69. data/bootstrap/etc/sx/models/common_php_m/inherit +1 -0
  70. data/bootstrap/etc/sx/models/common_php_m/site/php/pm_max_children +1 -0
  71. data/bootstrap/etc/sx/models/common_php_s/abstract +1 -0
  72. data/bootstrap/etc/sx/models/common_php_s/inherit +1 -0
  73. data/bootstrap/etc/sx/models/common_php_xl/abstract +1 -0
  74. data/bootstrap/etc/sx/models/common_php_xl/container/mail/daily_limit +1 -0
  75. data/bootstrap/etc/sx/models/common_php_xl/container/mail/hourly_limit +1 -0
  76. data/bootstrap/etc/sx/models/common_php_xl/inherit +1 -0
  77. data/bootstrap/etc/sx/models/common_php_xl/site/php/pm +1 -0
  78. data/bootstrap/etc/sx/models/common_php_xl/site/php/pm_max_children +1 -0
  79. data/bootstrap/etc/sx/models/common_php_xl/site/php/pm_max_spare_servers +1 -0
  80. data/bootstrap/etc/sx/models/common_php_xl/site/php/pm_min_spare_servers +1 -0
  81. data/bootstrap/etc/sx/models/common_php_xl/site/php/pm_start_servers +1 -0
  82. data/bootstrap/etc/sx/models/common_php_xs/abstract +1 -0
  83. data/bootstrap/etc/sx/models/common_php_xs/container/mail/daily_limit +1 -0
  84. data/bootstrap/etc/sx/models/common_php_xs/container/mail/hourly_limit +1 -0
  85. data/bootstrap/etc/sx/models/common_php_xs/inherit +1 -0
  86. data/bootstrap/etc/sx/models/common_php_xs/site/php/pm_max_children +1 -0
  87. data/bootstrap/etc/sx/models/common_s/abstract +1 -0
  88. data/bootstrap/etc/sx/models/common_s/container/docker/blkio_weight +1 -0
  89. data/bootstrap/etc/sx/models/common_s/container/docker/cpu_period +1 -0
  90. data/bootstrap/etc/sx/models/common_s/container/docker/cpu_quota +1 -0
  91. data/bootstrap/etc/sx/models/common_s/container/docker/cpu_shares +1 -0
  92. data/bootstrap/etc/sx/models/common_s/container/docker/memory +1 -0
  93. data/bootstrap/etc/sx/models/common_s/container/docker/memory_swap +1 -0
  94. data/bootstrap/etc/sx/models/common_symfony/abstract +1 -0
  95. data/bootstrap/etc/sx/models/common_symfony/container/mux +1 -0
  96. data/bootstrap/etc/sx/models/common_symfony/container/system_users +1 -0
  97. data/bootstrap/etc/sx/models/common_symfony/inherit +1 -0
  98. data/bootstrap/etc/sx/models/common_symfony/site/php/flag +3 -0
  99. data/bootstrap/etc/sx/models/common_symfony/site/php/user +1 -0
  100. data/bootstrap/etc/sx/models/common_symfony/site/use_apache +1 -0
  101. data/bootstrap/etc/sx/models/common_xl/abstract +1 -0
  102. data/bootstrap/etc/sx/models/common_xl/container/docker/blkio_weight +1 -0
  103. data/bootstrap/etc/sx/models/common_xl/container/docker/cpu_shares +1 -0
  104. data/bootstrap/etc/sx/models/common_xl/container/docker/memory +1 -0
  105. data/bootstrap/etc/sx/models/common_xl/container/docker/memory_swap +1 -0
  106. data/bootstrap/etc/sx/models/common_xs/abstract +1 -0
  107. data/bootstrap/etc/sx/models/common_xs/container/docker/blkio_weight +1 -0
  108. data/bootstrap/etc/sx/models/common_xs/container/docker/cpu_period +1 -0
  109. data/bootstrap/etc/sx/models/common_xs/container/docker/cpu_quota +1 -0
  110. data/bootstrap/etc/sx/models/common_xs/container/docker/cpu_shares +1 -0
  111. data/bootstrap/etc/sx/models/common_xs/container/docker/memory +1 -0
  112. data/bootstrap/etc/sx/models/common_xs/container/docker/memory_swap +1 -0
  113. data/bootstrap/etc/sx/models/fcgi_l/inherit +3 -0
  114. data/bootstrap/etc/sx/models/fcgi_m/inherit +3 -0
  115. data/bootstrap/etc/sx/models/fcgi_s/inherit +3 -0
  116. data/bootstrap/etc/sx/models/fcgi_xl/inherit +3 -0
  117. data/bootstrap/etc/sx/models/joomla_v2_l/inherit +3 -0
  118. data/bootstrap/etc/sx/models/joomla_v2_m/inherit +3 -0
  119. data/bootstrap/etc/sx/models/joomla_v2_s/inherit +3 -0
  120. data/bootstrap/etc/sx/models/joomla_v2_xs/inherit +3 -0
  121. data/bootstrap/etc/sx/models/joomla_v3_l/inherit +3 -0
  122. data/bootstrap/etc/sx/models/joomla_v3_m/inherit +3 -0
  123. data/bootstrap/etc/sx/models/joomla_v3_s/inherit +3 -0
  124. data/bootstrap/etc/sx/models/joomla_v3_xs/inherit +3 -0
  125. data/bootstrap/etc/sx/models/symfony_l/inherit +3 -0
  126. data/bootstrap/etc/sx/models/symfony_m/inherit +3 -0
  127. data/bootstrap/etc/sx/models/symfony_xl/inherit +3 -0
  128. data/bootstrap/etc/sx/models/test/container/config.rb +4 -0
  129. data/bootstrap/etc/sx/models/test/container/config_templates/supervisord.conf.erb +16 -0
  130. data/bootstrap/etc/sx/models/test/container/docker/blkio_weight +1 -0
  131. data/bootstrap/etc/sx/models/test/container/docker/command +1 -0
  132. data/bootstrap/etc/sx/models/test/container/docker/cpu_period +1 -0
  133. data/bootstrap/etc/sx/models/test/container/docker/cpu_quota +1 -0
  134. data/bootstrap/etc/sx/models/test/container/docker/cpu_shares +1 -0
  135. data/bootstrap/etc/sx/models/test/container/docker/image +1 -0
  136. data/bootstrap/etc/sx/models/test/container/docker/memory +1 -0
  137. data/bootstrap/etc/sx/models/test/container/docker/memory_swap +1 -0
  138. data/bootstrap/etc/sx/models/test/container/docker/user.erb +1 -0
  139. data/bootstrap/etc/sx/models/test/container/docker/volume.erb +2 -0
  140. data/bootstrap/etc/sx/models/test/container/system_users +1 -0
  141. data/bootstrap/etc/sx/models/test/site/config.rb +4 -0
  142. data/bootstrap/etc/sx/models/test/site/config_templates/nginx_vhost.erb +21 -0
  143. data/bootstrap/etc/sx/models/test_with_mux/container/mux +1 -0
  144. data/bootstrap/etc/sx/models/test_with_mux/inherit +1 -0
  145. data/bootstrap/etc/sx/muxs/base/docker/command +1 -0
  146. data/bootstrap/etc/sx/muxs/php-5.3/container/docker/image +1 -0
  147. data/bootstrap/etc/sx/muxs/php-5.3/docker/image +1 -0
  148. data/bootstrap/etc/sx/muxs/php-5.3/inherit +2 -0
  149. data/bootstrap/etc/sx/muxs/php-5.5/container/docker/image +1 -0
  150. data/bootstrap/etc/sx/muxs/php-5.5/docker/image +1 -0
  151. data/bootstrap/etc/sx/muxs/php-5.5/inherit +2 -0
  152. data/bootstrap/etc/sx/muxs/php-5.6/container/docker/image +1 -0
  153. data/bootstrap/etc/sx/muxs/php-5.6/docker/image +1 -0
  154. data/bootstrap/etc/sx/muxs/php-5.6/inherit +2 -0
  155. data/bootstrap/etc/sx/muxs/php/abstract +1 -0
  156. data/bootstrap/etc/sx/muxs/php/docker/pid +1 -0
  157. data/bootstrap/etc/sx/muxs/php/docker/privileged +1 -0
  158. data/bootstrap/etc/sx/muxs/php/docker/volume +3 -0
  159. data/bootstrap/etc/sx/muxs/php/site/config.rb +10 -0
  160. data/bootstrap/etc/sx/muxs/php/site/config_templates/apache_vhost.erb +26 -0
  161. data/bootstrap/etc/sx/muxs/php/site/config_templates/nginx_vhost.erb +39 -0
  162. data/bootstrap/etc/sx/muxs/php/site/config_templates/php_fpm_pool.erb +22 -0
  163. data/bootstrap/etc/sx/muxs/php/site/php/pm +1 -0
  164. data/bootstrap/etc/sx/muxs/php/site/php/pm_max_children +1 -0
  165. data/bootstrap/etc/sx/muxs/php/site/use_apache +1 -0
  166. data/bootstrap/etc/sx/muxs/test/container/docker/image +1 -0
  167. data/bootstrap/etc/sx/muxs/test/docker/command +1 -0
  168. data/bootstrap/etc/sx/muxs/test/docker/image +1 -0
  169. data/bootstrap/etc/sx/muxs/test/inherit +1 -0
  170. data/bootstrap/etc/sx/password_strength +1 -0
  171. data/bootstrap/etc/sx/smtp_hostname +1 -0
  172. data/dockerfile/almost_base +19 -0
  173. data/dockerfile/base +18 -0
  174. data/dockerfile/mux +6 -0
  175. data/lib/superhosting.rb +39 -5
  176. data/lib/superhosting/base.rb +15 -21
  177. data/lib/superhosting/cli/base.rb +56 -40
  178. data/lib/superhosting/cli/cmd/admin_add.rb +5 -0
  179. data/lib/superhosting/cli/cmd/admin_container_list.rb +4 -0
  180. data/lib/superhosting/cli/cmd/admin_list.rb +11 -0
  181. data/lib/superhosting/cli/cmd/admin_passwd.rb +4 -0
  182. data/lib/superhosting/cli/cmd/container_admin_list.rb +4 -0
  183. data/lib/superhosting/cli/cmd/container_inspect.rb +11 -0
  184. data/lib/superhosting/cli/cmd/container_list.rb +18 -0
  185. data/lib/superhosting/cli/cmd/container_reconfigure.rb +11 -0
  186. data/lib/superhosting/cli/cmd/container_rename.rb +16 -0
  187. data/lib/superhosting/cli/cmd/model_list.rb +11 -0
  188. data/lib/superhosting/cli/cmd/{container_reconfig.rb → model_reconfigure.rb} +1 -1
  189. data/lib/superhosting/cli/cmd/model_tree.rb +30 -0
  190. data/lib/superhosting/cli/cmd/model_update.rb +11 -0
  191. data/lib/superhosting/cli/cmd/mux_reconfigure.rb +11 -0
  192. data/lib/superhosting/cli/cmd/repair.rb +8 -0
  193. data/lib/superhosting/cli/cmd/site_container.rb +15 -0
  194. data/lib/superhosting/cli/cmd/site_inspect.rb +11 -0
  195. data/lib/superhosting/cli/cmd/site_list.rb +35 -0
  196. data/lib/superhosting/cli/cmd/site_name.rb +15 -0
  197. data/lib/superhosting/cli/cmd/site_reconfigure.rb +11 -0
  198. data/lib/superhosting/cli/cmd/site_rename.rb +4 -0
  199. data/lib/superhosting/cli/cmd/user_add.rb +11 -5
  200. data/lib/superhosting/cli/cmd/user_change.rb +12 -6
  201. data/lib/superhosting/cli/cmd/user_list.rb +7 -0
  202. data/lib/superhosting/cli/cmd/user_passwd.rb +9 -0
  203. data/lib/superhosting/composite_mapper.rb +12 -0
  204. data/lib/superhosting/composite_mapper/base.rb +17 -0
  205. data/lib/superhosting/composite_mapper/container.rb +9 -0
  206. data/lib/superhosting/composite_mapper/site.rb +13 -0
  207. data/lib/superhosting/config/net_status.yml +122 -0
  208. data/lib/superhosting/config_executor.rb +12 -0
  209. data/lib/superhosting/{script_executor → config_executor}/base.rb +6 -5
  210. data/lib/superhosting/config_executor/container.rb +69 -0
  211. data/lib/superhosting/config_executor/site.rb +18 -0
  212. data/lib/superhosting/controller/admin.rb +84 -4
  213. data/lib/superhosting/controller/admin/container.rb +62 -2
  214. data/lib/superhosting/controller/base.rb +18 -0
  215. data/lib/superhosting/controller/container.rb +185 -122
  216. data/lib/superhosting/controller/container/admin.rb +25 -3
  217. data/lib/superhosting/controller/container/states.rb +296 -0
  218. data/lib/superhosting/controller/model.rb +62 -0
  219. data/lib/superhosting/controller/mux.rb +88 -0
  220. data/lib/superhosting/controller/mysql.rb +2 -2
  221. data/lib/superhosting/controller/site.rb +217 -72
  222. data/lib/superhosting/controller/site/alias.rb +32 -6
  223. data/lib/superhosting/controller/site/states.rb +41 -0
  224. data/lib/superhosting/controller/user.rb +233 -4
  225. data/lib/superhosting/docker_api.rb +170 -6
  226. data/lib/superhosting/helper/cmd.rb +40 -0
  227. data/lib/superhosting/helper/config.rb +80 -0
  228. data/lib/superhosting/helper/file.rb +56 -0
  229. data/lib/superhosting/helper/i18n.rb +13 -0
  230. data/lib/superhosting/helper/logger.rb +136 -0
  231. data/lib/superhosting/helper/states.rb +69 -0
  232. data/lib/superhosting/helpers.rb +5 -21
  233. data/lib/superhosting/mapper_inheritance/base.rb +16 -0
  234. data/lib/superhosting/mapper_inheritance/model.rb +96 -0
  235. data/lib/superhosting/mapper_inheritance/mux.rb +49 -0
  236. data/lib/superhosting/patches/path_mapper/dir_node.rb +23 -0
  237. data/lib/superhosting/patches/path_mapper/file_node.rb +47 -0
  238. data/lib/superhosting/patches/path_mapper/null_node.rb +35 -0
  239. data/lib/superhosting/patches/string/punycode.rb +21 -0
  240. data/lib/superhosting/version.rb +1 -1
  241. data/provision/bootstrap.sh +11 -0
  242. data/provision/docker.sh +25 -0
  243. data/provision/pam_docker.sh +5 -0
  244. data/{bootstrap.sh → provision/vagrant.sh} +5 -8
  245. data/superhosting.gemspec +14 -3
  246. metadata +368 -12
  247. data/lib/superhosting/script_executor/container.rb +0 -36
  248. data/lib/superhosting/script_executor/site.rb +0 -13
@@ -2,21 +2,43 @@ module Superhosting
2
2
  module Controller
3
3
  class Container
4
4
  class Admin < Base
5
- def initialize(name:, **kvargs)
5
+ def initialize(name:, **kwargs)
6
+ super(kwargs)
6
7
  @container_name = name
7
- super(kvargs)
8
+ @user_controller = self.get_controller(User)
9
+ @admin_controller = self.get_controller(Controller::Admin)
8
10
  end
9
11
 
10
12
  def list
13
+ container_admins = self._list
14
+ { data: container_admins }
15
+ end
11
16
 
17
+ def _list
18
+ self._list_users.map do |user|
19
+ { admin: user[/(?<=#{@container_name}_admin_)(.*)/], user: user }
20
+ end
12
21
  end
13
22
 
14
23
  def add(name:)
15
-
24
+ if (resp = @admin_controller.existing_validation(name: name)).net_status_ok?
25
+ admin_container_controller = self.get_controller(Controller::Admin::Container, name: name)
26
+ resp = admin_container_controller.add(name: @container_name)
27
+ end
28
+ resp
16
29
  end
17
30
 
18
31
  def delete(name:)
32
+ if (resp = @admin_controller.existing_validation(name: name)).net_status_ok?
33
+ admin_container_controller = self.get_controller(Controller::Admin::Container, name: name)
34
+ resp = admin_container_controller.delete(name: @container_name)
35
+ end
36
+ resp
37
+ end
19
38
 
39
+ def _list_users
40
+ users = @user_controller._group_get_users_names(name: @container_name)
41
+ users.select {|user| user.start_with? "#{@container_name}_admin_" }
20
42
  end
21
43
  end
22
44
  end
@@ -0,0 +1,296 @@
1
+ module Superhosting
2
+ module Controller
3
+ class Container
4
+ include Helper::States
5
+
6
+ def install_data(name:, mail: 'model', admin_mail: nil, model: nil)
7
+ if !(resp = self.adding_validation(name: name)).net_status_ok?
8
+ return resp
9
+ elsif (model_ = model || @config.containers.f(name).f('model', default: @config.default_model)).nil?
10
+ return { error: :input_error, code: :no_model_given }
11
+ end
12
+
13
+ # model
14
+ model_mapper = @config.models.f(model_)
15
+ return { error: :input_error, code: :model_does_not_exists, data: { name: model_ } } unless @config.models.f(model_).dir?
16
+ etc_mapper = @config.containers.f(name).create!
17
+ etc_mapper.model.put!(model) unless model.nil?
18
+
19
+ # config
20
+ self.reindex_container(name: name)
21
+ mapper = self.index[name][:mapper]
22
+
23
+ # mail
24
+ unless mail != 'no'
25
+ if mail == 'yes'
26
+ mapper.mail.put!(mail)
27
+ unless (admin_mail_ = admin_mail).nil?
28
+ mapper.admin_mail.put!(admin_mail_)
29
+ end
30
+ elsif mail == 'model'
31
+ if model_mapper.default_mail == 'yes'
32
+ admin_mail_ = admin_mail || model_mapper.default_admin_mail
33
+ end
34
+ end
35
+ return { error: :input_error, code: :option_admin_mail_required } if defined? admin_mail_ and admin_mail_.nil?
36
+ end
37
+
38
+ # lib
39
+ mapper.lib.config.delete!
40
+ mapper.lib.config.create!
41
+ mapper.lib.web.create!
42
+
43
+ # web
44
+ PathMapper.new('/web').create!
45
+ safe_link!(mapper.lib.web.path, mapper.web.path)
46
+ {}
47
+ end
48
+
49
+ def uninstall_data(name:)
50
+ if self.index.include? name
51
+ mapper = self.index[name][:mapper]
52
+
53
+ # lib
54
+ safe_unlink!(mapper.web.path)
55
+ mapper.lib = mapper.lib
56
+ mapper.lib.web.delete!
57
+ mapper.lib.config.delete!
58
+ mapper.lib.delete!
59
+
60
+ # config
61
+ mapper.delete!
62
+
63
+ self.reindex_container(name: name)
64
+ end
65
+
66
+ {}
67
+ end
68
+
69
+ def install_users(name:)
70
+ mapper = self.index[name][:mapper]
71
+
72
+ # user / group
73
+ user_controller = self.get_controller(User)
74
+ user_controller._group_pretty_add(name: name)
75
+ unless (resp = user_controller._pretty_add_custom(name: name, group: name)).net_status_ok?
76
+ return resp
77
+ end
78
+ user = user_controller._get(name: name)
79
+
80
+ self.with_dry_run do |dry_run|
81
+ user_gid = if dry_run
82
+ 'XXXX' if user.nil?
83
+ else
84
+ user.gid
85
+ end
86
+
87
+ mapper.lib.config.f('etc-group').append_line!("#{name}:x:#{user_gid}:") unless user_gid.nil?
88
+ end
89
+
90
+ # system users
91
+ current_system_users = user_controller._group_get_system_users(name: name)
92
+ add_users = mapper.system_users.lines - current_system_users
93
+ del_users = current_system_users - mapper.system_users.lines
94
+ add_users.each do |u|
95
+ unless (resp = user_controller._add_system_user(name: u.strip, container_name: name)).net_status_ok?
96
+ return resp
97
+ end
98
+ end
99
+ del_users.each do |u|
100
+ user_name = "#{name}_#{u.strip}"
101
+ user = user_controller._get(name: user_name)
102
+ unless (resp = user_controller._del(name: user_name)).net_status_ok?
103
+ return resp
104
+ end
105
+ mapper.lib.config.f('etc-passwd').remove_line!(/^#{user_name}:.*/)
106
+ end
107
+
108
+ # docker
109
+ PathMapper.new('/etc/security/docker.conf').append_line!("@#{name} #{name}")
110
+
111
+ # chown
112
+ chown_r!(name, name, mapper.lib.web.path)
113
+ {}
114
+ end
115
+
116
+ def uninstall_users(name:)
117
+ mapper = self.index[name][:mapper]
118
+
119
+ user_controller = self.get_controller(User)
120
+ if (user = user_controller._get(name: name))
121
+ mapper.lib.config.f('etc-group').remove_line!("#{name}:x:#{user.gid}:")
122
+ end
123
+
124
+ user_controller._group_del_users(name: name)
125
+ user_controller._group_pretty_del(name: name)
126
+
127
+ # docker
128
+ PathMapper.new('/etc/security/docker.conf').remove_line!("@#{name} #{name}")
129
+
130
+ {}
131
+ end
132
+
133
+ def configure(name:)
134
+ self._each_site(name: name) do |controller, sname, state|
135
+ controller.configure(name: sname).net_status_ok!
136
+ end
137
+ super
138
+ end
139
+
140
+ def unconfigure(name:)
141
+ self._each_site(name: name) do |controller, sname, state|
142
+ controller.unconfigure(name: sname).net_status_ok! # TODO: unchanged site status
143
+ end
144
+ super
145
+ end
146
+
147
+ def apply(name:)
148
+ self._each_site(name: name) do |controller, sname, state|
149
+ controller.apply(name: sname).net_status_ok!
150
+ end
151
+ super
152
+ end
153
+
154
+ def configure_with_apply(name:)
155
+ self._each_site(name: name) do |controller, sname, state|
156
+ controller.reconfigure(name: sname).net_status_ok!
157
+ end
158
+ super
159
+ end
160
+
161
+ def run(name:)
162
+ mapper = self.index[name][:mapper]
163
+
164
+ if (resp = self._collect_docker_options(mapper: mapper)).net_status_ok?
165
+ command_options, image, command = resp[:data]
166
+ dump_command_option = (command_options + [command]).join("\n")
167
+ dummy_signature_md5 = Digest::MD5.new.digest(dump_command_option)
168
+
169
+ restart = (!image.compare_with(mapper.lib.image) or (dummy_signature_md5 != mapper.lib.signature.md5))
170
+
171
+ if (resp = self._safe_run_docker(command_options, image, command, name: name, restart: restart)).net_status_ok?
172
+ mapper.lib.image.put!(image, logger: false)
173
+ mapper.lib.signature.put!(dump_command_option, logger: false)
174
+ end
175
+ end
176
+ resp
177
+ end
178
+
179
+ def run_mux(name:)
180
+ resp = {}
181
+ mapper = self.index[name][:mapper]
182
+
183
+ if (mux_mapper = mapper.mux).file?
184
+ mux_name = "mux-#{mux_mapper.value}"
185
+ mux_controller = self.get_controller(Mux)
186
+ resp = mux_controller.add(name: mux_name) if mux_controller.not_running_validation(name: mux_name).net_status_ok?
187
+ mux_controller.index_push(mux_name, name)
188
+ end
189
+
190
+ resp
191
+ end
192
+
193
+ def stop_mux(name:)
194
+ mapper = self.index[name][:mapper]
195
+
196
+ if (mux_mapper = mapper.mux).file?
197
+ mux_name = "mux-#{mux_mapper.value}"
198
+ mux_controller = self.get_controller(Mux)
199
+ mux_controller.index_pop(mux_name, name)
200
+ self._delete_docker(name: mux_name) unless mux_controller.index.include?(mux_name)
201
+ end
202
+
203
+ {}
204
+ end
205
+
206
+ def stop(name:)
207
+ self._delete_docker(name: name)
208
+ self.get_controller(Mux).reindex
209
+ {}
210
+ end
211
+
212
+ def _config_options(name:, on_reconfig:, on_config:)
213
+ mapper = self.index[name][:mapper]
214
+ model = mapper.model(default: @config.default_model)
215
+ model_mapper = @config.models.f(:"#{model}")
216
+ registry_mapper = mapper.lib.registry.f('container')
217
+ mux_mapper = self.index[name][:mux_mapper]
218
+
219
+ {
220
+ container: mapper,
221
+ mux: mux_mapper,
222
+ model: model_mapper,
223
+ registry_mapper: registry_mapper,
224
+ on_reconfig: on_reconfig,
225
+ on_config: on_config,
226
+ etc: @config,
227
+ lib: @lib,
228
+ docker_api: @docker_api
229
+ }
230
+ end
231
+
232
+ def _delete_docker(name:)
233
+ if @docker_api.container_exists?(name)
234
+ @docker_api.container_unpause!(name) if @docker_api.container_paused?(name)
235
+ @docker_api.container_kill!(name)
236
+ @docker_api.container_rm!(name)
237
+ end
238
+ end
239
+
240
+ def _recreate_docker(*docker_options, name:)
241
+ docker_options ||= self._collect_docker_options(mapper: self.index[name][:mapper]).net_status_ok!
242
+ self._delete_docker(name: name)
243
+ self._run_docker(*docker_options, name: name)
244
+ end
245
+
246
+ def _run_docker(*docker_options, name:)
247
+ docker_options = self._collect_docker_options(mapper: self.index[name][:mapper]).net_status_ok![:data] if docker_options.empty?
248
+ @docker_api.container_run(name, *docker_options)
249
+ end
250
+
251
+ def _safe_run_docker(*docker_options, name:, restart: false)
252
+ if restart
253
+ self._recreate_docker(*docker_options, name: name)
254
+ elsif @docker_api.container_exists?(name)
255
+ if @docker_api.container_dead?(name)
256
+ self._recreate_docker(*docker_options, name: name)
257
+ elsif @docker_api.container_exited?(name)
258
+ @docker_api.container_start!(name)
259
+ elsif @docker_api.container_paused?(name)
260
+ @docker_api.container_unpause!(name)
261
+ elsif @docker_api.container_restarting?(name)
262
+ Polling.start 10 do
263
+ break unless @docker_api.container_restarting?(name)
264
+ sleep 2
265
+ end
266
+ end
267
+ else
268
+ self._run_docker(*docker_options, name: name)
269
+ end
270
+ self.running_validation(name: name)
271
+ end
272
+
273
+ def _collect_docker_options(mapper:, model_or_mux: nil)
274
+ model_or_mux ||= mapper.f('model', default: @config.default_model)
275
+ return { error: :input_error, code: :no_docker_image_specified_in_model_or_mux, data: { name: model_or_mux } } if (image = mapper.docker.image).nil?
276
+
277
+ all_options = mapper.docker.grep_files.map {|n| [n.name[/(.*(?=\.erb))|(.*)/].to_sym, n.value] }.to_h
278
+ return { error: :logical_error, code: :docker_command_not_found } if (command = all_options[:command]).nil?
279
+
280
+ command_options = @docker_api.grab_container_options(all_options)
281
+ volume_opts = []
282
+ mapper.docker.f('volume', overlay: false).each {|v| volume_opts += v.lines unless v.nil? }
283
+ volume_opts.each {|val| command_options << "--volume #{val}" }
284
+
285
+ { data: [command_options, image, command] }
286
+ end
287
+
288
+ def _each_site(name:)
289
+ site_controller = self.get_controller(Superhosting::Controller::Site)
290
+ site_controller._list(container_name: name).each do |site_name, data|
291
+ yield site_controller, site_name, data[:state]
292
+ end
293
+ end
294
+ end
295
+ end
296
+ end
@@ -0,0 +1,62 @@
1
+ module Superhosting
2
+ module Controller
3
+ class Model < Base
4
+ def initialize(**kwargs)
5
+ super
6
+ @container_controller = self.get_controller(Container)
7
+ end
8
+
9
+ def list
10
+ { data: self._list }
11
+ end
12
+
13
+ def _list
14
+ models = []
15
+ @config.models.grep_dirs.each do |model_mapper|
16
+ models << model_mapper.name unless model_mapper.abstract?
17
+ end
18
+ models
19
+ end
20
+
21
+ def tree(name:)
22
+ if (resp = self.existing_validation(name: name)).net_status_ok?
23
+ { data: MapperInheritance::Model.new(@config.models.f(name)).collect_inheritors_tree }
24
+ else
25
+ resp
26
+ end
27
+ end
28
+
29
+ def reconfigure(name:)
30
+ if (resp = self.useable_validation(name: name)).net_status_ok?
31
+ self.index[name].each do |container_name|
32
+ break unless (resp = @container_controller.reconfigure(name: container_name)).net_status_ok?
33
+ end
34
+ end
35
+ resp
36
+ end
37
+
38
+ def update(name:)
39
+
40
+ end
41
+
42
+ def useable_validation(name:)
43
+ self.index.include?(name) ? {} : { error: :logical_error, code: :model_does_not_used, data: { name: name } }
44
+ end
45
+
46
+ def existing_validation(name:)
47
+ self._list.include?(name) ? {} : { error: :logical_error, code: :model_does_not_exists, data: { name: name } }
48
+ end
49
+
50
+ def index
51
+ index = {}
52
+ @container_controller._list.each do |container_name, data|
53
+ container_mapper = @container_controller.index[container_name][:mapper]
54
+ model = container_mapper.f('model', default: @config.default_model).value
55
+
56
+ (index[model] ||= []) << container_name
57
+ end
58
+ index
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,88 @@
1
+ module Superhosting
2
+ module Controller
3
+ class Mux < Base
4
+ attr_writer :index
5
+
6
+ def initialize(**kwargs)
7
+ super
8
+ @container_controller = self.get_controller(Container)
9
+ end
10
+
11
+ def add(name:)
12
+ if (resp = self.adding_validation(name: name))
13
+ mux_name = name[/(?<=mux-).*/]
14
+ mapper = MapperInheritance::Mux.new(@config.muxs.f(mux_name)).set_inheritors
15
+
16
+ # docker
17
+ mapper.erb_options = { mux: mapper }
18
+ if (resp = @container_controller._collect_docker_options(mapper: mapper, model_or_mux: mux_name)).net_status_ok?
19
+ docker_options = resp[:data]
20
+ @container_controller._safe_run_docker(*docker_options, name: name ).net_status_ok!
21
+ end
22
+ else
23
+ resp
24
+ end
25
+ end
26
+
27
+ def reconfigure(name:)
28
+ if (resp = self.existing_validation(name: name)).net_status_ok?
29
+ self.index[name].each do |container_name|
30
+ break unless (resp = @container_controller.reconfigure(name: container_name)).net_status_ok?
31
+ end
32
+ end
33
+ resp
34
+ end
35
+
36
+ def adding_validation(name:)
37
+ if (resp = @container_controller.base_validation(name: name)).net_status_ok?
38
+ resp = self.not_running_validation(name: name)
39
+ end
40
+ resp
41
+ end
42
+
43
+ def existing_validation(name:)
44
+ self.index.include?(name) ? {} : { error: :logical_error, code: :mux_does_not_exists, data: { name: name } }
45
+ end
46
+
47
+ def not_running_validation(name:)
48
+ @container_controller.not_running_validation(name: name).net_status_ok? ? {} : { error: :logical_error, code: :mux_is_running, data: { name: name } }
49
+ end
50
+
51
+ def running_validation(name:)
52
+ @container_controller.running_validation(name: name).net_status_ok? ? {} : { error: :logical_error, code: :mux_is_not_running, data: { name: name } }
53
+ end
54
+
55
+ def index
56
+ @@index ||= self.reindex
57
+ end
58
+
59
+ def reindex
60
+ @@index ||= {}
61
+ @container_controller._list.map do |container_name, data|
62
+ container_mapper = @container_controller.index[container_name][:mapper]
63
+ if (mux_mapper = container_mapper.mux).file?
64
+ mux_name = "mux-#{mux_mapper.value}"
65
+ if @container_controller.running_validation(name: container_name).net_status_ok?
66
+ self.index_push(mux_name, container_name)
67
+ else
68
+ self.index_pop(mux_name, container_name)
69
+ end
70
+ end
71
+ end
72
+ @@index
73
+ end
74
+
75
+ def index_pop(mux_name, container_name)
76
+ if self.index.key? mux_name
77
+ self.index[mux_name].delete(container_name)
78
+ self.index.delete(mux_name) if self.index[mux_name].empty?
79
+ end
80
+ end
81
+
82
+ def index_push(mux_name, container_name)
83
+ self.index[mux_name] ||= []
84
+ self.index[mux_name] << container_name unless self.index[mux_name].include? container_name
85
+ end
86
+ end
87
+ end
88
+ end