Ticket #549: unicode_supportv2.diff

File unicode_supportv2.diff, 11.7 KB (added by [email protected]…, 15 years ago)

2nd version of the patch, with better support of xml encoding and header

  • src/lib/Server/Plugins/Cfg.py

     
    7979        if entry.get('encoding') == 'base64': 
    8080            entry.text = binascii.b2a_base64(data) 
    8181        else: 
    82             entry.text = data             
     82            entry.text = unicode(data, "utf-8") 
    8383        if entry.text in ['', None]: 
    8484            entry.set('empty', 'true') 
    8585 
  • src/lib/Server/Plugins/TGenshi.py

     
    5252                name=fname, metadata=metadata, path=self.name, 
    5353                properties=self.properties).filter(removecomment) 
    5454            if isinstance(self.template, TextTemplate): 
    55                 entry.text = stream.render('text') 
     55                textdata = stream.render('text') 
     56                if type(textdata) == unicode: 
     57                    entry.text = textdata 
     58                else: 
     59                    entry.text = unicode(textdata, 'UTF-8') 
    5660            else: 
    57                 entry.text = stream.render('xml') 
     61                xmldata = stream.render('xml') 
     62                if type(xmldata) == unicode: 
     63                    entry.text = xmldata 
     64                else: 
     65                    entry.text = unicode(xmldata, 'UTF-8') 
    5866        except TemplateError, terror: 
    5967            logger.error('Genshi template error: %s' % terror) 
    6068            raise Bcfg2.Server.Plugin.PluginExecutionError 
  • src/lib/Server/Plugins/Metadata.py

     
    267267        except IOError: 
    268268            self.logger.error("Failed to write clients.xml") 
    269269            raise MetadataRuntimeError 
    270         datafile.write(lxml.etree.tostring(self.clientdata.getroot())) 
     270        datafile.write(lxml.etree.tostring(self.clientdata.getroot(), encoding='UTF-8', xml_declaration=True)) 
    271271        datafile.close() 
    272272 
    273273    def write_probedata(self): 
     
    281281                                          value=self.probedata[client][probe]) 
    282282                for group in self.cgroups[client]: 
    283283                    lxml.etree.SubElement(cx, "Group", name=group) 
    284             data = lxml.etree.tostring(top) 
     284            data = lxml.etree.tostring(top, encoding='UTF-8', xml_declaration=True) 
    285285            try: 
    286286                datafile = open("%s/%s" % (self.data, 'probed.xml'), 'w') 
    287287            except IOError: 
  • src/lib/Server/Plugins/TCheetah.py

     
    3434        self.template.path = entry.get('realname', entry.get('name')) 
    3535         
    3636        try: 
    37             entry.text = str(self.template) 
     37            entry.text = unicode(str(self.template),'UTF-8') 
    3838        except: 
    3939            (a, b, c) = sys.exc_info() 
    4040            msg = traceback.format_exception(a, b, c, limit=2)[-1][:-1] 
  • src/lib/Server/Statistics.py

     
    2828            except IOError, ioerr: 
    2929                self.logger.error("Failed to open %s for writing: %s" % (self.filename + '.new', ioerr)) 
    3030            else: 
    31                 fout.write(lxml.etree.tostring(self.element)) 
     31                fout.write(lxml.etree.tostring(self.element, encoding='UTF-8', xml_declaration=True)) 
    3232                fout.close() 
    3333                os.rename(self.filename + '.new', self.filename) 
    3434                self.dirty = 0 
  • src/lib/Server/Admin/Pull.py

     
    7070            new_entry['text'] = '\n'.join(difflib.restore(diff.split('\n'), 1)) 
    7171        else: 
    7272            print "found no data::" 
    73             print lxml.etree.tostring(cfentry) 
     73            print lxml.etree.tostring(cfentry, encoding='UTF-8', xml_declaration=True) 
    7474            raise SystemExit(1) 
    7575        return new_entry 
    7676 
  • src/lib/Client/Tools/POSIX.py

     
    320320                self.logger.error("Cannot verify incomplete ConfigFile %s" % (entry.get('name'))) 
    321321                return False 
    322322            tempdata = entry.text 
     323            if type(tempdata) == unicode: 
     324                tempdata = tempdata.encode('UTF-8') 
    323325        try: 
    324326            content = open(entry.get('name')).read() 
    325327        except IOError, error: 
    326328            self.logger.error("Failed to read %s: %s" % (error.filename, error.strerror)) 
    327329            return False 
     330        # comparaison should be done with figerprints or md5sum so it would be faster  
     331        # for big binary files 
    328332        contentStatus = content == tempdata 
    329333        if not contentStatus: 
    330334            if tbin or not isString(content): 
     
    348352                        break 
    349353                if do_diff: 
    350354                    diff = '\n'.join(rawdiff) 
    351                     entry.set("current_bdiff", binascii.b2a_base64(diff)) 
     355#                    entry.set("current_bdiff", binascii.b2a_base64(diff)) 
     356#                    entry.set("current_diff", diff) 
    352357                    udiff = '\n'.join([x for x in \ 
    353358                                       difflib.unified_diff(content.split('\n'), \ 
    354359                                                            tempdata.split('\n'))]) 
     
    356361                        eudiff = udiff.encode('ascii') 
    357362                    except: 
    358363                        eudiff = "Binary file: no diff printed" 
     364  
    359365                    nqtext = entry.get('qtext', '') 
    360366 
    361367                    if nqtext: 
     
    417423            elif entry.get('empty', 'false') == 'true': 
    418424                filedata = '' 
    419425            else: 
    420                 filedata = entry.text 
     426                if type(entry.text) == unicode: 
     427                    filedata = entry.text.encode('UTF-8') 
     428                else: 
     429                    filedata = entry.text 
    421430            newfile.write(filedata) 
    422431            newfile.close() 
    423432            try: 
  • src/sbin/bcfg2-ping-sweep

     
    6363                elm.set("pingable",'N') 
    6464 
    6565    fout = open(clientdatapath, 'w') 
    66     fout.write(lxml.etree.tostring(clientElement.getroot())) 
     66    fout.write(lxml.etree.tostring(clientElement.getroot(), encoding='UTF-8', xml_declaration=True)) 
    6767    fout.close() 
    6868                         
  • src/sbin/bcfg2

     
    244244            if len(probes.findall(".//probe")) > 0: 
    245245                try: 
    246246                    # upload probe responses 
    247                     proxy.RecvProbeData(Bcfg2.Client.XML.tostring(probedata)) 
     247                    proxy.RecvProbeData(Bcfg2.Client.XML.tostring(probedata, encoding='UTF-8', xml_declaration=True)) 
    248248                except: 
    249249                    self.logger.error("Failed to upload probe data", exc_info=1) 
    250250                    raise SystemExit(1) 
     
    293293            feedback = self.tools.GenerateStats() 
    294294 
    295295            try: 
    296                 proxy.RecvStats(Bcfg2.Client.XML.tostring(feedback)) 
     296                proxy.RecvStats(Bcfg2.Client.XML.tostring(feedback, encoding='UTF-8', xml_declaration=True)) 
    297297            except xmlrpclib.Fault: 
    298298                self.logger.error("Failed to upload configuration statistics") 
    299299                raise SystemExit(2) 
  • src/sbin/bcfg2-server

     
    104104                           if isinstance(p, Bcfg2.Server.Plugin.ProbingPlugin)]: 
    105105                for probe in plugin.GetProbes(meta): 
    106106                    resp.append(probe) 
    107             return tostring(resp) 
     107            return tostring(resp, encoding='UTF-8', xml_declaration=True) 
    108108        except Bcfg2.Server.Plugins.Metadata.MetadataConsistencyError: 
    109109            warning = 'Client metadata resolution error for %s; check server log' % address[0] 
    110110            self.logger.warning(warning) 
     
    158158        '''Build config for a client''' 
    159159        try: 
    160160            client = self.Core.metadata.resolve_client(address) 
    161             return tostring(self.Core.BuildConfiguration(client)) 
     161            return tostring(self.Core.BuildConfiguration(client), encoding='UTF-8', xml_declaration=True) 
    162162        except Bcfg2.Server.Plugins.Metadata.MetadataConsistencyError: 
    163163            self.logger.warning("Metadata consistency failure for %s" % (address)) 
    164164            raise Fault, (6, "Metadata consistency failure") 
  • src/sbin/bcfg2-build-reports

     
    100100            for item in items: 
    101101                channel.append(item) 
    102102 
    103         tree = "<?xml version=\"1.0\"?>" + tostring(rssdata) 
     103        tree = tostring(rssdata, encoding='UTF-8', xml_declaration=True) 
    104104        fil.write(tree) 
    105105        fil.close() 
    106106 
     
    249249 
    250250            #apply XSLT, different ones based on report type, and options 
    251251            if deliverymechanism == 'null-operator': #Special Cases 
    252                 fileout(tostring(ElementTree(procnodereport).getroot()), deliv) 
     252                fileout(tostring(ElementTree(procnodereport).getroot(), encoding='UTF-8', xml_declaration=True), deliv) 
    253253                break 
    254254            transform = delivtype + '-' + deliverymechanism + '.xsl' 
    255255 
     
    301301                                           (toastring, socket.getfqdn(), outputstring) 
    302302                            mail(outputstring, c) #call function to send 
    303303            else: 
    304                 outputstring = tostring(stylesheet.apply(ElementTree(procnodereport)).getroot()) 
     304                outputstring = tostring(stylesheet.apply(ElementTree(procnodereport)).getroot(), encoding='UTF-8', xml_declaration=True) 
    305305                if deliverymechanism == 'rss': 
    306306                    rss(outputstring, deliv, reprt) 
    307307                else: # must be deliverymechanism == 'www': 
  • src/sbin/bcfg2-info

     
    9797        if len(args.split()) == 2: 
    9898            client, ofile = args.split() 
    9999            output = open(ofile, 'w') 
    100             data = lxml.etree.tostring(self.BuildConfiguration(client)) 
     100            data = lxml.etree.tostring(self.BuildConfiguration(client), encoding='UTF-8', xml_declaration=True) 
    101101            output.write(data) 
    102102            output.close() 
    103103        else: 
     
    121121            entry = lxml.etree.Element('ConfigFile', name=fname) 
    122122            metadata = self.metadata.get_metadata(client) 
    123123            self.Bind(entry, metadata) 
    124             print lxml.etree.tostring(entry) 
     124            print lxml.etree.tostring(entry, encoding="UTF-8", xml_declaration=True) 
    125125        else: 
    126126            print 'Usage: buildfile filename hostname' 
    127127