Module copr_sign_unsigned
[hide private]
[frames] | no frames]

Source Code for Module copr_sign_unsigned

  1  #!/usr/bin/python 
  2  # coding: utf-8 
  3   
  4  """ 
  5  One-time run script to sign unsigned rpms and  place pubkey gpg to the all projects. 
  6  """ 
  7  from __future__ import print_function 
  8  from __future__ import unicode_literals 
  9  from __future__ import division 
 10  from __future__ import absolute_import 
 11  import shutil 
 12   
 13  import sys 
 14  import os 
 15  import logging 
 16  import pwd 
 17   
 18   
 19  logging.basicConfig( 
 20      filename="/var/log/copr/onetime_signer.log", 
 21      format='[%(asctime)s][%(levelname)6s]: %(message)s', 
 22      level=logging.DEBUG) 
 23  log = logging.getLogger(__name__) 
 24   
 25   
 26  sys.path.append("/usr/share/copr/") 
 27  from backend.helpers import BackendConfigReader 
 28  from backend.sign import get_pubkey, sign_rpms_in_dir, create_user_keys 
 29  from backend.exceptions import CoprSignNoKeyError 
 30  from backend.createrepo import createrepo 
 31   
 32   
33 -def check_signed_rpms_in_pkg_dir(pkg_dir, user, project, chroot, chroot_dir, opts):
34 success = True 35 36 class LogCb(object): 37 def __init__(self, logger): 38 self.logger = logger
39 40 def log(self, msg): 41 self.logger.info(">>> {}".format(msg)) 42 43 def error(self, msg): 44 self.logger.error(">>> {}".format(msg)) 45 46 cb = LogCb(log) 47 48 try: 49 sign_rpms_in_dir(user, project, pkg_dir, opts, callback=cb) 50 51 log.info("running createrepo for {}".format(pkg_dir)) 52 base_url = "/".join([opts.results_baseurl, user, 53 project, chroot]) 54 createrepo( 55 path=chroot_dir, 56 front_url=opts.frontend_base_url, 57 base_url=base_url, 58 username=user, 59 projectname=project, 60 ) 61 62 except Exception as err: 63 success = False 64 log.error(">>> Failed to check/sign rpm in dir pkg_dir") 65 log.exception(err) 66 67 return success 68 69
70 -def check_signed_rpms(project_dir, user, project, opts):
71 """ 72 Ensure that all rpm files are signed 73 """ 74 success = True 75 for chroot in os.listdir(project_dir): 76 if not (chroot.startswith("fedora") or chroot.startswith("epel")): 77 continue 78 79 chroot_path = os.path.join(project_dir, chroot) 80 if not os.path.isdir(chroot_path): 81 continue 82 83 log.debug("> Checking chroot `{}` in dir `{}`".format(chroot, project_dir)) 84 85 for mb_pkg in os.listdir(chroot_path): 86 if mb_pkg in ["repodata", "devel"]: 87 continue 88 mb_pkg_path = os.path.join(chroot_path, mb_pkg) 89 if not os.path.isdir(mb_pkg_path): 90 continue 91 92 log.debug(">> Stepping into package: {}".format(mb_pkg_path)) 93 94 if not check_signed_rpms_in_pkg_dir(mb_pkg_path, user, project, chroot, chroot_path, opts): 95 success = False 96 97 return success
98 99
100 -def check_pubkey(pubkey_path, user, project, opts):
101 """ 102 Ensure that pubkey.gpg presented in project/dir 103 """ 104 if os.path.exists(pubkey_path): 105 log.info("Pubkey for {}/{} exists: {}".format(user, project, pubkey_path)) 106 return True 107 else: 108 log.info("Missing pubkey for {}/{}".format(user, project)) 109 try: 110 get_pubkey(user, project, pubkey_path) 111 return True 112 except Exception as err: 113 log.exception(err) 114 return False
115 116
117 -def main():
118 # shutil.rmtree("/tmp/users_failed.txt", ignore_errors=True) 119 # shutil.rmtree("/tmp/users_done.txt", ignore_errors=True) 120 users_done_old = set() 121 try: 122 with open("/tmp/users_done.txt") as handle: 123 for line in handle: 124 users_done_old.add(line.strip()) 125 except Exception as err: 126 log.exception(err) 127 log.debug("error during read old users done") 128 129 opts = BackendConfigReader().read() 130 log.info("Starting pubkey fill, destdir: {}".format(opts.destdir)) 131 132 log.debug("list dir: {}".format(os.listdir(opts.destdir))) 133 for user_name in os.listdir(opts.destdir): 134 if user_name in users_done_old: 135 log.info("skipping user: {}".format(user_name)) 136 continue 137 138 failed = False 139 log.info("Started processing user dir: {}".format(user_name)) 140 user_dir = os.path.join(opts.destdir, user_name) 141 142 for project_name in os.listdir(user_dir): 143 log.info("Checking project dir: {}".format(project_name)) 144 145 try: 146 get_pubkey(user_name, project_name) 147 log.info("Key-pair exists for {}/{}".format(user_name, project_name)) 148 except CoprSignNoKeyError: 149 create_user_keys(user_name, project_name, opts) 150 log.info("Created new key-pair for {}/{}".format(user_name, project_name)) 151 except Exception as err: 152 log.error("Failed to get pubkey for {}/{}, mark as failed, skipping") 153 log.exception(err) 154 failed = True 155 continue 156 157 project_dir = os.path.join(user_dir, project_name) 158 pubkey_path = os.path.join(project_dir, "pubkey.gpg") 159 if not check_signed_rpms(project_dir, user_name, project_name, opts): 160 failed = False 161 162 if not check_pubkey(pubkey_path, user_name, project_name, opts): 163 failed = False 164 165 if failed: 166 with open("/tmp/users_failed.txt", "a") as handle: 167 handle.write("{}\n".format(user_name)) 168 else: 169 with open("/tmp/users_done.txt", "a") as handle: 170 handle.write("{}\n".format(user_name))
171 172 if __name__ == "__main__": 173 if pwd.getpwuid(os.getuid())[0] != "copr": 174 print("This script should be executed under the `copr` user") 175 sys.exit(1) 176 else: 177 main() 178