diff options
author | Paul Sokolovsky <paul.sokolovsky@linaro.org> | 2012-04-09 14:49:51 +0300 |
---|---|---|
committer | Paul Sokolovsky <paul.sokolovsky@linaro.org> | 2012-04-09 14:49:51 +0300 |
commit | 686c0d723b1786cbfdf9602359554a601598c6a8 (patch) | |
tree | 89a4030f68efcd92afb656313a446a74886f8100 | |
parent | dbaab76c3527c9cfa109a2458481a9b708d980c2 (diff) |
Add initial version of a tool to XPath-query Jenkins job configs.
-rwxr-xr-x | utils/query-jobs/query-jobs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/utils/query-jobs/query-jobs b/utils/query-jobs/query-jobs new file mode 100755 index 0000000..80bf194 --- /dev/null +++ b/utils/query-jobs/query-jobs @@ -0,0 +1,65 @@ +#!/usr/bin/env python +import sys +import glob +import re +import optparse + +from lxml import etree + + +JENKINS_HOME = "/var/lib/jenkins/" + +def get_xpath(el): + path = [] + while el is not None: + path.insert(0, el.tag) + el = el.getparent() + return "/" + "/".join(path) + +def process(query): + for fname in glob.glob(options.home + "jobs/*/config.xml"): + job_name = fname.split('/')[-2] + if options.filter_jobname: + pos = True + r = options.filter_jobname + if r[0] == "-": + pos = False + r = r[1:] + if bool(re.search(r, job_name)) ^ pos: + continue + + doc = etree.parse(fname) + results = doc.getroot().xpath(query) + if options.filter and len(results) == 0: + continue + if options.filter_not and len(results) > 0: + continue + + if options.verbose: + print "===== %s =====" % fname + else: + if options.show_file: + print fname + else: + print job_name + if options.verbose: + first = True + for el in results: + if not first: + print "-" * 20 + print "XPath %s:" % get_xpath(el) + print etree.tostring(el) + first = False + +optparser = optparse.OptionParser(usage="%prog") +optparser.add_option("-v", "--verbose", action="store_true", help="Verbose") +optparser.add_option("--show-file", action="store_true", help="Show job config path (default is job name)") +optparser.add_option("--home", default=JENKINS_HOME, help="Jenkins home dir (%default)") +optparser.add_option("--filter-jobname", help="Process only jobs matching regex pattern") +optparser.add_option("--filter", action="store_true", help="Show jobs matching query") +optparser.add_option("--filter-not", action="store_true", help="Show jobs not matching query") +options, args = optparser.parse_args(sys.argv[1:]) +if len(args) != 1: + optparser.error("Wrong number of arguments") + +process(args[0]) |