main.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import datetime
  2. import logging
  3. import sys
  4. import os
  5. import re
  6. from docopt import docopt
  7. from inspect import getdoc
  8. from .. import __version__
  9. from ..service import get_container_name
  10. from ..service_collection import ServiceCollection
  11. from .command import Command
  12. from .errors import UserError
  13. from .docopt_command import NoSuchCommand
  14. log = logging.getLogger(__name__)
  15. def main():
  16. console_handler = logging.StreamHandler()
  17. console_handler.setFormatter(logging.Formatter())
  18. console_handler.setLevel(logging.INFO)
  19. root_logger = logging.getLogger()
  20. root_logger.addHandler(console_handler)
  21. root_logger.setLevel(logging.DEBUG)
  22. # Disable requests logging
  23. logging.getLogger("requests").propagate = False
  24. try:
  25. command = TopLevelCommand()
  26. command.sys_dispatch()
  27. except KeyboardInterrupt:
  28. log.error("\nAborting.")
  29. exit(1)
  30. except UserError, e:
  31. log.error(e.msg)
  32. exit(1)
  33. except NoSuchCommand, e:
  34. log.error("No such command: %s", e.command)
  35. log.error("")
  36. log.error("\n".join(parse_doc_section("commands:", getdoc(e.supercommand))))
  37. exit(1)
  38. # stolen from docopt master
  39. def parse_doc_section(name, source):
  40. pattern = re.compile('^([^\n]*' + name + '[^\n]*\n?(?:[ \t].*?(?:\n|$))*)',
  41. re.IGNORECASE | re.MULTILINE)
  42. return [s.strip() for s in pattern.findall(source)]
  43. class TopLevelCommand(Command):
  44. """.
  45. Usage:
  46. plum [options] [COMMAND] [ARGS...]
  47. plum -h|--help
  48. Options:
  49. --verbose Show more output
  50. --version Print version and exit
  51. Commands:
  52. ps List services and containers
  53. run Run a one-off command
  54. start Start services
  55. stop Stop services
  56. """
  57. def ps(self, options):
  58. """
  59. List services and containers.
  60. Usage: ps
  61. """
  62. for service in self.service_collection:
  63. for container in service.containers:
  64. print get_container_name(container)
  65. def run(self, options):
  66. """
  67. Run a one-off command.
  68. Usage: run SERVICE COMMAND [ARGS...]
  69. """
  70. service = self.service_collection.get(options['SERVICE'])
  71. container_options = {
  72. 'command': [options['COMMAND']] + options['ARGS'],
  73. }
  74. container = service.create_container(**container_options)
  75. stream = self.client.logs(container, stream=True)
  76. for data in stream:
  77. if data is None:
  78. break
  79. print data
  80. def start(self, options):
  81. """
  82. Start all services
  83. Usage: start
  84. """
  85. self.service_collection.start()
  86. def stop(self, options):
  87. """
  88. Stop all services
  89. Usage: stop
  90. """
  91. self.service_collection.stop()