Skip to content

Commit b2ac885

Browse files
TUN-6209: Sign RPM packages
This PR uses a provided key to - sign all the .rpms before they are uploaded to R2. - detach signs the repomd.xml after createrepo is run.
1 parent 2c480a7 commit b2ac885

File tree

1 file changed

+43
-10
lines changed

1 file changed

+43
-10
lines changed

release_pkgs.py

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,25 +109,40 @@ def create_deb_pkgs(self, release, deb_file):
109109
print(f"create deb_pkgs result => {out}, {err}")
110110
raise
111111

112-
# TODO https://jira.cfops.it/browse/TUN-6209 : Sign these packages.
113-
def create_rpm_pkgs(self, artifacts_path):
114-
self._setup_rpm_pkg_directories(artifacts_path)
112+
def create_rpm_pkgs(self, artifacts_path, gpg_key_name):
113+
self._setup_rpm_pkg_directories(artifacts_path, gpg_key_name)
115114
p = Popen(["createrepo", "./rpm"], stdout=PIPE, stderr=PIPE)
116115
out, err = p.communicate()
117116
if p.returncode != 0:
118117
print(f"create rpm_pkgs result => {out}, {err}")
119118
raise
120119

120+
self._sign_repomd()
121+
122+
def _sign_rpms(self, file_path):
123+
p = Popen(["rpm" , "--define", f"_gpg_name {gpg_key_name}", "--addsign", file_path], stdout=PIPE, stderr=PIPE)
124+
out, err = p.communicate()
125+
if p.returncode != 0:
126+
print(f"rpm sign result result => {out}, {err}")
127+
raise
128+
129+
def _sign_repomd(self):
130+
p = Popen(["gpg", "--batch", "--detach-sign", "--armor", "./rpm/repodata/repomd.xml"], stdout=PIPE, stderr=PIPE)
131+
out, err = p.communicate()
132+
if p.returncode != 0:
133+
print(f"sign repomd result => {out}, {err}")
134+
raise
135+
121136
"""
122-
sets up the RPM directories in the following format:
137+
sets up and signs the RPM directories in the following format:
123138
- rpm
124139
- aarch64
125140
- x86_64
126141
- 386
127142
128143
this assumes the assets are in the format <prefix>-<aarch64/x86_64/386>.rpm
129144
"""
130-
def _setup_rpm_pkg_directories(self, artifacts_path, archs=["aarch64", "x86_64", "386"]):
145+
def _setup_rpm_pkg_directories(self, artifacts_path, gpg_key_name, archs=["aarch64", "x86_64", "386"]):
131146
for arch in archs:
132147
for root, _ , files in os.walk(artifacts_path):
133148
for file in files:
@@ -137,6 +152,7 @@ def _setup_rpm_pkg_directories(self, artifacts_path, archs=["aarch64", "x86_64",
137152
old_path = os.path.join(root, file)
138153
new_path = os.path.join(new_dir, file)
139154
shutil.copyfile(old_path, new_path)
155+
self._sign_rpms(new_path)
140156

141157
"""
142158
imports gpg keys into the system so reprepro and createrepo can use it to sign packages.
@@ -149,7 +165,23 @@ def import_gpg_keys(self, private_key, public_key):
149165
public_key = base64.b64decode(public_key)
150166
gpg.import_keys(public_key)
151167
data = gpg.list_keys(secret=True)
152-
return (data[0]["fingerprint"])
168+
return (data[0]["fingerprint"], data[0]["uids"][0])
169+
170+
"""
171+
basically rpm --import <key_file>
172+
This enables us to sign rpms.
173+
"""
174+
def import_rpm_key(self, public_key):
175+
file_name = "pb.key"
176+
with open(file_name, "wb") as f:
177+
public_key = base64.b64decode(public_key)
178+
f.write(public_key)
179+
180+
p = Popen(["rpm", "--import", file_name], stdout=PIPE, stderr=PIPE)
181+
out, err = p.communicate()
182+
if p.returncode != 0:
183+
print(f"create rpm import result => {out}, {err}")
184+
raise
153185

154186

155187
"""
@@ -212,9 +244,9 @@ def create_deb_packaging(pkg_creator, pkg_uploader, releases, gpg_key_id, binary
212244
upload_from_directories(pkg_uploader, "dists", release_version, binary_name)
213245
upload_from_directories(pkg_uploader, "pool", release_version, binary_name)
214246

215-
def create_rpm_packaging(pkg_creator, pkg_uploader, artifacts_path, release_version, binary_name):
247+
def create_rpm_packaging(pkg_creator, pkg_uploader, artifacts_path, release_version, binary_name, gpg_key_name):
216248
print(f"creating rpm pkgs...")
217-
pkg_creator.create_rpm_pkgs(artifacts_path)
249+
pkg_creator.create_rpm_pkgs(artifacts_path, gpg_key_name)
218250

219251
print("uploading latest to r2...")
220252
upload_from_directories(pkg_uploader, "rpm", None, binary_name)
@@ -282,11 +314,12 @@ def parse_args():
282314
exit(1)
283315

284316
pkg_creator = PkgCreator()
285-
gpg_key_id = pkg_creator.import_gpg_keys(args.gpg_private_key, args.gpg_public_key)
317+
(gpg_key_id, gpg_key_name) = pkg_creator.import_gpg_keys(args.gpg_private_key, args.gpg_public_key)
318+
pkg_creator.import_rpm_key(args.gpg_public_key)
286319

287320
pkg_uploader = PkgUploader(args.account, args.bucket, args.id, args.secret)
288321
print(f"signing with gpg_key: {gpg_key_id}")
289322
create_deb_packaging(pkg_creator, pkg_uploader, args.deb_based_releases, gpg_key_id, args.binary, args.archs,
290323
"main", args.release_tag)
291324

292-
create_rpm_packaging(pkg_creator, pkg_uploader, "./built_artifacts", args.release_tag, args.binary )
325+
create_rpm_packaging(pkg_creator, pkg_uploader, "./built_artifacts", args.release_tag, args.binary, gpg_key_name)

0 commit comments

Comments
 (0)