From 15b7d2dda489b5307b7e02cbdca731bc9884bbd5 Mon Sep 17 00:00:00 2001 From: Narayan Desai Date: Mon, 12 Dec 2005 19:57:16 +0000 Subject: more client cleanups fix the server git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@1620 ce84e21b-d406-0410-9b95-82705330c041 --- src/sbin/Bcfg2Server | 10 ++++---- src/sbin/bcfg2 | 67 ++++++++++++++++++++++++++-------------------------- 2 files changed, 38 insertions(+), 39 deletions(-) (limited to 'src') diff --git a/src/sbin/Bcfg2Server b/src/sbin/Bcfg2Server index ae878771e..d63ced61c 100644 --- a/src/sbin/Bcfg2Server +++ b/src/sbin/Bcfg2Server @@ -153,7 +153,7 @@ class Bcfg2(Component): def resolve_client(self, client): try: - ret = gethostbyaddr(client)[0] + return gethostbyaddr(client)[0] except herror: warning = "host resolution error for %s" % (client) warning_error(warning) @@ -161,7 +161,7 @@ class Bcfg2(Component): def Bcfg2GetProbes(self, address): '''Fetch probes for a particular client''' - client = resolve_client(address[0]) + client = self.resolve_client(address[0]) resp = Element('probes') try: @@ -177,7 +177,7 @@ class Bcfg2(Component): def Bcfg2RecvProbeData(self, address, probedata): '''Receive probe data from clients''' - client = resolve_client(address[0]) + client = self.resolve_client(address[0]) for data in probedata: try: @@ -191,7 +191,7 @@ class Bcfg2(Component): def Bcfg2GetConfig(self, address, image=False, profile=False): '''Build config for a client''' - client = resolve_client(address[0]) + client = self.resolve_client(address[0]) if image and profile: try: @@ -210,7 +210,7 @@ class Bcfg2(Component): state = sdata.find(".//Statistics") # Versioned stats to prevent tied client/server upgrade if state.get('version') >= '2.0': - client = resolve_client(address[0]) + client = self.resolve_client(address[0]) # Update statistics self.Core.stats.updateStats(sdata, client) diff --git a/src/sbin/bcfg2 b/src/sbin/bcfg2 index a75b01ec8..82e22603c 100644 --- a/src/sbin/bcfg2 +++ b/src/sbin/bcfg2 @@ -3,19 +3,18 @@ '''Bcfg2 Client''' __revision__ = '$Revision$' -from getopt import getopt, GetoptError +import ConfigParser +import getopt +import signal +import socket +import sys +import tempfile +import time +import traceback +import xmlrpclib + from os import popen, chmod, unlink, _exit -from signal import signal, SIGINT -from sys import argv -from tempfile import mktemp -from ConfigParser import ConfigParser, NoSectionError, NoOptionError -from time import time -from xmlrpclib import ServerProxy, Fault from lxml.etree import Element, XML, tostring, XMLSyntaxError -from time import sleep -from sys import exc_info -from traceback import extract_tb -import socket def cb_sigint_handler(signum, frame): '''Exit upon CTRL-C''' @@ -28,10 +27,11 @@ class SafeProxy: self.password = password self.retries = retries self.serverUrl = serverUrl - self.proxy = ServerProxy(serverUrl) + self.proxy = xmlrpclib.ServerProxy(serverUrl) self.retryCount = 0 def runMethod(self, operationDescription, methodName, methodArgs): + '''Execute xmlrpc method call''' method = getattr(self.proxy, methodName) instanceRetries = 0 for i in xrange(self.retries): @@ -43,20 +43,19 @@ class SafeProxy: (instanceRetries, operationDescription, self.serverUrl)) verbose("%s completed successfully" % (operationDescription)) return ret - except Fault, f: + except xmlrpclib.Fault, f: fatal_error("%s encountered a server error:\n%s" % (operationDescription, f)) except socket.error, e: instanceRetries += 1 self.retryCount += 1 - sleep(1.0) + time.sleep(0.5) except: critical_error(operationDescription) fatal_error("%s failed:\nCould not connect to server (%s)" % (operationDescription, self.serverUrl)) - def load_toolset(toolset, config, clientsetup): '''Import client toolset modules''' @@ -84,7 +83,7 @@ def run_probe(probe): probeName = probe.attrib['name'] ret = Element("probe-data", probeName, source=probe.attrib['source']) try: - script = open(mktemp(), 'w+') + script = open(tempfile.mktemp(), 'w+') try: script.write("#!%s\n" % (probe.attrib.get('interpreter', '/bin/sh'))) script.write(probe.text) @@ -101,8 +100,8 @@ def run_probe(probe): def critical_error(operation): '''Print tracebacks in unexpected cases''' print "Traceback information (please include in any bug report):" - (ttype, value, trace) = exc_info() - for line in extract_tb(trace): + (ttype, value, trace) = sys.exc_info() + for line in traceback.extract_tb(trace): print "File %s, line %i, in %s\n %s\n" % (line) print "%s: %s\n" % (ttype, value) @@ -149,8 +148,8 @@ def dgetopt(arglist, opt, vopt, descs, argDescs): gstr = "".join(opt.keys()) + "".join([optionkey + ':' for optionkey in vopt.keys()]) try: - ginfo = getopt(arglist, gstr) - except GetoptError, gerr: + ginfo = getopt.getopt(arglist, gstr) + except getopt.GetoptError, gerr: usage_error(gerr, opt, vopt, descs, argDescs) for (gopt, garg) in ginfo[0]: @@ -175,7 +174,7 @@ def dgetopt(arglist, opt, vopt, descs, argDescs): if __name__ == '__main__': # parse command line options - signal(SIGINT, cb_sigint_handler) + signal.signal(signal.SIGINT, cb_sigint_handler) options = { 'v':'verbose', 'q':'quick', @@ -216,12 +215,12 @@ if __name__ == '__main__': 'i': "", 'r': "(pkgs | svcs | all)" } - setup = dgetopt(argv[1:], options, doptions, + setup = dgetopt(sys.argv[1:], options, doptions, descriptions, argumentDescriptions) timeinfo = Element("Times") # begin configuration - start = time() + start = time.time() comm = None if setup['file']: @@ -233,7 +232,7 @@ if __name__ == '__main__': except IOError: fatal_error("failed to read cached configuration from: %s" % (setup['file'])) else: - cf = ConfigParser() + cf = ConfigParser.ConfigParser() try: bcfgConf = '/etc/bcfg2.conf' verbose("reading setup info from %s" % (bcfgConf)) @@ -247,7 +246,7 @@ if __name__ == '__main__': probedata = proxy.runMethod("probe download", "GetProbes", ()) - timeinfo.set('probefetch', str(time() - start)) + timeinfo.set('probefetch', str(time.time() - start)) try: probes = XML(probedata) @@ -263,12 +262,12 @@ if __name__ == '__main__': # upload probe responses proxy.runMethod("probe data upload", "RecvProbeData", (probeinfo, )) - cstart = time() + cstart = time.time() cfginfo = proxy.runMethod("configuration download", "GetConfig", (setup['image'], setup['profile'])) - timeinfo.set('config', str(time() - cstart )) + timeinfo.set('config', str(time.time() - cstart )) if setup['cache']: try: @@ -276,13 +275,13 @@ if __name__ == '__main__': except IOError: warning_error("failed to write config cache file %s" % (setup['cache'])) - pt = time() + pt = time.time() try: cfg = XML(cfginfo) except XMLSyntaxError, e: fatal_error("the configuration could not be parsed") - timeinfo.set('parse', str(time() - pt)) + timeinfo.set('parse', str(time.time() - pt)) if cfg.tag == 'error': fatal_error("server error: %s" % (cfg.text)) @@ -303,15 +302,15 @@ if __name__ == '__main__': # Create toolset handle client = load_toolset(cfg_toolset, cfg, setup) - istart = time() + istart = time.time() # verify state client.Inventory() - timeinfo.set('inventory', str(time() - istart)) + timeinfo.set('inventory', str(time.time() - istart)) correct = client.states.values().count(True) total = len(client.states.values()) - istart = time() + istart = time.time() if ((correct < total) or client.pkgwork['remove']): if client.pkgwork['remove']: @@ -336,8 +335,8 @@ if __name__ == '__main__': else: client.CondPrint("verbose", "All entries correct") - timeinfo.set('install', str(time() - istart)) - timeinfo.set('total', str(time() - start)) + timeinfo.set('install', str(time.time() - istart)) + timeinfo.set('total', str(time.time() - start)) if not setup['file']: # upload statistics -- cgit v1.2.3-1-g7c22