celeryev.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import sys
  2. from celery import platforms
  3. from celery.bin.base import Command, Option, daemon_options
  4. from celery.platforms import create_daemon_context
  5. from celery.utils.functional import partial
  6. class EvCommand(Command):
  7. def run(self, dump=False, camera=None, frequency=1.0, maxrate=None,
  8. loglevel="INFO", logfile=None, prog_name="celeryev",
  9. pidfile=None, uid=None, gid=None, umask=None,
  10. working_directory=None, detach=False, **kwargs):
  11. self.prog_name = prog_name
  12. if dump:
  13. return self.run_evdump()
  14. if camera:
  15. return self.run_evcam(camera, freq=frequency, maxrate=maxrate,
  16. loglevel=loglevel, logfile=logfile,
  17. pidfile=pidfile, uid=uid, gid=gid,
  18. umask=umask,
  19. working_directory=working_directory,
  20. detach=detach)
  21. return self.run_evtop()
  22. def run_evdump(self):
  23. from celery.events.dumper import evdump
  24. self.set_process_status("dump")
  25. return evdump(app=self.app)
  26. def run_evtop(self):
  27. from celery.events.cursesmon import evtop
  28. self.set_process_status("top")
  29. return evtop(app=self.app)
  30. def run_evcam(self, camera, logfile=None, pidfile=None, uid=None,
  31. gid=None, umask=None, working_directory=None,
  32. detach=False, **kwargs):
  33. from celery.events.snapshot import evcam
  34. self.set_process_status("cam")
  35. kwargs["app"] = self.app
  36. if not detach:
  37. return evcam(camera, logfile=logfile, **kwargs)
  38. context, on_stop = create_daemon_context(
  39. logfile=logfile,
  40. pidfile=pidfile,
  41. uid=uid,
  42. gid=gid,
  43. umask=umask,
  44. working_directory=working_directory)
  45. context.open()
  46. try:
  47. return evcam(camera, logfile=logfile, **kwargs)
  48. finally:
  49. on_stop()
  50. def set_process_status(self, prog, info=""):
  51. prog = "%s:%s" % (self.prog_name, prog)
  52. info = "%s %s" % (info, platforms.strargv(sys.argv))
  53. return platforms.set_process_title(prog, info=info)
  54. def get_options(self):
  55. return (
  56. Option('-d', '--dump',
  57. action="store_true", dest="dump",
  58. help="Dump events to stdout."),
  59. Option('-c', '--camera',
  60. action="store", dest="camera",
  61. help="Camera class to take event snapshots with."),
  62. Option('--detach',
  63. default=False, action="store_true", dest="detach",
  64. help="Recording: Detach and run in the background."),
  65. Option('-F', '--frequency', '--freq',
  66. action="store", dest="frequency",
  67. type="float", default=1.0,
  68. help="Recording: Snapshot frequency."),
  69. Option('-r', '--maxrate',
  70. action="store", dest="maxrate", default=None,
  71. help="Recording: Shutter rate limit (e.g. 10/m)"),
  72. Option('-l', '--loglevel',
  73. action="store", dest="loglevel", default="INFO",
  74. help="Loglevel. Default is WARNING."),
  75. ) + daemon_options(default_pidfile="celeryev.pid",
  76. default_logfile=None)
  77. def main():
  78. ev = EvCommand()
  79. ev.execute_from_commandline()
  80. if __name__ == "__main__": # pragma: no cover
  81. main()