#!/usr/bin/env python import os import colorama import feedparser import urllib3 import requests import sys from pprint import pprint from .. import __version__ def auth_valid(s): if ":" in s: return True return False def auth_split(s): return s.split(":", 1) def main(): import argparse parser = argparse.ArgumentParser() parser.add_argument('-a', '--auth', help='Format: "username:token" (or omit "-a" and use JENKINS_AUTH environment variable)', type=str) parser.add_argument('--insecure', help='Disable SSL certificate verification', action='store_true') parser.add_argument('-l', '--latest', help="Show only latest builds", action='store_true') parser.add_argument('-f', '--failed', help="Show only failed builds", action='store_true') parser.add_argument('-s', '--search', help='Filter output on sub-string (case-sensitive)', action='append', nargs="?", type=str) parser.add_argument('-n', '--negate', help='Negate search filter', action='store_true') parser.add_argument('--html', help='Output as html (i.e. email)', action='store_true') parser.add_argument('-V', '--version', help='Show version', action='store_true'); parser.add_argument('jenkins_url', type=str, nargs='?') args = parser.parse_args() username = "" token = "" if args.version: print(__version__) exit(0) if not args.jenkins_url: print("Jenkins URL required (i.e. https://jenkins OR https://jenkins/job/folder") exit(1) # Disable SSL drivel when in insecure mode if args.insecure: urllib3.disable_warnings() # Consume authentication string argument, or via environment (not both) # i.e. username:token if args.auth: if not auth_valid(args.auth): print("Invalid auth string") exit(1) username, token = auth_split(args.auth) elif os.environ.get("JENKINS_AUTH"): if not auth_valid(os.environ["JENKINS_AUTH"]): print("Invalid JENKINS_AUTH string") exit(1) username, token = auth_split(os.environ["JENKINS_AUTH"]) # Set default server entrypoint if args.failed: jenkins_url = f"{args.jenkins_url}/rssFailed" elif args.latest: jenkins_url = f"{args.jenkins_url}/rssLatest" else: jenkins_url = f"{args.jenkins_url}/rssAll" # Is this an anonymous or authenticated server query? if not username and not token: auth_data=None else: auth_data = (username, token) # Get RSS data data = requests.get(jenkins_url, auth=auth_data, verify=not args.insecure) # On failure dump whatever Jenkins needs you to know (RAW HTML) if not data: print(data.text, file=sys.stderr) exit(1) # Consume RSS feed data feed = feedparser.parse(data.text) if args.html: color_date = "black" else: color_date = colorama.Fore.BLUE # Verify we have data to iterate over if not feed or not feed.entries: print("No records") exit(0) # Begin dumping RSS records for rec in feed.entries: if args.html: color_title = "red" else: color_title = colorama.Fore.RED if '(stable)' in rec.title or '(back to normal)' in rec.title: if args.html: color_title = "green" else: color_title = colorama.Fore.GREEN if args.html: output_fmt = f"{rec.published}: " \ f"{rec.title} " \ f"(link)
" else: output_fmt = f"{color_date}{rec.published}{colorama.Style.RESET_ALL}: " \ f"{color_title}{rec.title}{colorama.Style.RESET_ALL} " \ f"({rec.link})" # User-defined search is additive (-s str1 -s str2 -s str...) if args.search: for pattern in args.search: if args.negate: # Negated search if pattern not in rec.title: print(output_fmt) else: # Normal search if pattern in rec.title: print(output_fmt) else: print(output_fmt) if __name__ == '__main__': sys.exit(main)