Ticket #578: patch0.patch

File patch0.patch, 6.8 KB (added by stousignant@…, 11 years ago)

2nd version of the patch, with better output

  • bcfg2/schemas/metadata.xsd

    diff --git a/bcfg2/schemas/metadata.xsd b/bcfg2/schemas/metadata.xsd
    index 9cb2e08..4615592 100644
    a b  
    2323    </xsd:restriction> 
    2424  </xsd:simpleType> 
    2525 
    26  
     26  <xsd:simpleType name='deprecatedType'> 
     27    <xsd:restriction base='xsd:string'> 
     28      <xsd:pattern value="now|[0-9]{4}-[0-9]{2}-[0-9]{2}" /> 
     29    </xsd:restriction> 
     30  </xsd:simpleType> 
     31   
    2732  <xsd:complexType name='groupType'> 
    2833    <xsd:choice minOccurs='0' maxOccurs='unbounded'> 
    2934      <xsd:element name='Bundle'> 
     
    4449    <xsd:attribute type='toolsetType' name='toolset' use='optional'/> 
    4550    <xsd:attribute type='xsd:string' name='category' use='optional'/> 
    4651    <xsd:attribute type='xsd:string' name='comment' use='optional'/> 
     52    <xsd:attribute type='deprecatedType' name='deprecated' use='optional' /> 
    4753  </xsd:complexType> 
    4854 
    4955  <xsd:complexType name='groupsType'> 
  • new file cfg2/src/lib/Server/Admin/Deprecated.py

    diff --git a/bcfg2/src/lib/Server/Admin/Deprecated.py b/bcfg2/src/lib/Server/Admin/Deprecated.py
    new file mode 100644
    index 0000000..7ec7f60
    - +  
     1import Bcfg2.Server.Admin, Bcfg2.Logging, logging 
     2import datetime 
     3import lxml.etree 
     4 
     5class Deprecated(Bcfg2.Server.Admin.Mode): 
     6    __shorthelp__ = 'bcfg2-admin deprecated [-d <days>] [--xml [file]]' 
     7    __longhelp__ = __shorthelp__ + '\n\tFind all clients that is in a deprecated group' 
     8    __args__ = ['-d', '--xml'] 
     9 
     10    def __init__(self, configfile): 
     11        logging.root.setLevel(100) 
     12        Bcfg2.Logging.setup_logging(100, to_console=False, to_syslog=False) 
     13        Bcfg2.Server.Admin.Mode.__init__(self, configfile) 
     14         
     15        try: 
     16            self.bcore = Bcfg2.Server.Core.Core(self.get_repo_path(), 
     17                                                [], ['Metadata'], 
     18                                                'foo', False, 'UTF-8') 
     19        except Bcfg2.Server.Core.CoreInitError, msg: 
     20            self.errExit("Core load failed because %s" % msg) 
     21        [self.bcore.fam.Service() for _ in range(1)] 
     22        self.meta = self.bcore.metadata 
     23        while self.bcore.fam.Service(): 
     24            pass 
     25 
     26    def __call__(self, args): 
     27        Bcfg2.Server.Admin.Mode.__call__(self, args) 
     28        nextIsDay = False 
     29        outputXML = False 
     30        # I know hardcoding this way is bad 
     31        outputFile = "/dev/stdout" 
     32        days = 0 
     33        for arg in args: 
     34            if nextIsDay: 
     35                days = int(arg) 
     36                nextIsDay = False 
     37            elif arg == '-d': 
     38                nextIsDay = True 
     39            elif arg == '--xml': 
     40                outputXML = True 
     41            elif outputXML and arg not in self.__args__: 
     42                outputFile = arg 
     43 
     44        delta = datetime.timedelta(days) 
     45        table = [] 
     46        maxlenname = 0 
     47        maxlenend = 0 
     48        for name, profile in self.meta.clients.items(): 
     49            endingSoonest = datetime.date(datetime.MAXYEAR,1,1) 
     50            for group, date in self.meta.deprecatedgroup.items(): 
     51                if group in self.meta.groups[profile][1]: 
     52                    if endingSoonest > date: 
     53                        endingSoonest = date 
     54            datecheck = endingSoonest - delta 
     55            if datecheck < datetime.date.today(): 
     56                enddate = endingSoonest.isoformat(); 
     57                table.append((name, enddate, self.meta.groups[profile][2])) 
     58                if name.__len__() > maxlenname: 
     59                    maxlenname = name.__len__() 
     60                if enddate.__len__() > maxlenend: 
     61                    maxlenend = enddate.__len__() 
     62        if outputXML: 
     63            # Build an XML format so we can process de file elsewhere in an other program 
     64            root = lxml.etree.Element("deprecated") 
     65            root.text = '\n' 
     66            root.tail = "\n" 
     67            for value in table: 
     68                attributes = {'name':value[0], 'when':value[1]} 
     69                client = lxml.etree.Element("client", attributes) 
     70                client.tail = "\n" 
     71                for k,v in value[2].items(): 
     72                    attributes = {'name':k, 'group':v}; 
     73                    categories = lxml.etree.Element("category", attributes) 
     74                    categories.tail = '\n' 
     75                    client.append(categories) 
     76                root.append(client) 
     77            outFile = open(outputFile, "w") 
     78            outFile.write(lxml.etree.tostring(root, encoding='UTF-8', xml_declaration='True')) 
     79             
     80        else: 
     81            format = "%%%ds %%%ds" % (maxlenname*-1, maxlenend*-1) 
     82            for value in table: 
     83                print format % (value[0], value[1]) 
     84 
  • bcfg2/src/lib/Server/Admin/__init__.py

    diff --git a/bcfg2/src/lib/Server/Admin/__init__.py b/bcfg2/src/lib/Server/Admin/__init__.py
    index cff9eec..b66b069 100644
    a b  
    11__revision__ = '$Revision$' 
    22 
    33__all__ = ['Mode', 'Client', 'Compare', 'Fingerprint', 'Init', 'Minestruct', 
    4            'Pull', 'Query', 'Tidy', 'Viz'] 
     4           'Pull', 'Query', 'Tidy', 'Viz', 'Deprecated'] 
    55 
    66import ConfigParser, lxml.etree, logging 
    77 
  • bcfg2/src/lib/Server/Plugins/Metadata.py

    diff --git a/bcfg2/src/lib/Server/Plugins/Metadata.py b/bcfg2/src/lib/Server/Plugins/Metadata.py
    index 75b8045..3151412 100644
    a b  
    11'''This file stores persistent metadata for the BCFG Configuration Repository''' 
    22__revision__ = '$Revision$' 
    33 
    4 import lxml.etree, re, socket, time, fcntl, copy 
     4import lxml.etree, re, socket, time, fcntl, copy, datetime 
    55import Bcfg2.Server.Plugin 
    66 
    77class MetadataConsistencyError(Exception): 
    class Metadata(Bcfg2.Server.Plugin.MetadataPlugin, 
    192192            self.groups = {} 
    193193            grouptmp = {} 
    194194            self.categories = {} 
     195            self.deprecatedgroup = {} 
    195196            for group in xdata.xpath('//Groups/Group') \ 
    196197                    + xdata.xpath('Group'): 
    197198                grouptmp[group.get('name')] = tuple([[item.get('name') for item in group.findall(spec)] 
    class Metadata(Bcfg2.Server.Plugin.MetadataPlugin, 
    205206                    self.public.append(group.get('name')) 
    206207                if group.attrib.has_key('category'): 
    207208                    self.categories[group.get('name')] = group.get('category') 
     209                if group.attrib.has_key('deprecated'): 
     210                    if group.get('deprecated') == 'now': 
     211                        date = datetime.date.today() 
     212                    else: 
     213                        datestr = group.get('deprecated').split('-') 
     214                        date = datetime.date(int(datestr[0]), int(datestr[1]), int(datestr[2])) 
     215                    self.deprecatedgroup[group.get('name')] = date 
    208216            for group in grouptmp: 
    209217                # self.groups[group] => (bundles, groups, categories) 
    210218                self.groups[group] = ([], [], {})