Py Webhook

Python webhook listens on Port 5500 for JIRA json dump, then does steps to this json dump

jira-listener.py

#!/usr/bin/env python

## JIRA webhook listener

base_dir = "/opt/jira-processor"

conf_file = base_dir+'/conf/processor.conf'

fields_file = base_dir+'/conf/fields.csv'

import sys

sys.path.append(base_dir+'/modules')

import maestro

import json

import re

import flask

from flask import Flask

from flask import request

import os

import subprocess

import ConfigParser

import requests

import csv

# some housekeeping.. get all fields from JIRA

if not os.path.exists(fields_file):


# get Jira creds from conf file

config = ConfigParser.ConfigParser()

config.read(conf_file)

jira_server = config.get('jira','server').replace('"','') #strip double quotes

jira_user = config.get('jira','user').replace('"','')

jira_pw = config.get('jira','pw').replace('"','')


# get field json from Jira

url = "https://"+jira_server+"/rest/api/2/field"

req = requests.get(url,auth=(jira_user,jira_pw), verify=False)

jsonfile = req.json()


# create multi-dim dictionary of key/val pairs

with open(fields_file,'w') as csvfile:

writer = csv.writer(csvfile,delimiter='\n')

for item in jsonfile:

fname = item.get("name").encode('utf-8')

fid = item.get("id").encode('utf-8')

pair = fname+','+fid

writer.writerow([pair])

csvfile.close()

# let the Processor do its thing now!

os.chdir(base_dir)

app = Flask(__name__)

# WEBHOOK PROCESSING

@app.route('/webhook', methods=['GET', 'POST'])

def tracking():

if request.method == 'POST':

data = request.get_json()

proj_key = data['issue']['fields']['project']['key']

issue_key = data['issue']['key']

issue_type = data['issue']['fields']['issuetype']['name']

status = data['issue']['fields']['status']['name']

## ---------- PROJECTS -----------------------------

## ALPHA

if proj_key == "ALPHA" and issue_type == "Task" and status != "Closed":

subprocess.Popen([ './projects/alpha/process_alpha.py', json.dumps(data), base_dir ])

## BRAVO

# not applicable, BRavo is triggered from Cron not webhook

## GAMMA

if proj_key == "GAMMA" and issue_type == "Task" and status != "Closed":

subprocess.Popen(['./projects/gamma/process_gamma.py', json.dumps(data), base_dir ])

## --------------------------------------------------

print 'JIRA Webhook received! Very niiice!'

return 'ok'

else:

return displayHTML(request)

if __name__ == '__main__':

app.run(host='localhost', port=5500, debug=True)

process_gamma.py

#!/usr/bin/env python

# processor script

import sys

from sys import argv

import json

import re

import os

import subprocess

import ConfigParser

data = json.loads(argv[1])

base_dir = argv[2]

proj_key = argv[3]

issue_key = argv[4]

issue_type = argv[5]

fields_file = base_dir+'/conf/fields.csv'

sys.path.append(base_dir+'/modules')

import maestro

## go to conf dir

os.chdir(base_dir+'/conf')

# check if conf file exists

if not os.path.isfile(base_dir+'/conf/listener.conf'):

print '%s does not exist. Exiting..' % base_dir+'/conf/listener.conf'

sys.exit()

# open conf file

config = ConfigParser.ConfigParser()

config.read(base_dir+'/conf/listener.conf')

# get Conf values

jira_server = config.get("jira","server")

jira_user = config.get("jira","user")

jira_pw = config.get("jira","pw")

bintray_server = config.get("bintray","server")

bintray_user = config.get("bintray","user")

bintray_apikey = config.get("bintray","apikey")

# get custom field IDs

f_lifetime = maestro.getCF(fields_file,'Bintray URL Lifetime')

f_customer_email = maestro.getCF(fields_file,'Customer Email')

f_product = maestro.getCF(fields_file,'Product')

f_signed_url = maestro.getCF(fields_file,'Bintray Signed URL')

f_email_flag = maestro.getCF(fields_file,'Email Customer?')

if data['issue']['fields'][f_customer_email]:

customer_email = data['issue']['fields'][f_customer_email]

else:

customer_email = "NA"

if data['issue']['fields'][f_product]['child']['value']:

product = data['issue']['fields'][f_product]['child']['value']

else:

product = "NA"

if data['issue']['fields'][f_email_flag]['value']:

email_flag = data['issue']['fields'][f_email_flag]['value']

else:

email_flag = "Yes"

if data['issue']['fields'][f_lifetime]['value']:

lifetime = data['issue']['fields'][f_lifetime]['value']

else:

lifetime = "NA"

os.chdir(base_dir+'/projects/bintray_url')

# call Bash script to create new branch and pull request

subprocess.Popen([ './getURL.sh', base_dir, issue_key, lifetime, customer_email, product, f_signed_url, email_flag ])