kuroko2 0.2.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 (338) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +15 -0
  4. data/Rakefile +26 -0
  5. data/app/assets/images/kuroko2/avatar.png +0 -0
  6. data/app/assets/images/kuroko2/kuroko-logo-horizontal.png +0 -0
  7. data/app/assets/javascripts/kuroko2/application.js +28 -0
  8. data/app/assets/javascripts/kuroko2/bootstrap.js +2363 -0
  9. data/app/assets/javascripts/kuroko2/definition_linker.js +20 -0
  10. data/app/assets/javascripts/kuroko2/instance_linker.js +10 -0
  11. data/app/assets/javascripts/kuroko2/job_definition_stats.js +67 -0
  12. data/app/assets/javascripts/kuroko2/job_definitions.js +79 -0
  13. data/app/assets/javascripts/kuroko2/job_instances.js +88 -0
  14. data/app/assets/javascripts/kuroko2/job_timelines.js.coffee +24 -0
  15. data/app/assets/javascripts/kuroko2/narrow_job_definitions.js +30 -0
  16. data/app/assets/stylesheets/kuroko2/admin-lte.css +3402 -0
  17. data/app/assets/stylesheets/kuroko2/application.scss +86 -0
  18. data/app/assets/stylesheets/kuroko2/bootstrap.css +6799 -0
  19. data/app/assets/stylesheets/kuroko2/fonts.scss +1 -0
  20. data/app/assets/stylesheets/kuroko2/job_definitions.scss +19 -0
  21. data/app/assets/stylesheets/kuroko2/users.scss +7 -0
  22. data/app/controllers/kuroko2/api/application_controller.rb +49 -0
  23. data/app/controllers/kuroko2/api/job_instances_controller.rb +46 -0
  24. data/app/controllers/kuroko2/api/stats_controller.rb +28 -0
  25. data/app/controllers/kuroko2/application_controller.rb +43 -0
  26. data/app/controllers/kuroko2/dashboard_controller.rb +27 -0
  27. data/app/controllers/kuroko2/execution_logs_controller.rb +19 -0
  28. data/app/controllers/kuroko2/executions_controller.rb +28 -0
  29. data/app/controllers/kuroko2/job_definition_stats_controller.rb +54 -0
  30. data/app/controllers/kuroko2/job_definitions_controller.rb +100 -0
  31. data/app/controllers/kuroko2/job_instances_controller.rb +87 -0
  32. data/app/controllers/kuroko2/job_schedules_controller.rb +39 -0
  33. data/app/controllers/kuroko2/job_suspend_schedules_controller.rb +38 -0
  34. data/app/controllers/kuroko2/job_timelines_controller.rb +56 -0
  35. data/app/controllers/kuroko2/logs_controller.rb +15 -0
  36. data/app/controllers/kuroko2/sessions_controller.rb +32 -0
  37. data/app/controllers/kuroko2/stars_controller.rb +30 -0
  38. data/app/controllers/kuroko2/tokens_controller.rb +47 -0
  39. data/app/controllers/kuroko2/users_controller.rb +62 -0
  40. data/app/controllers/kuroko2/workers_controller.rb +5 -0
  41. data/app/errors/http/bad_request.rb +4 -0
  42. data/app/errors/http/forbidden.rb +4 -0
  43. data/app/errors/http/unauthorized.rb +4 -0
  44. data/app/helpers/kuroko2/application_helper.rb +8 -0
  45. data/app/helpers/kuroko2/dashboard_helper.rb +4 -0
  46. data/app/helpers/kuroko2/executions_helper.rb +4 -0
  47. data/app/helpers/kuroko2/job_definitions_helper.rb +38 -0
  48. data/app/helpers/kuroko2/job_instances_helper.rb +71 -0
  49. data/app/helpers/kuroko2/job_schedules_helper.rb +4 -0
  50. data/app/helpers/kuroko2/logs_helper.rb +4 -0
  51. data/app/helpers/kuroko2/sessions_helper.rb +4 -0
  52. data/app/helpers/kuroko2/stars_helper.rb +4 -0
  53. data/app/helpers/kuroko2/tokens_helper.rb +4 -0
  54. data/app/helpers/kuroko2/users_helper.rb +4 -0
  55. data/app/helpers/kuroko2/workers_helper.rb +4 -0
  56. data/app/jobs/kuroko2/application_job.rb +4 -0
  57. data/app/mailers/kuroko2/application_mailer.rb +6 -0
  58. data/app/mailers/kuroko2/notifications.rb +63 -0
  59. data/app/models/concerns/kuroko2/table_name_customizable.rb +16 -0
  60. data/app/models/kuroko2/admin_assignment.rb +6 -0
  61. data/app/models/kuroko2/api/application_resource.rb +10 -0
  62. data/app/models/kuroko2/api/job_instance_resource.rb +7 -0
  63. data/app/models/kuroko2/application_record.rb +5 -0
  64. data/app/models/kuroko2/execution.rb +55 -0
  65. data/app/models/kuroko2/job_definition.rb +147 -0
  66. data/app/models/kuroko2/job_definition_tag.rb +6 -0
  67. data/app/models/kuroko2/job_instance.rb +118 -0
  68. data/app/models/kuroko2/job_schedule.rb +93 -0
  69. data/app/models/kuroko2/job_suspend_schedule.rb +35 -0
  70. data/app/models/kuroko2/log.rb +3 -0
  71. data/app/models/kuroko2/memory_consumption_log.rb +49 -0
  72. data/app/models/kuroko2/memory_expectancy.rb +21 -0
  73. data/app/models/kuroko2/process_signal.rb +14 -0
  74. data/app/models/kuroko2/star.rb +6 -0
  75. data/app/models/kuroko2/tag.rb +8 -0
  76. data/app/models/kuroko2/tick.rb +12 -0
  77. data/app/models/kuroko2/token.rb +101 -0
  78. data/app/models/kuroko2/user.rb +48 -0
  79. data/app/models/kuroko2/worker.rb +12 -0
  80. data/app/views/kaminari/history/_paginator.html.slim +15 -0
  81. data/app/views/kaminari/list/_paginator.html.slim +17 -0
  82. data/app/views/kuroko2/dashboard/_taglist.html.slim +13 -0
  83. data/app/views/kuroko2/dashboard/index.html.slim +49 -0
  84. data/app/views/kuroko2/execution_logs/index.json.jbuilder +16 -0
  85. data/app/views/kuroko2/executions/index.html.slim +35 -0
  86. data/app/views/kuroko2/job_definition_stats/execution_time.json.jbuilder +13 -0
  87. data/app/views/kuroko2/job_definition_stats/index.html.slim +48 -0
  88. data/app/views/kuroko2/job_definition_stats/memory.json.jbuilder +10 -0
  89. data/app/views/kuroko2/job_definitions/_alert.html.slim +7 -0
  90. data/app/views/kuroko2/job_definitions/_form.html.slim +93 -0
  91. data/app/views/kuroko2/job_definitions/_list.html.slim +26 -0
  92. data/app/views/kuroko2/job_definitions/_search_results.html.slim +51 -0
  93. data/app/views/kuroko2/job_definitions/_taglist.html.slim +13 -0
  94. data/app/views/kuroko2/job_definitions/edit.html.slim +15 -0
  95. data/app/views/kuroko2/job_definitions/index.html.slim +11 -0
  96. data/app/views/kuroko2/job_definitions/new.html.slim +12 -0
  97. data/app/views/kuroko2/job_definitions/show.html.slim +90 -0
  98. data/app/views/kuroko2/job_instances/_instance.html.slim +42 -0
  99. data/app/views/kuroko2/job_instances/index.html.slim +58 -0
  100. data/app/views/kuroko2/job_instances/show.html.slim +19 -0
  101. data/app/views/kuroko2/job_instances/working.html.slim +37 -0
  102. data/app/views/kuroko2/job_schedules/index.html.slim +32 -0
  103. data/app/views/kuroko2/job_suspend_schedules/index.html.slim +27 -0
  104. data/app/views/kuroko2/job_timelines/dataset.json.jbuilder +11 -0
  105. data/app/views/kuroko2/job_timelines/index.html.slim +31 -0
  106. data/app/views/kuroko2/kaminari/history/_paginator.html.slim +15 -0
  107. data/app/views/kuroko2/kaminari/list/_paginator.html.slim +17 -0
  108. data/app/views/kuroko2/layouts/application.html.slim +68 -0
  109. data/app/views/kuroko2/logs/index.html.slim +33 -0
  110. data/app/views/kuroko2/notifications/executor_not_assigned.text.erb +22 -0
  111. data/app/views/kuroko2/notifications/job_failure.html.slim +21 -0
  112. data/app/views/kuroko2/notifications/job_failure.text.erb +18 -0
  113. data/app/views/kuroko2/notifications/notify_long_elapsed_time.text.erb +9 -0
  114. data/app/views/kuroko2/notifications/process_absence.text.erb +22 -0
  115. data/app/views/kuroko2/notifications/remind_failure.html.slim +21 -0
  116. data/app/views/kuroko2/notifications/remind_failure.text.erb +10 -0
  117. data/app/views/kuroko2/sessions/new.html.slim +20 -0
  118. data/app/views/kuroko2/tokens/index.html.slim +42 -0
  119. data/app/views/kuroko2/users/index.html.slim +55 -0
  120. data/app/views/kuroko2/users/show.html.slim +76 -0
  121. data/app/views/kuroko2/workers/index.html.slim +40 -0
  122. data/app/views/layouts/kuroko2/application.html.slim +72 -0
  123. data/app/views/layouts/mailer.html.erb +13 -0
  124. data/app/views/layouts/mailer.text.erb +1 -0
  125. data/bin/cleanup_old_instances.rb +9 -0
  126. data/bin/remind_failure.rb +5 -0
  127. data/config/initializers/000_kuroko2.rb +16 -0
  128. data/config/initializers/assets.rb +9 -0
  129. data/config/initializers/garage.rb +2 -0
  130. data/config/initializers/kaminari_config.rb +3 -0
  131. data/config/initializers/omniauth.rb +5 -0
  132. data/config/locales/en.yml +28 -0
  133. data/config/routes.rb +54 -0
  134. data/db/migrate/001_create_job_definitions.rb +22 -0
  135. data/db/migrate/002_create_job_instances.rb +17 -0
  136. data/db/migrate/003_create_job_schedules.rb +14 -0
  137. data/db/migrate/004_create_ticks.rb +7 -0
  138. data/db/migrate/005_create_logs.rb +13 -0
  139. data/db/migrate/006_create_tokens.rb +21 -0
  140. data/db/migrate/007_create_executions.rb +26 -0
  141. data/db/migrate/008_create_process_signals.rb +15 -0
  142. data/db/migrate/009_create_users.rb +20 -0
  143. data/db/migrate/010_create_admin_assignments.rb +12 -0
  144. data/db/migrate/011_create_stars.rb +12 -0
  145. data/db/migrate/012_create_workers.rb +15 -0
  146. data/db/migrate/018_create_job_definition_tags.rb +13 -0
  147. data/db/migrate/019_create_tags.rb +11 -0
  148. data/db/migrate/021_create_memory_expectancies.rb +17 -0
  149. data/db/migrate/025_create_job_suspend_schedules.rb +12 -0
  150. data/lib/kuroko2/command/executor.rb +62 -0
  151. data/lib/kuroko2/command/kill.rb +24 -0
  152. data/lib/kuroko2/command/monitor.rb +109 -0
  153. data/lib/kuroko2/command/shell.rb +163 -0
  154. data/lib/kuroko2/configuration.rb +19 -0
  155. data/lib/kuroko2/engine.rb +59 -0
  156. data/lib/kuroko2/execution_logger/cloud_watch_logs.rb +92 -0
  157. data/lib/kuroko2/execution_logger/void.rb +13 -0
  158. data/lib/kuroko2/execution_logger.rb +20 -0
  159. data/lib/kuroko2/memory_sampler.rb +50 -0
  160. data/lib/kuroko2/return_to_validator.rb +14 -0
  161. data/lib/kuroko2/servers/base.rb +30 -0
  162. data/lib/kuroko2/servers/command_executor.rb +27 -0
  163. data/lib/kuroko2/servers/job_scheduler.rb +25 -0
  164. data/lib/kuroko2/servers/workflow_processor.rb +25 -0
  165. data/lib/kuroko2/util/logger.rb +19 -0
  166. data/lib/kuroko2/util/rails_logger_formatter.rb +9 -0
  167. data/lib/kuroko2/version.rb +3 -0
  168. data/lib/kuroko2/workflow/assertion_error.rb +6 -0
  169. data/lib/kuroko2/workflow/engine.rb +141 -0
  170. data/lib/kuroko2/workflow/engine_error.rb +6 -0
  171. data/lib/kuroko2/workflow/node.rb +124 -0
  172. data/lib/kuroko2/workflow/notifier/concerns/chat_message_builder.rb +39 -0
  173. data/lib/kuroko2/workflow/notifier/hipchat.rb +88 -0
  174. data/lib/kuroko2/workflow/notifier/mail.rb +44 -0
  175. data/lib/kuroko2/workflow/notifier/slack.rb +121 -0
  176. data/lib/kuroko2/workflow/notifier.rb +31 -0
  177. data/lib/kuroko2/workflow/processor.rb +40 -0
  178. data/lib/kuroko2/workflow/scheduler.rb +42 -0
  179. data/lib/kuroko2/workflow/script_parser.rb +66 -0
  180. data/lib/kuroko2/workflow/shell_scanner.rb +34 -0
  181. data/lib/kuroko2/workflow/syntax_error.rb +6 -0
  182. data/lib/kuroko2/workflow/task/auto_skip_error.rb +20 -0
  183. data/lib/kuroko2/workflow/task/base.rb +32 -0
  184. data/lib/kuroko2/workflow/task/env.rb +45 -0
  185. data/lib/kuroko2/workflow/task/execute.rb +128 -0
  186. data/lib/kuroko2/workflow/task/expected_time.rb +9 -0
  187. data/lib/kuroko2/workflow/task/fork.rb +45 -0
  188. data/lib/kuroko2/workflow/task/kuroko_runner.rb +24 -0
  189. data/lib/kuroko2/workflow/task/noop.rb +13 -0
  190. data/lib/kuroko2/workflow/task/queue.rb +27 -0
  191. data/lib/kuroko2/workflow/task/rails_env.rb +24 -0
  192. data/lib/kuroko2/workflow/task/sequence.rb +13 -0
  193. data/lib/kuroko2/workflow/task/sleep.rb +29 -0
  194. data/lib/kuroko2/workflow/task/sub_process.rb +53 -0
  195. data/lib/kuroko2/workflow/task/time_base.rb +44 -0
  196. data/lib/kuroko2/workflow/task/timeout.rb +9 -0
  197. data/lib/kuroko2/workflow/task/wait.rb +143 -0
  198. data/lib/kuroko2.rb +26 -0
  199. data/lib/tasks/kuroko2_tasks.rake +4 -0
  200. data/spec/command/kill_spec.rb +20 -0
  201. data/spec/command/monitor_spec.rb +68 -0
  202. data/spec/command/shell_spec.rb +87 -0
  203. data/spec/controllers/dashboard_controller_spec.rb +5 -0
  204. data/spec/controllers/executions_controller_spec.rb +23 -0
  205. data/spec/controllers/job_definition_stats_controller_spec.rb +95 -0
  206. data/spec/controllers/job_definitions_controller_spec.rb +89 -0
  207. data/spec/controllers/job_instances_controller_spec.rb +62 -0
  208. data/spec/controllers/job_schedules_controller_spec.rb +39 -0
  209. data/spec/controllers/job_suspend_schedules_controller_spec.rb +39 -0
  210. data/spec/controllers/job_timelines_controller_spec.rb +114 -0
  211. data/spec/controllers/logs_controller_spec.rb +5 -0
  212. data/spec/controllers/sessions_controller_spec.rb +58 -0
  213. data/spec/controllers/stars_controller_spec.rb +28 -0
  214. data/spec/controllers/tokens_controller_spec.rb +5 -0
  215. data/spec/controllers/users_controller_spec.rb +51 -0
  216. data/spec/controllers/workers_controller_spec.rb +5 -0
  217. data/spec/dummy/Rakefile +6 -0
  218. data/spec/dummy/app/assets/config/manifest.js +5 -0
  219. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  220. data/spec/dummy/app/assets/javascripts/cable.js +13 -0
  221. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  222. data/spec/dummy/app/channels/application_cable/channel.rb +4 -0
  223. data/spec/dummy/app/channels/application_cable/connection.rb +4 -0
  224. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  225. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  226. data/spec/dummy/app/jobs/application_job.rb +2 -0
  227. data/spec/dummy/app/mailers/application_mailer.rb +4 -0
  228. data/spec/dummy/app/models/application_record.rb +3 -0
  229. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  230. data/spec/dummy/app/views/layouts/mailer.html.erb +13 -0
  231. data/spec/dummy/app/views/layouts/mailer.text.erb +1 -0
  232. data/spec/dummy/bin/bundle +3 -0
  233. data/spec/dummy/bin/rails +4 -0
  234. data/spec/dummy/bin/rake +4 -0
  235. data/spec/dummy/bin/setup +34 -0
  236. data/spec/dummy/bin/update +29 -0
  237. data/spec/dummy/config/application.rb +25 -0
  238. data/spec/dummy/config/boot.rb +3 -0
  239. data/spec/dummy/config/cable.yml +9 -0
  240. data/spec/dummy/config/database.yml +29 -0
  241. data/spec/dummy/config/environment.rb +5 -0
  242. data/spec/dummy/config/environments/development.rb +54 -0
  243. data/spec/dummy/config/environments/production.rb +86 -0
  244. data/spec/dummy/config/environments/test.rb +42 -0
  245. data/spec/dummy/config/initializers/application_controller_renderer.rb +6 -0
  246. data/spec/dummy/config/initializers/assets.rb +11 -0
  247. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  248. data/spec/dummy/config/initializers/cookies_serializer.rb +5 -0
  249. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  250. data/spec/dummy/config/initializers/inflections.rb +16 -0
  251. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  252. data/spec/dummy/config/initializers/new_framework_defaults.rb +23 -0
  253. data/spec/dummy/config/initializers/session_store.rb +3 -0
  254. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  255. data/spec/dummy/config/kuroko2.yml +35 -0
  256. data/spec/dummy/config/locales/en.yml +23 -0
  257. data/spec/dummy/config/puma.rb +47 -0
  258. data/spec/dummy/config/routes.rb +3 -0
  259. data/spec/dummy/config/secrets.yml +22 -0
  260. data/spec/dummy/config/spring.rb +6 -0
  261. data/spec/dummy/config.ru +5 -0
  262. data/spec/dummy/db/schema.rb +217 -0
  263. data/spec/dummy/lib/dummy_extention.rb +14 -0
  264. data/spec/dummy/lib/kuroko2/workflow/task/custom_task1.rb +13 -0
  265. data/spec/dummy/public/404.html +67 -0
  266. data/spec/dummy/public/422.html +67 -0
  267. data/spec/dummy/public/500.html +66 -0
  268. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  269. data/spec/dummy/public/apple-touch-icon.png +0 -0
  270. data/spec/dummy/public/favicon.ico +0 -0
  271. data/spec/execution_logger/cloud_watch_logs_spec.rb +95 -0
  272. data/spec/factories/execution_factory.rb +13 -0
  273. data/spec/factories/job_definition_factory.rb +21 -0
  274. data/spec/factories/job_instance_factory.rb +4 -0
  275. data/spec/factories/job_schedule_factory.rb +10 -0
  276. data/spec/factories/job_suspend_schedule_factory.rb +8 -0
  277. data/spec/factories/memory_expectancy_factory.rb +5 -0
  278. data/spec/factories/process_signal_factory.rb +4 -0
  279. data/spec/factories/star_factory.rb +4 -0
  280. data/spec/factories/tick_factory.rb +4 -0
  281. data/spec/factories/token_factory.rb +10 -0
  282. data/spec/factories/user_factory.rb +11 -0
  283. data/spec/factories/worker_factory.rb +8 -0
  284. data/spec/features/dashborad_spec.rb +82 -0
  285. data/spec/features/job_definition_spec.rb +74 -0
  286. data/spec/features/job_instance_spec.rb +94 -0
  287. data/spec/features/sign_in_and_out_spec.rb +17 -0
  288. data/spec/features/users_spec.rb +90 -0
  289. data/spec/features/workers_spec.rb +44 -0
  290. data/spec/helpers/executions_helper_spec.rb +4 -0
  291. data/spec/helpers/job_definition_helper_spec.rb +42 -0
  292. data/spec/helpers/job_schedules_helper_spec.rb +4 -0
  293. data/spec/helpers/logs_helper_spec.rb +4 -0
  294. data/spec/helpers/tokens_helper_spec.rb +4 -0
  295. data/spec/helpers/users_helper_spec.rb +4 -0
  296. data/spec/helpers/workers_helper_spec.rb +4 -0
  297. data/spec/mailers/notifications_spec.rb +54 -0
  298. data/spec/memory_sampler_spec.rb +11 -0
  299. data/spec/models/admin_assignment_spec.rb +4 -0
  300. data/spec/models/execution_spec.rb +26 -0
  301. data/spec/models/job_definition_spec.rb +163 -0
  302. data/spec/models/job_instance_spec.rb +115 -0
  303. data/spec/models/job_schedule_spec.rb +121 -0
  304. data/spec/models/job_suspend_schedule_spec.rb +32 -0
  305. data/spec/models/memory_consumption_log_spec.rb +50 -0
  306. data/spec/models/memory_expectancy_spec.rb +26 -0
  307. data/spec/models/star_spec.rb +4 -0
  308. data/spec/models/tick_spec.rb +23 -0
  309. data/spec/models/token_spec.rb +54 -0
  310. data/spec/models/user_spec.rb +17 -0
  311. data/spec/models/worker_spec.rb +5 -0
  312. data/spec/rails_helper.rb +81 -0
  313. data/spec/requests/api/job_instances_spec.rb +96 -0
  314. data/spec/requests/api/stats_spec.rb +45 -0
  315. data/spec/return_to_validator_spec.rb +28 -0
  316. data/spec/settings_spec.rb +10 -0
  317. data/spec/spec_helper.rb +49 -0
  318. data/spec/support/feature_sign_in_helper.rb +31 -0
  319. data/spec/support/sign_in_helper.rb +5 -0
  320. data/spec/support/wait_for_ajax.rb +11 -0
  321. data/spec/workflow/engine_spec.rb +241 -0
  322. data/spec/workflow/node_spec.rb +62 -0
  323. data/spec/workflow/notifier/hipchat_spec.rb +117 -0
  324. data/spec/workflow/notifier/mail_spec.rb +86 -0
  325. data/spec/workflow/notifier/slack_spec.rb +110 -0
  326. data/spec/workflow/script_parser_spec.rb +119 -0
  327. data/spec/workflow/shell_scanner_spec.rb +47 -0
  328. data/spec/workflow/task/auto_skip_error_spec.rb +35 -0
  329. data/spec/workflow/task/env_spec.rb +47 -0
  330. data/spec/workflow/task/execute_spec.rb +127 -0
  331. data/spec/workflow/task/expected_time_spec.rb +52 -0
  332. data/spec/workflow/task/fork_spec.rb +30 -0
  333. data/spec/workflow/task/queue_spec.rb +45 -0
  334. data/spec/workflow/task/rails_env_spec.rb +30 -0
  335. data/spec/workflow/task/sleep_spec.rb +22 -0
  336. data/spec/workflow/task/sub_process_spec.rb +32 -0
  337. data/spec/workflow/task/wait_spec.rb +162 -0
  338. metadata +1038 -0
@@ -0,0 +1,40 @@
1
+ - @title = 'Kuroko Workers'
2
+ - @content_title = '<i class="fa fa-rocket"></i> Kuroko Workers'
3
+
4
+ .box#workers
5
+ .box-header
6
+ h3.box-title Kuroko Workers
7
+ .box-body.table-responsive
8
+ table.table.table-hover
9
+ tbody
10
+ tr
11
+ th.col-md-2 Hostname
12
+ th.col-md-1 WID
13
+ th.col-md-2 Queue
14
+ th.col-md-1 Status
15
+ th.col-md-5 Execution
16
+ th.col-md-1 &nbsp;
17
+ - for worker in @workers
18
+ tr
19
+ td= worker.hostname
20
+ td= worker.worker_id
21
+ td= worker.queue
22
+ td
23
+ - if worker.working
24
+ span.label.label-primary WORKING
25
+ - else
26
+ '&nbsp;
27
+ td
28
+ - if worker.execution
29
+ .log= worker.execution.shell
30
+ - elsif worker.execution_id?
31
+ span.text-danger Couldn't find Execution with 'id'=#{worker.execution_id}.
32
+ - else
33
+ '&nbsp;
34
+ td
35
+ - if worker.execution
36
+ = link_to(raw('<i class="fa fa-chevron-right"></i> Details'),
37
+ job_definition_job_instance_path(job_definition_id: worker.execution.job_definition_id, id: worker.execution.job_instance_id),
38
+ role: 'button', class: 'btn btn-sm btn-default')
39
+ - else
40
+ '&nbsp;
@@ -0,0 +1,72 @@
1
+ doctype html
2
+ html
3
+ head
4
+ title #{@title} « Kuroko 2
5
+ meta charset='UTF-8'
6
+ meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'
7
+ link rel='icon' href='/favicon.ico'
8
+ link type='application/opensearchdescription+xml' rel='search' href='#{osd_path(format: 'xml')}' title='Kuroko2'
9
+ = csrf_meta_tag
10
+ = stylesheet_link_tag 'kuroko2/application'
11
+ = javascript_include_tag 'kuroko2/application'
12
+
13
+ body.skin-black
14
+ header.header
15
+ = link_to 'Kuroko 2', root_path, class: 'logo'
16
+ nav.navbar.navbar-static-top role='navigation'
17
+ a.navbar-btn.sidebar-toggle data-toggle='offcanvas' role='button' href='#'
18
+ span.sr-only Toggle navigation
19
+ span.icon-bar
20
+ span.icon-bar
21
+ span.icon-bar
22
+ .navbar-right
23
+ ul.nav.navbar-nav
24
+ li.dropdown
25
+ = link_to raw('<i class="fa fa-sign-out"></i> Sign out'), sign_out_path, method: :delete
26
+ .wrapper.row-offcanvas.row-offcanvas-left
27
+ aside.left-side.sidebar-offcanvas
28
+ section.sidebar
29
+ .user-panel
30
+ .pull-left.image
31
+ img.img-circle src='#{current_user.image}' alt="#{current_user.name}"
32
+ .pull-left.info
33
+ p Hello, #{current_user.name}
34
+ ul.sidebar-menu
35
+ li class=('active' if controller_name == 'dashboard')
36
+ = link_to raw('<i class="fa fa-dashboard"></i> Dashboard'), root_path
37
+ li
38
+ a name="#"
39
+ i.fa.fa-database
40
+ 'Job Definitions
41
+ ul.menu-child
42
+ li.menu-child-item class=('active' if controller_name == 'job_definitions' && action_name == 'index')
43
+ = link_to raw('<i class="fa fa-angle-double-right"></i> All Job Definitions'), job_definitions_path
44
+ li.menu-child-item class=('active' if controller_name == 'job_definitions' && action_name == 'new')
45
+ = link_to raw('<i class="fa fa-angle-double-right"></i> Create New'), new_job_definition_path
46
+ li class=('active' if controller_name == 'job_instances' && action_name == 'working')
47
+ = link_to raw('<i class="fa fa-spinner"></i> Working Jobs'), working_job_instances_path
48
+ li class=('active' if controller_name == 'executions' && action_name == 'index')
49
+ = link_to executions_path do
50
+ i.fa.fa-tasks
51
+ |Executions
52
+ li class=('active' if controller_name == 'workers')
53
+ = link_to raw('<i class="fa fa-rocket"></i> Kuroko Workers'), workers_path
54
+ li
55
+ a name="#"
56
+ i.fa.fa-users
57
+ 'Users
58
+ ul.menu-child
59
+ li.menu-child-item class=('active' if controller_name == 'users' && action_name == 'index' && !params[:target])
60
+ = link_to raw('<i class="fa fa-angle-double-right"></i> All '), users_path
61
+ li.menu-child-item class=('active' if controller_name == 'users' && params[:target] == 'group')
62
+ = link_to raw('<i class="fa fa-angle-double-right"></i> Groups'), users_path(target: 'group')
63
+
64
+ aside.right-side
65
+ section.content-header
66
+ h1= raw(@content_title || @title)
67
+ = yield :breadcrumb
68
+ section.content
69
+ .container-fluid
70
+ .row
71
+ .col-xs-12
72
+ = yield
@@ -0,0 +1,13 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Kuroko2</title>
5
+ <%= stylesheet_link_tag "kuroko2/application", media: "all" %>
6
+ <%= javascript_include_tag "kuroko2/application" %>
7
+ </head>
8
+ <body>
9
+
10
+ <%= yield %>
11
+
12
+ </body>
13
+ </html>
@@ -0,0 +1 @@
1
+ <%= yield %>
@@ -0,0 +1,9 @@
1
+ old_instances = Kuroko2::JobInstance.where('finished_at < ?', 3.months.ago)
2
+
3
+ count = old_instances.count
4
+
5
+ Kuroko2::JobInstance.transaction do
6
+ old_instances.destroy_all
7
+ end
8
+
9
+ puts "Destroyed #{count} instances"
@@ -0,0 +1,5 @@
1
+ Kuroko2::JobInstance.working.where('error_at < ?', 1.days.ago).each do |instance|
2
+ Kuroko2::Notifications.remind_failure(instance).deliver_now
3
+
4
+ puts "Sent reminder mail to #{instance.job_definition.admins.map(&:name).join(' and ')}."
5
+ end
@@ -0,0 +1,16 @@
1
+ URI.parse(Kuroko2.config.url).tap do |url|
2
+ Kuroko2.config.url_host = url.host
3
+ Kuroko2.config.url_scheme = url.scheme
4
+ Kuroko2.config.url_port = url.port
5
+ end
6
+
7
+ Rails.application.config.action_mailer.default_url_options = {
8
+ host: Kuroko2.config.url_host,
9
+ protocol: Kuroko2.config.url_scheme,
10
+ port: Kuroko2.config.url_port
11
+ }
12
+
13
+ Rails.application.config.action_mailer.delivery_method =
14
+ Kuroko2.config.action_mailer.delivery_method.to_sym
15
+ Rails.application.config.action_mailer.smtp_settings =
16
+ Kuroko2.config.action_mailer.smtp_settings.to_h.symbolize_keys || {}
@@ -0,0 +1,9 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Version of your assets, change this if you want to expire all your assets.
4
+ Rails.application.config.assets.version = '1.0'
5
+
6
+ # Precompile additional assets.
7
+ # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
8
+ # Rails.application.config.assets.precompile += %w( search.js )
9
+ Rails.application.config.assets.precompile += %w( kuroko2/instance_linker.js timeline/* network/* )
@@ -0,0 +1,2 @@
1
+ Garage.configure {}
2
+ Garage.configuration.strategy = Garage::Strategy::NoAuthentication
@@ -0,0 +1,3 @@
1
+ Kaminari.configure do |config|
2
+ config.default_per_page = 10
3
+ end
@@ -0,0 +1,5 @@
1
+ require 'omniauth-google-oauth2'
2
+ Rails.application.config.middleware.use OmniAuth::Builder do
3
+ config = Kuroko2.config.app_authentication.google_oauth2
4
+ provider :google_oauth2, config.client_id, config.client_secret, config.options.to_h.symbolize_keys
5
+ end
@@ -0,0 +1,28 @@
1
+ # Files in the config/locales directory are used for internationalization
2
+ # and are automatically loaded by Rails. If you want to use locales other
3
+ # than English, add the necessary files in this directory.
4
+ #
5
+ # To use the locales, use `I18n.t`:
6
+ #
7
+ # I18n.t 'hello'
8
+ #
9
+ # In views, this is aliased to just `t`:
10
+ #
11
+ # <%= t('hello') %>
12
+ #
13
+ # To use a different locale, set it with `I18n.locale`:
14
+ #
15
+ # I18n.locale = :es
16
+ #
17
+ # This would use the information in config/locales/es.yml.
18
+ #
19
+ # To learn more, please read the Rails Internationalization guide
20
+ # available at http://guides.rubyonrails.org/i18n.html.
21
+
22
+ en:
23
+ model:
24
+ job_definition:
25
+ script_syntax: 'There are syntax errors on script: %{reason}'
26
+ validation_error: 'There are validation errors on script: %{reason}'
27
+ validate_number_of_admins: 'should be at least one person.'
28
+ confirm_active_instances: 'There are a working job instance.'
data/config/routes.rb ADDED
@@ -0,0 +1,54 @@
1
+ Kuroko2::Engine.routes.draw do
2
+ resources :job_definitions, path: 'definitions' do
3
+ get 'page/:page', action: :index, on: :collection, as: 'paged'
4
+ resources :stars, only: %w(create destroy)
5
+ resources :job_instances, path: 'instances', only: %w(index create show destroy) do
6
+ get 'naked', action: :show, on: :member, mode: :naked
7
+ get 'page/:page', action: :index, on: :collection, as: 'paged'
8
+ delete 'force_destroy', action: :force_destroy, on: :member
9
+ resources :tokens, only: %w(index update)
10
+ resources :executions, only: %w(destroy)
11
+ resources :logs, only: %w(index)
12
+ resources :execution_logs, only: %w(index)
13
+ end
14
+ resources :job_schedules, path: 'schedules', only: %w(index create destroy)
15
+ resources :job_suspend_schedules, path: 'suspend_schedules', only: %w(index create destroy)
16
+ resources :job_definition_stats, path: 'stats', only: %w(index) do
17
+ get :memory, action: :memory, on: :collection, defaults: { format: 'json' }
18
+ get :execution_time, action: :execution_time, on: :collection, defaults: { format: 'json' }
19
+ end
20
+ end
21
+ resources :users do
22
+ get 'page/:page', action: :index, on: :collection, as: 'paged'
23
+ end
24
+
25
+ resources :workers, only: :index
26
+ resources :job_instances, path: 'instances', only: %w() do
27
+ get :working, action: :working, on: :collection
28
+ end
29
+ resources :executions, only: %i(index)
30
+
31
+ resources :job_timelines, only: :index do
32
+ get :dataset, action: :dataset, on: :collection, defaults: { format: 'json' }
33
+ end
34
+
35
+ get '/sign_in', to: 'sessions#new', as: 'sign_in'
36
+ delete '/sign_out', to: 'sessions#destroy', as: 'sign_out'
37
+
38
+ get '/auth/:provider', as: :auth, to: lambda { |_env| [500, {}, 'Never called'] }
39
+ get '/auth/:provider/callback', to: 'sessions#create'
40
+
41
+ root 'dashboard#index'
42
+ get '/osd' => 'dashboard#osd', as: :osd
43
+
44
+ scope :v1, module: 'api', as: 'api' do
45
+ resources :job_definitions, path: 'definitions', only: [] do
46
+ resources :job_instances, path: 'instances', only: [:show, :create]
47
+ end
48
+
49
+ namespace :stats do
50
+ get :instance
51
+ get :waiting_execution
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,22 @@
1
+ class CreateJobDefinitions < ActiveRecord::Migration
2
+ def change
3
+ create_table "job_definitions" do |t|
4
+ t.integer "version", limit: 4, default: 0, null: false
5
+ t.string "name", limit: 180, null: false
6
+ t.text "description", limit: 65535, null: false
7
+ t.text "script", limit: 65535, null: false
8
+ t.boolean "suspended", default: false, null: false
9
+ t.integer "prevent_multi", limit: 4, default: 1, null: false
10
+ t.boolean "notify_cancellation", default: true, null: false
11
+ t.string "hipchat_room", limit: 180, default: "", null: false
12
+ t.boolean "hipchat_notify_finished", default: true, null: false
13
+ t.string "hipchat_additional_text", limit: 180
14
+ t.string "slack_channel", limit: 180, default: "", null: false
15
+ t.boolean "api_allowed", default: false, null: false
16
+ t.datetime "created_at"
17
+ t.datetime "updated_at"
18
+ end
19
+
20
+ add_index "job_definitions", ["name"], name: "name", using: :btree
21
+ end
22
+ end
@@ -0,0 +1,17 @@
1
+ class CreateJobInstances < ActiveRecord::Migration
2
+ def change
3
+ create_table "job_instances" do |t|
4
+ t.integer "job_definition_id", limit: 4
5
+ t.integer "job_definition_version", limit: 4
6
+ t.text "script", limit: 65535
7
+ t.datetime "finished_at"
8
+ t.datetime "canceled_at"
9
+ t.datetime "error_at"
10
+ t.datetime "created_at"
11
+ t.datetime "updated_at"
12
+ end
13
+
14
+ add_index "job_instances", ["finished_at", "canceled_at", "job_definition_id"], name: "job_instance_idx", using: :btree
15
+ add_index "job_instances", ["job_definition_id"], using: :btree
16
+ end
17
+ end
@@ -0,0 +1,14 @@
1
+ class CreateJobSchedules < ActiveRecord::Migration
2
+ def change
3
+ create_table "job_schedules" do |t|
4
+ t.integer "job_definition_id", limit: 4
5
+ t.string "cron", limit: 180
6
+ t.datetime "created_at"
7
+ t.datetime "updated_at"
8
+ end
9
+
10
+ add_index "job_schedules", ["job_definition_id", "cron"], name: 'kuroko2_schedules_definition_id_cron_idx', unique: true, using: :btree
11
+ end
12
+ end
13
+
14
+
@@ -0,0 +1,7 @@
1
+ class CreateTicks < ActiveRecord::Migration
2
+ def change
3
+ create_table "ticks" do |t|
4
+ t.datetime "at"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,13 @@
1
+ class CreateLogs < ActiveRecord::Migration
2
+ def change
3
+ create_table "logs" do |t|
4
+ t.integer "job_instance_id", limit: 4
5
+ t.string "level", limit: 10
6
+ t.text "message", limit: 16777217 # this means MySQL LONGTEXT type and PostgreSQL TEXT type.
7
+ t.datetime "created_at"
8
+ t.datetime "updated_at"
9
+ end
10
+
11
+ add_index "logs", ["job_instance_id"], name: "job_instance_id", using: :btree
12
+ end
13
+ end
@@ -0,0 +1,21 @@
1
+ class CreateTokens < ActiveRecord::Migration
2
+ def change
3
+ create_table "tokens" do |t|
4
+ t.string "uuid", limit: 36, null: false
5
+ t.integer "job_definition_id", limit: 4
6
+ t.integer "job_definition_version", limit: 4
7
+ t.integer "job_instance_id", limit: 4
8
+ t.integer "parent_id", limit: 4
9
+ t.text "script", limit: 65535, null: false
10
+ t.string "path", limit: 180, default: "/", null: false
11
+ t.integer "status", limit: 4, default: 0, null: false
12
+ t.text "message", limit: 65535, null: false
13
+ t.text "context", limit: 65535, null: false
14
+ t.datetime "created_at"
15
+ t.datetime "updated_at"
16
+ end
17
+
18
+ add_index "tokens", ["parent_id"], name: "parent_id", using: :btree
19
+ add_index "tokens", ["status"], name: "status", using: :btree
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ class CreateExecutions < ActiveRecord::Migration
2
+ def change
3
+ create_table "executions" do |t|
4
+ t.string "uuid", limit: 36, null: false
5
+ t.integer "job_definition_id", limit: 4
6
+ t.integer "job_definition_version", limit: 4
7
+ t.integer "job_instance_id", limit: 4
8
+ t.integer "token_id", limit: 4
9
+ t.string "queue", limit: 180, default: "@default", null: false
10
+ t.text "shell", limit: 65535, null: false
11
+ t.text "context", limit: 65535, null: false
12
+ t.integer "pid", limit: 4
13
+ t.text "output", limit: 16777217
14
+ t.integer "exit_status", limit: 1
15
+ t.integer "term_signal", limit: 1
16
+ t.datetime "started_at"
17
+ t.datetime "finished_at"
18
+ t.datetime "mailed_at"
19
+ t.datetime "created_at"
20
+ t.datetime "updated_at"
21
+ end
22
+
23
+ add_index "executions", ["job_definition_id", "token_id"], unique: true, using: :btree
24
+ add_index "executions", ["started_at"], name: "started_at", using: :btree
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ class CreateProcessSignals < ActiveRecord::Migration
2
+ def change
3
+ create_table "process_signals" do |t|
4
+ t.string "hostname", limit: 180, default: "", null: false
5
+ t.integer "pid", limit: 4, null: false
6
+ t.integer "number", limit: 1, default: 15, null: false
7
+ t.datetime "started_at"
8
+ t.datetime "created_at"
9
+ t.datetime "updated_at"
10
+ t.text "message", limit: 65535
11
+ end
12
+
13
+ add_index "process_signals", ["hostname", "started_at"], name: "hostname_started_at", using: :btree
14
+ end
15
+ end
@@ -0,0 +1,20 @@
1
+ class CreateUsers < ActiveRecord::Migration
2
+ def change
3
+ create_table "users" do |t|
4
+ t.string "provider", limit: 180, default: "google_oauth2", null: false
5
+ t.string "uid", limit: 180, null: false
6
+ t.string "name", limit: 180, default: "", null: false
7
+ t.string "email", limit: 180, null: false
8
+ t.string "first_name", limit: 180, default: "", null: false
9
+ t.string "last_name", limit: 180, default: "", null: false
10
+ t.string "image", limit: 180, default: "", null: false
11
+ t.datetime "suspended_at"
12
+ t.datetime "created_at"
13
+ t.datetime "updated_at"
14
+ end
15
+
16
+ add_index "users", ["email"], name: "email", unique: true, using: :btree
17
+ add_index "users", ["uid", "suspended_at"], name: "uid_2", using: :btree
18
+ add_index "users", ["uid"], name: "uid", unique: true, using: :btree
19
+ end
20
+ end
@@ -0,0 +1,12 @@
1
+ class CreateAdminAssignments < ActiveRecord::Migration
2
+ def change
3
+ create_table "admin_assignments" do |t|
4
+ t.integer "user_id", limit: 4, null: false
5
+ t.integer "job_definition_id", limit: 4, null: false
6
+ t.datetime "created_at"
7
+ t.datetime "updated_at"
8
+ end
9
+
10
+ add_index "admin_assignments", ["user_id", "job_definition_id"], name: "user_id", unique: true, using: :btree
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ class CreateStars < ActiveRecord::Migration
2
+ def change
3
+ create_table "stars" do |t|
4
+ t.integer "user_id", limit: 4, null: false
5
+ t.integer "job_definition_id", limit: 4, null: false
6
+ t.datetime "created_at"
7
+ t.datetime "updated_at"
8
+ end
9
+
10
+ add_index "stars", ["user_id", "job_definition_id"], unique: true, using: :btree
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ class CreateWorkers < ActiveRecord::Migration
2
+ def change
3
+ create_table "workers" do |t|
4
+ t.string "hostname", limit: 180, null: false
5
+ t.integer "worker_id", limit: 1, null: false
6
+ t.string "queue", limit: 180, default: "@default", null: false
7
+ t.boolean "working", default: false, null: false
8
+ t.integer "execution_id", limit: 4
9
+ t.datetime "created_at"
10
+ t.datetime "updated_at"
11
+ end
12
+
13
+ add_index "workers", ["hostname", "worker_id"], name: "hostname", unique: true, using: :btree
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ class CreateJobDefinitionTags < ActiveRecord::Migration
2
+ def change
3
+ create_table "job_definition_tags" do |t|
4
+ t.integer "job_definition_id", limit: 4, null: false
5
+ t.integer "tag_id", limit: 4, null: false
6
+ t.datetime "created_at", null: false
7
+ t.datetime "updated_at", null: false
8
+ end
9
+
10
+ add_index "job_definition_tags", ["job_definition_id", "tag_id"], name: 'kuroko2_definition_tag_idx', unique: true, using: :btree
11
+ add_index "job_definition_tags", ["tag_id"], name: "job_definition_tags_tag_id", using: :btree
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ class CreateTags < ActiveRecord::Migration
2
+ def change
3
+ create_table "tags" do |t|
4
+ t.string "name", limit: 100, null: false
5
+ t.datetime "created_at", null: false
6
+ t.datetime "updated_at", null: false
7
+ end
8
+
9
+ add_index "tags", ["name"], unique: true, using: :btree
10
+ end
11
+ end
@@ -0,0 +1,17 @@
1
+ class CreateMemoryExpectancies < ActiveRecord::Migration
2
+ def change
3
+ create_table :memory_expectancies do |t|
4
+ t.integer :expected_value, null: false, default: 0
5
+ t.references :job_definition, index: true
6
+
7
+ t.timestamps null: false
8
+ end
9
+
10
+ create_table :memory_consumption_logs do |t|
11
+ t.references :job_instance, index: true
12
+ t.integer :value, null: false
13
+
14
+ t.timestamps null: false
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ class CreateJobSuspendSchedules < ActiveRecord::Migration
2
+ def change
3
+ create_table "job_suspend_schedules" do |t|
4
+ t.integer "job_definition_id", limit: 4
5
+ t.string "cron", limit: 180
6
+ t.datetime "created_at", null: false
7
+ t.datetime "updated_at", null: false
8
+ end
9
+
10
+ add_index "job_suspend_schedules", ["job_definition_id", "cron"], name: 'kuroko2_suspend_schedules_definition_id_cron_idx', unique: true, using: :btree
11
+ end
12
+ end
@@ -0,0 +1,62 @@
1
+ module Kuroko2
2
+ module Command
3
+ module Executor
4
+ DEFAULT_NUM_WORKERS = 4
5
+ NUM_SYSTEM_WORKERS = 2 # master and monitor
6
+
7
+ def self.num_workers
8
+ @num_workers ||= (ENV['NUM_WORKERS'] || DEFAULT_NUM_WORKERS).to_i + NUM_SYSTEM_WORKERS
9
+ end
10
+
11
+ def initialize
12
+ @stop = ServerEngine::BlockingFlag.new
13
+
14
+ @hostname = ENV['HOSTNAME'] || Socket.gethostname
15
+ @queue = ENV['QUEUE'] || Execution::DEFAULT_QUEUE
16
+
17
+ @command = if worker_id == 0
18
+ Command::Kill.new(@hostname, worker_id)
19
+ elsif worker_id == (Command::Executor.num_workers - 1)
20
+ Command::Monitor.new(hostname: @hostname, worker_id: worker_id)
21
+ else
22
+ @worker = Worker.where(hostname: @hostname, worker_id: worker_id, queue: @queue).first_or_create!
23
+ Command::Shell.new(hostname: @hostname, worker_id: worker_id, worker: @worker, queue: @queue)
24
+ end
25
+ end
26
+
27
+ def run
28
+ Kuroko2.logger = logger
29
+ Kuroko2.logger.info "[#{@hostname}-#{worker_id}] Start worker"
30
+ toggle_worker_status(true)
31
+
32
+ sleep worker_id
33
+
34
+ until @stop.wait(1 + rand)
35
+ @command.execute
36
+ end
37
+ rescue Exception => e
38
+ Kuroko2.logger.fatal("[#{@hostname}-#{worker_id}] #{e.class}: #{e.message}\n" +
39
+ e.backtrace.map { |trace| " #{trace}" }.join("\n"))
40
+
41
+ raise e
42
+ end
43
+
44
+ def stop
45
+ Kuroko2.logger.info "[#{@hostname}-#{worker_id}] Stop worker"
46
+ toggle_worker_status(false)
47
+
48
+ @stop.set!
49
+ end
50
+
51
+ private
52
+
53
+ def toggle_worker_status(status)
54
+ return false unless @command.kind_of?(Command::Shell)
55
+
56
+ @worker.working = status
57
+ @worker.save
58
+ end
59
+
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,24 @@
1
+ module Kuroko2
2
+ module Command
3
+ class Kill
4
+ def initialize(host, process = nil)
5
+ @hostname = host
6
+ @process = process
7
+ end
8
+
9
+ def execute
10
+ if (signal = ProcessSignal.poll(@hostname))
11
+ Kuroko2.logger.info("[#{@hostname}-#{@process}] Send #{Signal.signame(signal.number)} signal to #{signal.pid}")
12
+ Process.kill(signal.number, signal.pid)
13
+
14
+ signal.destroy!
15
+ signal
16
+ end
17
+ rescue SystemCallError => e
18
+ signal.update_column(:message, "[#{@hostname}-#{@process}] #{e.class}: #{e.message}") rescue nil
19
+
20
+ Kuroko2.logger.error("[#{@hostname}-#{@process}] #{e.class}: #{e.message}")
21
+ end
22
+ end
23
+ end
24
+ end