diff --git a/gestion/tools/postdiff.py b/gestion/tools/postdiff.py new file mode 100755 index 00000000..3e2d517e --- /dev/null +++ b/gestion/tools/postdiff.py @@ -0,0 +1,101 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# postdiff.py +# ----------- +# +# Copyright (C) 2007 Jeremie Dimino +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This file is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + +'''Petit utilitaire pour voir les différences de configuration entre deux +fichiers de configurations main.cf de postfix''' + +import sys, re, commands + +__re_param_separator = re.compile('[ \t]*,[ \t]*|[ \t]+') + +def postconf(conf_dir): + vars = commands.getoutput("/usr/sbin/postconf -n -c %s" % conf_dir).split('\n')[0:-1] + canonicalized = {} + for var in vars: + [varname, params] = var.split(' = ') + params = __re_param_separator.split(params) + params.sort() + canonicalized[varname] = params + del canonicalized["config_directory"] + return canonicalized + +def compare(a, b): + common = [] + onlya = [] + onlyb = [] + for var in a: + if b.has_key(var): + common.append(var) + else: + onlya.append(var) + for var in b: + if a.has_key(var): + if not var in common: + common.append(var) + else: + onlyb.append(var) + return common, onlya, onlyb + +def __usage(err): + sys.stderr.write("%s\n" % err) + sys.stderr.write("usage: %s \n" % os.path.basename(sys.argv[0])) + sys.exit(2) + +if __name__ == '__main__': + import tempfile, os, sys + sys.path.append('/usr/scripts/gestion') + from affich_tools import cprint + + if len(sys.argv) != 3: + __usage("Mauvais nombre d'arguments") + + for i in 1, 2: + if not os.access(sys.argv[i], os.R_OK): + __usage("%s n'est pas lisible!" % sys.argv[i]) + + conf = {} + # On copie les fichier car postconf n'accepte qu'un dossier en + # paramètre et non un fichier directement + tempd = tempfile.mkdtemp() + for i in 1, 2: + open(tempd + "/main.cf", "w").write(file(sys.argv[i]).read()) + conf[i] = postconf(tempd) + os.unlink(tempd + "/main.cf") + os.rmdir(tempd) + + diff = compare(conf[1], conf[2]) + diff_common = filter(lambda var: conf[1][var] != conf[2][var], diff[0]) + for i in 0, 1, 2: + diff[i].sort() + for i in 1, 2: + if len(diff[i]) > 0: + cprint(u"variables définis uniquement dans %s" % sys.argv[i], "bleu") + for var in diff[i]: + print " %s = %s" % (var, ", ".join(conf[i][var])) + if len(diff_common) > 0: + cprint(u"variables différentes dans a:%s et b:%s" % (sys.argv[1], sys.argv[2]), "bleu") + for var in diff_common: + cprint(" a:%s = %s" % (var, ", ".join(conf[1][var])), "gris") + cprint(" b:%s = %s" % (var, ", ".join(conf[2][var])), "gras") + if len(diff_common) == 0 and len(diff[1]) == 0 and len(diff[2]) == 0: + cprint("Les fichiers sont identiques!") +