def __init__(self, config=None):
     PluginManager.__init__(self)
     self.gconfig = config
     self.log = config.get('log_facility')
     self.platform = config.get('platform')
     PluginLoader.register_observer(self)
     self.refresh_plugin_data()
示例#2
0
 def on_click(self, event, params, vars=None):
     if params[0] == 'update':
         self._mgr.update_list()
         self.put_message('info', 'Plugin list updated')
     if params[0] == 'remove':
         self._mgr.remove(params[1])
         self.put_message(
             'info',
             'Plugin removed. Refresh page for changes to take effect.')
     if params[0] == 'reload':
         try:
             PluginLoader.unload(params[1])
         except:
             pass
         try:
             PluginLoader.load(params[1])
         except:
             pass
         self.put_message(
             'info',
             'Plugin reloaded. Refresh page for changes to take effect.')
     if params[0] == 'restart':
         self.app.restart()
     if params[0] == 'install':
         self._mgr.install(params[1], load=True)
         self.put_message(
             'info',
             'Plugin installed. Refresh page for changes to take effect.')
         ComponentManager.get().rescan()
示例#3
0
 def __init__(self, config=None):
     PluginManager.__init__(self)
     self.gconfig = config
     self.log = config.get('log_facility')
     self.platform = config.get('platform')
     PluginLoader.register_observer(self)
     self.refresh_plugin_data()
示例#4
0
    def refresh_plugin_data(self):
        """
        Rescans plugins for JS, CSS, LESS, XSLT widgets and XML templates.
        """
        self.template_path = []
        self.less_styles = []
        self.template_styles = []
        self.template_scripts = []
        self.layouts = {}
        includes = []
        functions = {}

        for f in self.grab_plugins(IXSLTFunctionProvider):
            functions.update(f.get_funcs())

        # Get path for static content and templates
        plugins = []
        plugins.extend(PluginLoader.list_plugins().keys())
        plugins.extend(netcontrol.plugins.plist)

        for c in plugins:
            path = os.path.join(PluginLoader.get_plugin_path(self, c), c)

            fp = os.path.join(path, 'files')
            if os.path.exists(fp):
                self.template_styles.extend([
                    '/dl/' + c + '/' + s for s in os.listdir(fp)
                    if s.endswith('.css')
                ])
                self.less_styles.extend([
                    '/dl/' + c + '/' + s for s in os.listdir(fp)
                    if s.endswith('.less')
                ])
                self.template_scripts.extend([
                    '/dl/' + c + '/' + s for s in os.listdir(fp)
                    if s.endswith('.js')
                ])

            wp = os.path.join(path, 'widgets')
            if os.path.exists(wp):
                includes.extend([
                    os.path.join(wp, s) for s in os.listdir(wp)
                    if s.endswith('.xslt')
                ])

            lp = os.path.join(path, 'layout')
            if os.path.exists(lp):
                for s in os.listdir(lp):
                    if s.endswith('.xml'):
                        self.layouts['%s:%s' % (c, s)] = os.path.join(lp, s)

            tp = os.path.join(path, 'templates')
            if os.path.exists(tp):
                self.template_path.append(tp)

        if xslt.xslt is None:
            xslt.prepare(includes, functions)
示例#5
0
def make_report(app, err):
    """
    Formats a bug report.
    """
    from netcontrol.plugmgr import PluginLoader
    pr = ''
    for p in sorted(PluginLoader.list_plugins().keys()):
        pr += p + '\n'

    # Finalize the reported log
    app.log.blackbox.stop()

    return (('Netcontrol %s bug report\n' +
           '--------------------\n\n' +
           'System: %s\n' +
           'Detected platform: %s\n' +
           'Detected distro: %s\n' +
           'Python: %s\n\n' +
           'Config path: %s\n\n' +
           '%s\n\n'
           'Loaded plugins:\n%s\n\n' +
           'Log:\n%s\n'
           )
            % (version(),
               shell('uname -a'),
               detect_platform(),
               detect_distro(),
               '.'.join([str(x) for x in platform.python_version_tuple()]),
               app.config.filename,
               err,
               pr,
               app.log.blackbox.buffer,
              ))
示例#6
0
def make_report(app, err):
    """
    Formats a bug report.
    """
    from netcontrol.plugmgr import PluginLoader
    pr = ''
    for p in sorted(PluginLoader.list_plugins().keys()):
        pr += p + '\n'

    # Finalize the reported log
    app.log.blackbox.stop()

    return (
        ('Netcontrol %s bug report\n' + '--------------------\n\n' +
         'System: %s\n' + 'Detected platform: %s\n' + 'Detected distro: %s\n' +
         'Python: %s\n\n' + 'Config path: %s\n\n' + '%s\n\n'
         'Loaded plugins:\n%s\n\n' + 'Log:\n%s\n') % (
             version(),
             shell('uname -a'),
             detect_platform(),
             detect_distro(),
             '.'.join([str(x) for x in platform.python_version_tuple()]),
             app.config.filename,
             err,
             pr,
             app.log.blackbox.buffer,
         ))
示例#7
0
    def process_dl(self, req, start_response):
        params = req['PATH_INFO'].split('/', 3)
        self.log.debug('Dispatching download: %s'%req['PATH_INFO'])

        path = PluginLoader.get_plugin_path(self.app, params[2])
        file = os.path.join(path, params[2], 'files', params[3])

        return wsgi_serve_file(req, start_response, file)
示例#8
0
 def on_click(self, event, params, vars=None):
     if params[0] == 'update':
         self._mgr.update_list()
         self.put_message('info', 'Plugin list updated')
     if params[0] == 'remove':
         self._mgr.remove(params[1])
         self.put_message('info', 'Plugin removed. Refresh page for changes to take effect.')
     if params[0] == 'reload':
         try:
             PluginLoader.unload(params[1])
         except:
             pass
         try:
             PluginLoader.load(params[1])
         except:
             pass
         self.put_message('info', 'Plugin reloaded. Refresh page for changes to take effect.')
     if params[0] == 'restart':
         self.app.restart()
     if params[0] == 'install':
         self._mgr.install(params[1], load=True)
         self.put_message('info', 'Plugin installed. Refresh page for changes to take effect.')
         ComponentManager.get().rescan()
示例#9
0
def run_server(log_level=logging.INFO, config_file=''):
    log = make_log(debug=log_level == logging.DEBUG, log_level=log_level)

    # For the debugging purposes
    log.info('Netcontrol %s' % version())

    # We need this early
    netcontrol.utils.logger = log

    # Read config
    config = Config()
    if config_file:
        log.info('Using config file %s' % config_file)
        config.load(config_file)
    else:
        log.info('Using default settings')

    # Handle first-launch reconfiguration
    deployed.reconfigure(config)

    # Add log handler to config, so all plugins could access it
    config.set('log_facility', log)

    # Start recording log for the bug reports
    log.blackbox.start()

    platform = netcontrol.utils.detect_platform()
    log.info('Detected platform: %s' % platform)

    # Load external plugins
    PluginLoader.initialize(log, config.get('netcontrol', 'plugins'), platform)
    PluginLoader.load_plugins()

    # Start components
    app = Application(config)
    PluginLoader.register_mgr(app)  # Register permanent app
    ComponentManager.create(app)

    # Start server
    host = config.get('netcontrol', 'bind_host')
    port = config.getint('netcontrol', 'bind_port')
    log.info('Listening on %s:%d' % (host, port))

    # SSL params
    ssl = {}
    if config.getint('netcontrol', 'ssl') == 1:
        ssl = {
            'keyfile': config.get('netcontrol', 'cert_key'),
            'certfile': config.get('netcontrol', 'cert_file'),
        }

    server = gevent.pywsgi.WSGIServer(
        (host, port), application=AppDispatcher(config).dispatcher, **ssl)

    config.set('server', server)

    log.info('Starting server')

    server.serve_forever()

    ComponentManager.get().stop()

    if hasattr(server, 'restart_marker'):
        log.info('Restarting by request')

        fd = 20  # Close all descriptors. Creepy thing
        while fd > 2:
            try:
                os.close(fd)
                log.debug('Closed descriptor #%i' % fd)
            except:
                pass
            fd -= 1

        os.execv(sys.argv[0], sys.argv)
    else:
        log.info('Stopped by request')
示例#10
0
    def refresh_plugin_data(self):
        """
        Rescans plugins for JS, CSS, LESS, XSLT widgets and XML templates.
        """
        self.template_path = []
        self.less_styles = []
        self.template_styles = []
        self.template_scripts = []
        self.layouts = {}
        includes = []
        functions = {}

        for f in self.grab_plugins(IXSLTFunctionProvider):
            functions.update(f.get_funcs())

        # Get path for static content and templates
        plugins = []
        plugins.extend(PluginLoader.list_plugins().keys())
        plugins.extend(netcontrol.plugins.plist)

        for c in plugins:
            path = os.path.join(PluginLoader.get_plugin_path(self, c), c)

            fp = os.path.join(path, 'files')
            if os.path.exists(fp):
                self.template_styles.extend([
                    '/dl/'+c+'/'+s
                    for s in os.listdir(fp)
                    if s.endswith('.css')
                ])
                self.less_styles.extend([
                    '/dl/'+c+'/'+s
                    for s in os.listdir(fp)
                    if s.endswith('.less')
                ])
                self.template_scripts.extend([
                    '/dl/'+c+'/'+s
                    for s in os.listdir(fp)
                    if s.endswith('.js')
                ])

            wp = os.path.join(path, 'widgets')
            if os.path.exists(wp):
                includes.extend([
                    os.path.join(wp, s)
                    for s in os.listdir(wp)
                    if s.endswith('.xslt')
                ])

            lp = os.path.join(path, 'layout')
            if os.path.exists(lp):
                for s in os.listdir(lp):
                    if s.endswith('.xml'):
                        self.layouts['%s:%s'%(c,s)] = os.path.join(lp, s)

            tp = os.path.join(path, 'templates')
            if os.path.exists(tp):
                self.template_path.append(tp)

        if xslt.xslt is None:
            xslt.prepare(
                includes,
                functions
            )
示例#11
0
def run_server(log_level=logging.INFO, config_file=""):
    log = make_log(debug=log_level == logging.DEBUG, log_level=log_level)

    # For the debugging purposes
    log.info("Netcontrol %s" % version())

    # We need this early
    netcontrol.utils.logger = log

    # Read config
    config = Config()
    if config_file:
        log.info("Using config file %s" % config_file)
        config.load(config_file)
    else:
        log.info("Using default settings")

    # Handle first-launch reconfiguration
    deployed.reconfigure(config)

    # Add log handler to config, so all plugins could access it
    config.set("log_facility", log)

    # Start recording log for the bug reports
    log.blackbox.start()

    platform = netcontrol.utils.detect_platform()
    log.info("Detected platform: %s" % platform)

    # Load external plugins
    PluginLoader.initialize(log, config.get("netcontrol", "plugins"), platform)
    PluginLoader.load_plugins()

    # Start components
    app = Application(config)
    PluginLoader.register_mgr(app)  # Register permanent app
    ComponentManager.create(app)

    # Start server
    host = config.get("netcontrol", "bind_host")
    port = config.getint("netcontrol", "bind_port")
    log.info("Listening on %s:%d" % (host, port))

    # SSL params
    ssl = {}
    if config.getint("netcontrol", "ssl") == 1:
        ssl = {"keyfile": config.get("netcontrol", "cert_key"), "certfile": config.get("netcontrol", "cert_file")}

    server = gevent.pywsgi.WSGIServer((host, port), application=AppDispatcher(config).dispatcher, **ssl)

    config.set("server", server)

    log.info("Starting server")

    server.serve_forever()

    ComponentManager.get().stop()

    if hasattr(server, "restart_marker"):
        log.info("Restarting by request")

        fd = 20  # Close all descriptors. Creepy thing
        while fd > 2:
            try:
                os.close(fd)
                log.debug("Closed descriptor #%i" % fd)
            except:
                pass
            fd -= 1

        os.execv(sys.argv[0], sys.argv)
    else:
        log.info("Stopped by request")