krates 1.6.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 (293) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +212 -0
  3. data/LOGO +10 -0
  4. data/VERSION +1 -0
  5. data/bin/krates +23 -0
  6. data/lib/kontena/autoload_core.rb +19 -0
  7. data/lib/kontena/callback.rb +60 -0
  8. data/lib/kontena/callbacks/.gitkeep +0 -0
  9. data/lib/kontena/callbacks/auth/01_list_and_select_grid_after_master_auth.rb +26 -0
  10. data/lib/kontena/callbacks/master/01_clear_current_master_after_terminate.rb +19 -0
  11. data/lib/kontena/callbacks/master/deploy/01_show_logo_before_deploy.rb +14 -0
  12. data/lib/kontena/callbacks/master/deploy/04_default_master_version.rb +18 -0
  13. data/lib/kontena/callbacks/master/deploy/05_before_deploy_configuration_wizard.rb +105 -0
  14. data/lib/kontena/callbacks/master/deploy/40_install_ssl_certificate_after_deploy.rb +32 -0
  15. data/lib/kontena/callbacks/master/deploy/50_authenticate_after_deploy.rb +66 -0
  16. data/lib/kontena/callbacks/master/deploy/55_create_initial_grid_after_deploy.rb +21 -0
  17. data/lib/kontena/callbacks/master/deploy/56_set_server_provider_after_deploy.rb +24 -0
  18. data/lib/kontena/callbacks/master/deploy/60_configure_auth_provider_after_deploy.rb +31 -0
  19. data/lib/kontena/callbacks/master/deploy/70_invite_self_after_deploy.rb +95 -0
  20. data/lib/kontena/callbacks/master/deploy/90_proptip_after_deploy.rb +33 -0
  21. data/lib/kontena/cli/browser_launcher.rb +61 -0
  22. data/lib/kontena/cli/bytes_helper.rb +40 -0
  23. data/lib/kontena/cli/certificate/authorize_command.rb +107 -0
  24. data/lib/kontena/cli/certificate/common.rb +16 -0
  25. data/lib/kontena/cli/certificate/domain_authorization/list_command.rb +24 -0
  26. data/lib/kontena/cli/certificate/domain_authorization/remove_authorization_command.rb +25 -0
  27. data/lib/kontena/cli/certificate/domain_authorize_command.rb +7 -0
  28. data/lib/kontena/cli/certificate/export_command.rb +28 -0
  29. data/lib/kontena/cli/certificate/get_command.rb +33 -0
  30. data/lib/kontena/cli/certificate/import_command.rb +61 -0
  31. data/lib/kontena/cli/certificate/list_command.rb +75 -0
  32. data/lib/kontena/cli/certificate/register_command.rb +30 -0
  33. data/lib/kontena/cli/certificate/remove_command.rb +23 -0
  34. data/lib/kontena/cli/certificate/request_command.rb +20 -0
  35. data/lib/kontena/cli/certificate/show_command.rb +22 -0
  36. data/lib/kontena/cli/certificate_command.rb +18 -0
  37. data/lib/kontena/cli/cloud/login_command.rb +186 -0
  38. data/lib/kontena/cli/cloud/logout_command.rb +14 -0
  39. data/lib/kontena/cli/cloud/master/add_command.rb +156 -0
  40. data/lib/kontena/cli/cloud/master/list_command.rb +35 -0
  41. data/lib/kontena/cli/cloud/master/remove_command.rb +68 -0
  42. data/lib/kontena/cli/cloud/master/show_command.rb +21 -0
  43. data/lib/kontena/cli/cloud/master/update_command.rb +52 -0
  44. data/lib/kontena/cli/cloud/master_command.rb +14 -0
  45. data/lib/kontena/cli/cloud_command.rb +13 -0
  46. data/lib/kontena/cli/common.rb +360 -0
  47. data/lib/kontena/cli/config.rb +662 -0
  48. data/lib/kontena/cli/container_command.rb +10 -0
  49. data/lib/kontena/cli/containers/exec_command.rb +31 -0
  50. data/lib/kontena/cli/containers/inspect_command.rb +16 -0
  51. data/lib/kontena/cli/containers/list_command.rb +51 -0
  52. data/lib/kontena/cli/containers/logs_command.rb +19 -0
  53. data/lib/kontena/cli/etcd/common.rb +8 -0
  54. data/lib/kontena/cli/etcd/get_command.rb +26 -0
  55. data/lib/kontena/cli/etcd/health_command.rb +53 -0
  56. data/lib/kontena/cli/etcd/list_command.rb +36 -0
  57. data/lib/kontena/cli/etcd/mkdir_command.rb +23 -0
  58. data/lib/kontena/cli/etcd/remove_command.rb +29 -0
  59. data/lib/kontena/cli/etcd/set_command.rb +24 -0
  60. data/lib/kontena/cli/etcd_command.rb +12 -0
  61. data/lib/kontena/cli/external_registries/add_command.rb +25 -0
  62. data/lib/kontena/cli/external_registries/list_command.rb +23 -0
  63. data/lib/kontena/cli/external_registries/remove_command.rb +17 -0
  64. data/lib/kontena/cli/external_registry_command.rb +9 -0
  65. data/lib/kontena/cli/grid_command.rb +21 -0
  66. data/lib/kontena/cli/grid_options.rb +12 -0
  67. data/lib/kontena/cli/grids/audit_log_command.rb +22 -0
  68. data/lib/kontena/cli/grids/cloud_config_command.rb +53 -0
  69. data/lib/kontena/cli/grids/common.rb +182 -0
  70. data/lib/kontena/cli/grids/create_command.rb +48 -0
  71. data/lib/kontena/cli/grids/current_command.rb +25 -0
  72. data/lib/kontena/cli/grids/env_command.rb +32 -0
  73. data/lib/kontena/cli/grids/events_command.rb +50 -0
  74. data/lib/kontena/cli/grids/health_command.rb +69 -0
  75. data/lib/kontena/cli/grids/list_command.rb +59 -0
  76. data/lib/kontena/cli/grids/logs_command.rb +35 -0
  77. data/lib/kontena/cli/grids/remove_command.rb +31 -0
  78. data/lib/kontena/cli/grids/show_command.rb +25 -0
  79. data/lib/kontena/cli/grids/trusted_subnet_command.rb +10 -0
  80. data/lib/kontena/cli/grids/trusted_subnets/add_command.rb +18 -0
  81. data/lib/kontena/cli/grids/trusted_subnets/list_command.rb +18 -0
  82. data/lib/kontena/cli/grids/trusted_subnets/remove_command.rb +26 -0
  83. data/lib/kontena/cli/grids/update_command.rb +35 -0
  84. data/lib/kontena/cli/grids/use_command.rb +26 -0
  85. data/lib/kontena/cli/grids/user_command.rb +9 -0
  86. data/lib/kontena/cli/grids/users/add_command.rb +18 -0
  87. data/lib/kontena/cli/grids/users/list_command.rb +20 -0
  88. data/lib/kontena/cli/grids/users/remove_command.rb +20 -0
  89. data/lib/kontena/cli/helpers/exec_helper.rb +209 -0
  90. data/lib/kontena/cli/helpers/health_helper.rb +65 -0
  91. data/lib/kontena/cli/helpers/log_helper.rb +113 -0
  92. data/lib/kontena/cli/helpers/time_helper.rb +29 -0
  93. data/lib/kontena/cli/localhost_web_server.rb +113 -0
  94. data/lib/kontena/cli/log_formatters/compact.rb +65 -0
  95. data/lib/kontena/cli/log_formatters/strip_color.rb +13 -0
  96. data/lib/kontena/cli/logout_command.rb +10 -0
  97. data/lib/kontena/cli/master/audit_log_command.rb +19 -0
  98. data/lib/kontena/cli/master/config/export_command.rb +46 -0
  99. data/lib/kontena/cli/master/config/get_command.rb +26 -0
  100. data/lib/kontena/cli/master/config/import_command.rb +67 -0
  101. data/lib/kontena/cli/master/config/set_command.rb +19 -0
  102. data/lib/kontena/cli/master/config/unset_command.rb +20 -0
  103. data/lib/kontena/cli/master/config_command.rb +17 -0
  104. data/lib/kontena/cli/master/create_command.rb +74 -0
  105. data/lib/kontena/cli/master/current_command.rb +25 -0
  106. data/lib/kontena/cli/master/init_cloud_command.rb +45 -0
  107. data/lib/kontena/cli/master/join_command.rb +22 -0
  108. data/lib/kontena/cli/master/list_command.rb +24 -0
  109. data/lib/kontena/cli/master/login_command.rb +331 -0
  110. data/lib/kontena/cli/master/logout_command.rb +25 -0
  111. data/lib/kontena/cli/master/remove_command.rb +55 -0
  112. data/lib/kontena/cli/master/ssh_command.rb +72 -0
  113. data/lib/kontena/cli/master/token/common.rb +29 -0
  114. data/lib/kontena/cli/master/token/create_command.rb +50 -0
  115. data/lib/kontena/cli/master/token/current_command.rb +45 -0
  116. data/lib/kontena/cli/master/token/list_command.rb +39 -0
  117. data/lib/kontena/cli/master/token/remove_command.rb +19 -0
  118. data/lib/kontena/cli/master/token/show_command.rb +34 -0
  119. data/lib/kontena/cli/master/token_command.rb +13 -0
  120. data/lib/kontena/cli/master/use_command.rb +31 -0
  121. data/lib/kontena/cli/master/user/invite_command.rb +51 -0
  122. data/lib/kontena/cli/master/user/list_command.rb +29 -0
  123. data/lib/kontena/cli/master/user/remove_command.rb +24 -0
  124. data/lib/kontena/cli/master/user/role/add_command.rb +29 -0
  125. data/lib/kontena/cli/master/user/role/remove_command.rb +27 -0
  126. data/lib/kontena/cli/master/user/role_command.rb +6 -0
  127. data/lib/kontena/cli/master/user_command.rb +9 -0
  128. data/lib/kontena/cli/master_command.rb +21 -0
  129. data/lib/kontena/cli/node_command.rb +17 -0
  130. data/lib/kontena/cli/nodes/create_command.rb +25 -0
  131. data/lib/kontena/cli/nodes/env_command.rb +37 -0
  132. data/lib/kontena/cli/nodes/health_command.rb +47 -0
  133. data/lib/kontena/cli/nodes/label_command.rb +10 -0
  134. data/lib/kontena/cli/nodes/labels/add_command.rb +18 -0
  135. data/lib/kontena/cli/nodes/labels/list_command.rb +19 -0
  136. data/lib/kontena/cli/nodes/labels/remove_command.rb +32 -0
  137. data/lib/kontena/cli/nodes/list_command.rb +97 -0
  138. data/lib/kontena/cli/nodes/remove_command.rb +34 -0
  139. data/lib/kontena/cli/nodes/reset_token_command.rb +34 -0
  140. data/lib/kontena/cli/nodes/show_command.rb +56 -0
  141. data/lib/kontena/cli/nodes/ssh_command.rb +63 -0
  142. data/lib/kontena/cli/nodes/update_command.rb +31 -0
  143. data/lib/kontena/cli/plugin_command.rb +12 -0
  144. data/lib/kontena/cli/plugins/common.rb +8 -0
  145. data/lib/kontena/cli/plugins/install_command.rb +42 -0
  146. data/lib/kontena/cli/plugins/list_command.rb +31 -0
  147. data/lib/kontena/cli/plugins/search_command.rb +25 -0
  148. data/lib/kontena/cli/plugins/show_command.rb +17 -0
  149. data/lib/kontena/cli/plugins/uninstall_command.rb +31 -0
  150. data/lib/kontena/cli/plugins/upgrade_command.rb +60 -0
  151. data/lib/kontena/cli/registry/create_command.rb +151 -0
  152. data/lib/kontena/cli/registry/remove_command.rb +21 -0
  153. data/lib/kontena/cli/registry_command.rb +8 -0
  154. data/lib/kontena/cli/service_command.rb +28 -0
  155. data/lib/kontena/cli/services/container_command.rb +8 -0
  156. data/lib/kontena/cli/services/containers_command.rb +39 -0
  157. data/lib/kontena/cli/services/create_command.rb +105 -0
  158. data/lib/kontena/cli/services/deploy_command.rb +25 -0
  159. data/lib/kontena/cli/services/env_command.rb +9 -0
  160. data/lib/kontena/cli/services/envs/add_command.rb +21 -0
  161. data/lib/kontena/cli/services/envs/list_command.rb +22 -0
  162. data/lib/kontena/cli/services/envs/remove_command.rb +22 -0
  163. data/lib/kontena/cli/services/events_command.rb +36 -0
  164. data/lib/kontena/cli/services/exec_command.rb +107 -0
  165. data/lib/kontena/cli/services/link_command.rb +35 -0
  166. data/lib/kontena/cli/services/list_command.rb +66 -0
  167. data/lib/kontena/cli/services/logs_command.rb +33 -0
  168. data/lib/kontena/cli/services/monitor_command.rb +58 -0
  169. data/lib/kontena/cli/services/remove_command.rb +60 -0
  170. data/lib/kontena/cli/services/restart_command.rb +19 -0
  171. data/lib/kontena/cli/services/scale_command.rb +21 -0
  172. data/lib/kontena/cli/services/secret_command.rb +8 -0
  173. data/lib/kontena/cli/services/secrets/link_command.rb +26 -0
  174. data/lib/kontena/cli/services/secrets/unlink_command.rb +28 -0
  175. data/lib/kontena/cli/services/services_helper.rb +579 -0
  176. data/lib/kontena/cli/services/show_command.rb +26 -0
  177. data/lib/kontena/cli/services/start_command.rb +21 -0
  178. data/lib/kontena/cli/services/stats_command.rb +87 -0
  179. data/lib/kontena/cli/services/stop_command.rb +21 -0
  180. data/lib/kontena/cli/services/unlink_command.rb +30 -0
  181. data/lib/kontena/cli/services/update_command.rb +94 -0
  182. data/lib/kontena/cli/spinner.rb +205 -0
  183. data/lib/kontena/cli/stack_command.rb +21 -0
  184. data/lib/kontena/cli/stacks/build_command.rb +125 -0
  185. data/lib/kontena/cli/stacks/common.rb +209 -0
  186. data/lib/kontena/cli/stacks/deploy_command.rb +37 -0
  187. data/lib/kontena/cli/stacks/events_command.rb +33 -0
  188. data/lib/kontena/cli/stacks/inspect_command.rb +17 -0
  189. data/lib/kontena/cli/stacks/install_command.rb +95 -0
  190. data/lib/kontena/cli/stacks/label_command.rb +10 -0
  191. data/lib/kontena/cli/stacks/labels/add_command.rb +21 -0
  192. data/lib/kontena/cli/stacks/labels/common.rb +19 -0
  193. data/lib/kontena/cli/stacks/labels/list_command.rb +21 -0
  194. data/lib/kontena/cli/stacks/labels/remove_command.rb +21 -0
  195. data/lib/kontena/cli/stacks/list_command.rb +154 -0
  196. data/lib/kontena/cli/stacks/logs_command.rb +35 -0
  197. data/lib/kontena/cli/stacks/monitor_command.rb +93 -0
  198. data/lib/kontena/cli/stacks/registry/create_command.rb +24 -0
  199. data/lib/kontena/cli/stacks/registry/make_private_command.rb +24 -0
  200. data/lib/kontena/cli/stacks/registry/make_public_command.rb +24 -0
  201. data/lib/kontena/cli/stacks/registry/pull_command.rb +28 -0
  202. data/lib/kontena/cli/stacks/registry/push_command.rb +40 -0
  203. data/lib/kontena/cli/stacks/registry/remove_command.rb +30 -0
  204. data/lib/kontena/cli/stacks/registry/search_command.rb +42 -0
  205. data/lib/kontena/cli/stacks/registry/show_command.rb +65 -0
  206. data/lib/kontena/cli/stacks/registry_command.rb +12 -0
  207. data/lib/kontena/cli/stacks/remove_command.rb +80 -0
  208. data/lib/kontena/cli/stacks/restart_command.rb +24 -0
  209. data/lib/kontena/cli/stacks/service_generator.rb +131 -0
  210. data/lib/kontena/cli/stacks/service_generator_v2.rb +27 -0
  211. data/lib/kontena/cli/stacks/show_command.rb +168 -0
  212. data/lib/kontena/cli/stacks/stack_name.rb +71 -0
  213. data/lib/kontena/cli/stacks/stacks_helper.rb +83 -0
  214. data/lib/kontena/cli/stacks/stop_command.rb +24 -0
  215. data/lib/kontena/cli/stacks/upgrade_command.rb +264 -0
  216. data/lib/kontena/cli/stacks/validate_command.rb +75 -0
  217. data/lib/kontena/cli/stacks/yaml/custom_validators/affinities_validator.rb +19 -0
  218. data/lib/kontena/cli/stacks/yaml/custom_validators/build_validator.rb +22 -0
  219. data/lib/kontena/cli/stacks/yaml/custom_validators/certificates_validator.rb +22 -0
  220. data/lib/kontena/cli/stacks/yaml/custom_validators/extends_validator.rb +22 -0
  221. data/lib/kontena/cli/stacks/yaml/custom_validators/hooks_validator.rb +102 -0
  222. data/lib/kontena/cli/stacks/yaml/custom_validators/secrets_validator.rb +22 -0
  223. data/lib/kontena/cli/stacks/yaml/opto/certificates_resolver.rb +37 -0
  224. data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +78 -0
  225. data/lib/kontena/cli/stacks/yaml/opto/service_instances_resolver.rb +25 -0
  226. data/lib/kontena/cli/stacks/yaml/opto/service_link_resolver.rb +80 -0
  227. data/lib/kontena/cli/stacks/yaml/opto/vault_cert_prompt_resolver.rb +39 -0
  228. data/lib/kontena/cli/stacks/yaml/opto/vault_resolver.rb +13 -0
  229. data/lib/kontena/cli/stacks/yaml/opto/vault_setter.rb +12 -0
  230. data/lib/kontena/cli/stacks/yaml/opto.rb +16 -0
  231. data/lib/kontena/cli/stacks/yaml/reader.rb +525 -0
  232. data/lib/kontena/cli/stacks/yaml/service_extender.rb +65 -0
  233. data/lib/kontena/cli/stacks/yaml/stack_file_loader/file_loader.rb +41 -0
  234. data/lib/kontena/cli/stacks/yaml/stack_file_loader/registry_loader.rb +24 -0
  235. data/lib/kontena/cli/stacks/yaml/stack_file_loader/uri_loader.rb +23 -0
  236. data/lib/kontena/cli/stacks/yaml/stack_file_loader.rb +152 -0
  237. data/lib/kontena/cli/stacks/yaml/validations.rb +119 -0
  238. data/lib/kontena/cli/stacks/yaml/validator_v3.rb +164 -0
  239. data/lib/kontena/cli/subcommand_loader.rb +83 -0
  240. data/lib/kontena/cli/table_generator.rb +128 -0
  241. data/lib/kontena/cli/vault/export_command.rb +24 -0
  242. data/lib/kontena/cli/vault/import_command.rb +75 -0
  243. data/lib/kontena/cli/vault/list_command.rb +37 -0
  244. data/lib/kontena/cli/vault/read_command.rb +27 -0
  245. data/lib/kontena/cli/vault/remove_command.rb +23 -0
  246. data/lib/kontena/cli/vault/update_command.rb +24 -0
  247. data/lib/kontena/cli/vault/write_command.rb +23 -0
  248. data/lib/kontena/cli/vault_command.rb +13 -0
  249. data/lib/kontena/cli/version.rb +10 -0
  250. data/lib/kontena/cli/version_command.rb +20 -0
  251. data/lib/kontena/cli/volume_command.rb +9 -0
  252. data/lib/kontena/cli/volumes/create_command.rb +42 -0
  253. data/lib/kontena/cli/volumes/list_command.rb +29 -0
  254. data/lib/kontena/cli/volumes/remove_command.rb +29 -0
  255. data/lib/kontena/cli/volumes/show_command.rb +38 -0
  256. data/lib/kontena/cli/vpn/config_command.rb +27 -0
  257. data/lib/kontena/cli/vpn/create_command.rb +99 -0
  258. data/lib/kontena/cli/vpn/remove_command.rb +22 -0
  259. data/lib/kontena/cli/vpn_command.rb +9 -0
  260. data/lib/kontena/cli/whoami_command.rb +38 -0
  261. data/lib/kontena/client.rb +574 -0
  262. data/lib/kontena/command.rb +251 -0
  263. data/lib/kontena/debug_instrumentor.rb +80 -0
  264. data/lib/kontena/errors.rb +50 -0
  265. data/lib/kontena/light_prompt.rb +103 -0
  266. data/lib/kontena/machine/cert_helper.rb +43 -0
  267. data/lib/kontena/machine/cloud_config/cloudinit.yml +82 -0
  268. data/lib/kontena/machine/cloud_config/node_generator.rb +28 -0
  269. data/lib/kontena/machine/common.rb +17 -0
  270. data/lib/kontena/machine/random_name.rb +42 -0
  271. data/lib/kontena/main_command.rb +66 -0
  272. data/lib/kontena/plugin_manager/cleaner.rb +33 -0
  273. data/lib/kontena/plugin_manager/common.rb +89 -0
  274. data/lib/kontena/plugin_manager/installer.rb +78 -0
  275. data/lib/kontena/plugin_manager/loader.rb +93 -0
  276. data/lib/kontena/plugin_manager/rubygems_client.rb +59 -0
  277. data/lib/kontena/plugin_manager/uninstaller.rb +34 -0
  278. data/lib/kontena/plugin_manager.rb +26 -0
  279. data/lib/kontena/presets/github_auth_provider.yml +11 -0
  280. data/lib/kontena/presets/kontena_auth_provider.yml +11 -0
  281. data/lib/kontena/scripts/completer +9 -0
  282. data/lib/kontena/scripts/completer.rb +334 -0
  283. data/lib/kontena/scripts/init +18 -0
  284. data/lib/kontena/scripts/kontena.zsh +11 -0
  285. data/lib/kontena/scripts/krates.bash +8 -0
  286. data/lib/kontena/stacks/change_resolver.rb +118 -0
  287. data/lib/kontena/stacks/stack_data.rb +58 -0
  288. data/lib/kontena/stacks/stack_data_set.rb +51 -0
  289. data/lib/kontena/stacks_cache.rb +110 -0
  290. data/lib/kontena/stacks_client.rb +177 -0
  291. data/lib/kontena/util.rb +116 -0
  292. data/lib/kontena_cli.rb +190 -0
  293. metadata +518 -0
@@ -0,0 +1,30 @@
1
+
2
+ module Kontena::Cli::Certificate
3
+ class RegisterCommand < Kontena::Command
4
+ include Kontena::Cli::Common
5
+ include Kontena::Cli::GridOptions
6
+
7
+
8
+ parameter "EMAIL", "Email to register"
9
+
10
+ option '--agree-tos', :flag, "Automatically agree on Let's Encrypt Terms of Service"
11
+
12
+ def execute
13
+ require_api_url
14
+ token = require_token
15
+
16
+ data = {email: email}
17
+
18
+ if self.agree_tos? || ask_continue
19
+ response = client(token).post("certificates/#{current_grid}/register", data)
20
+ puts 'Email registered to LetsEncrypt'
21
+ end
22
+ end
23
+
24
+ def ask_continue
25
+ puts "By registering, you agree on Let's Encrypt Terms of Service: https://letsencrypt.org/documents/2017.11.15-LE-SA-v1.2.pdf"
26
+ exit_with_error "Registration canceled!" unless prompt.yes?("Continue?")
27
+ true
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../services/services_helper'
2
+
3
+ module Kontena::Cli::Certificate
4
+ class RemoveCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+ include Kontena::Cli::GridOptions
7
+
8
+ parameter "SUBJECT", "Certificate subject"
9
+ option "--force", :flag, "Force remove", default: false, attribute_name: :forced
10
+
11
+ requires_current_master
12
+ requires_current_master_token
13
+ requires_current_grid
14
+
15
+ def execute
16
+ confirm_command(self.subject) unless forced?
17
+
18
+ spinner "Removing certificate for #{self.subject.colorize(:cyan)} from #{current_grid.colorize(:cyan)} grid " do
19
+ client.delete("certificates/#{current_grid}/#{self.subject}")
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+
2
+ module Kontena::Cli::Certificate
3
+ class RequestCommand < Kontena::Command
4
+ include Kontena::Cli::Common
5
+ include Kontena::Cli::GridOptions
6
+
7
+ parameter "DOMAIN ...", "Domain(s) to get certificate for"
8
+
9
+ def execute
10
+ require_api_url
11
+ token = require_token
12
+ data = {domains: domain_list}
13
+
14
+ spinner "Requesting certificate for #{domain_list.join(',').colorize(:cyan)} " do
15
+ response = client(token).post("grids/#{current_grid}/certificates", data)
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../services/services_helper'
2
+ require_relative './common'
3
+
4
+ module Kontena::Cli::Certificate
5
+ class ShowCommand < Kontena::Command
6
+ include Kontena::Cli::Common
7
+ include Kontena::Cli::GridOptions
8
+ include Common
9
+
10
+ parameter "SUBJECT", "Certificate subject"
11
+
12
+ requires_current_master
13
+ requires_current_master_token
14
+ requires_current_grid
15
+
16
+ def execute
17
+ cert = client.get("certificates/#{current_grid}/#{self.subject}")
18
+
19
+ show_certificate(cert)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+
2
+ class Kontena::Cli::CertificateCommand < Kontena::Command
3
+
4
+ subcommand ["list", "ls"], "List certificates", load_subcommand('certificate/list_command')
5
+ subcommand "show", "Show certificate details", load_subcommand('certificate/show_command')
6
+ subcommand "export", "Export certificate to file", load_subcommand('certificate/export_command')
7
+ subcommand "register", "Register to LetsEncrypt", load_subcommand('certificate/register_command')
8
+ subcommand "authorize", "Create DNS authorization for domain", load_subcommand('certificate/authorize_command')
9
+ subcommand "request", "Request certificate for domain", load_subcommand('certificate/request_command')
10
+ subcommand "get", "Get certificate for domain [DEPRECATED]", load_subcommand('certificate/get_command')
11
+ subcommand "import", "Import certificate from file", load_subcommand('certificate/import_command')
12
+ subcommand ["remove", "rm"], "Remove certificate for domain", load_subcommand('certificate/remove_command')
13
+ subcommand "domain-authorization", "Domain authorization sub-commands", load_subcommand('certificate/domain_authorize_command')
14
+
15
+
16
+ def execute
17
+ end
18
+ end
@@ -0,0 +1,186 @@
1
+ require 'uri'
2
+
3
+ module Kontena::Cli::Cloud
4
+ class LoginCommand < Kontena::Command
5
+ include Kontena::Cli::Common
6
+
7
+ option ['-t', '--token'], '[TOKEN]', 'Use a pre-generated access token', environment_variable: 'KONTENA_CLOUD_TOKEN'
8
+ option ['-c', '--code'], '[CODE]', 'Use an authorization code'
9
+ option ['-v', '--verbose'], :flag, 'Increase output verbosity'
10
+ option ['-f', '--force'], :flag, 'Force reauthentication'
11
+ option ['-r', '--remote'], :flag, 'Remote login'
12
+
13
+ def execute
14
+ if self.code && self.force?
15
+ exit_with_error "Can't use --code and --force together"
16
+ end
17
+
18
+ if self.token
19
+ exit_with_error "Can't use --token and --force together" if self.force?
20
+ exit_with_error "Can't use --token and --code together" if self.code
21
+ end
22
+
23
+ if !kontena_account.token || !kontena_account.token.access_token || self.token || self.force?
24
+ kontena_account.token = Kontena::Cli::Config::Token.new(access_token: self.token, parent_type: :account, parent_name: kontena_account.name)
25
+ end
26
+
27
+ use_authorization_code(self.code) if self.code
28
+
29
+ client = Kontena::Client.new(kontena_account.userinfo_endpoint, kontena_account.token, prefix: '')
30
+
31
+ if kontena_account.token.access_token
32
+ auth_ok = vspinner "Verifying current access token" do
33
+ client.authentication_ok?(kontena_account.userinfo_endpoint)
34
+ end
35
+ if auth_ok
36
+ finish and return
37
+ end
38
+ end
39
+ if remote?
40
+ remote_login
41
+ else
42
+ web_flow
43
+ end
44
+ finish
45
+ end
46
+
47
+ def finish
48
+ update_userinfo unless kontena_account.username
49
+ config.current_account = kontena_account.name
50
+ config.write
51
+ config.reset_instance
52
+ reset_cloud_client
53
+ display_logo
54
+ display_login_info(only: :account)
55
+ true
56
+ end
57
+
58
+ def remote_login
59
+ client_id = kontena_account.client_id || Kontena::Client::CLIENT_ID
60
+ params = {
61
+ client_id: client_id
62
+ }
63
+ cloud_url = kontena_account.url
64
+ client = Kontena::Client.new(cloud_url, nil)
65
+ auth_request_response = client.post('/auth_requests', params, {}, { 'Content-Type' => 'application/x-www-form-urlencoded' }) rescue nil
66
+ if !auth_request_response.kind_of?(Hash)
67
+ exit_with_error "Remote login request failed"
68
+ elsif auth_request_response['error']
69
+ exit_with_error "Remote login request failed: #{auth_request_response['error']}"
70
+ end
71
+ begin
72
+ verification_uri = URI.parse(auth_request_response['verification_uri'])
73
+ rescue => e
74
+ exit_with_error "Parsing remote login URL failed."
75
+ end
76
+
77
+ puts "Please visit #{pastel.cyan(verification_uri.to_s)} and enter the code"
78
+ puts
79
+ puts "#{auth_request_response['user_code']}"
80
+ puts
81
+ puts "Once the authentication is complete you can close the browser"
82
+ puts "window or tab and return to this window to continue."
83
+ puts
84
+
85
+ code_request_params = {
86
+ client_id: client_id,
87
+ device_code: auth_request_response['device_code']
88
+ }
89
+ code_response = nil
90
+ spinner "Waiting for authentication" do
91
+ until code_response do
92
+ code_response = client.post("/auth_requests/code", code_request_params, {}, { 'Content-Type' => 'application/x-www-form-urlencoded' }) rescue nil
93
+ sleep 1
94
+ end
95
+ end
96
+ update_token(code_response)
97
+ end
98
+
99
+ def web_flow
100
+ if Kontena.browserless? && !force?
101
+ $stderr.puts "Your current environment does not seem to support opening a local graphical WWW browser. Using remote login instead."
102
+ $stderr.puts
103
+ remote_login
104
+ return
105
+ end
106
+
107
+ require_relative '../localhost_web_server'
108
+ require 'kontena/cli/browser_launcher'
109
+
110
+ uri = URI.parse(kontena_account.authorization_endpoint)
111
+ uri.host ||= kontena_account.url
112
+
113
+ web_server = Kontena::LocalhostWebServer.new
114
+
115
+ params = {
116
+ client_id: kontena_account.client_id || Kontena::Client::CLIENT_ID,
117
+ response_type: 'code',
118
+ redirect_uri: "http://localhost:#{web_server.port}/cb"
119
+ }
120
+
121
+ uri.query = URI.encode_www_form(params)
122
+
123
+ puts "Opening a browser to #{uri.scheme}://#{uri.host}"
124
+ #puts
125
+ #puts "If you are running this command over an ssh connection or it's"
126
+ #puts "otherwise not possible to open a browser from this terminal"
127
+ #puts "then you must use a pregenerated access token using the --token"
128
+ #puts "option : kontena cloud login --token <access_token>"
129
+ puts
130
+ puts "Once the authentication is complete you can close the browser"
131
+ puts "window or tab and return to this window to continue."
132
+ puts
133
+ any_key_to_continue(10)
134
+
135
+ puts "If the browser does not open, try visiting this URL manually:"
136
+ puts "#{uri.to_s}"
137
+ puts
138
+
139
+ server_thread = Thread.new { Thread.main['response'] = web_server.serve_one }
140
+ Kontena::Cli::BrowserLauncher.open(uri.to_s)
141
+
142
+ spinner "Waiting for browser authorization response" do
143
+ server_thread.join
144
+ end
145
+
146
+ update_token(Thread.main['response'])
147
+ end
148
+
149
+ def update_userinfo
150
+ uri = URI.parse(kontena_account.userinfo_endpoint)
151
+ path = uri.path
152
+ uri.path = '/'
153
+
154
+ response = Kontena::Client.new(uri.to_s, kontena_account.token).get(path)
155
+ if response.kind_of?(Hash) && response['data'] && response['data']['attributes']
156
+ kontena_account.username = response['data']['attributes']['username']
157
+ elsif response && response['error']
158
+ exit_with_error response['error']
159
+ else
160
+ exit_with_error "Userinfo request failed"
161
+ end
162
+ end
163
+
164
+ def use_authorization_code(code)
165
+ response = vspinner "Exchanging authorization code to access token" do
166
+ Kontena::Client.new(kontena_account.token_endpoint, kontena_account.token).exchange_code(code)
167
+ end
168
+ update_token(response)
169
+ end
170
+
171
+ def update_token(response)
172
+ if !response.kind_of?(Hash)
173
+ raise TypeError, "Invalid authentication response, expected Hash, got #{response.class}"
174
+ elsif response['error']
175
+ exit_with_error "Authentication failed: #{response['error']}"
176
+ elsif response['code']
177
+ use_authorization_code(response['code'])
178
+ else
179
+ kontena_account.token.access_token = response['access_token']
180
+ kontena_account.token.refresh_token = response['refresh_token']
181
+ kontena_account.token.expires_at = response['expires_at']
182
+ true
183
+ end
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,14 @@
1
+ module Kontena::Cli::Cloud
2
+ class LogoutCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+
5
+ def execute
6
+ config.accounts.each do |account|
7
+ use_refresh_token(account)
8
+ account.token = nil
9
+ end
10
+ config.write
11
+ puts pastel.green("You have been logged out of Kontena Cloud")
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,156 @@
1
+ module Kontena::Cli::Cloud::Master
2
+ class AddCommand < Kontena::Command
3
+
4
+ include Kontena::Cli::Common
5
+
6
+ callback_matcher 'cloud-master', 'create'
7
+
8
+ requires_current_account_token
9
+
10
+ parameter "[NAME]", "Master name"
11
+
12
+ option ['--redirect-uri'], '[URL]', 'Set master redirect URL'
13
+ option ['--url'], '[URL]', 'Set master URL'
14
+ option ['--provider'], '[NAME]', 'Set master provider'
15
+ option ['--name'], '[NAME]', 'Set master name', hidden: true
16
+ option ['--version'], '[VERSION]', 'Set master version', hidden: true
17
+ option ['--owner'], '[NAME]', 'Set master owner', hidden: true
18
+
19
+ option ['--id'], :flag, 'Just output the ID'
20
+ option ['--return'], :flag, 'Return the ID', hidden: true
21
+ option ['--force'], :flag, "Don't ask questions"
22
+
23
+ option ['--cloud-master-id'], '[ID]', "Use existing cloud master ID", hidden: true
24
+ option ['--current'], :flag, 'Register and configure current master', hidden: true
25
+
26
+ def register(name, url = nil, provider = nil, redirect_uri = nil, version = nil, owner = nil)
27
+ attributes = {}
28
+ attributes['name'] = name
29
+ attributes['url'] = url if url
30
+ attributes['provider'] = provider if provider
31
+ attributes['redirect-uri'] = redirect_uri if redirect_uri
32
+ attributes['version'] = version if version
33
+ attributes['owner'] = owner if owner
34
+
35
+ response = cloud_client.post('user/masters', { data: { attributes: attributes } })
36
+ exit_with_error "Failed (invalid response)" unless response.kind_of?(Hash)
37
+ exit_with_error "Failed: #{response['error']}" if response['error']
38
+ exit_with_error "Failed (no data)" unless response['data']
39
+ response
40
+ end
41
+
42
+ def get_existing(id)
43
+ cloud_client.get("user/masters/#{id}")
44
+ end
45
+
46
+ def cloud_masters
47
+ masters = []
48
+ spinner "Retrieving a list of your registered Kontena Masters in Kontena Cloud" do |spin|
49
+ begin
50
+ masters = Kontena.run!(%w(cloud master list --return --quiet))
51
+ rescue SystemExit
52
+ spin.fail
53
+ end
54
+ end
55
+ masters
56
+ end
57
+
58
+ def new_cloud_master_name(master_name)
59
+ masters = cloud_masters
60
+ return master_name if masters.empty?
61
+
62
+ existing_master = masters.find { |m| m['attributes']['name'] == master_name }
63
+ return master_name unless existing_master
64
+
65
+ new_name = "#{master_name}-2"
66
+ new_name.succ! until masters.find { |m| m['attributes']['name'] == new_name }.nil?
67
+ new_name
68
+ end
69
+
70
+ def register_current
71
+ require_api_url
72
+ require_token
73
+
74
+ unless self.force?
75
+ puts "Proceeding will:"
76
+ puts " * Register the Kontena Master #{current_master.name} to Kontena Cloud"
77
+ puts " * Configure the Kontena Master to use Kontena Cloud as the"
78
+ puts " authentication provider"
79
+ puts
80
+ puts "After this:"
81
+ puts " * Users will not be able to reauthenticate without authorizing the"
82
+ puts " Master to access their Kontena Cloud user information"
83
+ puts " * Users that have registered a different email address to Kontena"
84
+ puts " Cloud than the one they currently have as their username in the"
85
+ puts " master will not be able to authenticate before an administrator"
86
+ puts " of the Kontena Master creates an invitation code for them"
87
+ puts " (kontena master user invite old@email.example.com)"
88
+ exit_with_error "Aborted" unless prompt.yes?("Proceed?")
89
+ end
90
+
91
+ new_name = new_cloud_master_name(current_master.name)
92
+
93
+ if self.cloud_master_id
94
+ response = spinner "Retrieving Master information from Kontena Cloud using id" do
95
+ get_existing(self.cloud_master_id)
96
+ end
97
+ if response && response.kind_of?(Hash) && response.has_key?('data') && response['data']['attributes']
98
+ if (self.provider && response['data']['attributes']['provider'] != self.provider) || (self.version && response['data']['attributes']['version'] != self.version)
99
+ spinner "Updating provider and version attributes to Kontena Cloud master" do |spin|
100
+ args = []
101
+ args += ['--provider', self.provider] if self.provider
102
+ args += ['--version', self.version] if self.version
103
+ args << self.cloud_master_id
104
+ spin.fail! unless Kontena.run(['cloud', 'master', 'update'] + args)
105
+ end
106
+ end
107
+ end
108
+ else
109
+ response = spinner "Registering current Kontena Master '#{current_master.name}' #{" as '#{new_name}' " unless new_name == current_master.name}to Kontena Cloud" do
110
+ register(new_name, current_master.url, self.provider, current_master.url.gsub(/\/$/, '') + "/cb", self.version)
111
+ end
112
+ end
113
+
114
+ spinner "Loading Kontena Cloud auth provider base configuration to Kontena Master" do |spin|
115
+ spin.fail! unless Kontena.run(%w(master config import --force --preset kontena_auth_provider))
116
+ end
117
+
118
+ spinner "Updating OAuth2 client-id and client-secret to Kontena Master" do |spin|
119
+ spin.fail! unless Kontena.run(
120
+ [
121
+ 'master', 'config', 'set',
122
+ "oauth2.client_id=#{response['data']['attributes']['client-id'].shellescape}",
123
+ "oauth2.client_secret=#{response['data']['attributes']['client-secret'].shellescape}",
124
+ "server.root_url=#{current_master.url.shellescape}",
125
+ "server.name=#{current_master.name.shellescape}",
126
+ "cloud.provider_is_kontena=true"
127
+ ]
128
+ )
129
+ end
130
+ end
131
+
132
+ def execute
133
+ unless cloud_client.authentication_ok?(kontena_account.userinfo_endpoint)
134
+ Kontena.run!(%w(cloud login))
135
+ config.reset_instance
136
+ reset_cloud_client
137
+ end
138
+
139
+ return register_current if self.current?
140
+
141
+ exit_with_error 'Master name is required' unless self.name
142
+
143
+ response = register(self.name, self.url, self.provider, self.redirect_uri, self.version, self.owner)
144
+ if self.return?
145
+ return response['data']['id']
146
+ elsif self.id?
147
+ puts response['data']['id']
148
+ else
149
+ puts pastel.green("Registered master.")
150
+ puts "ID: #{response['data']['id']}"
151
+ puts "Client ID: #{response['data']['attributes']['client-id']}"
152
+ puts "Client Secret: #{response['data']['attributes']['client-secret']}"
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,35 @@
1
+ module Kontena::Cli::Cloud::Master
2
+ class ListCommand < Kontena::Command
3
+
4
+ include Kontena::Cli::Common
5
+ include Kontena::Cli::TableGenerator::Helper
6
+
7
+ callback_matcher 'cloud-master', 'list'
8
+
9
+ option '--return', :flag, 'Return the list', hidden: true
10
+
11
+ requires_current_account_token
12
+
13
+ def fields
14
+ quiet? ? ['id'] : %w(id name owner url connected)
15
+ end
16
+
17
+ def execute
18
+ response = spin_if(!quiet?, "Retrieving Master list from Kontena Cloud") do
19
+ cloud_client.get('user/masters')
20
+ end
21
+
22
+ unless response && response.kind_of?(Hash) && response['data'].kind_of?(Array)
23
+ abort pastel.red("Listing masters failed")
24
+ end
25
+
26
+ return Array(response['data']) if self.return?
27
+
28
+ print_table(response['data']) do |row|
29
+ row.merge!(row['attributes'])
30
+ row['connected'] = !!row['connected'] ? pastel.green('yes') : pastel.red('no')
31
+ end
32
+ end
33
+ end
34
+ end
35
+
@@ -0,0 +1,68 @@
1
+ module Kontena::Cli::Cloud::Master
2
+ class RemoveCommand < Kontena::Command
3
+
4
+ include Kontena::Cli::Common
5
+
6
+ callback_matcher 'cloud-master', 'delete'
7
+
8
+ requires_current_account_token
9
+
10
+ parameter "[MASTER_ID]", "Master ID"
11
+
12
+ option ['-f', '--force'], :flag, "Don't ask for confirmation"
13
+
14
+ def delete_server(id)
15
+ spinner "Deleting server #{id} from Kontena Cloud" do |spin|
16
+ begin
17
+ cloud_client.delete("user/masters/#{id}")
18
+ rescue
19
+ spin.fail
20
+ end
21
+ end
22
+ end
23
+
24
+ def run_interactive
25
+ response = nil
26
+ spinner "Retrieving a list of registered masters on Kontena Cloud" do
27
+ response = cloud_client.get('user/masters')
28
+ unless response && response.kind_of?(Hash) && response['data'].kind_of?(Array)
29
+ abort pastel.red('Listing masters failed')
30
+ end
31
+ end
32
+
33
+ if response['data'].empty?
34
+ puts "No registered masters"
35
+ return
36
+ end
37
+
38
+ servers_to_delete = prompt.multi_select("Select registered master(s) to delete:") do |menu|
39
+ response['data'].each do |server|
40
+ menu.choice "#{server['attributes']['name']} (#{server['attributes']['url'] || "?"})", server['id']
41
+ end
42
+ end
43
+
44
+ if servers_to_delete.empty?
45
+ puts "No masters selected"
46
+ else
47
+ puts "About to delete servers from Kontena Cloud:"
48
+ servers_to_delete.each do |id|
49
+ puts " * #{id}"
50
+ end
51
+ confirm unless self.force?
52
+ servers_to_delete.each do |id|
53
+ delete_server(id)
54
+ end
55
+ end
56
+ end
57
+
58
+ def execute
59
+ if self.master_id.nil?
60
+ run_interactive
61
+ else
62
+ confirm unless self.force?
63
+ delete_server(self.master_id)
64
+ end
65
+ exit 0
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,21 @@
1
+ module Kontena::Cli::Cloud::Master
2
+ class ShowCommand < Kontena::Command
3
+
4
+ include Kontena::Cli::Common
5
+
6
+ callback_matcher 'cloud-master', 'show'
7
+
8
+ requires_current_account_token
9
+
10
+ parameter "MASTER_ID", "Master ID"
11
+
12
+ def execute
13
+ response = cloud_client.get("user/masters/#{master_id}")
14
+ response['data']['attributes']['id'] = response['data']['id']
15
+ response['data']['attributes'].each do |key, value|
16
+ puts "%20.20s : %s" % [key, value]
17
+ end
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,52 @@
1
+ module Kontena::Cli::Cloud::Master
2
+ class UpdateCommand < Kontena::Command
3
+
4
+ include Kontena::Cli::Common
5
+
6
+ callback_matcher 'cloud-master', 'update'
7
+
8
+ requires_current_account_token
9
+
10
+ parameter "MASTER_ID", "Master ID"
11
+
12
+ option ['--redirect-uri'], '[URL]', 'Set master redirect URL'
13
+ option ['--url'], '[URL]', 'Set master URL'
14
+ option ['--provider'], '[NAME]', 'Set master provider'
15
+ option ['--name'], '[NAME]', 'Set master name', hidden: true
16
+ option ['--version'], '[VERSION]', 'Set master version', hidden: true
17
+ option ['--owner'], '[NAME]', 'Set master owner', hidden: true
18
+
19
+ def get_attributes
20
+ cloud_client.get("user/masters/#{self.master_id}")["data"]["attributes"]
21
+ rescue
22
+ nil
23
+ end
24
+
25
+ def execute
26
+ attrs = get_attributes
27
+ unless attrs
28
+ puts pastel.red("Failed to obtain master credentials")
29
+ exit 1
30
+ end
31
+
32
+ attrs["name"] = self.name if self.name
33
+ attrs["redirect-uri"] = self.redirect_uri if self.redirect_uri
34
+ attrs["url"] = self.url if self.url
35
+ attrs["provider"] = self.provider if self.provider
36
+ attrs["version"] = self.version if self.version
37
+ attrs["owner"] = self.owner if self.owner
38
+
39
+ response = cloud_client.put(
40
+ "user/masters/#{master_id}",
41
+ { data: { attributes: attrs.reject{ |k, _| ['client-id', 'client-secret'].include?(k) } } }
42
+ )
43
+
44
+ if response
45
+ puts "Master settings updated"
46
+ else
47
+ puts "Request failed"
48
+ exit 1
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,14 @@
1
+ module Kontena::Cli::Cloud
2
+ class MasterCommand < Kontena::Command
3
+ include Kontena::Cli::Common
4
+
5
+ subcommand ['list', 'ls'], "List masters in Kontena Cloud", load_subcommand('cloud/master/list_command')
6
+ subcommand "add", "Register a master in Kontena Cloud", load_subcommand('cloud/master/add_command')
7
+ subcommand ['remove', 'rm'], "Remove a master registration from Kontena Cloud", load_subcommand('cloud/master/remove_command')
8
+ subcommand "show", "Show master settings in Kontena Cloud", load_subcommand('cloud/master/show_command')
9
+ subcommand "update", "Update master settings in Kontena Cloud", load_subcommand('cloud/master/update_command')
10
+
11
+ def execute
12
+ end
13
+ end
14
+ end