From e1f7f3683417c6d869b53b4186b681ae2bc0135c Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Jul 18 2017 17:30:25 +0000 Subject: kojira monitors external repos changes Fixes: https://pagure.io/koji/issue/512 --- diff --git a/util/kojira b/util/kojira index 4a21332..a0fbabc 100755 --- a/util/kojira +++ b/util/kojira @@ -35,10 +35,12 @@ import fnmatch import logging import logging.handlers import pprint +import requests import signal import time import threading import traceback +from xml.etree import ElementTree @@ -291,8 +293,31 @@ class RepoManager(object): self.logger.info('Dropping entry for inactive repo: %s', repo_id) del self.repos[repo_id] + def checkExternalRepo(self, ts, repodata, tag): + """Determine which external repos are current""" + url = repodata['url'] + if url not in self.external_repos: + newest_ts = 0 + for arch in self.tag_arches.get(tag, self.session.getTag(tag)['arches'].split()): + arch_url = url.replace('$arch', arch) + arch_url = os.path.join(arch_url, 'repodata/repomd.xml') + try: + r = requests.get(arch_url) + root = ElementTree.fromstring(r.text) + for child in root.iter('{http://linux.duke.edu/metadata/repo}timestamp'): + newest_ts = max(newest_ts, int(child.text)) + except Exception: + # inaccessible or without timestamps + # treat repo as unchanged (ts = 0) + pass + self.external_repos[url] = newest_ts + return ts < self.external_repos[url] + def checkCurrentRepos(self, session=None): """Determine which repos are current""" + # clean one-cycle timestamp + arch cache + self.external_repos = {} + self.tag_arches = {} if session is None: session = self.session to_check = [] @@ -320,6 +345,18 @@ class RepoManager(object): #session.multicall = True for repo in to_check: changed = session.tagChangedSinceEvent(repo.event_id, repo.taglist) + if not changed: + # look to external repos + for tag in repo.taglist: + for external_repo in session.getExternalRepoList(tag): + changed = self.checkExternalRepo(repo.event_ts, external_repo, tag) + self.logger.debug("Check external repo %s [%s] for tag %s: %s" % ( + external_repo['external_repo_id'], external_repo['url'], + tag, changed)) + if changed: + break + if changed: + break #for repo, [changed] in zip(to_check, session.multiCall(strict=True)): if changed: self.logger.info("Repo %i no longer current", repo.repo_id)