Пример #1
0
    def run(self, cmdline, db) -> None:
        mbt = bugtrackers["centos-mantisbt"]
        db_tracker = get_bugtracker_by_name(db, "centos-mantisbt")
        for bug_id in mbt.list_bugs():
            self.log_info("Processing Mantis issue #{0}".format(bug_id))
            bug = mbt.mc.mc_issue_get(mbt.user, mbt.password, bug_id)
            bug_dict = mbt.preprocess_bug(bug)
            if bug_dict and bug_dict.get("url", False):
                url = bug_dict["url"]
                report_hash = url.split("/")[-1]
                db_report = get_report(db, report_hash)
                if db_report is None:
                    self.log_info(
                        "Report with hash {0} not found.".format(report_hash))
                    continue
                db_mantisbug = get_mantis_bug(db, bug_id, db_tracker.id)
                if db_mantisbug is None:
                    self.log_info("Downloading bug to storage...")
                    db_mantisbug = mbt.download_bug_to_storage(db, bug_id)
                    if db_mantisbug is None:
                        self.log_info("Failed to download bug.")
                        continue

                db_rm = (db.session.query(ReportMantis).filter(
                    ReportMantis.report == db_report).filter(
                        ReportMantis.mantisbug == db_mantisbug).first())
                if db_rm is None:
                    db_rm = ReportMantis()
                    db_rm.mantisbug = db_mantisbug
                    db_rm.report = db_report
                    db.session.add(db_rm)
                    db.session.flush()
                    self.log_info(
                        "Associated issue #{0} with report #{1}.".format(
                            bug_id, db_report.id))
            else:
                self.log_info(
                    "Bug {0} is not a valid ABRT issue.".format(bug_id))
Пример #2
0
    def run(self, cmdline, db):
        mbt = bugtrackers["centos-mantisbt"]
        db_tracker = get_bugtracker_by_name(db, "centos-mantisbt")
        for bug_id in mbt.list_bugs():
            self.log_info("Processing Mantis issue #{0}".format(bug_id))
            bug = mbt.mc.mc_issue_get(mbt.user, mbt.password, bug_id)
            bug_dict = mbt._preprocess_bug(bug)
            if bug_dict and bug_dict.get("url", False):
                url = bug_dict["url"]
                report_hash = url.split("/")[-1]
                db_report = get_report(db, report_hash)
                if db_report is None:
                    self.log_info("Report with hash {0} not found.".format(report_hash))
                    continue
                db_mantisbug = get_mantis_bug(db, bug_id, db_tracker.id)
                if db_mantisbug is None:
                    self.log_info("Downloading bug to storage...")
                    db_mantisbug = mbt.download_bug_to_storage(db, bug_id)
                    if db_mantisbug is None:
                        self.log_info("Failed to download bug.")
                        continue

                db_rm = (
                    db.session.query(ReportMantis)
                    .filter(ReportMantis.report == db_report)
                    .filter(ReportMantis.mantisbug == db_mantisbug)
                    .first()
                )
                if db_rm is None:
                    db_rm = ReportMantis()
                    db_rm.mantisbug = db_mantisbug
                    db_rm.report = db_report
                    db.session.add(db_rm)
                    db.session.flush()
                    self.log_info("Associated issue #{0} with report #{1}.".format(bug_id, db_report.id))
            else:
                self.log_info("Not a valid ABRT issue.".format(bug_id))
Пример #3
0
def save_attachment(db, attachment):
    atype = attachment["type"].lower()

    if not attachment_type_allowed(atype):
        raise FafError(
            "Attachment type '{}' not allowed on this server".format(atype))

    report = get_report(db, attachment["bthash"])
    if not report:
        raise FafError("Report for given bthash not found")

    if atype in ["rhbz", "fedora-bugzilla", "rhel-bugzilla"]:
        bug_id = int(attachment["data"])

        reportbug = (db.session.query(
            ReportBz).filter((ReportBz.report_id == report.id)
                             & (ReportBz.bzbug_id == bug_id)).first())

        if reportbug:
            log.debug("Skipping existing attachment")
            return

        bug = get_bz_bug(db, bug_id)
        if not bug:
            if atype in bugtrackers:
                # download from bugtracker identified by atype
                tracker = bugtrackers[atype]

                if not tracker.installed(db):
                    raise FafError("Bugtracker used in this attachment"
                                   " is not installed")

                bug = tracker.download_bug_to_storage(db, bug_id)
            elif atype == "rhbz":
                # legacy value
                # - we need to guess the bugtracker:
                # either fedora-bugzilla or rhel-bugzilla,
                # former is more probable
                for possible_tracker in ["fedora-bugzilla", "rhel-bugzilla"]:
                    if possible_tracker not in bugtrackers:
                        continue

                    tracker = bugtrackers[possible_tracker]
                    if not tracker.installed(db):
                        continue

                    bug = tracker.download_bug_to_storage(db, bug_id)
                    if bug:
                        break

        if bug:
            new = ReportBz()
            new.report = report
            new.bzbug = bug
            db.session.add(new)
            db.session.flush()
        else:
            log.error("Failed to fetch bug #{0} from '{1}'".format(
                bug_id, atype))

    elif atype == "centos-mantisbt":
        bug_id = int(attachment["data"])

        reportbug = (db.session.query(ReportMantis).filter(
            (ReportMantis.report_id == report.id)
            & (ReportMantis.mantisbug_id == bug_id)).first())

        if reportbug:
            log.debug("Skipping existing attachment")
            return

        bug = get_mantis_bug(db, bug_id)
        if not bug:
            if atype in bugtrackers:
                # download from bugtracker identified by atype
                tracker = bugtrackers[atype]

                if not tracker.installed(db):
                    raise FafError("Bugtracker used in this attachment"
                                   " is not installed")

                bug = tracker.download_bug_to_storage(db, bug_id)

        if bug:
            new = ReportMantis()
            new.report = report
            new.mantisbug = bug
            db.session.add(new)
            db.session.flush()
        else:
            log.error("Failed to fetch bug #{0} from '{1}'".format(
                bug_id, atype))

    elif atype == "comment":
        comment = ReportComment()
        comment.report = report
        comment.text = attachment["data"]
        comment.saved = datetime.datetime.utcnow()
        db.session.add(comment)
        db.session.flush()

    elif atype == "email":
        db_contact_email = get_contact_email(db, attachment["data"])
        if db_contact_email is None:
            db_contact_email = ContactEmail()
            db_contact_email.email_address = attachment["data"]
            db.session.add(db_contact_email)

            db_report_contact_email = ReportContactEmail()
            db_report_contact_email.contact_email = db_contact_email
            db_report_contact_email.report = report
            db.session.add(db_report_contact_email)
        else:
            db_report_contact_email = \
                get_report_contact_email(db, db_contact_email.id, report.id)
            if db_report_contact_email is None:
                db_report_contact_email = ReportContactEmail()
                db_report_contact_email.contact_email = db_contact_email
                db_report_contact_email.report = report
                db.session.add(db_report_contact_email)

        try:
            db.session.flush()
        except IntegrityError:
            raise FafError("Email address already assigned to the report")

    elif atype == "url":
        url = attachment["data"]

        # 0ne URL can be attached to many Reports, but every reports must
        # have unique url's
        db_url = (db.session.query(ReportURL).filter(
            ReportURL.url == url).filter(
                ReportURL.report_id == report.id).first())

        if db_url:
            log.debug("Skipping existing URL")
            return

        db_url = ReportURL()
        db_url.report = report
        db_url.url = url
        db_url.saved = datetime.datetime.utcnow()

        try:
            db.session.flush()
        except IntegrityError:
            raise FafError("Unable to save URL")

    else:
        log.warning("Unknown attachment type")