#!/bin/sh # # Copyright (C) 2012, 2017, 2019 Etersoft # Copyright (C) 2012, 2017, 2019 Vitaly Lipatov <lav@etersoft.ru> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # load_helper epm-sh-altlinux ETERSOFTPUBURL=http://download.etersoft.ru/pub ALTLINUXPUBURL=http://ftp.altlinux.org/pub/distributions __epm_addrepo_rhel() { local repo="$*" if [ -z "$repo" ] ; then echo "Add repo." echo "1. Use with repository URL, f.i. http://www.example.com/example.repo" echo "2. Use with epel to add EPEL repository" echo "3. Use with powertools to add PowerTools repository" echo "4. Use with crb to add Rocky Linux CRB repository" return 1 fi case "$1" in epel) # dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm epm install epel-release return 1 ;; powertools) # https://serverfault.com/questions/997896/how-to-enable-powertools-repository-in-centos-8 epm install --skip-installed dnf-plugins-core sudocmd dnf config-manager --set-enabled powertools return 1 ;; crb) # https://wiki.rockylinux.org/rocky/repo/ epm install --skip-installed dnf-plugins-core sudocmd dnf config-manager --set-enabled crb return 1 ;; esac return 0 } __epm_addrepo_etersoft_addon() { epm install --skip-installed apt-conf-etersoft-common apt-conf-etersoft-hold || fatal # TODO: ignore only error code 22 (skipped) || fatal local pb="$DISTRVERSION/branch" [ "$DISTRVERSION" = "Sisyphus" ] && pb="$DISTRVERSION" # FIXME [ -n "$DISTRVERSION" ] || fatal "Empty DISTRVERSION" docmd epm repo add "rpm [etersoft] $ETERSOFTPUBURL/Etersoft LINUX@Etersoft/$pb/noarch addon" docmd epm repo add "rpm [etersoft] $ETERSOFTPUBURL/Etersoft LINUX@Etersoft/$pb/$DISTRARCH addon" if [ "$DISTRARCH" = "x86_64" ] ; then docmd epm repo add "rpm [etersoft] $ETERSOFTPUBURL/Etersoft LINUX@Etersoft/$pb/x86_64-i586 addon" fi } get_archlist() { echo "noarch" echo "$DISTRARCH" case $DISTRARCH in x86_64) echo "i586" ;; esac } # 'rpm protocol:/path/to/repo component' __epm_addrepo_altlinux_short() { [ -n "$1" ] || fatal "only for rpm repo" local url="$2" local REPO_NAME="$3" local arch arch="$(basename "$url")" url="$(dirname "$url")" docmd epm repo add "rpm $url $arch $REPO_NAME" } __epm_addrepo_altlinux_url() { local url="$1" local arch local base # URL to path/RPMS.addon base="$(basename "$url")" if echo "$base" | grep -q "^RPMS\." ; then REPO_NAME="$(echo $base | sed -e 's|.*\.||')" url="$(dirname $url)" docmd epm repo add "rpm $url $REPO_NAME" return fi # TODO: add to eget file:/ support and use here # URL to path (where RPMS.addon is exists) local baseurl="$(eget --list "$url/RPMS.*")" base="$(basename "$baseurl")" if echo "$base" | grep -q "^RPMS\." ; then REPO_NAME="$(echo $base | sed -e 's|.*\.||')" docmd epm repo add "rpm $url $REPO_NAME" return fi # URL to {i586,x86_64,noarch}/RPMS.addon local res='' for arch in $(get_archlist) ; do local rd="$(eget --list $url/$arch/RPMS.*)" [ -d "$rd" ] || continue local REPO_NAME="$(echo "$rd" | sed -e 's|.*\.||')" docmd epm repo add "rpm $url $arch $REPO_NAME" res='1' done [ -n "$res" ] || warning "There is no arch repos in $url" } __epm_addrepo_altlinux() { local repo="$*" local branch="$(echo "$DISTRVERSION" | tr "[:upper:]" "[:lower:]")" [ -n "$branch" ] || fatal "Empty DISTRVERSION" if [ -z "$repo" ] || [ "$repo" == "--help" ] ; then info "Add branch repo. Use follow params:" sudocmd apt-repo $dryrun add branch echo "etersoft - for LINUX@Etersoft repo" echo "basealt - for BaseALT repo" echo "yandex - for BaseALT repo mirror on yandex (recommended)" echo "<task number> - add task repo" echo "archive 2018/02/09 - for archive from that date" echo "autoimports - for BaseALT autoimports repo" echo "/dir/to/repo [component] - add repo dir generated with epm repo index --init" echo "URL [arch] [component] - add repo by URL" return fi # 'rpm protocol:/path/to/repo component' if [ "$1" = "rpm" ] && [ -n "$2" ] && [ -n "$3" ] && [ -z "$4" ] ; then __epm_addrepo_altlinux_short "$@" return fi # /path/to/repo if [ -d "$1" ] ; then __epm_addrepo_altlinux_url "file:$1" return fi # file:/path/to/repo or http://path/to/repo if is_url "$1" ; then __epm_addrepo_altlinux_url "$1" return fi case "$1" in etersoft) info "add Etersoft's addon repo" assure_exists apt-repo __epm_addrepo_etersoft_addon sudocmd apt-repo add $branch epm repofix etersoft return 0 ;; basealt|ALTLinux|ALTServer) # TODO: setrepo? assure_exists apt-repo sudocmd apt-repo add $branch return 0 ;; yandex) assure_exists apt-repo sudocmd apt-repo add $branch epm repofix yandex return 0 ;; autoimports) repo="autoimports.$branch" ;; archive) datestr="$2" echo "$datestr" | grep -Eq "^20[0-2][0-9]/[01][0-9]/[0-3][0-9]$" || fatal "use follow date format: 2017/12/31" echo "" | sudocmd tee -a /etc/apt/sources.list local distrversion="$(echo "$DISTRVERSION" | tr "[:upper:]" "[:lower:]")" local rpmsign='[alt]' [ "$distrversion" != "sisyphus" ] && rpmsign="[$distrversion]" echo "rpm $rpmsign $ALTLINUXPUBURL archive/$distrversion/date/$datestr/$DISTRARCH classic" | sudocmd tee -a /etc/apt/sources.list if [ "$DISTRARCH" = "x86_64" ] ; then echo "rpm $rpmsign $ALTLINUXPUBURL archive/$distrversion/date/$datestr/x86_64-i586 classic" | sudocmd tee -a /etc/apt/sources.list fi echo "rpm $rpmsign $ALTLINUXPUBURL archive/$distrversion/date/$datestr/noarch classic" | sudocmd tee -a /etc/apt/sources.list return 0 ;; esac assure_exists apt-repo if tasknumber "$repo" >/dev/null ; then sudocmd_foreach "apt-repo $dryrun add" $(tasknumber "$repo") return fi # don't add again epm repo list --quiet | grep -q -F "$repo" && return 0 sudocmd apt-repo $dryrun add "$repo" } __epm_addkey_altlinux() { local url="$1" local fingerprint="$2" local comment="$3" local name="$(basename "$url" .gpg)" [ -s /etc/apt/vendors.list.d/$name.list ] && return # TODO: get this info from the gpg key cat << EOF | sudorun tee /etc/apt/vendors.list.d/$name.list simple-key "$name" { FingerPrint "$fingerprint"; Name "$comment"; } EOF eget -q -O /tmp/$name.gpg $url || fatal sudorun gpg --no-default-keyring --keyring /usr/lib/alt-gpgkeys/pubring.gpg --import /tmp/$name.gpg rm -f /tmp/$name.gpg } __epm_addkey_deb() { local url="$1" local fingerprint="$2" local comment="$3" local name="$(basename $url .gpg)" [ -s /etc/apt/trusted.gpg.d/$name.gpg ] && return if [ -z "$fingerprint" ] ; then set_sudo eget -q -O- "$url" | sudorun apt-key add - # # if [ ! -f /etc/apt/trusted.gpg.d/$name.gpg ]; then # epm tool eget -q -O /etc/apt/trusted.gpg.d/$name.gpg https://example.com/$name.gpg > /dev/null # chmod 0644 /etc/apt/trusted.gpg.d/$name.gpg # fi return fi sudocmd apt-key adv --keyserver "$url" --recv "$fingerprint" } epm_addkey() { case $BASEDISTRNAME in "alt") __epm_addkey_altlinux "$@" return ;; esac case $PMTYPE in apt-dpkg) __epm_addkey_deb "$@" ;; esac } __epm_addrepo_astra() { local repo="$*" if [ -z "$repo" ] || [ "$repo" = "--help" ]; then info "Add repo. You can use follow params:" echo " distribution component name" echo " full sources list line" echo " URL version component" return fi local reponame="$(epm print info --repo-name)" # keywords # https://wiki.astralinux.ru/pages/viewpage.action?pageId=3276859 case "$1-$reponame" in astra-1.7_x86_64) # TODO epm repo change http / https epm install --skip-installed apt-transport-https ca-certificates || fatal # https://wiki.astralinux.ru/pages/viewpage.action?pageId=158598882 epm repo add "deb [arch-=i386] https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-main/ 1.7_x86-64 main contrib non-free" epm repo add "deb [arch-=i386] https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-update/ 1.7_x86-64 main contrib non-free" epm repo add "deb [arch-=i386] https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-base/ 1.7_x86-64 main contrib non-free" epm repo add "deb [arch-=i386] https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-extended/ 1.7_x86-64 main contrib non-free" epm repo add "deb [arch-=i386] https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-extended/ 1.7_x86-64 astra-ce" return ;; astra-orel) # TODO epm repo change http / https epm install --skip-installed apt-transport-https ca-certificates || fatal # https://wiki.astralinux.ru/pages/viewpage.action?pageId=158605543 epm repo add "deb [arch=amd64] https://dl.astralinux.ru/astra/frozen/$(epm print info -v)_x86-64/$(epm print info --full-version)/repository stable main contrib non-free" #epm repo add "deb https://download.astralinux.ru/astra/stable/orel/repository/ orel main contrib non-free" return ;; astra-*) fatal "Unsupported distro version $reponame, see '# epm print info' output." ;; esac echo "Use workaround for AstraLinux ..." # aptsources.distro.NoDistroTemplateException: Error: could not find a distribution template for AstraLinuxCE/orel # don't add again epm repo list --quiet | grep -q -F "$repo" && return 0 [ -z "$(tail -n1 /etc/apt/sources.list)" ] || echo "" | sudocmd tee -a /etc/apt/sources.list echo "$repo" | sudocmd tee -a /etc/apt/sources.list return } __epm_addrepo_deb() { assure_exists apt-add-repository software-properties-common local ad="$($DISTRVENDOR --distro-arch)" # TODO: move to distro_info local nd="$(lsb_release -cs)" local repo="$*" if [ -z "$repo" ] || [ "$repo" = "--help" ]; then info "Add repo. You can use follow params:" echo " docker - add official docker repo" echo " ppa:<user>/<ppa-name> - add PPA repo" echo " distribution component name" echo " full sources list line" echo " URL version component" return fi # keywords case "$1" in docker) __epm_addkey_deb https://download.docker.com/linux/$PKGVENDOR/gpg "9DC858229FC7DD38854AE2D88D81803C0EBFCD88" repo="https://download.docker.com/linux/$PKGVENDOR $nd stable" ;; esac # if started from url, use heroistic if echo "$repo" | grep -E -q "^https?://" ; then repo="deb [arch=$ad] $repo" fi if echo "$repo" | grep -q "https://" ; then assure_exists /usr/share/doc/apt-transport-https apt-transport-https assure_exists /usr/sbin/update-ca-certificates ca-certificates fi if [ -d "$repo" ] ; then sudocmd epm repo add "deb file:$repo ./" return fi # FIXME: quotes in showcmd/sudocmd showcmd apt-add-repository "$repo" sudorun apt-add-repository "$repo" info "Check file /etc/apt/sources.list if needed" } epm_addrepo() { local repo="$*" case $BASEDISTRNAME in "alt") # Note! Don't use quotes here __epm_addrepo_altlinux $repo return ;; "astra") __epm_addrepo_astra $repo return esac case $PMTYPE in apt-dpkg) # Note! Don't use quotes here __epm_addrepo_deb $repo ;; aptitude-dpkg) info "You need manually add repo to /etc/apt/sources.list (TODO)" ;; yum-rpm) assure_exists yum-utils __epm_addrepo_rhel "$repo" || return sudocmd yum-config-manager --add-repo "$repo" ;; dnf-rpm) __epm_addrepo_rhel "$repo" || return sudocmd dnf config-manager --add-repo "$repo" ;; urpm-rpm) sudocmd urpmi.addmedia "$repo" ;; zypper-rpm) sudocmd zypper ar "$repo" ;; emerge) sudocmd layman -a "$repo" ;; pacman) info "You need manually add repo to /etc/pacman.conf" # Only for alone packages: #sudocmd repo-add $pkg_filenames ;; npackd) sudocmd npackdcl add-repo --url="$repo" ;; winget) sudocmd winget source add "$repo" ;; slackpkg) info "You need manually add repo to /etc/slackpkg/mirrors" ;; *) fatal "Have no suitable command for $PMTYPE" ;; esac }