From 3b8cf7d1fb565683cfd01a79282f723d06c09b17 Mon Sep 17 00:00:00 2001 From: Michael Marineau Date: Sat, 21 Mar 2015 19:13:12 -0700 Subject: [PATCH] build_image_util: generate package license list for each image There isn't a sane way for users to know the licenses of individual packages in CoreOS images in built images. The information is hidden away back in the original ebuilds. This extends our existing package list with a new file that also includes licenses: ``` app-admin/flannel-0.3.0-r3::coreos Apache-2.0 app-admin/fleet-0.9.1::coreos Apache-2.0 app-admin/locksmith-0.2.3::coreos Apache-2.0 app-admin/sdnotify-proxy-0.1.0::coreos Apache-2.0 app-admin/sudo-1.8.10_p2::portage-stable ISC BSD app-admin/toolbox-0.0.0-r4::coreos Apache-2.0 app-arch/bzip2-1.0.6-r6::portage-stable BZIP2 app-arch/gzip-1.5::portage-stable GPL-3 app-arch/tar-1.27.1-r2::portage-stable GPL-3+ ... ``` --- build_library/build_image_util.sh | 34 +++++++++++++++++++++++++------ build_library/dev_image_util.sh | 2 ++ build_library/prod_image_util.sh | 2 ++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/build_library/build_image_util.sh b/build_library/build_image_util.sh index 80ef6dace6..733eb209ae 100755 --- a/build_library/build_image_util.sh +++ b/build_library/build_image_util.sh @@ -142,16 +142,38 @@ write_contents() { popd >/dev/null } +# Generate a list of packages installed in an image. +# Usage: image_packages /image/root +image_packages() { + local profile="${BUILD_DIR}/configroot/etc/portage/profile" + ROOT="$1" PORTAGE_CONFIGROOT="${BUILD_DIR}"/configroot \ + equery --no-color list --format '$cpv::$repo' '*' + # In production images GCC libraries are extracted manually. + if [[ -f "${profile}/package.provided" ]]; then + xargs --arg-file="${profile}/package.provided" \ + equery-${BOARD} --no-color list --format '$cpv::$repo' + fi +} + # Generate a list of installed packages in the format: # sys-apps/systemd-212-r8::coreos write_packages() { - local profile="${BUILD_DIR}/configroot/etc/portage/profile" info "Writing ${2##*/}" - ROOT="$1" PORTAGE_CONFIGROOT="${BUILD_DIR}"/configroot \ - equery --no-color list '*' --format '$cpv::$repo' > "$2" - if [[ -f "${profile}/package.provided" ]]; then - cat "${profile}/package.provided" >> "$2" - fi + image_packages "$1" | sort > "$2" +} + +# Generate a list of packages w/ their licenses in the format: +# sys-apps/systemd-212-r8::coreos GPL-2 LGPL-2.1 MIT public-domain +write_licenses() { + info "Writing ${2##*/}" + local vdb=$(portageq-${BOARD} vdb_path) + local pkg lic + for pkg in $(image_packages "$1" | sort); do + lic="$vdb/${pkg%%:*}/LICENSE" + if [[ -f "$lic" ]]; then + echo "$pkg $(< "$lic")" + fi + done > "$2" } extract_docs() { diff --git a/build_library/dev_image_util.sh b/build_library/dev_image_util.sh index daf2b4a0fc..f71751a4e2 100755 --- a/build_library/dev_image_util.sh +++ b/build_library/dev_image_util.sh @@ -84,12 +84,14 @@ create_dev_image() { local root_fs_dir="${BUILD_DIR}/rootfs" local image_contents="${image_name%.bin}_contents.txt" local image_packages="${image_name%.bin}_packages.txt" + local image_licenses="${image_name%.bin}_licenses.txt" start_image "${image_name}" "${disk_layout}" "${root_fs_dir}" "${update_group}" set_image_profile dev emerge_to_image "${root_fs_dir}" @system coreos-base/coreos-dev write_packages "${root_fs_dir}" "${BUILD_DIR}/${image_packages}" + write_licenses "${root_fs_dir}" "${BUILD_DIR}/${image_licenses}" # Setup portage for emerge and gmerge configure_dev_portage "${root_fs_dir}" "${devserver}" diff --git a/build_library/prod_image_util.sh b/build_library/prod_image_util.sh index 3e9644ee9b..f0167cfa30 100755 --- a/build_library/prod_image_util.sh +++ b/build_library/prod_image_util.sh @@ -39,6 +39,7 @@ create_prod_image() { local root_fs_dir="${BUILD_DIR}/rootfs" local image_contents="${image_name%.bin}_contents.txt" local image_packages="${image_name%.bin}_packages.txt" + local image_licenses="${image_name%.bin}_licenses.txt" start_image "${image_name}" "${disk_layout}" "${root_fs_dir}" "${update_group}" @@ -47,6 +48,7 @@ create_prod_image() { extract_prod_gcc "${root_fs_dir}" emerge_to_image "${root_fs_dir}" "${base_pkg}" write_packages "${root_fs_dir}" "${BUILD_DIR}/${image_packages}" + write_licenses "${root_fs_dir}" "${BUILD_DIR}/${image_licenses}" extract_docs "${root_fs_dir}" # Assert that if this is supposed to be an official build that the