You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

206 lines
5.3 KiB

  1. from __future__ import unicode_literals, absolute_import
  2. import click
  3. import json, sys
  4. import frappe
  5. from frappe.utils import cint
  6. from frappe.commands import pass_context, get_site
  7. def _is_scheduler_enabled():
  8. enable_scheduler = False
  9. try:
  10. frappe.connect()
  11. enable_scheduler = cint(frappe.db.get_single_value("System Settings", "enable_scheduler")) and True or False
  12. except:
  13. pass
  14. finally:
  15. frappe.db.close()
  16. return enable_scheduler
  17. @click.command('trigger-scheduler-event')
  18. @click.argument('event')
  19. @pass_context
  20. def trigger_scheduler_event(context, event):
  21. "Trigger a scheduler event"
  22. import frappe.utils.scheduler
  23. for site in context.sites:
  24. try:
  25. frappe.init(site=site)
  26. frappe.connect()
  27. frappe.utils.scheduler.trigger(site, event, now=context.force)
  28. finally:
  29. frappe.destroy()
  30. @click.command('enable-scheduler')
  31. @pass_context
  32. def enable_scheduler(context):
  33. "Enable scheduler"
  34. import frappe.utils.scheduler
  35. for site in context.sites:
  36. try:
  37. frappe.init(site=site)
  38. frappe.connect()
  39. frappe.utils.scheduler.enable_scheduler()
  40. frappe.db.commit()
  41. print "Enabled for", site
  42. finally:
  43. frappe.destroy()
  44. @click.command('disable-scheduler')
  45. @pass_context
  46. def disable_scheduler(context):
  47. "Disable scheduler"
  48. import frappe.utils.scheduler
  49. for site in context.sites:
  50. try:
  51. frappe.init(site=site)
  52. frappe.connect()
  53. frappe.utils.scheduler.disable_scheduler()
  54. frappe.db.commit()
  55. print "Disabled for", site
  56. finally:
  57. frappe.destroy()
  58. @click.command('scheduler')
  59. @click.option('--site', help='site name')
  60. @click.argument('state', type=click.Choice(['pause', 'resume', 'disable', 'enable']))
  61. @pass_context
  62. def scheduler(context, state, site=None):
  63. from frappe.installer import update_site_config
  64. import frappe.utils.scheduler
  65. if not site:
  66. site = get_site(context)
  67. try:
  68. frappe.init(site=site)
  69. if state == 'pause':
  70. update_site_config('pause_scheduler', 1)
  71. elif state == 'resume':
  72. update_site_config('pause_scheduler', 0)
  73. elif state == 'disable':
  74. frappe.connect()
  75. frappe.utils.scheduler.disable_scheduler()
  76. frappe.db.commit()
  77. elif state == 'enable':
  78. frappe.connect()
  79. frappe.utils.scheduler.enable_scheduler()
  80. frappe.db.commit()
  81. print 'Scheduler {0}d for site {1}'.format(state, site)
  82. finally:
  83. frappe.destroy()
  84. @click.command('set-maintenance-mode')
  85. @click.option('--site', help='site name')
  86. @click.argument('state', type=click.Choice(['on', 'off']))
  87. @pass_context
  88. def set_maintenance_mode(context, state, site=None):
  89. from frappe.installer import update_site_config
  90. if not site:
  91. site = get_site(context)
  92. try:
  93. frappe.init(site=site)
  94. update_site_config('maintenance_mode', 1 if (state == 'on') else 0)
  95. finally:
  96. frappe.destroy()
  97. @click.command('doctor') #Passing context always gets a site and if there is no use site it breaks
  98. @click.option('--site', help='site name')
  99. def doctor(site=None):
  100. "Get diagnostic info about background workers"
  101. from frappe.utils.doctor import doctor as _doctor
  102. return _doctor(site=site)
  103. @click.command('show-pending-jobs')
  104. @click.option('--site', help='site name')
  105. @pass_context
  106. def show_pending_jobs(context, site=None):
  107. "Get diagnostic info about background jobs"
  108. from frappe.utils.doctor import pending_jobs as _pending_jobs
  109. if not site:
  110. site = get_site(context)
  111. with frappe.init_site(site):
  112. pending_jobs = _pending_jobs(site=site)
  113. return pending_jobs
  114. @click.command('purge-jobs')
  115. @click.option('--site', help='site name')
  116. @click.option('--queue', default=None, help='one of "low", "default", "high')
  117. @click.option('--event', default=None, help='one of "all", "weekly", "monthly", "hourly", "daily", "weekly_long", "daily_long"')
  118. def purge_jobs(site=None, queue=None, event=None):
  119. "Purge any pending periodic tasks, if event option is not given, it will purge everything for the site"
  120. from frappe.utils.doctor import purge_pending_jobs
  121. frappe.init(site or '')
  122. count = purge_pending_jobs(event=event, site=site, queue=queue)
  123. print "Purged {} jobs".format(count)
  124. @click.command('dump-queue-status')
  125. def dump_queue_status():
  126. "Dump detailed diagnostic infomation for task queues in JSON format"
  127. frappe.init('')
  128. from frappe.utils.doctor import dump_queue_status as _dump_queue_status, inspect_queue
  129. print json.dumps(_dump_queue_status(), indent=1)
  130. inspect_queue()
  131. @click.command('schedule')
  132. def start_scheduler():
  133. from frappe.utils.scheduler import start_scheduler
  134. start_scheduler()
  135. @click.command('worker')
  136. @click.option('--queue', type=str)
  137. def start_worker(queue):
  138. from frappe.utils.background_jobs import start_worker
  139. start_worker(queue)
  140. @click.command('ready-for-migration')
  141. @click.option('--site', help='site name')
  142. @pass_context
  143. def ready_for_migration(context, site=None):
  144. from frappe.utils.doctor import get_pending_jobs
  145. if not site:
  146. site = get_site(context)
  147. try:
  148. frappe.init(site=site)
  149. pending_jobs = get_pending_jobs(site=site)
  150. if pending_jobs:
  151. print 'NOT READY for migration: site {0} has pending background jobs'.format(site)
  152. sys.exit(1)
  153. else:
  154. print 'READY for migration: site {0} does not have any background jobs'.format(site)
  155. return 0
  156. finally:
  157. frappe.destroy()
  158. commands = [
  159. disable_scheduler,
  160. doctor,
  161. dump_queue_status,
  162. enable_scheduler,
  163. purge_jobs,
  164. ready_for_migration,
  165. scheduler,
  166. set_maintenance_mode,
  167. show_pending_jobs,
  168. start_scheduler,
  169. start_worker,
  170. trigger_scheduler_event,
  171. ]