From 59b3d315c402e72120d2d12a0f08f58bdff98aeb Mon Sep 17 00:00:00 2001 From: Sol Jerome Date: Fri, 26 Oct 2012 15:05:51 -0500 Subject: tools: Add migrate_perms_to_mode tool Helps users to migrate their repositories from the perms attribute to mode. Signed-off-by: Sol Jerome --- tools/upgrade/1.3/README | 4 ++ tools/upgrade/1.3/migrate_perms_to_mode.py | 68 ++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 tools/upgrade/1.3/migrate_perms_to_mode.py (limited to 'tools/upgrade/1.3') diff --git a/tools/upgrade/1.3/README b/tools/upgrade/1.3/README index e72650729..2831d8f00 100644 --- a/tools/upgrade/1.3/README +++ b/tools/upgrade/1.3/README @@ -15,3 +15,7 @@ service_modes.py migrate_dbstats.py - Convert old DBStats entries to the new Reporting system + +migrate_perms_to_mode.py + - Convert perms attribute to mode (note that if you have info/:info + files, you should run migrate_info.py first) diff --git a/tools/upgrade/1.3/migrate_perms_to_mode.py b/tools/upgrade/1.3/migrate_perms_to_mode.py new file mode 100644 index 000000000..0aa9c574c --- /dev/null +++ b/tools/upgrade/1.3/migrate_perms_to_mode.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +import lxml.etree +import os +import sys + +import Bcfg2.Options + + +def setmodeattr(elem): + """Set the mode attribute for a given element.""" + if elem.attrib.has_key('perms'): + elem.set('mode', elem.get('perms')) + del elem.attrib['perms'] + return True + + +def writefile(f, xdata): + """Write xml data to a file""" + newfile = open(f, 'w') + newfile.write(lxml.etree.tostring(xdata, pretty_print=True)) + newfile.close() + + +def convertinfo(ifile): + """Do perms -> mode conversion for info.xml files.""" + xdata = lxml.etree.parse(ifile) + found = False + for i in xdata.findall('//Info'): + found = setmodeattr(i) + if found: + writefile(ifile, xdata) + + +def convertstructure(structfile): + """Do perms -> mode conversion for structure files.""" + xdata = lxml.etree.parse(structfile) + found = False + for path in xdata.findall('//BoundPath'): + found = setmodeattr(path) + for path in xdata.findall('//Path'): + found = setmodeattr(path) + if found: + writefile(structfile, xdata) + + +def main(): + opts = dict(repo=Bcfg2.Options.SERVER_REPOSITORY, + configfile=Bcfg2.Options.CFILE, + plugins=Bcfg2.Options.SERVER_PLUGINS) + setup = Bcfg2.Options.OptionParser(opts) + setup.parse(sys.argv[1:]) + repo = setup['repo'] + + for plugin in setup['plugins']: + if plugin in ['Base', 'Bundler', 'Rules']: + for root, dirs, files in os.walk(os.path.join(repo, plugin)): + for fname in files: + convertstructure(os.path.join(root, fname)) + if plugin not in ['Cfg', 'TGenshi', 'TCheetah']: + continue + for root, dirs, files in os.walk(os.path.join(repo, plugin)): + for fname in files: + if fname == 'info.xml': + convertinfo(os.path.join(root, fname)) + +if __name__ == '__main__': + sys.exit(main()) -- cgit v1.2.3-1-g7c22