diff --git a/src/hostinfo.py b/src/hostinfo.py index 122710e4b86a9c8bd399568a8029f1f55fd433cf..35641c4b5cf2d4df564a278d25abd6ceabd189c8 100755 --- a/src/hostinfo.py +++ b/src/hostinfo.py @@ -148,7 +148,6 @@ def host_order(a,b): tag_weight = { ('hostinfo', 'soa') : (1, None), ('hostinfo', 'subnet') : (2, network_order), -# lambda a,b: cmp(a.network[0],b.network[0])), ('hostinfo', 'nameserver') : (3, None), ('hostinfo', 'netgroup') : (4, lambda a,b: cmp(a.name[0],b.name[0])), @@ -158,9 +157,10 @@ tag_weight = { ('host', 'mio') : (3, None), ('interface', 'kickstart') : (1, None), ('interface', 'ip') : (2, None), - ('interface', 'alias') : (3, None), - ('interface', 'dhcpserver') : (4, None), - ('interface', 'nameserver') : (5, None), + ('interface', 'ipv6') : (3, None), + ('interface', 'alias') : (4, None), + ('interface', 'dhcpserver') : (5, None), + ('interface', 'nameserver') : (6, None), ('automount', 'entry') : (1, lambda a,b: cmp(a.key[0],b.key[0])), } @@ -282,7 +282,7 @@ if __name__ == '__main__': options = optParser.parse_args(sys.argv[1:]) hostinfo.options = options - tree = hostinfo.parser.parse(options.hostinfo_xml) + tree = hostinfo.parser.parse(options.hostinfo_xml, include_comments=True) host = options.host file = {} diff --git a/src/hostinfo/dhcpd_ipv6.py b/src/hostinfo/dhcpd_ipv6.py index 7ea126229621cc76878068900b1b0825a56e0ff0..3511a03c7fed9fbc386d05bc0e634e913a06e023 100755 --- a/src/hostinfo/dhcpd_ipv6.py +++ b/src/hostinfo/dhcpd_ipv6.py @@ -85,9 +85,6 @@ def emit_network(tree, options, subnet, dhcp): def emit_subnet_info(subnet): result = util.StringArray() - if subnet.gateway[0]: - result += "option routers %s;" % subnet.gateway[0] - pass if subnet.domain[0]: result += "option domain-name \"%s\";" % subnet.domain[0] pass diff --git a/src/hostinfo/ifconfig.py b/src/hostinfo/ifconfig.py index a541e05550050b177c7b330e2e55b168f15a7d07..6eb2051c35dd87c208b9dbabdfc4eaaf82c30294 100755 --- a/src/hostinfo/ifconfig.py +++ b/src/hostinfo/ifconfig.py @@ -94,9 +94,11 @@ def generate_ifcfgv6(tree, interface, search, nameservers): address = [] for ipv6 in filter(util.address, interface._ipv6_): a = util.address(ipv6) + gateway = None for s in filter(util.network, tree._subnet_ ): n = util.network(s) if a in n: + gateway = s.gateway[0] address.append('%s/%d' % (a, n.prefixlen)) if s.domain[0]: search.update(s.domain[0].split()) @@ -110,6 +112,9 @@ def generate_ifcfgv6(tree, interface, search, nameservers): config.append('IPV6_DEFROUTE=yes') config.append('IPV6_FAILURE_FATAL=no') config.append('IPV6ADDR=%s' % address[0]) + if gateway: + config.append('IPV6_DEFAULTGW=%s' % gateway) + pass pass if len(address) > 1: config.append('IPV6ADDR_SECONDARIES="%s"' % diff --git a/src/hostinfo/parser.py b/src/hostinfo/parser.py index 3d6dc240b1c70ab3ff479f3d4ac9d6e61f609acf..2c4e4a760a16e3f5525b2e27965ffe4bfa645946 100755 --- a/src/hostinfo/parser.py +++ b/src/hostinfo/parser.py @@ -1,9 +1,13 @@ +import calendar import os import stat import sys import time import xml.sax +import xml.parsers.expat import traceback +import urlparse +import urllib2 __doc__ = """ Package for xml parsing @@ -360,12 +364,6 @@ class Node: def _xml(self, indent=0, attr_sort=None, tag_sort=None, width=80): """Generate a prettyprinted xml of the tree rooted in this node""" - if self._tag == '': - # Comment node - result = "%s<!--" % (" " * indent) - result += self._attribute[''] - result += "-->\n" - return result result = "" line = "%s<%s" % (" " * indent, self._tag) blanks = " " * len(line) @@ -382,7 +380,6 @@ class Node: result += "%s/>\n" % line else: result += "%s>\n" % line - #result += xml_escape('\n'.join(self._char)) if self._char: result += '\n'.join(self._char) result += '\n' @@ -434,47 +431,63 @@ class Node: def __repr__(self): return self._xml() +class Comment: + def __init__(self, content, line=None): + self._content = content + self._line = line + self._parent = None + self._tag = '' + self._attribute = { '': content} + + def __copy__(self): + """Copy self""" + result = Comment(self._content, self._line) + return result + + def __deepcopy__(self, memo): + """Copy node and all children""" + return self.__copy__() + + def _xml(self, indent=0, attr_sort=None, tag_sort=None, width=80): + """Generate a prettyprinted xml of the tree rooted in this node""" + result = "%s<!--" % (" " * indent) + result += self._attribute[''] + result += "-->\n" + return result + + def __repr__(self): + return self._xml() -class Parser(xml.sax.ContentHandler): - def __init__(self, url): - """Parse the given url inti .tree +class Parser: + def __init__(self, data, url=None, mtime=None, include_comments=False): + """Parse the given url into .tree augment the tree with - ._mtime == url modification time if url is a file, 0 otherwise + ._mtime == url modification time if url is a file, + current time otherwise ._url == the url that was parsed """ + self.include_comments = include_comments self.tree = None # Create a xml parser - import xml.parsers.expat self.parser = xml.parsers.expat.ParserCreate() self.parser.StartElementHandler = self.startElement self.parser.EndElementHandler = self.endElement self.parser.CharacterDataHandler = self.characters self.parser.CommentHandler = self.comment - """parser = xml.sax.make_parser() - parser.setFeature(xml.sax.handler.feature_namespaces, 0) - parser.setContentHandler(self) - try: - parser.setFeature(xml.sax.handler.feature_external_ges, 0) - except: - pass - """ - + # Parse the url self.current = [ self ] - self.parser.Parse(open(url).read()) - - #import urllib2 - #parser.Parse(urllib2.urlopen(url).read()) - - # Set the mtime - mtime = 0 try: - mtime = os.stat(url)[stat.ST_MTIME] - except Exception,e: - mtime = int(time.time()) - + self.parser.Parse(data) + except xml.parsers.expat.ExpatError: + reason = xml.parsers.expat.ErrorString(self.parser.ErrorCode) + line = self.parser.ErrorLineNumber + column = self.parser.ErrorColumnNumber + raise Exception("%s at line %d, column %d in %s" % + (reason, line, column, url)) + pass self.tree._mtime = mtime self.tree._url = url @@ -504,11 +517,32 @@ class Parser(xml.sax.ContentHandler): self.current[-1]._append(char) def comment(self, data): - # Ugly hack, ... - parent = self.current[-1] - parent._add(Node('', self.parser.CurrentLineNumber, { '': data })) - -def parse(url): - """Parse the given 'url' returning an easily traversable tree""" - return Parser(url).tree - + if self.include_comments: + parent = self.current[-1] + parent._add(Comment(data, self.parser.CurrentLineNumber)) + +def parse(source, include_comments=False): + """Parse the given 'source' returning an easily traversable tree""" + (scheme, host, path, param, query, frag) = urlparse.urlparse(source) + if not scheme: + data = open(source).read() + mtime = os.stat(source)[stat.ST_MTIME] + pass + else: + u = urllib2.urlopen(source) + data = u.read() + try: + modified = u.info()["Last-Modified"] + mtime = calendar.timegm( + time.strptime(modified, "%a, %d %b %Y %H:%M:%S %Z")) + except: + mtime = None + pass + pass + pass + return Parser(data, url=source, mtime=mtime, + include_comments=include_comments).tree + +def parse_string(source, include_comments=False): + return Parser(source, url=None, mtime=None, + include_comments=include_comments).tree diff --git a/src/hostinfo/yp.py b/src/hostinfo/yp.py index e2d6e9a5c7d86bb68385eb37fddd23b4d0b262f0..ee9a3bc3ad0be08a392100f4bb9318290a72ba1a 100755 --- a/src/hostinfo/yp.py +++ b/src/hostinfo/yp.py @@ -86,16 +86,13 @@ def netgroup(tree): pass netgroup[m.name[1]].append(entry) pass + def exclude(ip): + if not util.address(ip): + return False + if ip.exclude_netgroups[0] == 'yes': + return False + return True for g in tree._host_._interface_._netgroup_: - def exclude(ip): - if not util.address(ip): - return False - if ip.exclude_netgroups[0]: - if g.name[0] in ip.exclude_netgroups[0].split(','): - return False - pass - return True - for ip in filter(exclude, g._parent._ip_): if not g.name[0:] in netgroup: netgroup[g.name[0:]] = [ ] @@ -105,9 +102,7 @@ def netgroup(tree): pass pass for k in tree._host_._interface_._kickstart_: - for ip in filter(lambda ip: (not ip.alias[0] and not ip.vlan[0] and - not ip.never[0]), - k._parent._ip_): + for ip in filter(exclude, k._parent._ip_): entry = "(%s,,)" % util.fqn(tree, ip)[0:-1] key = "ks-%s" % k.file[0:] if not key in netgroup: