以jira为工单平台,可以解决一些棘手的问题,献上封装好的代码。

jira api 总结

jira状态转变

  • ('4', '开始进行')
  • ('5', '解决问题')
  • ('2', '关闭问题')
  • ('701', '关闭问题')
  • ('3', '恢复开启问题')
from jira import JIRA
from config import jira_account
import pandas as pd
jira_server_url = 'http://%s:%d'%(jira_account["HOST"],jira_account["PORT"])
# 连接jira服务器
# server = {'server': jira_url}

class JiraTool:
    # ('4', '开始进行')
    # ('5', '解决问题')
    # ('2', '关闭问题')
    # ('701', '关闭问题')
    # ('3', '恢复开启问题')
    def __init__(self,server=jira_server_url,username=jira_account["USER"],password=jira_account["PASS"]):#
        self.server = server
        self.basic_auth = (username, password)
        self.jiraClinet = None
        self.issue = None

    def login(self):
        self.jiraClinet = JIRA(server=self.server, basic_auth=self.basic_auth)
        if self.jiraClinet != None:
            print(f"[+]login jira with account:{self.basic_auth[0]} successful!")
            return True
        else:
            return False
    # 依据分配的id搜索
    def findIssueById(self, issueId):
        if issueId:
            if self.jiraClinet == None:
                self.login()
            return self.jiraClinet.issue(issueId)
        else:
            return 'Please input your issueId'

    def createIssue(self, project, summary, description, assignee, priority,labels):
        issue_dict = {
            'project': {'key': project},
            'issuetype': {'name': u'xx问题'},
            'summary': summary,
            'description': description,
            'assignee': {'name': assignee},
            'priority': {'name': priority},
            'labels': labels.split(';')
        }
        if self.jiraClinet == None:
            self.login()
        return self.jiraClinet.create_issue(issue_dict)
    #添加完watcher,
    def addWatcher(self,new_issue,assignee):
        try:
            self.jiraClinet.add_watcher(new_issue.id, assignee)
        except Exception as e:
            print(e)
        self.jiraClinet.add_comment(new_issue, u'请管理员在xx修复完毕后点击[解决问题]按钮,以方便跟踪进度,谢谢')

    # 依据内部编号(如:HTxx)的ID搜索
    def searchissue(self,vulns_id):
        # 拼接jira的查询语句
        jiraexp = f'project=SRCVR AND text ~ "{vulns_id}"'
        # 获取jira目前漏洞修复的状态
        _issue = self.jiraClinet.search_issues(jiraexp)
        if _issue:
            self.issue = _issue[0]
            return _issue[0]
        # status = issue[0].fields.status.name
    def closeissue(self):
        if self.issue:
            if '2' in self.availabletransitions():
                self.jiraClinet.transition_issue(issue, '2', fields={'assignee': {'name': '0xx'}, 'resolution': {'id': '1'}},#resolution 1 为解决问题
                              comment=u'漏洞修复完毕')  # 关闭问题

    # 重新打开
    # def reopenissue(self,issue,owner_num):
    def reopenissue(self):
        if self.issue:
            if '3' in self.availabletransitions():
                self.jiraClinet.transition_issue(self.issue, '3',comment=u'经复测,漏洞再次扫出,请检查漏洞修复状态')
        # self.jiraClinet.assign_issue(issue, owner_num)

    # 用于检查漏洞可转换的状态
    def availabletransitions(self):
        if self.issue:
            transitions = self.jiraClinet.transitions(self.issue)
            availableidlist = [t['id'] for t in transitions]
            return availableidlist

jira api 参考链接1 jira api 参考链接1