From 8b195f8bd6372f0215ebc72d409e2c3e767bcdf0 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Wed, 16 May 2018 15:09:52 +0200 Subject: [PATCH] Add SAR script for pagure Signed-off-by: Pierre-Yves Chibon --- .../host_vars/pagure01.fedoraproject.org | 5 + roles/pagure/frontend/files/pagure_sar.py | 145 ++++++++++++++++++ roles/pagure/frontend/tasks/main.yml | 7 + 3 files changed, 157 insertions(+) create mode 100644 roles/pagure/frontend/files/pagure_sar.py diff --git a/inventory/host_vars/pagure01.fedoraproject.org b/inventory/host_vars/pagure01.fedoraproject.org index 828de32abf..0e8efc3cba 100644 --- a/inventory/host_vars/pagure01.fedoraproject.org +++ b/inventory/host_vars/pagure01.fedoraproject.org @@ -26,3 +26,8 @@ effective_cache_size: "512MB" ssh_hostnames: - pagure.io + +# GDPR SAR variables - datanommer/datagrepper +sar_script: /usr/local/bin/pagure_sar.py +sar_script_user: git +sar_output_file: pagure.json diff --git a/roles/pagure/frontend/files/pagure_sar.py b/roles/pagure/frontend/files/pagure_sar.py new file mode 100644 index 0000000000..f04c49f3f7 --- /dev/null +++ b/roles/pagure/frontend/files/pagure_sar.py @@ -0,0 +1,145 @@ +#!/usr/bin/python + +from __future__ import unicode_literals, print_function + +import json +import os +import sys + +import sqlalchemy + +import pagure.config +import pagure.lib +from pagure.lib import model + + +if 'PAGURE_CONFIG' not in os.environ \ + and os.path.exists('/etc/pagure/pagure.cfg'): + os.environ['PAGURE_CONFIG'] = '/etc/pagure/pagure.cfg' + + +_config = pagure.config.reload_config() +session = pagure.lib.create_session(_config['DB_URL']) + + +def get_issue_users(session, user_id): + ''' Return all pagure.lib.model.Issue related to the usernames provided + ''' + query1 = session.query( + model.Issue.uid + ).filter( + sqlalchemy.or_( + model.Issue.assignee_id == user_id, + model.Issue.user_id == user_id + ) + ) + query2 = session.query( + model.Issue.uid + ).filter( + model.Issue.uid == model.IssueComment.issue_uid + ).filter( + model.IssueComment.user_id == user_id + ) + + query = session.query( + model.Issue + ).filter( + sqlalchemy.or_( + model.Issue.uid.in_(query1.subquery()), + model.Issue.uid.in_(query2.subquery()) + ) + ).order_by( + model.Issue.date_created + ) + + return query.all() + + +def get_pr_users(session, user_id): + ''' Return all pagure.lib.model.PullRequest related to the usernames provided + ''' + query1 = session.query( + model.PullRequest.uid + ).filter( + sqlalchemy.or_( + model.PullRequest.assignee_id == user_id, + model.PullRequest.user_id == user_id + ) + ) + query2 = session.query( + model.PullRequest.uid + ).filter( + model.PullRequest.uid == model.PullRequestComment.pull_request_uid + ).filter( + model.PullRequestComment.user_id == user_id + ) + + query = session.query( + model.PullRequest + ).filter( + sqlalchemy.or_( + model.PullRequest.uid.in_(query1.subquery()), + model.PullRequest.uid.in_(query2.subquery()) + ) + ).order_by( + model.PullRequest.date_created + ) + + return query.all() + + +def main(): + ''' Prints out all the pagure project and comment related to the username + specified in the SAR_USERNAME environment variable or the email + specified in the SAR_EMAIL environment variable.. + ''' + + username = os.getenv('SAR_USERNAME') + email = os.getenv('SAR_EMAIL') + + users = [] + if username: + users.append(pagure.lib.search_user(session, username=username)) + if email: + user_email = pagure.lib.search_user(session, email=email) + if user_email not in users: + users.apennd(user_email) + + output = {} + + for user in users: + temp = {} + temp['user_info'] = user.to_json(public=False) + + projects = pagure.lib.search_projects(session, user.username) + projects = [ + project.to_json() + for project in projects + ] + temp['projects'] = projects + + issues = get_issue_users(session, user.id) + issues = [ + issue.to_json() + for issue in issues + ] + temp['issues'] = issues + + prs = get_pr_users(session, user.id) + prs = [ + pr.to_json() + for pr in prs + ] + temp['pull_requests'] = prs + + output[user.username] = temp + + session.remove() + + print(json.dumps( + output, sort_keys=True, indent=4, separators=(',', ': ') + ).encode('utf-8')) + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/roles/pagure/frontend/tasks/main.yml b/roles/pagure/frontend/tasks/main.yml index 787b7adb58..50d1892759 100644 --- a/roles/pagure/frontend/tasks/main.yml +++ b/roles/pagure/frontend/tasks/main.yml @@ -402,3 +402,10 @@ tags: - config - apache + +- name: Add SAR script for pagure + copy: src=pagure_sar.py dest=/usr/local/bin/pagure_sar.py owner=git mode=0700 + tags: + - SAR + - GDPR + - pagure