base.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import os
  2. import sys
  3. from optparse import OptionParser, make_option as Option
  4. import celery
  5. class Command(object):
  6. args = ''
  7. version = celery.__version__
  8. option_list = ()
  9. preload_options = (
  10. Option("--app",
  11. default=None, action="store", dest="app",
  12. help="Name of the app instance to use. "),
  13. Option("--loader",
  14. default=None, action="store", dest="loader",
  15. help="Name of the loader class to use. "
  16. "Taken from the environment variable CELERY_LOADER, "
  17. "or 'default' if that is not set."),
  18. Option("--config",
  19. default="celeryconfig", action="store",
  20. dest="config_module",
  21. help="Name of the module to read configuration from.")
  22. )
  23. enable_config_from_cmdline = False
  24. namespace = "celery"
  25. Parser = OptionParser
  26. def __init__(self, app=None, get_app=None):
  27. self.app = app
  28. self.get_app = get_app or self._get_default_app
  29. def usage(self):
  30. return "%%prog [options] %s" % (self.args, )
  31. def get_options(self):
  32. return self.option_list
  33. def handle_argv(self, prog_name, argv):
  34. options, args = self.parse_options(prog_name, argv)
  35. return self.run(*args, **vars(options))
  36. def run(self, *args, **options):
  37. raise NotImplementedError("subclass responsibility")
  38. def execute_from_commandline(self, argv=None):
  39. if argv is None:
  40. argv = list(sys.argv)
  41. argv = self.setup_app_from_commandline(argv)
  42. prog_name = os.path.basename(argv[0])
  43. return self.handle_argv(prog_name, argv[1:])
  44. def parse_options(self, prog_name, arguments):
  45. """Parse the available options."""
  46. parser = self.create_parser(prog_name)
  47. options, args = parser.parse_args(arguments)
  48. return options, args
  49. def create_parser(self, prog_name):
  50. return self.Parser(prog=prog_name,
  51. usage=self.usage(),
  52. version=self.version,
  53. option_list=(self.preload_options +
  54. self.get_options()))
  55. def setup_app_from_commandline(self, argv):
  56. preload_options = self.parse_preload_options(argv)
  57. app = (preload_options.pop("app", None) or
  58. os.environ.get("CELERY_APP"))
  59. loader = (preload_options.pop("loader", None) or
  60. os.environ.get("CELERY_LOADER") or
  61. "default")
  62. config_module = preload_options.pop("config_module", None)
  63. if config_module:
  64. os.environ["CELERY_CONFIG_MODULE"] = config_module
  65. if app:
  66. self.app = self.get_cls_by_name(app)
  67. else:
  68. self.app = self.get_app(loader=loader)
  69. if self.enable_config_from_cmdline:
  70. argv = self.process_cmdline_config(argv)
  71. return argv
  72. def get_cls_by_name(self, name):
  73. from celery.utils import get_cls_by_name, import_from_cwd
  74. return get_cls_by_name(name, imp=import_from_cwd)
  75. def process_cmdline_config(self, argv):
  76. try:
  77. cargs_start = argv.index('--')
  78. except ValueError:
  79. return argv
  80. argv, cargs = argv[:cargs_start], argv[cargs_start + 1:]
  81. self.app.config_from_cmdline(cargs, namespace=self.namespace)
  82. return argv
  83. def parse_preload_options(self, args):
  84. acc = {}
  85. preload_options = dict((opt._long_opts[0], opt.dest)
  86. for opt in self.preload_options)
  87. for arg in args:
  88. if arg.startswith('--') and '=' in arg:
  89. key, value = arg.split('=', 1)
  90. dest = preload_options.get(key)
  91. if dest:
  92. acc[dest] = value
  93. return acc
  94. def _get_default_app(self, *args, **kwargs):
  95. return celery.Celery(*args, **kwargs)
  96. def daemon_options(default_pidfile, default_logfile=None):
  97. return (
  98. Option('-f', '--logfile', default=default_logfile,
  99. action="store", dest="logfile",
  100. help="Path to the logfile"),
  101. Option('--pidfile', default=default_pidfile,
  102. action="store", dest="pidfile",
  103. help="Path to the pidfile."),
  104. Option('--uid', default=None,
  105. action="store", dest="uid",
  106. help="Effective user id to run as when detached."),
  107. Option('--gid', default=None,
  108. action="store", dest="gid",
  109. help="Effective group id to run as when detached."),
  110. Option('--umask', default=0,
  111. action="store", type="int", dest="umask",
  112. help="Umask of the process when detached."),
  113. Option('--workdir', default=None,
  114. action="store", dest="working_directory",
  115. help="Directory to change to when detached."),
  116. )