From b563090860d1f90ad60b752ed14bc2feb3650dc7 Mon Sep 17 00:00:00 2001 From: Ralph Bean Date: Mon, 6 Jan 2014 20:35:26 +0000 Subject: [PATCH] Cronjob to award the fas "lifecycle" badges. --- .../files/cron/award-lifecycle-badges | 112 ++++++++++++++++++ .../files/cron/award-lifecycle-badges.cron | 1 + .../files/cron/cron-badges-logrotate | 6 + roles/badges-backend/tasks/main.yml | 2 + 4 files changed, 121 insertions(+) create mode 100644 roles/badges-backend/files/cron/award-lifecycle-badges create mode 100644 roles/badges-backend/files/cron/award-lifecycle-badges.cron diff --git a/roles/badges-backend/files/cron/award-lifecycle-badges b/roles/badges-backend/files/cron/award-lifecycle-badges new file mode 100644 index 0000000000..924e3886f7 --- /dev/null +++ b/roles/badges-backend/files/cron/award-lifecycle-badges @@ -0,0 +1,112 @@ +#!/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 datetime +import time +import urllib +import socket + +from tahrir_api.dbapi import TahrirDatabase +import transaction + +_fas_cache = {} + +import logging +log = logging.getLogger() +logging.basicConfig() +import fedora.client.fas2 + +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) + +import fedbadges.utils + + +def get_fas_userlist(fas_credentials, lookup, **config): + creds = fas_credentials + + fasclient = fedora.client.fas2.AccountSystem( + username=creds['username'], + password=creds['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) + + # We don't actually check for CLA+1, just "2 groups" + return [p for p in request['people'] if len(p.memberships) > 1] + + +def main(): + year = datetime.timedelta(days=365.5) + mapping = { + 'egg': year * 1, + 'embryo': year * 2, + 'tadpole': year * 3, + 'tadpole-with-legs': year * 5, + 'froglet': year * 7, + 'adult frog': year * 10, + } + + # First, some validation that the badge ids actually exist. + for badge_id, delta in mapping.items(): + badge = tahrir.get_badge(badge_id=badge_id) + assert(badge.id) + + # Then, do a long query against FAS for our candidates. + results = get_fas_userlist(fas_credentials=fm_config['fas_credentials']) + + for badge_id, delta in mapping.items(): + badge = tahrir.get_badge(badge_id=badge_id) + for person in results: + if now - person.creation > delta: + hit_em_up(badge, person) + + +def hit_em_up(badge, fas_user): + email = fas_user.username + "@fedoraproject.org" + user = tahrir.get_person(email) + + if not user: + return + + if tahrir.assertion_exists(badge.id, email): + print email, "already has", badge.id, "skipping." + return + + 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, + ) + main() diff --git a/roles/badges-backend/files/cron/award-lifecycle-badges.cron b/roles/badges-backend/files/cron/award-lifecycle-badges.cron new file mode 100644 index 0000000000..ad51a56f6c --- /dev/null +++ b/roles/badges-backend/files/cron/award-lifecycle-badges.cron @@ -0,0 +1 @@ +40 2 * * 3 fedmsg /usr/share/badges/cronjobs/award-lifecycle-badges >> /var/log/fedmsg/cron-award-lifecycle-badges.log 2>&1 diff --git a/roles/badges-backend/files/cron/cron-badges-logrotate b/roles/badges-backend/files/cron/cron-badges-logrotate index 06bcc0bb01..7a387a71c1 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-lifecycle-badges.log { + missingok + notifempty + rotate 4 + weekly +} /var/log/fedmsg/cron-award-mirror-badge.log { missingok notifempty diff --git a/roles/badges-backend/tasks/main.yml b/roles/badges-backend/tasks/main.yml index 174aec072e..65098cb296 100644 --- a/roles/badges-backend/tasks/main.yml +++ b/roles/badges-backend/tasks/main.yml @@ -94,6 +94,7 @@ - award-libravatar-badge - award-flock-paparazzi-badge - award-mirror-badge + - award-lifecycle-badges tags: - config - cron @@ -110,6 +111,7 @@ - award-libravatar-badge - award-flock-paparazzi-badge - award-mirror-badge + - award-lifecycle-badges tags: - config - cron