Beispiel #1
0
class Supervisor:
    def __init__(self):
        self.__config = Configuration()
        self.process_prefix = 'qlds_'

        self.__config_file = self.__config.get_config_dir() + '/supervisor.conf'

    def generate_config(self, servers):
        parser = ConfigParser()

        config_dir = self.__config.get_config_dir()

        parser.add_section('unix_http_server')
        parser.set('unix_http_server', 'file', config_dir + '/supervisor.sock')
        parser.set('unix_http_server', 'chmod', '0700')

        parser.add_section('supervisord')
        parser.set('supervisord', 'logfile', config_dir + '/supervisor_error.log')
        parser.set('supervisord', 'pidfile', config_dir + '/supervisor.pid')

        parser.add_section('rpcinterface:supervisor')
        parser.set('rpcinterface:supervisor', 'supervisor.rpcinterface_factory', 'supervisor.rpcinterface:make_main_rpcinterface')

        parser.add_section('supervisorctl')
        parser.set('supervisorctl', 'serverurl', 'unix://' + config_dir + '/supervisor.sock')

        ql_executable = self.get_ql_executable()

        for sid,data in servers.items():
            name = self.process_prefix + sid
            section = 'program:' + name
            parser.add_section(section)
            parser.set(section, 'command', self.build_command_line(sid, data, ql_executable))
            parser.set(section, 'process_name', name)
            parser.set(section, 'autorestart', 'true')

        if os.path.isfile(self.__config_file) and not os.access(self.__config_file, os.W_OK):
            raise IOError('Cannot write to file ' + self.__config_file)

        with (open(self.__config_file, 'w+')) as config_fp:
            parser.write(config_fp)

    def build_command_line(self, sid, server, executable):
        command_line = [
            executable,
            '+set fs_homepath %s/%s' % (os.path.expanduser('~/.quakelive/'), sid)
        ]

        for k,v in sorted(server.items()):
            command_line.append('+set %s %s' % (k, v))

        return ' '.join(command_line)

    def get_ql_executable(self):
        if platform.architecture()[0] == '64bit':
            executable = 'run_server_x64.sh'
        else:
            executable = 'run_server_x86.sh'

        return os.path.expanduser(self.__config.get('dir', 'ql')) + '/' + executable

    def get_config_location(self):
        return self.__config_file

    def start(self):
        supervisor_executable = self.__config.get('supervisor', 'supervisor')
        supervisor_executable_fs = FSCheck(supervisor_executable)

        supervisor_executable_fs.exists()
        supervisor_executable_fs.access('x')

        return call([supervisor_executable, '-c', self.__config_file])

    def ctl(self, args: list):
        args = list(args)

        ctl_executable = self.__config.get('supervisor', 'supervisorctl')
        ctl_executable_fs = FSCheck(ctl_executable)

        ctl_executable_fs.exists()
        ctl_executable_fs.access('x')

        call_args = [ctl_executable, '-c', self.__config_file] + args

        return call(call_args)
Beispiel #2
0
class Supervisor:
    def __init__(self):
        self.__config = Configuration()
        self.process_prefix = 'qlds_'

        self.__config_file = self.__config.get_config_dir(
        ) + '/supervisor.conf'

    def generate_config(self, servers):
        parser = ConfigParser()

        config_dir = self.__config.get_config_dir()

        parser.add_section('unix_http_server')
        parser.set('unix_http_server', 'file', config_dir + '/supervisor.sock')
        parser.set('unix_http_server', 'chmod', '0700')

        parser.add_section('supervisord')
        parser.set('supervisord', 'logfile',
                   config_dir + '/supervisor_error.log')
        parser.set('supervisord', 'pidfile', config_dir + '/supervisor.pid')

        parser.add_section('rpcinterface:supervisor')
        parser.set('rpcinterface:supervisor',
                   'supervisor.rpcinterface_factory',
                   'supervisor.rpcinterface:make_main_rpcinterface')

        parser.add_section('supervisorctl')
        parser.set('supervisorctl', 'serverurl',
                   'unix://' + config_dir + '/supervisor.sock')

        ql_executable = self.get_ql_executable()

        for sid, data in servers.items():
            name = self.process_prefix + sid
            section = 'program:' + name
            parser.add_section(section)
            parser.set(section, 'command',
                       self.build_command_line(sid, data, ql_executable))
            parser.set(section, 'process_name', name)
            parser.set(section, 'autorestart', 'true')

        if os.path.isfile(self.__config_file) and not os.access(
                self.__config_file, os.W_OK):
            raise IOError('Cannot write to file ' + self.__config_file)

        with (open(self.__config_file, 'w+')) as config_fp:
            parser.write(config_fp)

    def build_command_line(self, sid, server, executable):
        command_line = [
            executable,
            '+set fs_homepath %s/%s' %
            (os.path.expanduser('~/.quakelive/'), sid)
        ]

        for k, v in sorted(server.items()):
            command_line.append('+set %s %s' % (k, v))

        return ' '.join(command_line)

    def get_ql_executable(self):
        if platform.architecture()[0] == '64bit':
            executable = 'run_server_x64.sh'
        else:
            executable = 'run_server_x86.sh'

        return os.path.expanduser(self.__config.get('dir',
                                                    'ql')) + '/' + executable

    def get_config_location(self):
        return self.__config_file

    def start(self):
        supervisor_executable = self.__config.get('supervisor', 'supervisor')
        supervisor_executable_fs = FSCheck(supervisor_executable)

        supervisor_executable_fs.exists()
        supervisor_executable_fs.access('x')

        return call([supervisor_executable, '-c', self.__config_file])

    def ctl(self, args: list):
        args = list(args)

        ctl_executable = self.__config.get('supervisor', 'supervisorctl')
        ctl_executable_fs = FSCheck(ctl_executable)

        ctl_executable_fs.exists()
        ctl_executable_fs.access('x')

        call_args = [ctl_executable, '-c', self.__config_file] + args

        return call(call_args)