__init__.py 4.6 KB
Newer Older
Marco Mariani's avatar
Marco Mariani committed
1 2
# -*- coding: utf-8 -*-
# vim: set et sts=2:
Marco Mariani's avatar
Marco Mariani committed
3
# pylint: disable-msg=W0311,C0301,C0103,C0111,R0904,R0903
Marco Mariani's avatar
Marco Mariani committed
4

Łukasz Nowak's avatar
Łukasz Nowak committed
5
import ConfigParser
Marco Mariani's avatar
Marco Mariani committed
6
import datetime
Łukasz Nowak's avatar
Łukasz Nowak committed
7 8
import logging
import logging.handlers
Marco Mariani's avatar
Marco Mariani committed
9
from optparse import OptionParser, Option
Łukasz Nowak's avatar
Łukasz Nowak committed
10
import os
11
import slapos.runner.process
Łukasz Nowak's avatar
Łukasz Nowak committed
12
import sys
13
from slapos.runner.utils import runInstanceWithLock
Marco Mariani's avatar
Marco Mariani committed
14

Łukasz Nowak's avatar
Łukasz Nowak committed
15 16 17 18 19 20 21

class Parser(OptionParser):
  """
  Parse all arguments.
  """
  def __init__(self, usage=None, version=None):
    """
Marco Mariani's avatar
typo  
Marco Mariani committed
22
    Initialize all possible options.
Łukasz Nowak's avatar
Łukasz Nowak committed
23 24 25
    """
    OptionParser.__init__(self, usage=usage, version=version,
                          option_list=[
26
      Option("-l", "--log_file",
Łukasz Nowak's avatar
Łukasz Nowak committed
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
             help="The path to the log file used by the script.",
             type=str),
      Option("-v", "--verbose",
             default=False,
             action="store_true",
             help="Verbose output."),
      Option("-c", "--console",
             default=False,
             action="store_true",
             help="Console output."),
      Option("-d", "--debug",
             default=False,
             action="store_true",
             help="Debug mode."),
    ])

  def check_args(self):
    """
    Check arguments
    """
    (options, args) = self.parse_args()
    if len(args) != 1:
      self.error("Incorrect number of arguments")

    return options, args[0]

class Config:
Marco Mariani's avatar
Marco Mariani committed
54 55 56 57 58 59 60
  def __init__(self):
    self.configuration_file_path = None
    self.console = None
    self.log_file = None
    self.logger = None
    self.verbose = None

Łukasz Nowak's avatar
Łukasz Nowak committed
61 62 63 64 65 66 67 68 69 70 71 72 73
  def setConfig(self, option_dict, configuration_file_path):
    """
    Set options given by parameters.
    """
    self.configuration_file_path = os.path.abspath(configuration_file_path)
    # Set options parameters
    for option, value in option_dict.__dict__.items():
      setattr(self, option, value)

    # Load configuration file
    configuration_parser = ConfigParser.SafeConfigParser()
    configuration_parser.read(configuration_file_path)
    # Merges the arguments and configuration
74 75 76

    for section in ("slaprunner", "slapos", "slapproxy", "slapformat",
                    "sshkeys_authority", "gitclient", "cloud9_IDE"):
Łukasz Nowak's avatar
Łukasz Nowak committed
77 78 79 80 81 82 83 84 85 86 87
      configuration_dict = dict(configuration_parser.items(section))
      for key in configuration_dict:
        if not getattr(self, key, None):
          setattr(self, key, configuration_dict[key])

    # set up logging
    self.logger = logging.getLogger("slaprunner")
    self.logger.setLevel(logging.INFO)
    if self.console:
      self.logger.addHandler(logging.StreamHandler())

88 89
    if self.log_file:
      if not os.path.isdir(os.path.dirname(self.log_file)):
Łukasz Nowak's avatar
Łukasz Nowak committed
90 91 92
        # fallback to console only if directory for logs does not exists and
        # continue to run
        raise ValueError('Please create directory %r to store %r log file' % (
93
          os.path.dirname(self.log_file), self.log_file))
Łukasz Nowak's avatar
Łukasz Nowak committed
94
      else:
95
        file_handler = logging.FileHandler(self.log_file)
Łukasz Nowak's avatar
Łukasz Nowak committed
96 97
        file_handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
        self.logger.addHandler(file_handler)
98
        self.logger.info('Configured logging to file %r' % self.log_file)
Łukasz Nowak's avatar
Łukasz Nowak committed
99 100

    self.logger.info("Started.")
101
    self.logger.info(os.environ['PATH'])
Łukasz Nowak's avatar
Łukasz Nowak committed
102 103 104 105 106 107 108 109 110 111 112 113 114 115
    if self.verbose:
      self.logger.setLevel(logging.DEBUG)
      self.logger.debug("Verbose mode enabled.")


def run():
  "Run default configuration."
  usage = "usage: %s [options] CONFIGURATION_FILE" % sys.argv[0]

  try:
    # Parse arguments
    config = Config()
    config.setConfig(*Parser(usage=usage).check_args())

Marco Mariani's avatar
Marco Mariani committed
116 117 118 119
    if os.getuid() == 0:
        # avoid mistakes (mainly in development mode)
        raise Exception('Do not run SlapRunner as root.')

Łukasz Nowak's avatar
Łukasz Nowak committed
120 121
    serve(config)
    return_code = 0
Marco Mariani's avatar
Marco Mariani committed
122
  except SystemExit as err:
Łukasz Nowak's avatar
Łukasz Nowak committed
123 124 125 126 127 128 129
    # Catch exception raise by optparse
    return_code = err

  sys.exit(return_code)

def serve(config):
  from views import app
130
  workdir = os.path.join(config.runner_workdir, 'project')
131
  software_link = os.path.join(config.runner_workdir, 'softwareLink')
Łukasz Nowak's avatar
Łukasz Nowak committed
132 133 134 135
  app.config.update(**config.__dict__)
  app.config.update(
    software_log=config.software_root.rstrip('/') + '.log',
    instance_log=config.instance_root.rstrip('/') + '.log',
136
    workspace = workdir,
137
    software_link=software_link,
138 139
    instance_profile='instance.cfg',
    software_profile='software.cfg',
140
    SECRET_KEY=os.urandom(24),
Marco Mariani's avatar
Marco Mariani committed
141
    PERMANENT_SESSION_LIFETIME=datetime.timedelta(days=31),
Łukasz Nowak's avatar
Łukasz Nowak committed
142
  )
143 144
  if not os.path.exists(workdir):
    os.mkdir(workdir)
145 146
  if not os.path.exists(software_link):
    os.mkdir(software_link)
147
  slapos.runner.process.setHandler()
148
  runInstanceWithLock(app.config)
Łukasz Nowak's avatar
Łukasz Nowak committed
149 150
  app.run(host=config.runner_host, port=int(config.runner_port),
      debug=config.debug, threaded=True)