diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/Bcfg2/Logger.py | 10 | ||||
-rw-r--r-- | src/lib/Bcfg2/Options.py | 55 | ||||
-rw-r--r-- | src/lib/Bcfg2/Server/Admin/Init.py | 2 | ||||
-rw-r--r-- | src/lib/Bcfg2/Server/Core.py | 9 | ||||
-rw-r--r-- | src/lib/Bcfg2/Server/Plugins/Hostbase.py | 23 | ||||
-rw-r--r-- | src/lib/Bcfg2/Server/Plugins/Packages/Yum.py | 10 | ||||
-rw-r--r-- | src/lib/Bcfg2/Server/Plugins/Pkgmgr.py | 1 | ||||
-rw-r--r-- | src/lib/Bcfg2/settings.py | 2 | ||||
-rwxr-xr-x | src/sbin/bcfg2-crypt | 8 | ||||
-rwxr-xr-x | src/sbin/bcfg2-info | 2 | ||||
-rwxr-xr-x | src/sbin/bcfg2-ping-sweep | 70 |
11 files changed, 80 insertions, 112 deletions
diff --git a/src/lib/Bcfg2/Logger.py b/src/lib/Bcfg2/Logger.py index 81b45550f..903209ac3 100644 --- a/src/lib/Bcfg2/Logger.py +++ b/src/lib/Bcfg2/Logger.py @@ -57,9 +57,11 @@ class TermiosFormatter(logging.Formatter): lines = int(math.ceil(float(len(record.msg)) / columns)) for lineNumber in range(lines): indices = [idx for idx in [(colNum * lines) + lineNumber - for colNum in range(columns)] if idx < len(record.msg)] - format = (len(indices) * (" %%-%ds " % columnWidth)) - returns.append(format % tuple([record.msg[idx] for idx in indices])) + for colNum in range(columns)] + if idx < len(record.msg)] + retformat = (len(indices) * (" %%-%ds " % columnWidth)) + returns.append(retformat % tuple([record.msg[idx] + for idx in indices])) else: returns.append(str(record.msg)) if record.exc_info: @@ -86,6 +88,8 @@ class FragmentingSysLogHandler(logging.handlers.SysLogHandler): error = record.exc_info record.exc_info = None msgdata = record.msg + if len(msgdata) == 0: + return while msgdata: newrec = copy.copy(record) newrec.msg = msgdata[:250] diff --git a/src/lib/Bcfg2/Options.py b/src/lib/Bcfg2/Options.py index 37781e2ed..e768284b9 100644 --- a/src/lib/Bcfg2/Options.py +++ b/src/lib/Bcfg2/Options.py @@ -1,11 +1,12 @@ """Option parsing library for utilities.""" -import re -import os -import sys import copy -import shlex import getopt +import inspect +import os +import re +import shlex +import sys import Bcfg2.Client.Tools # Compatibility imports from Bcfg2.Bcfg2Py3k import ConfigParser @@ -61,7 +62,8 @@ class Option(object): return value def __init__(self, desc, default, cmd=False, odesc=False, - env=False, cf=False, cook=False, long_arg=False): + env=False, cf=False, cook=False, long_arg=False, + deprecated_cf=None): self.desc = desc self.default = default self.cmd = cmd @@ -75,6 +77,7 @@ class Option(object): self.odesc = odesc self.env = env self.cf = cf + self.deprecated_cf = deprecated_cf self.boolean = False if not odesc and not cook and isinstance(self.default, bool): self.boolean = True @@ -134,6 +137,15 @@ class Option(object): return except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): pass + if self.deprecated_cf: + try: + self.value = self.get_cooked_value(configparser.get(*self.deprecated_cf)) + print "Warning: [%s] %s is deprecated, use [%s] %s instead" % \ + (self.cf[0], self.cf[1], self.deprecated_cf[0], self.deprecated_cf[1]) + return + except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): + pass + # Default value not cooked self.value = self.default @@ -149,8 +161,14 @@ class OptionSet(dict): self.cfp = DefaultConfigParser() if (len(self.cfp.read(self.cfile)) == 0 and ('quiet' not in kwargs or not kwargs['quiet'])): - print("Warning! Unable to read specified configuration file: %s" % - self.cfile) + # suppress warnings if called from bcfg2-admin init + caller = inspect.stack()[-1][1].split('/')[-1] + if caller == 'bcfg2-admin' and len(sys.argv) > 1: + if sys.argv[1] == 'init': + return + else: + print("Warning! Unable to read specified configuration file: %s" % + self.cfile) def buildGetopt(self): return ''.join([opt.buildGetopt() for opt in list(self.values())]) @@ -428,28 +446,34 @@ SERVER_BACKEND = \ # database options DB_ENGINE = \ Option('Database engine', - default='django.db.backends.sqlite3', - cf=('database', 'engine')) + default='sqlite3', + cf=('database', 'engine'), + deprecated_cf=('statistics', 'database_engine')) DB_NAME = \ Option('Database name', default=os.path.join(SERVER_REPOSITORY.default, "bcfg2.sqlite"), - cf=('database', 'name')) + cf=('database', 'name'), + deprecated_cf=('statistics', 'database_name')) DB_USER = \ Option('Database username', default=None, - cf=('database', 'user')) + cf=('database', 'user'), + deprecated_cf=('statistics', 'database_user')) DB_PASSWORD = \ Option('Database password', default=None, - cf=('database', 'password')) + cf=('database', 'password'), + deprecated_cf=('statistics', 'database_password')) DB_HOST = \ Option('Database host', default='localhost', - cf=('database', 'host')) + cf=('database', 'host'), + deprecated_cf=('statistics', 'database_host')) DB_PORT = \ Option('Database port', default='', - cf=('database', 'port'),) + cf=('database', 'port'), + deprecated_cf=('statistics', 'database_port')) # Django options DJANGO_TIME_ZONE = \ @@ -459,7 +483,8 @@ DJANGO_TIME_ZONE = \ DJANGO_DEBUG = \ Option('Django debug', default=None, - cf=('statistics', 'debug'),) + cf=('statistics', 'web_debug'), + cook=get_bool,) # Django options DJANGO_WEB_PREFIX = \ Option('Web prefix', diff --git a/src/lib/Bcfg2/Server/Admin/Init.py b/src/lib/Bcfg2/Server/Admin/Init.py index 65194de06..cbcef3405 100644 --- a/src/lib/Bcfg2/Server/Admin/Init.py +++ b/src/lib/Bcfg2/Server/Admin/Init.py @@ -28,7 +28,7 @@ engine = sqlite3 # 'postgresql', 'mysql', 'mysql_old', 'sqlite3' or 'ado_mssql'. name = # Or path to database file if using sqlite3. -#<repository>/etc/brpt.sqlite is default path if left empty +#<repository>/bcfg2.sqlite is default path if left empty user = # Not used with sqlite3. password = diff --git a/src/lib/Bcfg2/Server/Core.py b/src/lib/Bcfg2/Server/Core.py index 5b84a334d..660d2c3ef 100644 --- a/src/lib/Bcfg2/Server/Core.py +++ b/src/lib/Bcfg2/Server/Core.py @@ -105,13 +105,14 @@ class BaseCore(object): # verify our database schema try: from Bcfg2.Server.SchemaUpdater import update_database, UpdaterError - update_database() + try: + update_database() + except UpdaterError: + self.logger.error("Failed to update database schema") + raise CoreInitError except ImportError: # assume django is not installed pass - except UpdaterError: - self.logger.error("Failed to update database schema") - raise CoreInitError except Exception: inst = sys.exc_info()[1] self.logger.error("Failed to update database schema") diff --git a/src/lib/Bcfg2/Server/Plugins/Hostbase.py b/src/lib/Bcfg2/Server/Plugins/Hostbase.py index e9c1c1cff..69b019160 100644 --- a/src/lib/Bcfg2/Server/Plugins/Hostbase.py +++ b/src/lib/Bcfg2/Server/Plugins/Hostbase.py @@ -3,19 +3,24 @@ This file provides the Hostbase plugin. It manages dns/dhcp/nis host information """ +from lxml.etree import Element, SubElement import os +import re +from time import strftime os.environ['DJANGO_SETTINGS_MODULE'] = 'Bcfg2.Server.Hostbase.settings' -from lxml.etree import Element, SubElement import Bcfg2.Server.Plugin from Bcfg2.Server.Plugin import PluginExecutionError, PluginInitError -from time import strftime -from sets import Set from django.template import Context, loader from django.db import connection -import re # Compatibility imports from Bcfg2.Bcfg2Py3k import StringIO +try: + set +except NameError: + # deprecated since python 2.6 + from sets import Set as set + class Hostbase(Bcfg2.Server.Plugin.Plugin, Bcfg2.Server.Plugin.Structure, @@ -383,7 +388,7 @@ class Hostbase(Bcfg2.Server.Plugin.Plugin, """) hostbase = cursor.fetchall() domains = [host[0].split(".", 1)[1] for host in hostbase] - domains_set = Set(domains) + domains_set = set(domains) domain_data = [(domain, domains.count(domain)) for domain in domains_set] domain_data.sort() @@ -393,7 +398,7 @@ class Hostbase(Bcfg2.Server.Plugin.Plugin, ips = cursor.fetchall() three_octets = [ip[0].rstrip('0123456789').rstrip('.') \ for ip in ips] - three_octets_set = Set(three_octets) + three_octets_set = set(three_octets) three_octets_data = [(octet, three_octets.count(octet)) \ for octet in three_octets_set] three_octets_data.sort() @@ -412,7 +417,7 @@ class Hostbase(Bcfg2.Server.Plugin.Plugin, append_data.append((three_octet, tuple(tosort))) two_octets = [ip.rstrip('0123456789').rstrip('.') for ip in three_octets] - two_octets_set = Set(two_octets) + two_octets_set = set(two_octets) two_octets_data = [(octet, two_octets.count(octet)) for octet in two_octets_set] two_octets_data.sort() @@ -446,7 +451,7 @@ class Hostbase(Bcfg2.Server.Plugin.Plugin, else: if appenddata[0] == ip[0]: simple = False - ips.append((appenddata[2], appenddata[0], Set(namelist), + ips.append((appenddata[2], appenddata[0], set(namelist), cnamelist, simple, appenddata[1])) appenddata = ip simple = True @@ -455,7 +460,7 @@ class Hostbase(Bcfg2.Server.Plugin.Plugin, if ip[4]: cnamelist.append(ip[4].split('.', 1)[0]) simple = False - ips.append((appenddata[2], appenddata[0], Set(namelist), + ips.append((appenddata[2], appenddata[0], set(namelist), cnamelist, simple, appenddata[1])) context = Context({ 'subnet': subnet[0], diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/Yum.py b/src/lib/Bcfg2/Server/Plugins/Packages/Yum.py index ce1d9886f..24187d7a9 100644 --- a/src/lib/Bcfg2/Server/Plugins/Packages/Yum.py +++ b/src/lib/Bcfg2/Server/Plugins/Packages/Yum.py @@ -1,14 +1,11 @@ import os import re import sys -import time import copy -import glob import socket import logging -import threading import lxml.etree -from subprocess import Popen, PIPE, STDOUT +from subprocess import Popen, PIPE import Bcfg2.Server.Plugin from Bcfg2.Bcfg2Py3k import StringIO, cPickle, HTTPError, URLError, \ ConfigParser, file @@ -434,7 +431,7 @@ class YumCollection(Collection): default="auto")) if attrs['version'] == 'any': return attrs - + if pkgtup[1]: attrs['arch'] = pkgtup[1] if pkgtup[2]: @@ -621,7 +618,6 @@ class YumSource(Source): self.filemap, self.url_map), cache, 2) cache.close() - def load_state(self): if not self.use_yum: data = file(self.cachefile) @@ -636,7 +632,7 @@ class YumSource(Source): usettings = [{'version':self.version, 'component':comp, 'arch':arch} for comp in self.components] - else: # rawurl given + else: # rawurl given usettings = [{'version':self.version, 'component':None, 'arch':arch}] diff --git a/src/lib/Bcfg2/Server/Plugins/Pkgmgr.py b/src/lib/Bcfg2/Server/Plugins/Pkgmgr.py index 87fac9b1b..7dac907e1 100644 --- a/src/lib/Bcfg2/Server/Plugins/Pkgmgr.py +++ b/src/lib/Bcfg2/Server/Plugins/Pkgmgr.py @@ -11,6 +11,7 @@ import Bcfg2.Server.Lint try: set except NameError: + # deprecated since python 2.6 from sets import Set as set logger = logging.getLogger('Bcfg2.Plugins.Pkgmgr') diff --git a/src/lib/Bcfg2/settings.py b/src/lib/Bcfg2/settings.py index 815a9529b..ae0cff070 100644 --- a/src/lib/Bcfg2/settings.py +++ b/src/lib/Bcfg2/settings.py @@ -52,7 +52,7 @@ def read_config(cfile='/etc/bcfg2.conf', repo=None, quiet=False): repo = setup['repo'] DATABASES['default'] = \ - dict(ENGINE=setup['db_engine'], + dict(ENGINE="django.db.backends.%s" % setup['db_engine'], NAME=setup['db_name'], USER=setup['db_user'], PASSWORD=setup['db_password'], diff --git a/src/sbin/bcfg2-crypt b/src/sbin/bcfg2-crypt index 89dfe3e2a..79f9e26a2 100755 --- a/src/sbin/bcfg2-crypt +++ b/src/sbin/bcfg2-crypt @@ -7,7 +7,13 @@ import logging import lxml.etree import Bcfg2.Logger import Bcfg2.Options -import Bcfg2.Encryption +try: + import Bcfg2.Encryption +except ImportError: + err = sys.exc_info()[1] + print("Import failed '%s'. Is M2Crypto installed?" % + err) + raise SystemExit(1) LOGGER = None diff --git a/src/sbin/bcfg2-info b/src/sbin/bcfg2-info index f3b2aec10..bba8eca7c 100755 --- a/src/sbin/bcfg2-info +++ b/src/sbin/bcfg2-info @@ -155,7 +155,7 @@ def load_interpreters(): import IPython if hasattr(IPython, "Shell"): interpreters["ipython"] = lambda v: \ - IPython.Shell.IPShell(argv=[], user_ns=v).mainloop + IPython.Shell.IPShell(argv=[], user_ns=v).mainloop() best = "ipython" elif hasattr(IPython, "embed"): interpreters["ipython"] = lambda v: IPython.embed(user_ns=v) diff --git a/src/sbin/bcfg2-ping-sweep b/src/sbin/bcfg2-ping-sweep deleted file mode 100755 index be8994be3..000000000 --- a/src/sbin/bcfg2-ping-sweep +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env python -#GenerateHostInfo - Joey Hagedorn - hagedorn@mcs.anl.gov - -"""Generates hostinfo.xml at a regular interval.""" - -from os import dup2, execl, fork, uname, wait -import sys -import time -import lxml.etree - -import Bcfg2.Options - -if __name__ == '__main__': - opts = {'repo': Bcfg2.Options.SERVER_REPOSITORY, - 'configfile': Bcfg2.Options.CFILE} - setup = Bcfg2.Options.OptionParser(opts) - setup.parse(sys.argv[1:]) - - cfpath = setup['configfile'] - clientdatapath = "%s/Metadata/clients.xml" % setup['repo'] - - clientElement = lxml.etree.parse(clientdatapath) - hostlist = [client.get('name') - for client in clientElement.findall("Client")] - - pids = {} - null = open('/dev/null', 'w+') - - #use uname to detect OS and use -t for darwin and -w for linux - #/bin/ping on linux /sbin/ping on os x - osname = uname()[0] - - while hostlist or pids: - if hostlist and len(list(pids.keys())) < 15: - host = hostlist.pop() - pid = fork() - if pid == 0: - # in child - dup2(null.fileno(), sys.__stdin__.fileno()) - dup2(null.fileno(), sys.__stdout__.fileno()) - dup2(null.fileno(), sys.__stderr__.fileno()) - if osname == 'Linux': - execl('/bin/ping', 'ping', '-w', '5', '-c', '1', host) - elif osname in ['Darwin', 'FreeBSD']: - execl('/sbin/ping', 'ping', '-t', '5', '-c', '1', host) - elif osname == 'SunOS': - execl('/usr/sbin/ping', 'ping', host, '56', '1') - else: # default - execl('/bin/ping', 'ping', '-w', '5', '-c', '1', host) - else: - pids[pid] = host - else: - try: - (cpid, status) = wait() - except OSError: - continue - chost = pids[cpid] - del pids[cpid] - elm = clientElement.xpath("//Client[@name='%s']" % chost)[0] - if status == 0: - elm.set("pingable", 'Y') - elm.set("pingtime", str(time.time())) - else: - elm.set("pingable", 'N') - - fout = open(clientdatapath, 'w') - fout.write(lxml.etree.tostring(clientElement.getroot(), - encoding='UTF-8', - xml_declaration=True)) - fout.close() |