From 9ed7a29ebb77c36ee555c2818b728a7e6b160322 Mon Sep 17 00:00:00 2001
From: Daniil Baturin <daniil@baturin.org>
Date: Wed, 6 Nov 2024 18:55:37 +0000
Subject: build: T6855: make the custom APT entry and key syntax more flexible

---
 scripts/image-build/build-vyos-image | 44 ++++++++++++++++++++++++++++++------
 scripts/image-build/defaults.py      |  2 +-
 2 files changed, 38 insertions(+), 8 deletions(-)

(limited to 'scripts')

diff --git a/scripts/image-build/build-vyos-image b/scripts/image-build/build-vyos-image
index a9294f38..044a9055 100755
--- a/scripts/image-build/build-vyos-image
+++ b/scripts/image-build/build-vyos-image
@@ -25,6 +25,7 @@ import copy
 import uuid
 import glob
 import json
+import base64
 import shutil
 import argparse
 import datetime
@@ -503,8 +504,9 @@ DOCUMENTATION_URL="{build_config['documentation_url']}"
         ## Create live-build configuration files
 
         # Add the additional repositories to package lists
-        print("I: Setting up additional APT entries")
+        print("I: Setting up VyOS repository APT entries")
         vyos_repo_entry = "deb {vyos_mirror} {vyos_branch} main\n".format(**build_config)
+        vyos_repo_entry += "deb-src {vyos_mirror} {vyos_branch} main\n".format(**build_config)
 
         apt_file = defaults.VYOS_REPO_FILE
 
@@ -516,10 +518,36 @@ DOCUMENTATION_URL="{build_config['documentation_url']}"
             f.write(vyos_repo_entry)
 
         # Add custom APT entries
+        print("I: Setting up additional APT entries")
         if build_config.get('additional_repositories', False):
-            build_config['custom_apt_entry'] += build_config['additional_repositories']
+            for r in build_config['additional_repositories']:
+                repo_data = build_config['additional_repositories'][r]
+
+                url = repo_data.get('url', None)
+                arch = repo_data.get('architecture', None)
+                distro = repo_data.get('distribution', build_config['debian_distribution'])
+                components = repo_data.get('components', 'main')
+
+                if not url:
+                    print(f'E: repository {r} does not specify URL')
+                    sys.exit(1)
+
+                if arch:
+                    arch_string = f'[arch={arch}]'
+                else:
+                    arch_string = ''
+
+                entry = f'deb {arch_string} {url} {distro} {components}'
+                build_config['custom_apt_entry'].append(entry)
+
+                if not repo_data.get('no_source', False):
+                    src_entry = f'deb-src {url} {distro} {components}'
+                    build_config['custom_apt_entry'].append(src_entry)
+
+                if repo_data.get('key', None):
+                    build_config['custom_apt_keys'].append({'name': r, 'key': repo_data['key']})
 
-        if build_config.get('custom_apt_entry', False):
+        if build_config.get('custom_apt_entry', []):
             custom_apt_file = defaults.CUSTOM_REPO_FILE
             entries = "\n".join(build_config['custom_apt_entry'])
             if debug:
@@ -530,11 +558,13 @@ DOCUMENTATION_URL="{build_config['documentation_url']}"
                 f.write("\n")
 
         # Add custom APT keys
-        if has_nonempty_key(build_config, 'custom_apt_key'):
+        if has_nonempty_key(build_config, 'custom_apt_keys'):
             key_dir = defaults.ARCHIVES_DIR
-            for k in build_config['custom_apt_key']:
-                dst_name = '{0}.key.chroot'.format(os.path.basename(k))
-                shutil.copy(k, os.path.join(key_dir, dst_name))
+            for k in build_config['custom_apt_keys']:
+                dst_name = '{0}.key.chroot'.format(k['name'])
+                with open(os.path.join(key_dir, dst_name), 'bw') as f:
+                    key_data = base64.b64decode(k['key'])
+                    f.write(key_data)
 
         # Add custom packages
         if has_nonempty_key(build_config, 'packages'):
diff --git a/scripts/image-build/defaults.py b/scripts/image-build/defaults.py
index a0c5c8bf..29a6d59f 100644
--- a/scripts/image-build/defaults.py
+++ b/scripts/image-build/defaults.py
@@ -35,7 +35,7 @@ boot_settings: dict[str, str] = {
 # Hardcoded default values
 HARDCODED_BUILD = {
     'custom_apt_entry': [],
-    'custom_apt_key': [],
+    'custom_apt_keys': [],
     'custom_package': [],
     'reuse_iso': None,
     'disk_size': 10,
-- 
cgit v1.2.3