;;; Copyright © 2021 Denis Carikli ;;; ;;; TODO: This file is not part of GNU Guix (yet). ;;; ;;; This file is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; This file 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 General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (gnu packages archlinux) #:use-module (guix build-system copy) #:use-module (guix build-system gnu) #:use-module (guix build-system trivial) #:use-module (guix download) #:use-module (guix git-download) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (gnu packages autotools) #:use-module (gnu packages backup) #:use-module (gnu packages base) #:use-module (gnu packages bash) #:use-module (gnu packages curl) #:use-module (gnu packages documentation) #:use-module (gnu packages gawk) #:use-module (gnu packages gnupg) #:use-module (gnu packages linux) #:use-module (gnu packages m4) #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) #:use-module (gnu packages python) #:use-module (gnu packages tls)) ;; To install Parabola x86_64 in a GuixSD installation: ;; # guix package -i \ ;; parabola-pacman-config \ # For pacman.conf ;; arch-install-scripts \ # For pacstrap ;; pacman \ # For pacman-key ;; # mkdir -p mnt ;; # pacman-key --init ;; # pacman-key --populate archlinux ;; # pacman-key --populate archlinux32 ;; # pacman-key --populate parabola ;; # pacman-key --refresh-keys ;; # pacstrap -M -C \ ;; $(guix package -I|grep "^parabola-pacman-config"|cut -f 4)/etc/pacman.d/pacman.conf.x86_64 \ ;; -c mnt ;; # mount -o bind mnt mnt ;; # arch-chroot mnt ;; # pacman -S ca-certificates-utils ;; ;; And to install Hyperbola x86_64 in a GuixSD installation: ;; # guix package -i \ ;; hyperbola-pacman-config \ # For pacman.conf ;; arch-install-scripts \ # For pacstrap ;; pacman \ # For pacman-key ;; # mkdir -p mnt ;; # pacman-key --init ;; # pacman-key --populate hyperbola ;; # pacman-key --populate hyperbola-archlinux ;; # pacman-key --refresh-keys ;; # pacstrap -M -C \ ;; $(guix package -I|grep "^parabola-pacman-config"|cut -f 4)/etc/pacman.d/pacman.conf.x86_64 \ ;; -c mnt ;; # mount -o bind mnt mnt ;; # arch-chroot mnt pacman -S ca-certificates-utils ;; TODO: ;; - Fix postinstall ;; Available keyrings: ;; archlinux-keyring ;; archlinux32-keyring ;; archlinuxarm-keyring ;; hyperbola-archlinux-keyring ;; hyperbola-keyring ;; parabola-keyring (define-public pacman-keyrings (package (name "pacman-keyrings") (version "0.0.1") (home-page "https://www.parabola.nu/") (source #f) (inputs `(("archlinux-keyring" ,archlinux-keyring) ("archlinux32-keyring" ,archlinux32-keyring) ("archlinuxarm-keyring" ,archlinuxarm-keyring) ("hyperbola-keyring" ,hyperbola-keyring) ("hyperbola-archlinux-keyring" ,hyperbola-archlinux-keyring) ("parabola-keyring" ,parabola-keyring))) (build-system copy-build-system) (arguments '(#:phases (modify-phases %standard-phases (delete 'unpack) (replace 'install (lambda _ (mkdir-p (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) ;; Arch Linux (Required for Parabola) (copy-file (string-append (assoc-ref %build-inputs "archlinux-keyring") "/share/pacman/keyrings/archlinux.gpg") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/archlinux.gpg"))) (copy-file (string-append (assoc-ref %build-inputs "archlinux-keyring") "/share/pacman/keyrings/archlinux-revoked") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/archlinux-revoked"))) (copy-file (string-append (assoc-ref %build-inputs "archlinux-keyring") "/share/pacman/keyrings/archlinux-trusted") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/archlinux-trusted"))) ;; Arch Linux 32 (Required for Parabola) (copy-file (string-append (assoc-ref %build-inputs "archlinux32-keyring") "/share/pacman/keyrings/archlinux32.gpg") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/archlinux32.gpg"))) (copy-file (string-append (assoc-ref %build-inputs "archlinux32-keyring") "/share/pacman/keyrings/archlinux32-revoked") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/archlinux32-revoked"))) (copy-file (string-append (assoc-ref %build-inputs "archlinux32-keyring") "/share/pacman/keyrings/archlinux32-trusted") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/archlinux32-trusted"))) ;; Arch Linux ARM (Required for Parabola armv7h) (copy-file (string-append (assoc-ref %build-inputs "archlinuxarm-keyring") "/share/pacman/keyrings/archlinuxarm.gpg") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/archlinuxarm.gpg"))) (copy-file (string-append (assoc-ref %build-inputs "archlinuxarm-keyring") "/share/pacman/keyrings/archlinuxarm-revoked") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/archlinuxarm-revoked"))) (copy-file (string-append (assoc-ref %build-inputs "archlinuxarm-keyring") "/share/pacman/keyrings/archlinuxarm-trusted") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/archlinuxarm-trusted"))) ;; Hyperbola (copy-file (string-append (assoc-ref %build-inputs "hyperbola-keyring") "/share/pacman/keyrings/hyperbola.gpg") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/hyperbola.gpg"))) (copy-file (string-append (assoc-ref %build-inputs "hyperbola-keyring") "/share/pacman/keyrings/hyperbola-revoked") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/hyperbola-revoked"))) (copy-file (string-append (assoc-ref %build-inputs "hyperbola-keyring") "/share/pacman/keyrings/hyperbola-trusted") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/hyperbola-trusted"))) ;; Hyperbola Arch Linux keyring (copy-file (string-append (assoc-ref %build-inputs "hyperbola-archlinux-keyring") "/share/pacman/keyrings/hyperbola-archlinux.gpg") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/hyperbola-archlinux.gpg"))) (copy-file (string-append (assoc-ref %build-inputs "hyperbola-archlinux-keyring") "/share/pacman/keyrings/hyperbola-archlinux-revoked") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/hyperbola-archlinux-revoked"))) (copy-file (string-append (assoc-ref %build-inputs "hyperbola-archlinux-keyring") "/share/pacman/keyrings/hyperbola-archlinux-trusted") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/hyperbola-archlinux-trusted"))) ;; Parabola (copy-file (string-append (assoc-ref %build-inputs "parabola-keyring") "/share/pacman/keyrings/parabola.gpg") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/parabola.gpg"))) (copy-file (string-append (assoc-ref %build-inputs "parabola-keyring") "/share/pacman/keyrings/parabola-revoked") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/parabola-revoked"))) (copy-file (string-append (assoc-ref %build-inputs "parabola-keyring") "/share/pacman/keyrings/parabola-trusted") (string-append (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/parabola-trusted"))) #t))))) (synopsis "Combination of various keyrings needed for installing Parabola") (description "") (license license:gpl2+))) (define-public archlinux-keyring (package (name "archlinux-keyring") (version "20210110") (source (origin (method url-fetch) (uri (string-append "https://sources.archlinux.org/other/archlinux-keyring/" "archlinux-keyring-" version ".tar.gz")) (sha256 (base32 "11m8wg90ww4g7s3m615i63zbpyq5brf34l7al4m0aahr77adc05g")))) (build-system copy-build-system) (arguments '(#:phases (modify-phases %standard-phases (replace 'install (lambda _ (install-file "archlinux.gpg" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) (install-file "archlinux-trusted" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) (install-file "archlinux-revoked" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) #t))))) (synopsis "Arch Linux PGP keyring") (description "Arch Linux PGP keyring for use by pacman") (home-page "https://archlinux.org") (license license:gpl2+))) (define-public archlinux32-keyring (package (name "archlinux32-keyring") (version "20210429") (source (origin (method url-fetch) (uri (string-append "https://sources.archlinux32.org/sources/" "archlinux32-keyring-v" version ".tar.gz")) (sha256 (base32 "1d72rsd3nsclfphpn5dzca4jm4j3cyknlah9ppvfvs3zqsx0npwp")))) (build-system copy-build-system) (arguments '(#:phases (modify-phases %standard-phases (replace 'install (lambda _ (install-file "archlinux32.gpg" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) (install-file "archlinux32-trusted" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) (install-file "archlinux32-revoked" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) #t))))) (synopsis "Arch Linux 32 PGP keyring") (description "Arch Linux 32 PGP keyring for use by pacman") (home-page "https://archlinux32.org") (license license:gpl2+))) (define-public archlinuxarm-keyring (package (name "archlinuxarm-keyring") (version "20140119") (source (origin (method url-fetch) (uri (string-append "https://archlinuxarm.org/builder/src/" "archlinuxarm-keyring-" version ".tar.gz")) (sha256 (base32 "0lck9w66s3fk25zcasxnphx3wzqm7a1jmdpn9fmay4sswgz0dzqv")))) (build-system copy-build-system) (arguments '(#:phases (modify-phases %standard-phases (replace 'install (lambda _ (install-file "archlinuxarm.gpg" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) (install-file "archlinuxarm-trusted" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) (install-file "archlinuxarm-revoked" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) #t))))) (synopsis "Arch Linux ARM PGP keyring") (description "Arch Linux ARM PGP keyring for use by pacman") (home-page "https://archlinuxARM.org") (license license:gpl2+))) (define-public arch-install-scripts (package (name "arch-install-scripts") (version "23") (source (origin (method url-fetch) (uri (string-append "https://git.archlinux.org/arch-install-scripts.git/" "snapshot/arch-install-scripts-" version ".tar.gz")) (sha256 (base32 "0xnlm10gkqv0klwmiv39akjpa7vssvq1kw0b5cp10zq905afa9ab")))) (build-system gnu-build-system) (inputs `(("asciidoc" ,asciidoc) ("awk" ,gawk) ("bash" ,bash) ("coreutils" ,coreutils) ("m4" ,m4) ("pacman" ,pacman) ("util-linux" ,util-linux))) (arguments `(#:make-flags (list (string-append "DESTDIR=" %output) "PREFIX=/") #:phases (modify-phases %standard-phases (delete 'configure) ;; We need to be able to run the postinstall scripts in the chroot (add-after 'unpack 'fix-pacstrap-path (lambda _ (substitute* '("arch-chroot.in" "pacstrap.in") ((" unshare ") " PATH=\"$PATH:/usr/local/sbin:/usr/local/bin:/usr/bin\" unshare ")) #t))))) (synopsis "Scripts to aid in installing Arch Linux based GNU/Linux distributions") (description "Scripts to aid in installing Arch Linux based GNU/Linux distributions") (home-page "https://www.archlinux.org/pacman/") (license license:gpl2+))) (define-public hyperbola-archlinux-keyring (package (name "hyperbola-archlinux-keyring") (version "20200624") (source (origin (method url-fetch) (uri (string-append "https://repo.hyperbola.info:50000/sources/arch-keyring/" "arch-keyring-" version ".tar.gz")) (sha256 (base32 "1m6kaac98j9z0wbq2p4gm7i748zd3867cb340drsn8dld6rzzfff")))) (build-system copy-build-system) (arguments '(#:phases (modify-phases %standard-phases (replace 'install (lambda _ (mkdir-p (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) (copy-file "arch.gpg" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/hyperbola-archlinux.gpg")) (copy-file "arch-trusted" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/hyperbola-archlinux-trusted")) (copy-file "arch-revoked" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/hyperbola-archlinux-revoked")) #t))))) (synopsis "Hyperbola PGP keyring") (description "Hyperbola PGP keyring for use by pacman") (home-page "https://www.hyperbola.info") (license license:cc0))) ;; TODO: update to 20201208 which uses tar.lz (define-public hyperbola-keyring (package (name "hyperbola-keyring") (version "20201122") (source (origin (method url-fetch) (uri (string-append "https://repo.hyperbola.info:50000/sources/hyperbola-keyring/" "hyperbola-keyring-" version ".tar.gz")) (sha256 (base32 "0q22gfx79i3rlgrmxdznfipn87dj3vmzrvka072bbbw1vhfzi1lg")))) (build-system gnu-build-system) (arguments `(#:tests? #f ; no tests #:make-flags (list (string-append "DESTDIR=" %output) "PREFIX=/") #:phases (modify-phases %standard-phases (delete 'configure)))) (synopsis "Hyperbola PGP keyring") (description "Hyperbola PGP keyring for use by pacman") (home-page "https://www.hyperbola.info") (license license:cc0))) (define-public hyperbola-pacman-config (package (name "hyperbola-pacman-config") (version "5.0.2-2.hyperbola9") (source (origin (method url-fetch) (uri (string-append "https://repo.hyperbola.info:50012/gnu-plus-linux-libre/stable/sources/hyperbola/pacman-" version ".src.tar.gz")) (sha256 (base32 "02i3gicvdxhxs1r5s45q1620m6063ij11rqwdmkhawlkxz46lv8g")))) (build-system copy-build-system) (inputs `(("hyperbola-mirrorlist" ,hyperbola-mirrorlist))) (arguments '(#:phases (modify-phases %standard-phases (add-after 'unpack 'patch-config (lambda _ (substitute* '("pacman.conf.i686" "pacman.conf.x86_64") (("/etc/pacman.d/mirrorlist") (string-append (assoc-ref %build-inputs "hyperbola-mirrorlist") "/etc/pacman.d/mirrorlist"))) (substitute* '("pacman.conf.i686" "pacman.conf.x86_64") (("Include = /etc/pacman.d/\\*\\.conf") "# Include = /etc/pacman.d/*.conf")) #t))) #:install-plan '(("pacman.conf.i686" "etc/pacman.d/pacman.conf.i686") ("pacman.conf.x86_64" "etc/pacman.d/pacman.conf.x86_64")))) (synopsis "Hyperbola GNU/Linux-libre mirror list for use by pacman") (description "Hyperbola GNU/Linux-libre mirror list for use by pacman") (home-page "https://www.hyperbola.info") (license license:gpl2+))) (define-public hyperbola-mirrorlist (package (name "hyperbola-mirrorlist") (version "20201131-1") (source (origin (method url-fetch) (uri "https://repo.hyperbola.info:50000/other/mirrorlist/mirrorlist.txt") (sha256 (base32 "1q3mv4gajlyk7dcbxph6rxj7sc0w2d71193a46d0w0n6m4ajf3zz")))) (build-system copy-build-system) (arguments '(#:phases (modify-phases %standard-phases (delete 'unpack) (replace 'install (lambda _ (mkdir-p (string-append (assoc-ref %outputs "out") "/etc/pacman.d/")) (copy-file (assoc-ref %build-inputs "source") (string-append (assoc-ref %outputs "out") "/etc/pacman.d/mirrorlist")) #t))))) (synopsis "Hyperbola mirror list for use by pacman") (description "Hyperbola mirror list for use by pacman") (home-page "https://www.hyperbola.info") (license license:cc0))) (define-public pacman (package (name "pacman") (version "5.2.2") (source (origin (method url-fetch) (uri (string-append "https://sources.archlinux.org/other/pacman/pacman-" version ".tar.gz")) (sha256 (base32 "1829jcc300fxidr3cahx5kpnxkpg500daqgn2782hg5m5ygil85v")))) (build-system gnu-build-system) (native-inputs `(("asciidoc" ,asciidoc) ("autoconf" ,autoconf) ("automake" ,automake) ("m4" ,m4) ("pkgconfig" ,pkg-config) ("python" ,python) ; for tests ("fakeroot" ,fakeroot) ; for tests ("fakechroot" ,fakechroot) ; for tests ("pacman-keyrings", pacman-keyrings) ; for keyrings )) (inputs `(("bash" ,bash) ("curl" ,curl) ("gpg" , gnupg) ("gpgme" ,gpgme) ("libarchive" ,libarchive) ("openssl" ,openssl) ("parabola-mirrorlist", parabola-mirrorlist) ("perl" ,perl))) ;; for makepkg-template (arguments `(#:tests? #f ; Tests need to be fixed #:configure-flags '("--localstatedir=/var") #:phases (modify-phases %standard-phases ;; We need to use a writable directory. In ;; addition, it probably would not be a good idea ;; to have different key databases with different ;; pacman binaries. (add-after 'unpack 'fix-gpgdir (lambda _ (substitute* "src/pacman/Makefile.am" (("^gpgdir +.*/pacman.d/gnupg/") "gpgdir = /etc/pacman.d/gnupg/")) #t)) (add-after 'fix-gpgdir 'fix-gpgpath ;; The pacman-keyring script has the following calls to gpg: ;; - local gpg_ver=$(gpg --version | awk '{print $3; exit}') ;; - gpg --homedir "${importdir}" --export-ownertrust | \ ;; - if ! type -p gpg >/dev/null; then ;; - GPG_PACMAN=(gpg --homedir "${PACMAN_KEYRING_DIR}" --no-permission-warning) (lambda _ (substitute* "scripts/pacman-key.sh.in" (("gpg --version") (string-append (assoc-ref %build-inputs "gpg") "/bin/gpg --version"))) (substitute* "scripts/pacman-key.sh.in" (("gpg --homedir") (string-append (assoc-ref %build-inputs "gpg") "/bin/gpg --homedir"))) (substitute* "scripts/pacman-key.sh.in" (("if ! type -p gpg") (string-append "if ! type -p " (assoc-ref %build-inputs "gpg") "/bin/gpg"))) (substitute* "scripts/pacman-key.sh.in" (("GPG_PACMAN=\\(gpg") (string-append "GPG_PACMAN=(" (assoc-ref %build-inputs "gpg") "/bin/gpg"))) #t)) (add-after 'fix-gpgpath 'fix-keyringdir (lambda _ (substitute* "scripts/pacman-key.sh.in" (("local KEYRING_IMPORT_DIR='@pkgdatadir@/keyrings'") (string-append "local KEYRING_IMPORT_DIR='" (assoc-ref %build-inputs "pacman-keyrings") "/share/pacman/keyrings/'"))) #t)) (add-after 'fix-keyringdir 'patch-tests (lambda _ (substitute* "test/pacman/pmtest.py" (("/bin/sh") (which "sh"))) #t))))) (synopsis "A library-based package manager with dependency support") (description "A library-based package manager with dependency support used in various GNU/Linux distributions") (home-page "https://www.archlinux.org/pacman/") (license license:gpl2+))) (define-public parabola-keyring (package (name "parabola-keyring") ;; parabola-keyring-20210514-1-any.src.tar.gz (version "20210514-1") (source (origin (method url-fetch) (uri (string-append "https://repo.parabola.nu/libre/os/x86_64/parabola-keyring-" version "-any.pkg.tar.xz")) (sha256 (base32 "0dqxzxr24a4a49kjjl6l7332skkjkfql3w6mxass5ynf8q945dc7")))) (build-system copy-build-system) (arguments '(#:phases (modify-phases %standard-phases (replace 'install (lambda _ (mkdir-p (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/")) (copy-file "../usr/share/pacman/keyrings/parabola.gpg" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/parabola.gpg")) (copy-file "../usr/share/pacman/keyrings/parabola-trusted" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/parabola-trusted")) (copy-file "../usr/share/pacman/keyrings/parabola-revoked" (string-append (assoc-ref %outputs "out") "/share/pacman/keyrings/parabola-revoked")) #t))))) (synopsis "Parabola GNU/Linux-libre PGP keyring") (description "Parabola GNU/Linux-libre PGP keyring for use by pacman") (home-page "https://www.parabola.nu") (license license:gpl2+))) (define-public parabola-pacman-config (package (name "parabola-pacman-config") (version "5.2.2-3") (source (origin (method url-fetch) (uri (string-append "https://repomirror.parabola.nu/sources/parabola/pacman-" version ".parabola1-x86_64.src.tar.gz")) (sha256 (base32 "147q8d9rfx7fvk1qsyhrfrf1nsxzw761bs7dl2wbqma99fyzajak")))) (build-system copy-build-system) (inputs `(("parabola-mirrorlist" ,parabola-mirrorlist))) (arguments '(#:phases (modify-phases %standard-phases (add-after 'unpack 'patch-config (lambda _ (substitute* '("pacman.conf.armv7h" "pacman.conf.i686" "pacman.conf.x86_64") (("/etc/pacman.d/mirrorlist") (string-append (assoc-ref %build-inputs "parabola-mirrorlist") "/etc/pacman.d/mirrorlist"))) (substitute* '("pacman.conf.armv7h" "pacman.conf.i686" "pacman.conf.x86_64") (("Include = /etc/pacman.d/\\*\\.conf") "# Include = /etc/pacman.d/*.conf")) #t))) #:install-plan '(("pacman.conf.armv7h" "etc/pacman.d/pacman.conf.armv7h") ("pacman.conf.i686" "etc/pacman.d/pacman.conf.i686") ("pacman.conf.x86_64" "etc/pacman.d/pacman.conf.x86_64")))) (synopsis "Parabola GNU/Linux-libre mirror list for use by pacman") (description "Parabola GNU/Linux-libre mirror list for use by pacman") (home-page "https://www.parabola.nu") (license license:gpl2+))) (define-public parabola-mirrorlist (package (name "parabola-mirrorlist") (version "20210225-1") (source (origin (method url-fetch) (uri (string-append "https://repomirror.parabola.nu/sources/parabola/pacman-mirrorlist-" version ".parabola1-any.src.tar.gz")) (sha256 (base32 "0vv0qv50bllwi89vq8y155f035hzw76zbryml6lm59p2y4cnbnfr")))) (build-system copy-build-system) (arguments '(#:install-plan '(("mirrorlist-20210225.txt" "etc/pacman.d/mirrorlist")))) (synopsis "Parabola GNU/Linux-libre mirror list for use by pacman") (description "Parabola GNU/Linux-libre mirror list for use by pacman") (home-page "https://www.parabola.nu") (license license:gpl2+)))