From: root <root@xxxxxxxxxxxxxxxxx>
diff --git a/cobbler/action_enchant.py b/cobbler/action_enchant.py
index 3bf80f8..4a54ebe 100644
--- a/cobbler/action_enchant.py
+++ b/cobbler/action_enchant.py
@@ -40,9 +40,9 @@ class Enchant:
raise CX(_("enchant failed. no address specified"))
if system is None and profile is None:
raise CX(_("enchant failed. no profile specified"))
- if system is not None and self.config.systems().find(system) is None:
+ if system is not None and self.config.systems().find(name=system) is None:
raise CX(_("enchant failed. system not found"))
- if profile is not None and self.config.profiles().find(profile) is None:
+ if profile is not None and self.config.profiles().find(name=profile) is None:
raise CX(_("enchant failed. profile name not found"))
diff --git a/cobbler/action_import.py b/cobbler/action_import.py
index 5789ae0..c74bc81 100644
--- a/cobbler/action_import.py
+++ b/cobbler/action_import.py
@@ -155,7 +155,7 @@ class Importer:
"""
for profile in self.profiles:
- distro = self.distros.find(profile.distro)
+ distro = self.distros.find(name=profile.distro)
if distro is None or not (distro in self.distros_added):
print _("- skipping distro %s since it wasn't imported this time") % profile.distro
continue
@@ -429,7 +429,7 @@ class Importer:
pxe_arch = self.get_pxe_arch(dirname)
name = self.get_proposed_name(dirname, pxe_arch)
- existing_distro = self.distros.find(name)
+ existing_distro = self.distros.find(name=name)
if existing_distro is not None:
print _("- modifying existing distro: %s") % name
@@ -446,7 +446,7 @@ class Importer:
self.distros.add(distro)
self.distros_added.append(distro)
- existing_profile = self.profiles.find(name)
+ existing_profile = self.profiles.find(name=name)
if existing_profile is None:
print _("- creating new profile: %s") % name
diff --git a/cobbler/action_litesync.py b/cobbler/action_litesync.py
index 21e6c62..2560d8d 100644
--- a/cobbler/action_litesync.py
+++ b/cobbler/action_litesync.py
@@ -53,7 +53,7 @@ class BootLiteSync:
def add_single_distro(self, name):
# get the distro record
- distro = self.distros.find(name)
+ distro = self.distros.find(name=name)
if distro is None:
raise CX(_("error in distro lookup: %s") % name)
# generate YAML file in distros/$name in webdir
@@ -73,7 +73,7 @@ class BootLiteSync:
def add_single_profile(self, name):
# get the profile object:
- profile = self.profiles.find(name)
+ profile = self.profiles.find(name=name)
if profile is None:
raise CX(_("error in profile lookup"))
# rebuild profile_list YAML file in webdir
@@ -93,7 +93,7 @@ class BootLiteSync:
def add_single_system(self, name):
# get the system object:
- system = self.systems.find(name)
+ system = self.systems.find(name=name)
if system is None:
raise CX(_("error in system lookup for %s") % name)
# rebuild system_list file in webdir
@@ -106,7 +106,7 @@ class BootLiteSync:
self.sync.validate_kickstart_for_specific_system(system)
def remove_single_system(self, name):
- system_record = self.systems.find(name)
+ system_record = self.systems.find(name=name)
# rebuild system_list file in webdir
self.sync.write_listings()
# delete system YAML file in systems/$name in webdir
@@ -118,11 +118,11 @@ class BootLiteSync:
# delete PXE Linux configuration file (which might be in one of two places)
itanic = False
- system_record = self.systems.find(name)
- profile = self.profiles.find(system_record.profile)
+ system_record = self.systems.find(name=name)
+ profile = self.profiles.find(name=system_record.profile)
# allow cobbler deletes to still work in the cobbler config is discombobulated
if profile is not None:
- distro = self.distros.find(profile.distro)
+ distro = self.distros.find(name=profile.distro)
if distro is not None and distro in [ "ia64", "IA64"]:
itanic = True
if not itanic:
diff --git a/cobbler/action_status.py b/cobbler/action_status.py
index 158ee30..660fb42 100644
--- a/cobbler/action_status.py
+++ b/cobbler/action_status.py
@@ -17,6 +17,7 @@ import os
import os.path
import glob
import time
+import api as cobbler_api
from rhpl.translate import _, N_, textdomain, utf8
@@ -99,6 +100,8 @@ class BootStatusReport:
tracking will be incomplete. This should be noted in the docs.
"""
+ api = cobbler_api.BootAPI()
+
apache_results = self.scan_apache_logfiles()
syslog_results = self.scan_syslog_logfiles()
ips = apache_results.keys()
@@ -112,9 +115,9 @@ class BootStatusReport:
last_recorded_time = 0
time_collisions = 0
- #header = ("Address", "State", "Started", "Last Request", "Seconds", "Log Entries")
+ #header = ("Name", "State", "Started", "Last Request", "Seconds", "Log Entries")
print "%-20s | %-15s | %-25s | %-25s | %-10s | %-6s" % (
- _("Address"),
+ _("Name"),
_("State"),
_("Last Request"),
_("Started"),
@@ -150,20 +153,19 @@ class BootStatusReport:
else:
entries[logtime] = "1"
-
- self.generate_report(entries,ip)
+ name = api.systems().find(ip_address=ip).name
+ self.generate_report(entries,name)
return True
#-----------------------------------------
- def generate_report(self,entries,ip):
+ def generate_report(self,entries,name):
"""
Given the information about transferred files and kickstart finish times, attempt
to produce a report that most describes the state of the system.
"""
-
# sort the access times
rtimes = entries.keys()
rtimes.sort()
@@ -175,7 +177,7 @@ class BootStatusReport:
fcount = 0
if len(rtimes) == 0:
- print _("%s: ?") % ip
+ print _("%s: ?") % name
return
# for each request time the machine has made
@@ -215,7 +217,7 @@ class BootStatusReport:
# print the status line for this IP address
print "%-20s | %-15s | %-25s | %-25s | %-10s | %-6s" % (
- ip,
+ name,
install_state,
display_start,
display_last,
diff --git a/cobbler/action_sync.py b/cobbler/action_sync.py
index ae65ccc..1e12aa8 100644
--- a/cobbler/action_sync.py
+++ b/cobbler/action_sync.py
@@ -367,7 +367,7 @@ class BootSync:
buf = ""
repos = profile.repos
for r in repos:
- repo = self.repos.find(r)
+ repo = self.repos.find(name=r)
if repo is None:
continue
http_url = "http://%s/cblr/repo_mirror/%s" % (self.settings.server, repo.name)
@@ -389,7 +389,7 @@ class BootSync:
repos = profile.repos
buf = ""
for r in repos:
- repo = self.repos.find(r)
+ repo = self.repos.find(name=r)
if repo is None:
continue
repo.local_filename = repo.local_filename.replace(".repo","")
diff --git a/cobbler/cobbler.py b/cobbler/cobbler.py
index 13daabd..0f34eee 100755
--- a/cobbler/cobbler.py
+++ b/cobbler/cobbler.py
@@ -200,7 +200,7 @@ class BootCLI:
def __list_names2(self, collection, args):
for p in args:
- obj = collection.find(p)
+ obj = collection.find(name=p)
if obj is not None:
print obj.printable()
return True
@@ -269,7 +269,7 @@ class BootCLI:
control_fn(args,obj)
def __generic_edit(self,args,collection_fn,control_fn,exc_msg):
- obj = collection_fn().find(self.find_arg(args,"--name"))
+ obj = collection_fn().find(name=self.find_arg(args,"--name"))
name2 = self.find_arg(args,"--newname")
if name2 is not None:
raise CX("objects cannot be renamed with the edit command, use 'rename'")
@@ -278,7 +278,7 @@ class BootCLI:
control_fn(args,obj)
def __generic_copy(self,args,collection_fn,control_fn,exc_msg):
- obj = collection_fn().find(self.find_arg(args,"--name"))
+ obj = collection_fn().find(name=self.find_arg(args,"--name"))
obj2 = self.find_arg(args,"--newname")
if obj is None:
raise CX(exc_msg)
diff --git a/cobbler/cobblerd.py b/cobbler/cobblerd.py
index 54294cb..d9a5ced 100644
--- a/cobbler/cobblerd.py
+++ b/cobbler/cobblerd.py
@@ -71,10 +71,11 @@ def do_syslog(bootapi, settings, port, logger):
while 1:
data, addr = s.recvfrom(buf)
(ip, port) = addr
- if not data:
+ name = bootapi.systems().find(ip_address = ip)
+ if not data and name:
break
else:
- logfile = open("/var/log/cobbler/syslog/%s" % ip, "a+")
+ logfile = open("/var/log/cobbler/syslog/%s" % name, "a+")
t = time.localtime()
# write numeric time
seconds = str(time.mktime(t))
@@ -118,7 +119,7 @@ class CobblerXMLRPCInterface:
# feature disabled!
return False
systems = self.api.systems()
- obj = systems.find(name)
+ obj = systems.find(name=name)
if obj == None:
# system not found!
return False
@@ -148,7 +149,7 @@ class CobblerXMLRPCInterface:
def __get_specific(self,collection,name):
self.api.clear()
self.api.deserialize()
- item = collection.find(name)
+ item = collection.find(name=name)
if item is None:
return self.fix_none({})
return self.fix_none(item.to_datastruct())
@@ -169,7 +170,7 @@ class CobblerXMLRPCInterface:
def get_distro_for_koan(self,name):
self.api.clear()
self.api.deserialize()
- obj = cobbler_api.distros().find(name)
+ obj = cobbler_api.distros().find(name=name)
if obj is not None:
return self.fix_none(utils.blender(True, obj))
return self.fix_none({})
@@ -177,7 +178,7 @@ class CobblerXMLRPCInterface:
def get_profile_for_koan(self,name):
self.api.clear()
self.api.deserialize()
- obj = self.api.profiles().find(name)
+ obj = self.api.profiles().find(name=name)
if obj is not None:
return self.fix_none(utils.blender(True, obj))
return self.fix_none({})
@@ -185,7 +186,7 @@ class CobblerXMLRPCInterface:
def get_system_for_koan(self,name):
self.api.clear()
self.api.deserialize()
- obj = self.api.systems().find(name)
+ obj = self.api.systems().find(name=name)
if obj is not None:
return self.fix_none(utils.blender(True, obj))
return self.fix_none({})
@@ -193,7 +194,7 @@ class CobblerXMLRPCInterface:
def get_repo_for_koan(self,name):
self.api.clear()
self.api.deserialize()
- obj = self.api.repos().find(name)
+ obj = self.api.repos().find(name=name)
if obj is not None:
return self.fix_none(utils.blender(True, obj))
return self.fix_none({})
diff --git a/cobbler/collection.py b/cobbler/collection.py
index 0c743f4..b2e3628 100644
--- a/cobbler/collection.py
+++ b/cobbler/collection.py
@@ -30,8 +30,8 @@ class Collection(serializable.Serializable):
def __init__(self,config):
"""
- Constructor.
- """
+ Constructor.
+ """
self.config = config
self.clear()
@@ -54,17 +54,17 @@ class Collection(serializable.Serializable):
"""
self.listing = {}
- def find(self,name):
+ def find(self, **kargs):
"""
- Return anything named 'name' in the collection, else return None if
- no objects can be found.
+ Return first object in the collection that maches all item='value'
+ pairs passed, else return None if no objects can be found.
"""
- n1 = name.lower()
- listing = self.listing
- if listing.has_key(n1):
- return self.listing[n1]
- else:
- return None
+ kargs = dict((k.lower(), v.lower()) for k, v in kargs.items())
+ for entry in self.to_datastruct():
+ match = dict((k.lower(), v.lower()) for k, v in entry.items() if kargs.has_key(k))
+ if match == kargs:
+ return self.listing[entry['name'].lower()]
+ return None
def to_datastruct(self):
"""
diff --git a/cobbler/collection_distros.py b/cobbler/collection_distros.py
index 70029eb..9ab9e3c 100644
--- a/cobbler/collection_distros.py
+++ b/cobbler/collection_distros.py
@@ -51,7 +51,7 @@ class Distros(collection.Collection):
for v in self.config.profiles():
if v.distro == name:
raise CX(_("removal would orphan profile: %s") % v.name)
- if self.find(name):
+ if self.find(name=name):
if with_delete:
self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/distro/pre/*")
lite_sync = action_litesync.BootLiteSync(self.config)
diff --git a/cobbler/collection_profiles.py b/cobbler/collection_profiles.py
index ac1798e..7331b08 100644
--- a/cobbler/collection_profiles.py
+++ b/cobbler/collection_profiles.py
@@ -49,7 +49,7 @@ class Profiles(collection.Collection):
for v in self.config.systems():
if v.profile == name:
raise CX(_("removal would orphan system: %s") % v.name)
- if self.find(name):
+ if self.find(name=name):
if with_delete:
self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/profile/pre/*")
lite_sync = action_litesync.BootLiteSync(self.config)
diff --git a/cobbler/collection_repos.py b/cobbler/collection_repos.py
index 8ffa1bf..ed62d88 100644
--- a/cobbler/collection_repos.py
+++ b/cobbler/collection_repos.py
@@ -53,7 +53,7 @@ class Repos(collection.Collection):
# NOTE: with_delete isn't currently meaningful for repos
# but is left in for consistancy in the API. Unused.
name = name.lower()
- if self.find(name):
+ if self.find(name=name):
if with_delete:
self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/repo/pre/*")
self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/repo/post/*")
diff --git a/cobbler/collection_systems.py b/cobbler/collection_systems.py
index 5ffcea5..58f9e13 100644
--- a/cobbler/collection_systems.py
+++ b/cobbler/collection_systems.py
@@ -49,7 +49,7 @@ class Systems(collection.Collection):
Remove element named 'name' from the collection
"""
name = name.lower()
- if self.find(name):
+ if self.find(name=name):
if with_delete:
self._run_triggers(self.listing[name], "/var/lib/cobbler/triggers/delete/system/pre/*")
lite_sync = action_litesync.BootLiteSync(self.config)
diff --git a/cobbler/item_distro.py b/cobbler/item_distro.py
index 4bbf32f..4a97fcf 100644
--- a/cobbler/item_distro.py
+++ b/cobbler/item_distro.py
@@ -55,7 +55,7 @@ class Distro(item.Item):
if self.parent is None or self.parent == '':
return None
else:
- return self.config.distros().find(self.parent)
+ return self.config.distros().find(name=self.parent)
def from_datastruct(self,seed_data):
"""
diff --git a/cobbler/item_profile.py b/cobbler/item_profile.py
index c7c9814..4062826 100644
--- a/cobbler/item_profile.py
+++ b/cobbler/item_profile.py
@@ -91,7 +91,7 @@ class Profile(item.Item):
# check must be done in two places as set_parent could be called before/after
# set_name...
raise CX(_("self parentage is weird"))
- found = self.config.profiles().find(parent_name)
+ found = self.config.profiles().find(name=parent_name)
if found is None:
raise CX(_("profile %s not found, inheritance not possible") % parent_name)
self.parent = parent_name
@@ -102,7 +102,7 @@ class Profile(item.Item):
Sets the distro. This must be the name of an existing
Distro object in the Distros collection.
"""
- d = self.config.distros().find(distro_name)
+ d = self.config.distros().find(name=distro_name)
if d is not None:
self.distro = distro_name
self.depth = d.depth +1 # reset depth if previously a subprofile and now top-level
@@ -125,7 +125,7 @@ class Profile(item.Item):
except:
pass
for r in repolist:
- if not self.config.repos().find(r):
+ if not self.config.repos().find(name=r):
ok = False
break
if ok:
@@ -203,9 +203,9 @@ class Profile(item.Item):
Return object next highest up the tree.
"""
if self.parent is None or self.parent == '':
- result = self.config.distros().find(self.distro)
+ result = self.config.distros().find(name=self.distro)
else:
- result = self.config.profiles().find(self.parent)
+ result = self.config.profiles().find(name=self.parent)
return result
def is_valid(self):
diff --git a/cobbler/item_system.py b/cobbler/item_system.py
index cb7d02f..3575d79 100644
--- a/cobbler/item_system.py
+++ b/cobbler/item_system.py
@@ -93,9 +93,9 @@ class System(item.Item):
Return object next highest up the tree.
"""
if self.parent is None or self.parent == '':
- return self.config.profiles().find(self.profile)
+ return self.config.profiles().find(name=self.profile)
else:
- return self.config.systems().find(self.parent)
+ return self.config.systems().find(name=self.parent)
def set_name(self,name):
"""
@@ -180,10 +180,10 @@ class System(item.Item):
def set_profile(self,profile_name):
"""
- Set the system to use a certain named profile. The profile
- must have already been loaded into the Profiles collection.
- """
- p = self.config.profiles().find(profile_name)
+ Set the system to use a certain named profile. The profile
+ must have already been loaded into the Profiles collection.
+ """
+ p = self.config.profiles().find(name=profile_name)
if p is not None:
self.profile = profile_name
self.depth = p.depth + 1 # subprofiles have varying depths.
@@ -229,8 +229,8 @@ class System(item.Item):
def is_valid(self):
"""
- A system is valid when it contains a valid name and a profile.
- """
+ A system is valid when it contains a valid name and a profile.
+ """
# NOTE: this validation code does not support inheritable distros at this time.
# this is by design as inheritable systems don't make sense.
if self.name is None:
diff --git a/tests/tests.py b/tests/tests.py
index 2f082e7..97b685c 100644
--- a/tests/tests.py
+++ b/tests/tests.py
@@ -84,20 +84,20 @@ class BootTest(unittest.TestCase):
self.assertTrue(distro.set_kernel(self.fk_kernel))
self.assertTrue(distro.set_initrd(self.fk_initrd))
self.assertTrue(self.api.distros().add(distro))
- self.assertTrue(self.api.distros().find("testdistro0"))
+ self.assertTrue(self.api.distros().find(name="testdistro0"))
profile = self.api.new_profile()
self.assertTrue(profile.set_name("testprofile0"))
self.assertTrue(profile.set_distro("testdistro0"))
self.assertTrue(profile.set_kickstart(FAKE_KICKSTART))
self.assertTrue(self.api.profiles().add(profile))
- self.assertTrue(self.api.profiles().find("testprofile0"))
+ self.assertTrue(self.api.profiles().find(name="testprofile0"))
system = self.api.new_system()
self.assertTrue(system.set_name(self.hostname))
self.assertTrue(system.set_profile("testprofile0"))
self.assertTrue(self.api.systems().add(system))
- self.assertTrue(self.api.systems().find(self.hostname))
+ self.assertTrue(self.api.systems().find(name=self.hostname))
class Utilities(BootTest):
@@ -149,7 +149,7 @@ class Additions(BootTest):
self.failUnlessRaises(CobblerException,distro.set_kernel,"filedoesntexist")
self.assertTrue(distro.set_initrd(self.fk_initrd))
self.failUnlessRaises(CobblerException, self.api.distros().add, distro)
- self.assertFalse(self.api.distros().find("testdistro2"))
+ self.assertFalse(self.api.distros().find(name="testdistro2"))
def test_invalid_distro_non_referenced_initrd(self):
distro = self.api.new_distro()
@@ -157,7 +157,7 @@ class Additions(BootTest):
self.assertTrue(distro.set_kernel(self.fk_kernel))
self.failUnlessRaises(CobblerException, distro.set_initrd, "filedoesntexist")
self.failUnlessRaises(CobblerException, self.api.distros().add, distro)
- self.assertFalse(self.api.distros().find("testdistro3"))
+ self.assertFalse(self.api.distros().find(name="testdistro3"))
def test_invalid_profile_non_referenced_distro(self):
profile = self.api.new_profile()
@@ -165,7 +165,7 @@ class Additions(BootTest):
self.failUnlessRaises(CobblerException, profile.set_distro, "distrodoesntexist")
self.assertTrue(profile.set_kickstart(FAKE_KICKSTART))
self.failUnlessRaises(CobblerException, self.api.profiles().add, profile)
- self.assertFalse(self.api.profiles().find("testprofile2"))
+ self.assertFalse(self.api.profiles().find(name="testprofile2"))
def test_invalid_profile_kickstart_not_url(self):
profile = self.api.new_profile()
@@ -174,7 +174,7 @@ class Additions(BootTest):
self.failUnlessRaises(CobblerException, profile.set_kickstart, "kickstartdoesntexist")
# since kickstarts are optional, you can still add it
self.assertTrue(self.api.profiles().add(profile))
- self.assertTrue(self.api.profiles().find("testprofile12"))
+ self.assertTrue(self.api.profiles().find(name="testprofile12"))
# now verify the other kickstart forms would still work
self.assertTrue(profile.set_kickstart("http://bar"))
self.assertTrue(profile.set_kickstart("ftp://bar"))
@@ -199,7 +199,7 @@ class Additions(BootTest):
self.assertTrue(system.set_name(name))
self.assertTrue(system.set_profile("testprofile0"))
self.assertTrue(self.api.systems().add(system))
- self.assertTrue(self.api.systems().find(name))
+ self.assertTrue(self.api.systems().find(name=name))
def test_system_name_is_an_IP(self):
system = self.api.new_system()
@@ -207,7 +207,7 @@ class Additions(BootTest):
self.assertTrue(system.set_name(name))
self.assertTrue(system.set_profile("testprofile0"))
self.assertTrue(self.api.systems().add(system))
- self.assertTrue(self.api.systems().find(name))
+ self.assertTrue(self.api.systems().find(name=name))
def test_invalid_system_non_referenced_profile(self):
system = self.api.new_system()
@@ -241,9 +241,9 @@ class Deletions(BootTest):
self.api.serialize()
self.assertTrue(self.api.profiles().remove("testprofile0"))
self.assertTrue(self.api.distros().remove("testdistro0"))
- self.assertFalse(self.api.systems().find(self.hostname))
- self.assertFalse(self.api.profiles().find("testprofile0"))
- self.assertFalse(self.api.distros().find("testdistro0"))
+ self.assertFalse(self.api.systems().find(name=self.hostname))
+ self.assertFalse(self.api.profiles().find(name="testprofile0"))
+ self.assertFalse(self.api.distros().find(name="testdistro0"))
class TestCheck(BootTest):