summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael DeHaan <mdehaan@redhat.com>2006-05-05 11:13:16 -0400
committerJim Meyering <jim@meyering.net>2006-05-05 11:13:16 -0400
commit9aef401e5787d9c00424dbdfceb577aa9ce1f012 (patch)
treefcc122acbccbe42a5a1d7ea79eec8e3c24e178c2
parenta5ffe9dda2488240d3fa440a11b2a88267110031 (diff)
downloadthird_party-cobbler-9aef401e5787d9c00424dbdfceb577aa9ce1f012.tar.gz
third_party-cobbler-9aef401e5787d9c00424dbdfceb577aa9ce1f012.tar.xz
third_party-cobbler-9aef401e5787d9c00424dbdfceb577aa9ce1f012.zip
Make /etc/cobbler.conf be packaged instead of being created, proper handling of parse errors on config files, tweaking unit tests tempfile stuff since sync() test is currently broken by the tempfile changes (why??)
-rw-r--r--Makefile1
-rw-r--r--cobbler.conf11
-rw-r--r--cobbler/api.py12
-rwxr-xr-xcobbler/cobbler.py37
-rw-r--r--cobbler/config.py25
-rw-r--r--cobbler/msg.py6
-rw-r--r--cobbler/sync.py1
-rw-r--r--setup.py2
-rw-r--r--tests/tests.py14
9 files changed, 60 insertions, 49 deletions
diff --git a/Makefile b/Makefile
index 8e917c0..ef8922d 100644
--- a/Makefile
+++ b/Makefile
@@ -7,6 +7,7 @@ manpage:
test:
python tests/tests.py
+ \rm -rf /tmp/_cobbler-*
install: clean manpage
python setup.py sdist
diff --git a/cobbler.conf b/cobbler.conf
new file mode 100644
index 0000000..f41ed35
--- /dev/null
+++ b/cobbler.conf
@@ -0,0 +1,11 @@
+---
+config:
+ httpd_bin: /usr/sbin/httpd
+ pxelinux: /usr/lib/syslinux/pxelinux.0
+ dhcpd_conf: /etc/dhcpd.conf
+ tftpd_bin: /usr/sbin/in.tftpd
+ server: localhost
+ dhcpd_bin: /usr/sbin/dhcpd
+ kernel_options: append devfs=nomount ramdisk_size=16438 lang= vga=788 ksdevice=eth0
+ tftpd_conf: /etc/xinetd.d/tftp
+ tftpboot: /tftpboot
diff --git a/cobbler/api.py b/cobbler/api.py
index 77dd835..e48fe7a 100644
--- a/cobbler/api.py
+++ b/cobbler/api.py
@@ -29,13 +29,19 @@ class BootAPI:
try:
if self.config.files_exist():
self.config.deserialize()
- except:
- # traceback.print_exc()
- print m("no_cfg")
+ except Exception, e:
+ # parse errors, attempt to recover
+ print self.last_error
+ if self.last_error == m("parse_error"):
+ # the error came from /etc/cobbler.conf, and must be fixed
+ # manually, CLI can't do it for policy reasons on /etc
+ raise Exception, "parse_error"
try:
self.config.serialize()
except:
+ # shouldn't get here. File permissions issue, perhaps?
traceback.print_exc()
+ raise Exception, "parse_error2"
if not self.config.files_exist():
self.config.serialize()
diff --git a/cobbler/cobbler.py b/cobbler/cobbler.py
index 0b26307..fb58ff7 100755
--- a/cobbler/cobbler.py
+++ b/cobbler/cobbler.py
@@ -10,6 +10,7 @@ import os
import sys
import api
import syck
+import traceback
from msg import *
class BootCLI:
@@ -59,13 +60,13 @@ class BootCLI:
def run(self):
"""
- Run the command line
+ Run the command line and return system exit code
"""
rc = self.curry_args(self.args[1:], self.commands['toplevel'])
if not rc:
print self.api.last_error
- return rc
-
+ return 1
+ return 0
def usage(self,args):
"""
@@ -294,19 +295,21 @@ def main():
# verify syck isn't busted (old syck bindings were)
if not hasattr(syck,"dump"):
- raise Exception("needs a more-recent PySyck")
+ raise Exception("needs a more-recent PySyck")
if os.getuid() != 0:
- # while it's true that we don't technically need root, we do need
- # permissions on a relatively long list of files that ordinarily
- # only root has access to, and we don't know specifically what
- # files are where (other distributions in play, etc). It's
- # fairly safe to assume root is required. This might be patched
- # later.
- print m("need_root")
- sys.exit(1)
- if BootCLI(sys.argv).run():
- sys.exit(0)
- else:
- sys.exit(1)
-
+ # while it's true that we don't technically need root, we do need
+ # permissions on a relatively long list of files that ordinarily
+ # only root has access to, and we don't know specifically what
+ # files are where (other distributions in play, etc). It's
+ # fairly safe to assume root is required. This might be patched
+ # later.
+ print m("need_root")
+ sys.exit(1)
+ try:
+ cli = BootCLI(sys.argv)
+ except Exception, e:
+ if not str(e) or not str(e).startswith("parse_error"):
+ traceback.print_exc()
+ sys.exit(3)
+ sys.exit(cli.run())
diff --git a/cobbler/config.py b/cobbler/config.py
index aa17763..197da91 100644
--- a/cobbler/config.py
+++ b/cobbler/config.py
@@ -15,7 +15,6 @@ global_settings_file = "/etc/cobbler.conf"
global_state_file = "/var/lib/cobbler/cobbler.conf"
-
class BootConfig:
def __init__(self,api):
@@ -153,17 +152,9 @@ class BootConfig:
state = None
# ------
- # dump global config (pathing, urls, etc)...
- try:
- settings = open(self.settings_file,"w+")
- except IOError:
- self.api.last_error = m("cant_create: %s" % self.settings_file)
- return False
- data = self.to_hash(True)
- settings.write(syck.dump(data))
+ # dump internal state (distros, profiles, systems...) into /var/lib/...
+ # /etc is not serialized, it's packaged.
- # ------
- # dump internal state (distros, profiles, systems...)
if not os.path.isdir(os.path.dirname(self.state_file)):
dirname = os.path.dirname(self.state_file)
if dirname != "":
@@ -194,11 +185,10 @@ class BootConfig:
self.from_hash(settings,True)
else:
self.last_error = m("parse_error")
- return False
+ raise Exception("parse_error")
except:
- traceback.print_exc()
self.api.last_error = m("parse_error")
- return False
+ raise Exception("parse_error")
# -----
# load internal state(distros, systems, profiles...)
@@ -207,12 +197,11 @@ class BootConfig:
if state is not None:
self.from_hash(state,False)
else:
- self.last_error = m("parse_error")
- return False
+ self.last_error = m("parse_error2")
+ raise Exception("parse_error2")
except:
- traceback.print_exc()
self.api.last_error = m("parse_error2")
- return False
+ raise Exception("parse_error2")
# all good
return True
diff --git a/cobbler/msg.py b/cobbler/msg.py
index f50443c..1eeb8e6 100644
--- a/cobbler/msg.py
+++ b/cobbler/msg.py
@@ -8,8 +8,8 @@ be reused and potentially translated.
msg_table = {
"bad_server" : "server field in /etc/cobbler.conf must be set to something other than localhost, or kickstarts will fail",
- "parse_error" : "could not parse /etc/cobbler.conf",
- "parse_error2" : "could not parse /var/cobbler/cobbler.conf",
+ "parse_error" : "could not parse /etc/cobbler.conf, must fix manually",
+ "parse_error2" : "could not parse /var/lib/cobbler/cobbler.conf, replacing...",
"no_create" : "cannot create: %s",
"no_args" : "this command requires arguments.",
"missing_options" : "cannot add, all parameters have not been set",
@@ -29,7 +29,7 @@ msg_table = {
"no_exist" : "%s does not exist",
"no_line" : "file '%s' should have a line '%s' somewhere",
"no_dir2" : "can't find %s for %s in cobbler.conf",
- "no_cfg" : "could not find cobbler.conf, recreating",
+ "no_cfg" : "could not find a valid /etc/cobbler.conf, rebuilding",
"bad_param" : "at least one parameter is missing for this function",
"empty_list" : "(Empty)",
"err_resolv" : "system (%s) did not resolve",
diff --git a/cobbler/sync.py b/cobbler/sync.py
index 80b0c67..3494382 100644
--- a/cobbler/sync.py
+++ b/cobbler/sync.py
@@ -101,6 +101,7 @@ class BootSync:
initrd = self.api.utils.find_initrd(d.initrd) # full path
if kernel is None or not os.path.isfile(kernel):
self.api.last_error = "Kernel for distro (%s) cannot be found and needs to be fixed: %s" % (d.name, d.kernel)
+ print self.api.last_error
raise "error"
if initrd is None or not os.path.isfile(initrd):
self.api.last_error = "Initrd for distro (%s) cannot be found and needs to be fixed: %s" % (d.name, d.initrd)
diff --git a/setup.py b/setup.py
index c477095..2a05cea 100644
--- a/setup.py
+++ b/setup.py
@@ -14,6 +14,7 @@ Cobbler is a command line tool for simplified configuration of boot/provisioning
if __name__ == "__main__":
# docspath="share/doc/koan-%s/" % VERSION
manpath="share/man/man1/"
+ etcpath="etc/"
setup(
name="cobbler",
version = VERSION,
@@ -27,6 +28,7 @@ if __name__ == "__main__":
data_files = [
# (docspath, ['README']),
(manpath, ['cobbler.1.gz'])
+ (etcpath, ['cobbler.conf'])
],
description = SHORT_DESC,
long_description = LONG_DESC
diff --git a/tests/tests.py b/tests/tests.py
index 2673cdd..cfe1081 100644
--- a/tests/tests.py
+++ b/tests/tests.py
@@ -24,11 +24,14 @@ FAKE_KERNEL2="vmlinuz-2.5.16-2.2055_FAKE"
FAKE_KERNEL3="vmlinuz-1.8.18-3.9999_FAKE"
FAKE_KICKSTART="http://127.0.0.1/fake.ks"
+cleanup_dirs = []
+
class BootTest(unittest.TestCase):
def setUp(self):
# Create temp dir
- self.topdir = tempfile.mkdtemp(prefix="_cobbler-")
+ self.topdir = tempfile.mkdtemp(prefix="_cobbler-",dir="/tmp")
+ print "using dir = %s" % self.topdir
self.fk_initrd = os.path.join(self.topdir, FAKE_INITRD)
self.fk_initrd2 = os.path.join(self.topdir, FAKE_INITRD2)
self.fk_initrd3 = os.path.join(self.topdir, FAKE_INITRD3)
@@ -37,11 +40,6 @@ class BootTest(unittest.TestCase):
self.fk_kernel2 = os.path.join(self.topdir, FAKE_KERNEL2)
self.fk_kernel3 = os.path.join(self.topdir, FAKE_KERNEL3)
- try:
- # it will interfere with results...
- os.remove("/etc/cobbler.conf")
- except:
- pass
self.api = api.BootAPI()
self.hostname = os.uname()[1]
create = [ self.fk_initrd, self.fk_initrd2, self.fk_initrd3,
@@ -51,7 +49,8 @@ class BootTest(unittest.TestCase):
self.make_basic_config()
def tearDown(self):
- shutil.rmtree(self.topdir, ignore_errors=1)
+ # this is causing problems with the sync() test
+ # shutil.rmtree(self.topdir,ignore_errors=True)
self.api = None
def make_basic_config(self):
@@ -297,4 +296,3 @@ if __name__ == "__main__":
print "tests: must invoke from top level directory"
sys.exit(1)
unittest.main()
-