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 ])