Browse Source
import a little CLI script that allows to talk to Murmur on the shell.
Natenom/support-murmur-13-1446181288462
import a little CLI script that allows to talk to Murmur on the shell.
Natenom/support-murmur-13-1446181288462
Michael Ziegler
15 years ago
1 changed files with 177 additions and 0 deletions
-
177pyweb/mucli.py
@ -0,0 +1,177 @@ |
|||||
|
#!/usr/bin/env python |
||||
|
# -*- coding: utf-8 -*- |
||||
|
|
||||
|
""" |
||||
|
* Copyright (C) 2010, Michael "Svedrin" Ziegler <diese-addy@funzt-halt.net> |
||||
|
* |
||||
|
* Mumble-Django is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This package is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
""" |
||||
|
|
||||
|
import os, sys |
||||
|
import inspect |
||||
|
|
||||
|
from optparse import OptionParser |
||||
|
from mumble.mctl import MumbleCtlBase |
||||
|
|
||||
|
usage = """Usage: %prog [options] [<method name>] [<method arguments>] |
||||
|
|
||||
|
Each method argument has the form: [<data type: bool|int|float|string>:]value |
||||
|
|
||||
|
If you do not specify a data type, string will be assumed, otherwise |
||||
|
`value' will be converted to the given type first. The bool conversion |
||||
|
interprets each of 'True', 'true', '1', 'Yes', 'yes' as True, everything else |
||||
|
as False. |
||||
|
|
||||
|
|
||||
|
Example: int:4 float:3.5 string:oh:hai foobar |
||||
|
""" |
||||
|
|
||||
|
parser = OptionParser(usage=usage) |
||||
|
|
||||
|
parser.add_option( "-d", "--django-settings", |
||||
|
help="if specified, get connstring and slice defaults from the given Django " |
||||
|
"settings module. Default: empty.", |
||||
|
default=None |
||||
|
) |
||||
|
|
||||
|
parser.add_option( "-c", "--connstring", |
||||
|
help="connection string to use. Default is 'Meta:tcp -h 127.0.0.1 -p 6502'.", |
||||
|
default=None |
||||
|
) |
||||
|
|
||||
|
parser.add_option( "-s", "--slice", |
||||
|
help="path to the slice file. Default is '/usr/share/slice/Murmur.ice'.", |
||||
|
default=None |
||||
|
) |
||||
|
|
||||
|
parser.add_option( "-e", "--encoding", |
||||
|
help="Character set arguments are encoded in. Default: Read from LANG env variable with fallback to UTF-8.", |
||||
|
default=None |
||||
|
) |
||||
|
|
||||
|
parser.add_option( |
||||
|
"-v", "--verbose", |
||||
|
help="Show verbose messages on stderr", |
||||
|
default=False, |
||||
|
action="store_true" |
||||
|
) |
||||
|
|
||||
|
options, progargs = parser.parse_args() |
||||
|
|
||||
|
if options.django_settings is not None: |
||||
|
if options.verbose: |
||||
|
print >> sys.stderr, "Reading settings from module '%s'." % options.django_settings |
||||
|
|
||||
|
os.environ['DJANGO_SETTINGS_MODULE'] = options.django_settings |
||||
|
from django.conf import settings |
||||
|
|
||||
|
if options.connstring is None: |
||||
|
if options.verbose: |
||||
|
print >> sys.stderr, "Setting connstring from settings module" |
||||
|
options.connstring = settings.DEFAULT_CONN |
||||
|
|
||||
|
if options.slice is None: |
||||
|
if options.verbose: |
||||
|
print >> sys.stderr, "Setting slice from settings module" |
||||
|
options.slice = settings.SLICE |
||||
|
else: |
||||
|
if options.connstring is None: |
||||
|
if options.verbose: |
||||
|
print >> sys.stderr, "Setting default connstring" |
||||
|
options.connstring = 'Meta:tcp -h 127.0.0.1 -p 6502' |
||||
|
|
||||
|
if options.slice is None: |
||||
|
if options.verbose: |
||||
|
print >> sys.stderr, "Setting default slice" |
||||
|
options.slice = '/usr/share/slice/Murmur.ice' |
||||
|
|
||||
|
|
||||
|
if options.encoding is None: |
||||
|
locale = os.environ['LANG'] |
||||
|
try: |
||||
|
_, options.encoding = locale.split('.') |
||||
|
except ValueError: |
||||
|
options.encoding = "UTF-8" |
||||
|
|
||||
|
|
||||
|
if options.verbose: |
||||
|
print >> sys.stderr, "Connection info:" |
||||
|
print >> sys.stderr, " Connstring: %s" % options.connstring |
||||
|
print >> sys.stderr, " Slice: %s" % options.slice |
||||
|
print >> sys.stderr, "Encoding: %s" % options.encoding |
||||
|
|
||||
|
|
||||
|
ctl = MumbleCtlBase.newInstance( connstring=options.connstring, slicefile=options.slice ) |
||||
|
|
||||
|
|
||||
|
if not progargs: |
||||
|
# Print available methods. |
||||
|
for method in inspect.getmembers( ctl ): |
||||
|
if method[0][0] == '_' or not callable( method[1] ): |
||||
|
continue |
||||
|
|
||||
|
if hasattr( method[1], "innerfunc" ): |
||||
|
args = inspect.getargspec( method[1].innerfunc )[0] |
||||
|
else: |
||||
|
args = inspect.getargspec( method[1] )[0] |
||||
|
|
||||
|
if len( args ) > 1: |
||||
|
if args[0] == 'self': |
||||
|
print "%s( %s )" % ( method[0], ', '.join( args[1:] ) ) |
||||
|
else: |
||||
|
print "%s()" % method[0] |
||||
|
|
||||
|
else: |
||||
|
# function name given. check if its args matches ours, if yes call it, if not print usage |
||||
|
if options.verbose: |
||||
|
print >> sys.stderr, "Method name: %s" % progargs[0] |
||||
|
|
||||
|
method = getattr( ctl, progargs[0] ) |
||||
|
if hasattr( method, "innerfunc" ): |
||||
|
method = method.innerfunc |
||||
|
|
||||
|
args = inspect.getargspec( method )[0] |
||||
|
|
||||
|
if len(progargs) == len(args) and args[0] == 'self': |
||||
|
if len(args) == 1: |
||||
|
print method(ctl) |
||||
|
else: |
||||
|
cleanargs = [] |
||||
|
for param in progargs[1:]: |
||||
|
try: |
||||
|
argtype, argval = param.split(':', 1) |
||||
|
except ValueError: |
||||
|
cleanargs.append( param.decode(options.encoding) ) |
||||
|
else: |
||||
|
cleanval = { |
||||
|
'bool': lambda val: val in ('True', 'true', '1', 'Yes', 'yes'), |
||||
|
'int': int, |
||||
|
'float': float, |
||||
|
'string': str |
||||
|
}[ argtype ]( argval ) |
||||
|
|
||||
|
if argtype == 'string': |
||||
|
cleanval = cleanval.decode(options.encoding) |
||||
|
cleanargs.append(cleanval) |
||||
|
|
||||
|
if options.verbose: |
||||
|
print >> sys.stderr, "Call arguments: %s" % repr(cleanargs) |
||||
|
|
||||
|
print method( ctl, *cleanargs ) |
||||
|
|
||||
|
elif len(args) == 1: |
||||
|
print >> sys.stderr, "Method '%s' does not take any arguments." % progargs[0] |
||||
|
print >> sys.stderr, "Expected %s()" % progargs[0] |
||||
|
|
||||
|
else: |
||||
|
print >> sys.stderr, "Invalid arguments for method '%s': %s" % ( progargs[0], ', '.join( progargs[1:] ) ) |
||||
|
print >> sys.stderr, "Expected %s( %s )" % ( progargs[0], ', '.join( args[1:] ) ) |
||||
|
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue