diff --git a/modules/rpm-ostree/README.md b/modules/rpm-ostree/README.md index 03a8383..5a524e4 100644 --- a/modules/rpm-ostree/README.md +++ b/modules/rpm-ostree/README.md @@ -2,14 +2,24 @@ The [`rpm-ostree`](https://coreos.github.io/rpm-ostree/) module offers pseudo-declarative package and repository management using `rpm-ostree`. -The module first downloads the repository files from repositories declared under `repos:` into `/etc/yum.repos.d/`. The magic string `%OS_VERSION%` is substituted with the current VERSION_ID (major Fedora version), which can be used, for example, for pulling correct versions of repositories from [Fedora's Copr](https://copr.fedorainfracloud.org/). +The module first downloads the repository files from URLs declared under `repos:` into `/etc/yum.repos.d/`. The magic string `%OS_VERSION%` is substituted with the current VERSION_ID (major Fedora version), which can be used, for example, for pulling correct versions of repositories from [Fedora's Copr](https://copr.fedorainfracloud.org/). +You can also add repository files directly into your git repository if URLs are not provided. For example: +```yml +repos: + - my-repository.repo # copies in .repo file from files/rpm-ostree/my-repository.repo to /etc/yum.repos.d/ +``` If you use a repo that requires adding custom keys (eg. Brave Browser), you can import the keys by declaring the key URLs under `keys:`. The magic string acts the same as it does in `repos`. Then the module installs the packages declared under `install:` using `rpm-ostree install`, it removes the packages declared under `remove:` using `rpm-ostree override remove`. If there are packages declared under both `install:` and `remove:` a hybrid command `rpm-ostree remove --install ` is used, which should allow you to switch required packages for other ones. Installing RPM packages directly from a `http(s)` url that points to the RPM file is also supported, you can just put the URLs under `install:` and they'll be installed along with the other packages. The magic string `%OS_VERSION%` is substituted with the current VERSION_ID (major Fedora version) like with the `repos:` property. +If an RPM is not available in a repository or as an URL, you can also install it directly from a file in your git repository. For example: +```yml +install: + - weird-package.rpm # tries to install files/rpm-ostree/weird-package.rpm +``` The module can also replace base RPM packages with packages from COPR repo. Under `replace:`, the module finds every pair of keys `- from-repo:` and `packages:`. (Multiple pairs are supported.) The module downloads the COPR repository file declared by `- from-repo:` into `/etc/yum.repos.d/`, and from that repository replaces packages declared under `packages:` using the command `rpm-ostree override replace`. The COPR repository file is then deleted. The magic string `%OS_VERSION%` is substituted with the current VERSION_ID (major Fedora version) as already said above. At the moment, only COPR repo is supported. :::note diff --git a/modules/rpm-ostree/module.yml b/modules/rpm-ostree/module.yml index 42803f0..497bf08 100644 --- a/modules/rpm-ostree/module.yml +++ b/modules/rpm-ostree/module.yml @@ -21,4 +21,4 @@ example: | packages: - mutter - mutter-common - - gdm \ No newline at end of file + - gdm diff --git a/modules/rpm-ostree/rpm-ostree.sh b/modules/rpm-ostree/rpm-ostree.sh index bf1afbf..f200dbe 100644 --- a/modules/rpm-ostree/rpm-ostree.sh +++ b/modules/rpm-ostree/rpm-ostree.sh @@ -8,8 +8,12 @@ get_yaml_array REPOS '.repos[]' "$1" if [[ ${#REPOS[@]} -gt 0 ]]; then echo "Adding repositories" for REPO in "${REPOS[@]}"; do - REPO="${REPO//%OS_VERSION%/${OS_VERSION}}" - curl --output-dir "/etc/yum.repos.d/" -O "${REPO//[$'\t\r\n ']}" + REPO="${REPO//%OS_VERSION%/${OS_VERSION}}" + if [[ "${REPO}" =~ ^https?:\/\/.* ]]; then + curl --output-dir "/etc/yum.repos.d/" -O "${REPO//[$'\t\r\n ']}" + elif [[ ! "${REPO}" =~ ^https?:\/\/.* ]] && [[ "${REPO}" == *".repo" ]] && [[ -f "${CONFIG_DIRECTORY}/rpm-ostree/${REPO}" ]]; then + cp "${CONFIG_DIRECTORY}/rpm-ostree/${REPO}" "/etc/yum.repos.d/${REPO##*/}" + fi done fi @@ -33,48 +37,86 @@ if [[ ${#OPTFIX[@]} -gt 0 ]]; then for OPTPKG in "${OPTFIX[@]}"; do OPTPKG="${OPTPKG%\"}" OPTPKG="${OPTPKG#\"}" - OPTPKG=$(printf "$OPTPKG") mkdir -p "/usr/lib/opt/${OPTPKG}" ln -s "../../usr/lib/opt/${OPTPKG}" "/var/opt/${OPTPKG}" echo "Created symlinks for ${OPTPKG}" done fi -get_yaml_array INSTALL '.install[]' "$1" -get_yaml_array REMOVE '.remove[]' "$1" +get_yaml_array INSTALL_PKGS '.install[]' "$1" +get_yaml_array REMOVE_PKGS '.remove[]' "$1" -if [[ ${#INSTALL[@]} -gt 0 ]]; then - for PKG in "${INSTALL[@]}"; do - if [[ "$PKG" =~ ^https?:\/\/.* ]]; then - REPLACED_PKG="${PKG//%OS_VERSION%/${OS_VERSION}}" - echo "Installing directly from URL: ${REPLACED_PKG}" - rpm-ostree install "$REPLACED_PKG" - INSTALL=( "${INSTALL[@]/$PKG}" ) # delete URL from install array - fi - done -fi - -# The installation is done with some wordsplitting hacks -# because of errors when doing array destructuring at the installation step. -# This is different from other ublue projects and could be investigated further. -INSTALL_STR=$(echo "${INSTALL[*]}" | tr -d '\n') -REMOVE_STR=$(echo "${REMOVE[*]}" | tr -d '\n') +CLASSIC_INSTALL=false +HTTPS_INSTALL=false +LOCAL_INSTALL=false # Install and remove RPM packages -if [[ ${#INSTALL[@]} -gt 0 && ${#REMOVE[@]} -gt 0 ]]; then +# Sort classic, URL & local packages +if [[ ${#INSTALL_PKGS[@]} -gt 0 ]]; then + for PKG in "${INSTALL_PKGS[@]}"; do + if [[ "${PKG}" =~ ^https?:\/\/.* ]]; then + VERSION_SUBSTITUTED_PKG="${PKG//%OS_VERSION%/${OS_VERSION}}" + HTTPS_INSTALL=true + HTTPS_PKGS+=("${VERSION_SUBSTITUTED_PKG}") + elif [[ ! "${PKG}" =~ ^https?:\/\/.* ]] && [[ -f "${CONFIG_DIRECTORY}/rpm-ostree/${PKG}" ]]; then + LOCAL_INSTALL=true + LOCAL_PKGS+=("${CONFIG_DIRECTORY}/rpm-ostree/${PKG}") + else + CLASSIC_INSTALL=true + CLASSIC_PKGS+=("${PKG}") + fi + done +fi + +echo_rpm_install() { + if ${CLASSIC_INSTALL} && ! ${HTTPS_INSTALL} && ! ${LOCAL_INSTALL}; then + echo "Installing: ${CLASSIC_PKGS[*]}" + elif ! ${CLASSIC_INSTALL} && ${HTTPS_INSTALL} && ! ${LOCAL_INSTALL}; then + echo "Installing package(s) directly from URL: ${HTTPS_PKGS[*]}" + elif ! ${CLASSIC_INSTALL} && ! ${HTTPS_INSTALL} && ${LOCAL_INSTALL}; then + echo "Installing local package(s): ${LOCAL_PKGS[*]}" + elif ${CLASSIC_INSTALL} && ${HTTPS_INSTALL} && ! ${LOCAL_INSTALL}; then + echo "Installing: ${CLASSIC_PKGS[*]}" + echo "Installing package(s) directly from URL: ${HTTPS_PKGS[*]}" + elif ${CLASSIC_INSTALL} && ! ${HTTPS_INSTALL} && ${LOCAL_INSTALL}; then + echo "Installing: ${CLASSIC_PKGS[*]}" + echo "Installing local package(s): ${LOCAL_PKGS[*]}" + elif ! ${CLASSIC_INSTALL} && ${HTTPS_INSTALL} && ${LOCAL_INSTALL}; then + echo "Installing package(s) directly from URL: ${HTTPS_PKGS[*]}" + echo "Installing local package(s): ${LOCAL_PKGS[*]}" + elif ${CLASSIC_INSTALL} && ${HTTPS_INSTALL} && ${LOCAL_INSTALL}; then + echo "Installing: ${CLASSIC_PKGS[*]}" + echo "Installing package(s) directly from URL: ${HTTPS_PKGS[*]}" + echo "Installing local package(s): ${LOCAL_PKGS[*]}" + fi +} + +if [[ ${#INSTALL_PKGS[@]} -gt 0 && ${#REMOVE_PKGS[@]} -gt 0 ]]; then echo "Installing & Removing RPMs" - echo "Installing: ${INSTALL_STR[*]}" - echo "Removing: ${REMOVE_STR[*]}" + echo_rpm_install + echo "Removing: ${REMOVE_PKGS[*]}" # Doing both actions in one command allows for replacing required packages with alternatives - rpm-ostree override remove $REMOVE_STR $(printf -- "--install=%s " $INSTALL_STR) -elif [[ ${#INSTALL[@]} -gt 0 ]]; then + # When --install= flag is used, URLs & local packages are not supported + if ${CLASSIC_INSTALL} && ! ${HTTPS_INSTALL} && ! ${LOCAL_INSTALL}; then + rpm-ostree override remove "${REMOVE_PKGS[@]}" $(printf -- "--install=%s " "${CLASSIC_PKGS[@]}") + elif ${CLASSIC_INSTALL} && ${HTTPS_INSTALL} && ! ${LOCAL_INSTALL}; then + rpm-ostree override remove "${REMOVE_PKGS[@]}" $(printf -- "--install=%s " "${CLASSIC_PKGS[@]}") + rpm-ostree install "${HTTPS_PKGS[@]}" + elif ${CLASSIC_INSTALL} && ! ${HTTPS_INSTALL} && ! ${LOCAL_INSTALL}; then + rpm-ostree override remove "${REMOVE_PKGS[@]}" $(printf -- "--install=%s " "${CLASSIC_PKGS[@]}") + rpm-ostree install "${LOCAL_PKGS[@]}" + elif ${CLASSIC_INSTALL} && ${HTTPS_INSTALL} && ${LOCAL_INSTALL}; then + rpm-ostree override remove "${REMOVE_PKGS[@]}" $(printf -- "--install=%s " "${CLASSIC_PKGS[@]}") + rpm-ostree install "${HTTPS_PKGS[@]}" "${LOCAL_PKGS[@]}" + fi +elif [[ ${#INSTALL_PKGS[@]} -gt 0 ]]; then echo "Installing RPMs" - echo "Installing: ${INSTALL_STR[*]}" - rpm-ostree install $INSTALL_STR -elif [[ ${#REMOVE[@]} -gt 0 ]]; then + echo_rpm_install + rpm-ostree install "${INSTALL_PKGS[@]}" +elif [[ ${#REMOVE_PKGS[@]} -gt 0 ]]; then echo "Removing RPMs" - echo "Removing: ${REMOVE_STR[*]}" - rpm-ostree override remove $REMOVE_STR + echo "Removing: ${REMOVE_PKGS[*]}" + rpm-ostree override remove "${REMOVE_PKGS[@]}" fi get_yaml_array REPLACE '.replace[]' "$1" @@ -108,7 +150,7 @@ if [[ ${#REPLACE[@]} -gt 0 ]]; then exit 1 fi - echo "Replacing packages from repository: '${REPO_NAME}' owned by '${MAINTAINER}'" + echo "Replacing packages from COPR repository: '${REPO_NAME}' owned by '${MAINTAINER}'" echo "Replacing: ${REPLACE_STR}" curl --output-dir "/etc/yum.repos.d/" -O "${REPO//[$'\t\r\n ']}"