Module copr_sign_unsigned
|
|
1
2
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
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
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
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
118
119
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