#!/bin/bash # silly, but good-enough bugzilla monitoring # jpokorny@redhat.com (will be pleased to know about further enhancements) # usage: # 1. optionally git clone git://git.fedorahosted.org/git/python-bugzilla # (system-wide can also be used) # 2. open ~/.watchbzrc for editing # - set BUGZILLA_ROOT when using cloned python-bugzilla # - optionally set STATUS and COMPONENT as per example # (or pass such string as a 1st argument) # - optionally set BZUSER to avoid the need to login manually before # the "watch session"; you can set BZPASSWORD as well but be careful! set -u export LANG=C HERE=$(dirname $0) BUGZILLA=$(which bugzilla 2>/dev/null) BUGZILLA_ROOT=/usr BUGZILLA_COOKIE=~/.watchbzcookies BUGZILLA_LOGOUT=1 # example defaults, modify via ~/.watchbzrc COMPONENT=luci,ricci,clustermon,conga,sunzi STATUS=OPEN REFRESH_INTERVAL=600 # [s], better not to drain bugzilla's power... # user configuration [ -f ~/.watchbzrc ] && source ~/.watchbzrc # guess correct paths if [ -z "$BUGZILLA" ]; then # BUGZILLA_ROOT (path to local repo) should rather be set in ~/.watchbzrc BUGZILLA="${BUGZILLA_ROOT}/bin/bugzilla" export PYTHONPATH="${BUGZILLA_ROOT}:${PYTHONPATH}" fi # hardcoded for now (note the SEP - OUTPUT_FMT relationship) SEP=@@@ WIDTH=$(( $(stty size | cut -d' ' -f2) - 1 )) # arguments if [ $# -ge 1 ]; then if [[ "$1" = -* ]]; then STATUS=$(echo "$1" | cut -c2-) shift fi if [ $# -ge 1 ]; then COMPONENT="$1" fi fi # omit component if only single one queried echo $COMPONENT | grep -q ',' if [ $? -eq 0 ]; then OUTPUT_FMT="%{component}$SEP%{bug_id}$SEP%{product}$SEP%{priority}$SEP%{status}$SEP%{flags}$SEP%{short_desc}" else OUTPUT_FMT="%{bug_id}$SEP%{product}$SEP%{priority}$SEP%{status}$SEP%{flags}$SEP%{short_desc}" fi do_logout () { rm "${BUGZILLA_COOKIE}" } # exclusively using globals do_init () { # login when available if [ -n "$BZUSER" ] && [ ! -f "${BUGZILLA_COOKIE}" ]; then "$BUGZILLA" --cookiefile="${BUGZILLA_COOKIE}" login "$BZUSER" $BZPASSWORD if [ $? -ne 0 ]; then echo "Cannot log in" exit 2 fi fi # C-c handler to optionally remove cookie on exit test $BUGZILLA_LOGOUT -ne 0 && trap do_logout INT } # exclusively using globals do_watch () { #sh -c \ watch -t --interval $REFRESH_INTERVAL --differences=cumulative \ "$BUGZILLA --cookiefile="${BUGZILLA_COOKIE}" query -c $COMPONENT \ -t $STATUS --outputformat $OUTPUT_FMT \ | sed -u \ -e \"s|${SEP}Red Hat Enterprise Linux |${SEP}EL|\" \ -e \"s|${SEP}Fedora|${SEP} F |\" \ -e \"s|${SEP}NEW|${SEP}N|\" \ -e \"s|${SEP}ASSIGNED|${SEP}A|\" \ -e \"s|${SEP}POST|${SEP}P|\" \ -e \"s|${SEP}MODIFIED|${SEP}M|\" \ -e \"s|${SEP}ON_QA|${SEP}Q|\" \ -e \"s|${SEP}ON_DEV|${SEP}D|\" \ -e \"s|${SEP}VERIFIED|${SEP}V|\" \ -e \"s|${SEP}RELEASE_PENDING|${SEP}R|\" \ -e \"s|${SEP}CLOSED|${SEP}C|\" \ -e \"s|${SEP}urgent|${SEP}!!!|\" \ -e \"s|${SEP}high|${SEP}!!|\" \ -e \"s|${SEP}medium|${SEP} ! |\" \ -e \"s|${SEP}low|${SEP} ~ |\" \ -e \"s|${SEP}unspecified|${SEP} ? |\" \ -e \"s|qa_ack|QA|\" \ -e \"s|pm_ack|PM|\" \ -e \"s|devel_ack|D|\" \ -e \"s|needinfo|I|\" \ -e \"s|exception|E|\" \ -e \"s|blocker|BL|\" \ -e \"s|requires_release_note|RN|\" \ -e \"s|docs_scoped|DS|\" \ -e \"s|rhel-||g\" \ -e \"s|qe_test_coverage||\" \ -e \"s|None||\" \ | ${HERE}/table-data $SEP | sort | cut -c-$WIDTH" # todo: colours for priorities (rhbz#801626) #-e 's/\(urgent\)/\^\[\[31m\1\^\[\[0m/' \ } do_init do_watch