Hi,

2012/11/7 FUJITA Tomonori <[email protected]>:
> This adds the feature to configure the log levels dynamically via CLI
> (like a commercial switch).
>
> - I don't like to access the internal of logging module. However,
>   seems that there is no way to know the list of used Loggers. Should
>   we add a wrapper for logging module?
>
> - We need to stop creating Logger per file. Too many Loggers
>   now. Logger per software component is better.
>
> - Currently, no authentication, no secure connection, no command
>   completion support. All are the future work.
>
>
> =
> >From e2772ce83cf31a980cc9e4c979b84e6fc7541bcf Mon Sep 17 00:00:00 2001
> From: FUJITA Tomonori <[email protected]>
> Date: Wed, 7 Nov 2012 20:15:07 +0900
> Subject: [PATCH] add interactive command line interface
>
> This adds CLI for configuring running Ryu daemon. The current feature
> is configuring the log levels.
>
> An example follows:
>
> fujita-mac:~ fujita$ telnet 127.0.0.1 2525
> Trying 127.0.0.1...
> Connected to localhost.
> Escape character is '^]'.
> Ryu> ?
>
> Undocumented commands:
> ======================
> exit  help  log
>
> Ryu> log show
> ryu.ofproto.nx_match    NOTSET
> ryu.app.simple_switch   NOTSET
> ryu.controller.handler  NOTSET
> ryu.ofproto.ofproto_v1_0_parser NOTSET
> ryu.ofproto.ofproto_parser      NOTSET
> ryu.utils                       NOTSET
> ryu.controller.controller       NOTSET
> ryu.app.wsgi                    NOTSET
> ryu.controller.ofp_handler      NOTSET
> ryu.ofproto.ofproto_v1_2_parser NOTSET
> ryu.controller.dispatcher       NOTSET
> ryu.base.app_manager            NOTSET
> ryu.controller.mac_to_port      NOTSET
> Ryu> log set ryu.controller.controller DEBUG
> set ryu.controller.controller loglevel to DEBUG
>
> Signed-off-by: FUJITA Tomonori <[email protected]>
> ---
>  bin/ryu-manager       |    5 +++
>  ryu/controller/cli.py |   76 
> +++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 81 insertions(+), 0 deletions(-)
>  create mode 100644 ryu/controller/cli.py
>
> diff --git a/bin/ryu-manager b/bin/ryu-manager
> index 002cc59..de30d23 100755
> --- a/bin/ryu-manager
> +++ b/bin/ryu-manager
> @@ -32,6 +32,7 @@ from ryu import utils
>  from ryu.app import wsgi
>  from ryu.base.app_manager import AppManager
>  from ryu.controller import controller
> +from ryu.controller import cli
>
>  # TODO:
>  #   Right now, we have our own patched copy of ovs python bindings
> @@ -74,6 +75,10 @@ def main():
>      thr = gevent.spawn_later(0, ctlr)
>      services.append(thr)
>
> +    cc = cli.CliController()
> +    thr = gevent.spawn_later(0, cc)
> +    services.append(thr)
> +
>      webapp = wsgi.start_service(app_mgr)
>      if webapp:
>          thr = gevent.spawn_later(0, webapp)
> diff --git a/ryu/controller/cli.py b/ryu/controller/cli.py
> new file mode 100644
> index 0000000..5185771
> --- /dev/null
> +++ b/ryu/controller/cli.py
> @@ -0,0 +1,76 @@
> +# Copyright (C) 2012 Nippon Telegraph and Telephone Corporation.
> +#
> +# Licensed under the Apache License, Version 2.0 (the "License");
> +# you may not use this file except in compliance with the License.
> +# You may obtain a copy of the License at
> +#
> +#    http://www.apache.org/licenses/LICENSE-2.0
> +#
> +# Unless required by applicable law or agreed to in writing, software
> +# distributed under the License is distributed on an "AS IS" BASIS,
> +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> +# implied.
> +# See the License for the specific language governing permissions and
> +# limitations under the License.
> +
> +import socket
> +import logging
> +import cmd
> +from gevent.server import StreamServer
> +
> +
> +class RyuCli(cmd.Cmd):
> +    prompt = "Ryu> "
> +    use_rawinput = False
> +
> +    def do_log(self, args):
> +        args = args.split()
> +        if len(args) > 0:
> +            if args[0] == 'show':
> +                self.log_show()
> +            elif args[0] == 'set':
> +                self.log_set(args)
> +            else:
> +                self.log_help()
> +
> +    def log_help(self):
> +        self.stdout.write('log show|set\n')
> +
> +    def log_show(self):
> +        for name, l in logging.Logger.manager.loggerDict.iteritems():
> +            if name.startswith('ryu.') and isinstance(l, logging.Logger):
> +                self.stdout.write('%s\t%s\n' %
> +                                  (name, logging.getLevelName(l.level)))

Should we show the RootLogger level? IIUC, all loggers print DEBUG
statements, when we set the RootLogger level to the DEBUG.

> +
> +    def log_set(self, args):
> +        if len(args) != 3:
> +            return
> +
> +        if not isinstance(logging.getLevelName(args[2]), int):
> +            return
> +
> +        if args[1] in logging.Logger.manager.loggerDict:
> +            log = logging.getLogger(args[1])
> +            log.setLevel(args[2])
> +            self.stdout.write('set %s loglevel to %s\n' % (args[1], args[2]))
> +
> +    def do_exit(self, args):
> +        return True
> +
> +
> +def client_factory(socket, address):
> +    f = socket.makefile("rb")
> +    try:
> +        RyuCli(stdin=f, stdout=f).cmdloop()
> +    except:
> +        pass
> +
> +
> +class CliController(object):
> +    def __init__(self):
> +        super(CliController, self).__init__()
> +
> +    def __call__(self):
> +        server = StreamServer(('', 2525),
> +                              client_factory)
> +        server.serve_forever()
> --
> 1.7.4.4
>
>
> ------------------------------------------------------------------------------
> LogMeIn Central: Instant, anywhere, Remote PC access and management.
> Stay in control, update software, and manage PCs from one command center
> Diagnose problems and improve visibility into emerging IT issues
> Automate, monitor and manage. Do more in less time with Central
> http://p.sf.net/sfu/logmein12331_d2d
> _______________________________________________
> Ryu-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/ryu-devel

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_nov
_______________________________________________
Ryu-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ryu-devel

Reply via email to