summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Client/Client.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/Bcfg2/Client/Client.py')
-rw-r--r--src/lib/Bcfg2/Client/Client.py52
1 files changed, 25 insertions, 27 deletions
diff --git a/src/lib/Bcfg2/Client/Client.py b/src/lib/Bcfg2/Client/Client.py
index 45e0b64e6..0488fcf21 100644
--- a/src/lib/Bcfg2/Client/Client.py
+++ b/src/lib/Bcfg2/Client/Client.py
@@ -8,26 +8,26 @@ import fcntl
import socket
import logging
import tempfile
-import Bcfg2.Proxy
import Bcfg2.Logger
import Bcfg2.Options
import Bcfg2.Client.XML
+import Bcfg2.Client.Proxy
import Bcfg2.Client.Frame
import Bcfg2.Client.Tools
+from Bcfg2.Utils import locked, Executor
from Bcfg2.Compat import xmlrpclib
from Bcfg2.version import __version__
-from subprocess import Popen, PIPE
class Client(object):
""" The main Bcfg2 client class """
- def __init__(self, setup):
+ def __init__(self):
self.toolset = None
self.tools = None
self.config = None
self._proxy = None
- self.setup = setup
+ self.setup = Bcfg2.Options.get_option_parser()
if self.setup['debug']:
level = logging.DEBUG
@@ -41,6 +41,9 @@ class Client(object):
to_file=self.setup['logging'])
self.logger = logging.getLogger('bcfg2')
self.logger.debug(self.setup)
+
+ self.cmd = Executor(self.setup['command_timeout'])
+
if self.setup['bundle_quick']:
if not self.setup['bundle'] and not self.setup['skipbundle']:
self.logger.error("-Q option requires -b or -B")
@@ -94,16 +97,14 @@ class Client(object):
stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH |
stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH |
stat.S_IWUSR) # 0755
- proc = Popen(scriptname, stdin=PIPE, stdout=PIPE, stderr=PIPE)
- ret.text, err = proc.communicate()
- rv = proc.wait()
- if err:
+ rv = self.cmd.run(scriptname, timeout=self.setup['timeout'])
+ if rv.stderr:
self.logger.warning("Probe %s has error output: %s" %
- (name, err))
- if rv:
+ (name, rv.stderr))
+ if not rv.success:
self._probe_failure(name, "Return value %s" % rv)
self.logger.info("Probe %s has result:" % name)
- self.logger.info(ret.text)
+ self.logger.info(rv.stdout)
finally:
os.unlink(scriptname)
except SystemExit:
@@ -121,7 +122,7 @@ class Client(object):
def proxy(self):
""" get an XML-RPC proxy to the server """
if self._proxy is None:
- self._proxy = Bcfg2.Proxy.ComponentProxy(
+ self._proxy = Bcfg2.Client.Proxy.ComponentProxy(
self.setup['server'],
self.setup['user'],
self.setup['password'],
@@ -141,8 +142,8 @@ class Client(object):
try:
probes = Bcfg2.Client.XML.XML(str(self.proxy.GetProbes()))
- except (Bcfg2.Proxy.ProxyError,
- Bcfg2.Proxy.CertificateError,
+ except (Bcfg2.Client.Proxy.ProxyError,
+ Bcfg2.Client.Proxy.CertificateError,
socket.gaierror,
socket.error):
err = sys.exc_info()[1]
@@ -165,7 +166,7 @@ class Client(object):
self.proxy.RecvProbeData(Bcfg2.Client.XML.tostring(
probedata,
xml_declaration=False).decode('UTF-8'))
- except Bcfg2.Proxy.ProxyError:
+ except Bcfg2.Client.Proxy.ProxyError:
err = sys.exc_info()[1]
self.fatal_error("Failed to upload probe data: %s" % err)
@@ -191,7 +192,7 @@ class Client(object):
if self.setup['profile']:
try:
self.proxy.AssertProfile(self.setup['profile'])
- except Bcfg2.Proxy.ProxyError:
+ except Bcfg2.Client.Proxy.ProxyError:
err = sys.exc_info()[1]
self.fatal_error("Failed to set client profile: %s" % err)
@@ -206,8 +207,8 @@ class Client(object):
"client version")
else:
self.logger.error("Failed to declare version: %s" % err)
- except (Bcfg2.Proxy.ProxyError,
- Bcfg2.Proxy.CertificateError,
+ except (Bcfg2.Client.Proxy.ProxyError,
+ Bcfg2.Client.Proxy.CertificateError,
socket.gaierror,
socket.error):
err = sys.exc_info()[1]
@@ -221,13 +222,13 @@ class Client(object):
self.proxy.GetDecisionList(self.setup['decision'])
self.logger.info("Got decision list from server:")
self.logger.info(self.setup['decision_list'])
- except Bcfg2.Proxy.ProxyError:
+ except Bcfg2.Client.Proxy.ProxyError:
err = sys.exc_info()[1]
self.fatal_error("Failed to get decision list: %s" % err)
try:
rawconfig = self.proxy.GetConfig().encode('UTF-8')
- except Bcfg2.Proxy.ProxyError:
+ except Bcfg2.Client.Proxy.ProxyError:
err = sys.exc_info()[1]
self.fatal_error("Failed to download configuration from "
"Bcfg2: %s" % err)
@@ -288,11 +289,7 @@ class Client(object):
#check lock here
try:
lockfile = open(self.setup['lockfile'], 'w')
- try:
- fcntl.lockf(lockfile.fileno(),
- fcntl.LOCK_EX | fcntl.LOCK_NB)
- except IOError:
- # otherwise exit and give a warning to the user
+ if locked(lockfile.fileno()):
self.fatal_error("Another instance of Bcfg2 is running. "
"If you want to bypass the check, run "
"with the %s option" %
@@ -301,7 +298,8 @@ class Client(object):
raise
except:
lockfile = None
- self.logger.error("Failed to open lockfile")
+ self.logger.error("Failed to open lockfile %s: %s" %
+ (self.setup['lockfile'], sys.exc_info()[1]))
# execute the configuration
self.tools.Execute()
@@ -324,7 +322,7 @@ class Client(object):
self.proxy.RecvStats(Bcfg2.Client.XML.tostring(
feedback,
xml_declaration=False).decode('UTF-8'))
- except Bcfg2.Proxy.ProxyError:
+ except Bcfg2.Client.Proxy.ProxyError:
err = sys.exc_info()[1]
self.logger.error("Failed to upload configuration statistics: "
"%s" % err)