From e9e94e78bb52ca2ec36e3f3402dbde3f8289cdf3 Mon Sep 17 00:00:00 2001 From: Andrew Brestick Date: Thu, 31 Jul 2008 20:50:44 +0000 Subject: added support for alternate metadata plugins in bcfg2-admin git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@4845 ce84e21b-d406-0410-9b95-82705330c041 --- src/lib/Server/Admin/Client.py | 76 +++++++++--------------------------------- 1 file changed, 16 insertions(+), 60 deletions(-) (limited to 'src/lib/Server/Admin/Client.py') diff --git a/src/lib/Server/Admin/Client.py b/src/lib/Server/Admin/Client.py index c51ac1598..1f784a4f2 100644 --- a/src/lib/Server/Admin/Client.py +++ b/src/lib/Server/Admin/Client.py @@ -1,25 +1,14 @@ -import lxml.etree -import fcntl import Bcfg2.Server.Admin +from Bcfg2.Server.Plugins.Metadata import MetadataConsistencyError -class Client(Bcfg2.Server.Admin.Mode): +class Client(Bcfg2.Server.Admin.MetadataCore): __shorthelp__ = 'bcfg2-admin client add attr1=val1 attr2=val2\nbcfg2-admin client del ' __longhelp__ = __shorthelp__ + '\n\tCreate or delete client entries' def __init__(self, configfile): - Bcfg2.Server.Admin.Mode.__init__(self, configfile) - try: - self.bcore = Bcfg2.Server.Core.Core(self.get_repo_path(), [], - [], [], 'foo', False, 'UTF-8') - except Bcfg2.Server.Core.CoreInitError, msg: - self.errExit("Core load failed because %s" % msg) - [self.bcore.fam.Service() for _ in range(5)] - while self.bcore.fam.Service(): - pass - self.tree = lxml.etree.parse(self.get_repo_path() + "/Metadata/clients.xml") - self.root = self.tree.getroot() + Bcfg2.Server.Admin.MetadataCore.__init__(self, configfile) def __call__(self, args): - Bcfg2.Server.Admin.Mode.__call__(self, args) + Bcfg2.Server.Admin.MetadataCore.__call__(self, args) if len(args) == 0: self.errExit("Client mode requires at least one argument: or ") if "-h" in args: @@ -30,55 +19,22 @@ class Client(Bcfg2.Server.Admin.Mode): attr_d = {} for i in args[2:]: attr, val = i.split('=', 1) - if attr not in ['profile', 'uuid', 'password', 'address', - 'secure', 'location']: + if attr not in ['profile', 'user', 'state', 'image', + 'action']: print "Attribute %s unknown" % attr raise SystemExit(1) attr_d[attr] = val - self.add_client(args[1], attr_d) + try: + self.metadata.add_client(args[1], attr_d) + except MetadataConsistencyError: + print "Error in adding client" + raise SystemExit(1) elif args[0] in ['delete', 'remove', 'del', 'rm']: - self.del_client(args[1]) + try: + self.metadata.remove_client(args[1]) + except MetadataConsistencyError: + print "Error in deleting client" + raise SystemExit(1) else: print "No command specified" raise SystemExit(1) - client_tree = open(self.get_repo_path() + "/Metadata/clients.xml","w") - fd = client_tree.fileno() - while True: - try: - fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) - except IOError: - continue - else: - break - self.tree.write(client_tree) - fcntl.lockf(fd, fcntl.LOCK_UN) - client_tree.close() - - def add_client(self, client, attrs): - '''add a new client''' - element = lxml.etree.Element("Client", name=client) - for key, val in attrs.iteritems(): - element.set(key, val) - node = self.search_client(client) - if node != None: - print "Client \"%s\" already exists" % (client) - raise SystemExit(1) - self.root.append(element) - - def del_client(self, client): - '''delete an existing client''' - node = self.search_client(client) - if node == None: - print "Client \"%s\" not found" % (client) - raise SystemExit(1) - self.root.remove(node) - - def search_client(self, client): - '''find a client''' - for node in self.root: - if node.attrib["name"] == client: - return node - for child in node: - if child.tag == "Alias" and child.attrib["name"] == client: - return node - return None -- cgit v1.2.3-1-g7c22