summaryrefslogtreecommitdiffstats
path: root/src/sbin
diff options
context:
space:
mode:
Diffstat (limited to 'src/sbin')
-rwxr-xr-xsrc/sbin/bcfg2-info54
1 files changed, 29 insertions, 25 deletions
diff --git a/src/sbin/bcfg2-info b/src/sbin/bcfg2-info
index fad51f037..92bb1ed4b 100755
--- a/src/sbin/bcfg2-info
+++ b/src/sbin/bcfg2-info
@@ -2,7 +2,7 @@
'''This tool loads the Bcfg2 core into an interactive debugger'''
__revision__ = '$Revision$'
-import copy, logging, lxml.etree, sys, cmd, time
+import copy, logging, lxml.etree, sys, cmd, time, tempfile, profile, pstats
import Bcfg2.Logger, Bcfg2.Server.Core, os
import Bcfg2.Server.Plugins.Metadata, Bcfg2.Server.Plugin
import Bcfg2.Options
@@ -23,6 +23,11 @@ def printTabular(rows):
for row in rows[1:]:
print(fstring % row)
+def displayTrace(trace, num=80, sort=('time', 'calls')):
+ stats = pstats.Stats(trace)
+ stats.sort_stats('time', 'calls')
+ stats.print_stats(100)
+
class infoCore(cmd.Cmd, Bcfg2.Server.Core.Core):
def __init__(self, repo, plgs, passwd, encoding, event_debug):
@@ -80,6 +85,7 @@ Usage: [quit|exit]"""
print 'groups - list groups'
print 'help - print this text'
print 'mappings <type*> <name*>- print generator mappings for optional type and name'
+ print 'profile <command> <args> - profile a single bcfg2-info command'
print 'quit'
print 'showentries <hostname> <type> - show abstract configuration entries for a given host'
print 'showclient <client1> <client2> - show metadata for given hosts'
@@ -287,16 +293,18 @@ Usage: [quit|exit]"""
continue
print(cand[0].name)
-def main(repo, plugins, password, encoding, debug, args=[]):
- loop = infoCore(repo, plugins, password, encoding, debug)
- if args == ['exit']:
- raise SystemExit(0)
- elif args:
- loop.onecmd(" ".join(args))
- raise SystemExit(0)
- else:
- loop.do_loop()
- return loop
+ def do_profile(self, arg):
+ tracefname = tempfile.mktemp()
+ p = profile.Profile()
+ p.runcall(self.onecmd, arg)
+ displayTrace(p)
+
+ def Run(self, args):
+ if args:
+ self.onecmd(" ".join(args))
+ os._exit(0)
+ else:
+ self.do_loop()
if __name__ == '__main__':
Bcfg2.Logger.setup_logging('bcfg2-info', to_syslog=False)
@@ -313,18 +321,14 @@ if __name__ == '__main__':
setup = Bcfg2.Options.OptionParser(optinfo)
setup.parse(sys.argv[1:])
print(setup)
- if not setup['profile']:
- loop = main(setup['repo'], setup['plugins'], setup['password'],
- setup['encoding'], '-d' in sys.argv, [])
+ if setup['profile']:
+ prof = profile.Profile()
+ loop = prof.runcall(infoCore, setup['repo'], setup['plugins'],
+ setup['password'], setup['encoding'],
+ setup['event debug'])
+ displayTrace(prof)
else:
- import hotshot, hotshot.stats
- prof = hotshot.Profile(setup['profile'])
- try:
- prof.runcall(main, setup['repo'], setup['plugins'], setup['password'],
- setup['encoding'], '-d' in sys.argv, [])
- except SystemExit:
- stats = hotshot.stats.load(setup['profile'])
- stats.strip_dirs()
- stats.sort_stats('time', 'calls')
- stats.print_stats(80)
- raise
+ loop = infoCore(setup['repo'], setup['plugins'], setup['password'],
+ setup['encoding'], setup['event debug'])
+
+ loop.Run(setup['args'])