aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Sokolovsky <paul.sokolovsky@linaro.org>2012-04-09 14:49:51 +0300
committerPaul Sokolovsky <paul.sokolovsky@linaro.org>2012-04-09 14:49:51 +0300
commit686c0d723b1786cbfdf9602359554a601598c6a8 (patch)
tree89a4030f68efcd92afb656313a446a74886f8100
parentdbaab76c3527c9cfa109a2458481a9b708d980c2 (diff)
Add initial version of a tool to XPath-query Jenkins job configs.
-rwxr-xr-xutils/query-jobs/query-jobs65
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])