From b5207ad26daf14c96b7f268b6e696953f74b6238 Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Tue, 7 Jan 2014 21:03:20 +0000 Subject: [PATCH] Add cronjob for awarding the "Badge Off" badge. --- .../files/cron/award-badges-dev-badge | 158 ++++++++++++++++++ .../files/cron/award-badges-dev-badge.cron | 1 + .../files/cron/cron-badges-logrotate | 6 + roles/badges-backend/tasks/main.yml | 2 + 4 files changed, 167 insertions(+) create mode 100644 roles/badges-backend/files/cron/award-badges-dev-badge create mode 100644 roles/badges-backend/files/cron/award-badges-dev-badge.cron diff --git a/roles/badges-backend/files/cron/award-badges-dev-badge b/roles/badges-backend/files/cron/award-badges-dev-badge new file mode 100644 index 0000000000..9a35edde94 --- /dev/null +++ b/roles/badges-backend/files/cron/award-badges-dev-badge @@ -0,0 +1,158 @@ +#!/usr/bin/env python + +import __main__ +# This is going to require sqlalchemy 0.8 sooner than later. +__main__.__requires__ = __requires__ = ["tahrir-api", "sqlalchemy>=0.7"] +import pkg_resources +pkg_resources.require(__requires__) + +import tempfile +import time +import os +import subprocess +import shutil + +from tahrir_api.dbapi import TahrirDatabase +import fedbadges.utils +import transaction + +import fedora.client +import socket + +import logging +log = logging.getLogger() +logging.basicConfig() + +import fedmsg +import fedmsg.config + +fm_config = fedmsg.config.load_config() +fm_config['cert_prefix'] = 'fedbadges' +fm_config['name'] = 'relay_inbound' +fm_config['active'] = True +fedmsg.init(**fm_config) + + +badge = None +email_to_username_mapping = {} + +_fas_cache = {} + + +def make_email_to_username_map(fas_credentials): + fasclient = fedora.client.fas2.AccountSystem( + username=fas_credentials['username'], + password=fas_credentials['password'], + ) + + timeout = socket.getdefaulttimeout() + socket.setdefaulttimeout(600) + try: + log.info("Downloading FAS cache") + request = fasclient.send_request('/user/list', + req_params={'search': '*'}, + auth=True) + finally: + socket.setdefaulttimeout(timeout) + + results = {} + for person in request['people']: + if person.email: + results[person.email] = person.username + + return results + + +def clone_repo(repo): + pwd = os.getcwd() + command = 'git clone https://github.com/fedora-infra/%s.git %s' + try: + location = tempfile.mkdtemp() + os.chdir(location) + os.system(command % (repo, location)) + finally: + os.chdir(pwd) + return location + + +def gather_authors(location): + pwd = os.getcwd() + command = 'git log --raw | grep "^Author: " | sort | uniq -c' + try: + os.chdir(location) + proc = subprocess.Popen([command], shell=True, stdout=subprocess.PIPE) + out, err = proc.communicate() + lines = out.split('\n') + authors = [line.split('<')[-1].split('>')[0] for line in lines] + finally: + os.chdir(pwd) + return authors + +def emails_to_fas_accounts(emails): + usernames = [] + for email in emails: + if email.endswith('@fedoraproject.org'): + username = email[:-1 * len('@fedoraproject.org')] + if not username in usernames: + usernames.append(username) + continue + + # Otherwise, look it up in FAS and append + raise WTFError("wtf is going on with fas") + + return usernames + + +def emails_to_fas_accounts(emails): + usernames = [] + for email in emails: + if email in email_to_username_mapping: + usernames.append(email_to_username_mapping[email]) + return usernames + + +def main(): + repos = ['tahrir', 'tahrir-api', 'fedbadges'] + for repo in repos: + print "Trying %r" % repo + location = clone_repo(repo) + try: + emails = gather_authors(location) + print "Considering emails %r" % emails + usernames = emails_to_fas_accounts(emails) + print "Considering users %r" % usernames + award_badges(usernames) + finally: + shutil.rmtree(location) + + +def award_badges(usernames): + for username in usernames: + email = username + "@fedoraproject.org" + if tahrir.assertion_exists(badge.id, email): + print email, "already has", badge.id, "skipping." + continue + + time.sleep(1) + print "awarding", badge.id, "to", email + try: + transaction.begin() + tahrir.add_assertion(badge.id, email, None) + transaction.commit() + except Exception as e: + transaction.abort() + print "Failure:", e + + +if __name__ == '__main__': + uri = fm_config['badges_global']['database_uri'] + tahrir = TahrirDatabase( + uri, + notification_callback=fedbadges.utils.notification_callback, + ) + badge = tahrir.get_badge(badge_id='badge-off!') + if not badge: + raise ValueError("badge does not exist") + email_to_username_mapping = make_email_to_username_mapping( + fm_config['fas_credentials']) + main() diff --git a/roles/badges-backend/files/cron/award-badges-dev-badge.cron b/roles/badges-backend/files/cron/award-badges-dev-badge.cron new file mode 100644 index 0000000000..422038592a --- /dev/null +++ b/roles/badges-backend/files/cron/award-badges-dev-badge.cron @@ -0,0 +1 @@ +40 2 * * 4 fedmsg /usr/share/badges/cronjobs/award-badges-dev-badge >> /var/log/fedmsg/cron-award-badges-dev-badge.log 2>&1 diff --git a/roles/badges-backend/files/cron/cron-badges-logrotate b/roles/badges-backend/files/cron/cron-badges-logrotate index 7a387a71c1..cba2d67258 100644 --- a/roles/badges-backend/files/cron/cron-badges-logrotate +++ b/roles/badges-backend/files/cron/cron-badges-logrotate @@ -10,6 +10,12 @@ rotate 4 weekly } +/var/log/fedmsg/cron-award-badges-dev-badge.log { + missingok + notifempty + rotate 4 + weekly +} /var/log/fedmsg/cron-award-lifecycle-badges.log { missingok notifempty diff --git a/roles/badges-backend/tasks/main.yml b/roles/badges-backend/tasks/main.yml index 65098cb296..8ada3e2413 100644 --- a/roles/badges-backend/tasks/main.yml +++ b/roles/badges-backend/tasks/main.yml @@ -95,6 +95,7 @@ - award-flock-paparazzi-badge - award-mirror-badge - award-lifecycle-badges + - award-badges-dev-badge tags: - config - cron @@ -112,6 +113,7 @@ - award-flock-paparazzi-badge - award-mirror-badge - award-lifecycle-badges + - award-badges-dev-badge tags: - config - cron