Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : master
---------------------------------------------------------------
commit cc712a388c0cc3a1d72ec712b786b5c5f8d43faa
Author: Valentin Gologuzov <vgologuz(a)redhat.com>
Date: Thu Feb 5 13:40:01 2015 +0100
[backend] one-time run sciprt to sign older builds
---------------------------------------------------------------
backend/run/copr_sign_unsigned.py | 152 +++++++++++++++++++++++++++++++++++++
1 files changed, 152 insertions(+), 0 deletions(-)
diff --git a/backend/run/copr_sign_unsigned.py b/backend/run/copr_sign_unsigned.py
new file mode 100755
index 0000000..de1527a
--- /dev/null
+++ b/backend/run/copr_sign_unsigned.py
@@ -0,0 +1,152 @@
+#!/usr/bin/python
+# coding: utf-8
+
+"""
+One-time run script to sign unsigned rpms and place pubkey gpg to the all projects.
+"""
+from __future__ import print_function
+from __future__ import unicode_literals
+from __future__ import division
+from __future__ import absolute_import
+import shutil
+
+import sys
+import os
+import logging
+import pwd
+
+
+logging.basicConfig(
+ filename="/var/log/copr/onetime_signer.log",
+ format='[%(asctime)s][%(levelname)6s]: %(message)s',
+ level=logging.DEBUG)
+log = logging.getLogger(__name__)
+
+
+sys.path.append("/usr/share/copr/")
+from backend.helpers import BackendConfigReader
+from backend.sign import get_pubkey, sign_rpms_in_dir, create_user_keys
+from backend.exceptions import CoprSignNoKeyError
+
+
+def check_signed_rpms_in_pkg_dir(pkg_dir, user, project, opts):
+ success = True
+
+ class LogCb(object):
+ def __init__(self, logger):
+ self.logger = logger
+
+ def log(self, msg):
+ self.logger.info(">>> {}".format(msg))
+
+ def error(self, msg):
+ self.logger.error(">>> {}".format(msg))
+
+ cb = LogCb(log)
+
+ try:
+ sign_rpms_in_dir(user, project, pkg_dir, opts, callback=cb)
+ except Exception as err:
+ success = False
+ log.error(">>> Failed to check/sign rpm in dir pkg_dir")
+ log.exception(err)
+
+ return success
+
+
+def check_signed_rpms(project_dir, user, project, opts):
+ """
+ Ensure that all rpm files are signed
+ """
+ success = True
+ for chroot in os.listdir(project_dir):
+ if not (chroot.startswith("fedora") or
chroot.startswith("epel")):
+ continue
+
+ chroot_path = os.path.join(project_dir, chroot)
+ if not os.path.isdir(chroot_path):
+ continue
+
+ log.debug("> Checking chroot `{}` in dir `{}`".format(chroot,
project_dir))
+
+ for mb_pkg in os.listdir(chroot_path):
+ if mb_pkg in ["repodata", "devel"]:
+ continue
+ mb_pkg_path = os.path.join(chroot_path, mb_pkg)
+ if not os.path.isdir(mb_pkg_path):
+ continue
+
+ log.debug(">> Stepping into package:
{}".format(mb_pkg_path))
+
+ if not check_signed_rpms_in_pkg_dir(mb_pkg_path, user, project, opts):
+ success = False
+
+ return success
+
+
+def check_pubkey(pubkey_path, user, project, opts):
+ """
+ Ensure that pubkey.gpg presented in project/dir
+ """
+ if os.path.exists(pubkey_path):
+ log.info("Pubkey for {}/{} exists: {}".format(user, project,
pubkey_path))
+ return True
+ else:
+ log.info("Missing pubkey for {}/{}".format(user, project))
+ try:
+ get_pubkey(user, project, pubkey_path)
+ return True
+ except Exception as err:
+ log.exception(err)
+ return False
+
+
+def main():
+ shutil.rmtree("/tmp/users_failed.txt", ignore_errors=True)
+ shutil.rmtree("/tmp/users_done.txt", ignore_errors=True)
+
+ opts = BackendConfigReader().read()
+ log.info("Starting pubkey fill, destdir: {}".format(opts.destdir))
+
+ log.debug("list dir: {}".format(os.listdir(opts.destdir)))
+ for user_name in os.listdir(opts.destdir):
+ failed = False
+ log.info("Started processing user dir: {}".format(user_name))
+ user_dir = os.path.join(opts.destdir, user_name)
+
+ for project_name in os.listdir(user_dir):
+ log.info("Checking project dir: {}".format(project_name))
+
+ try:
+ get_pubkey(user_name, project_name)
+ log.info("Key-pair exists for {}/{}".format(user_name,
project_name))
+ except CoprSignNoKeyError:
+ create_user_keys(user_name, project_name, opts)
+ log.info("Created new key-pair for {}/{}".format(user_name,
project_name))
+ except Exception as err:
+ log.error("Failed to get pubkey for {}/{}, mark as failed,
skipping")
+ log.exception(err)
+ failed = True
+ continue
+
+ project_dir = os.path.join(user_dir, project_name)
+ pubkey_path = os.path.join(project_dir, "pubkey.gpg")
+ if not check_signed_rpms(project_dir, user_name, project_name, opts):
+ failed = False
+
+ if not check_pubkey(pubkey_path, user_name, project_name, opts):
+ failed = False
+
+ if failed:
+ with open("/tmp/users_failed.txt", "a") as handle:
+ handle.write("{}\n".format(user_name))
+ else:
+ with open("/tmp/users_done.txt", "a") as handle:
+ handle.write("{}\n".format(user_name))
+
+if __name__ == "__main__":
+ if pwd.getpwuid(os.getuid())[0] != "copr":
+ print("This script should be executed under the `copr` user")
+ sys.exit(1)
+ else:
+ main()