From d2a7170def9f0adf7e60ff1d9e39737e3b412c59 Mon Sep 17 00:00:00 2001 From: Diego Nicola Barbato Date: Sun, 28 Jan 2018 20:59:02 +0100 Subject: doc: Mention escpr in CUPS configuration example. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Suggested by Danny Milosavljevic . * doc/guix.texi (Printing Services): Mention how to add support for Epson printers to CUPS via escpr in the configuration example. Signed-off-by: Ludovic Courtès --- doc/guix.texi | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'doc') diff --git a/doc/guix.texi b/doc/guix.texi index 983e00ab38..3ad9479489 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -11322,16 +11322,16 @@ CUPS service will generate a self-signed certificate if needed, for secure connections to the print server. Suppose you want to enable the Web interface of CUPS and also add -support for HP printers @i{via} the @code{hplip} package. You can do -that directly, like this (you need to use the @code{(gnu packages cups)} -module): +support for Epson printers @i{via} the @code{escpr} package and for HP +printers @i{via} the @code{hplip} package. You can do that directly, +like this (you need to use the @code{(gnu packages cups)} module): @example (service cups-service-type (cups-configuration (web-interface? #t) (extensions - (list cups-filters hplip)))) + (list cups-filters escpr hplip)))) @end example The available configuration parameters follow. Each parameter -- cgit v1.2.3 From 0c3deaccef7db349a625d54cf4b51ed44f56a952 Mon Sep 17 00:00:00 2001 From: Tobias Geerinckx-Rice Date: Sat, 27 Jan 2018 06:10:47 +0100 Subject: doc: Replace a stale reference to a code snippet. The text refers to a snippet which has since been removed, but a suitable replacement is near. Use it. * doc/guix.texi (Using the Configuration System): Substitute bind for tcpdump. --- doc/guix.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'doc') diff --git a/doc/guix.texi b/doc/guix.texi index 3ad9479489..7dfc68d4dc 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -8526,7 +8526,7 @@ of a package: @end lisp @findex specification->package -Referring to packages by variable name, like @var{tcpdump} above, has +Referring to packages by variable name, like @code{bind} above, has the advantage of being unambiguous; it also allows typos and such to be diagnosed right away as ``unbound variables''. The downside is that one needs to know which module defines which package, and to augment the -- cgit v1.2.3 From 5481887ddee21bf116f93bc13bd249fab2ecb6c7 Mon Sep 17 00:00:00 2001 From: Tobias Geerinckx-Rice Date: Sat, 27 Jan 2018 16:35:37 +0100 Subject: doc: Fix SCREEN-LOCKER-SERVICE description. * doc/guix.texi (X Window): Correct the documentation for the SCREEN-LOCKER-SERVICE procedure. --- doc/guix.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'doc') diff --git a/doc/guix.texi b/doc/guix.texi index 7dfc68d4dc..bcc19a60da 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -11283,7 +11283,7 @@ configuration file. It is used to pass extra text to be added verbatim to the configuration file. @end deffn -@deffn {Scheme Procedure} screen-locker-service @var{package} [@var{name}] +@deffn {Scheme Procedure} screen-locker-service @var{package} [@var{program}] Add @var{package}, a package for a screen-locker or screen-saver whose command is @var{program}, to the set of setuid programs and add a PAM entry for it. For example: -- cgit v1.2.3 From d64e1746b954e83a98ccf749dd23f8618ad97cf2 Mon Sep 17 00:00:00 2001 From: Tobias Geerinckx-Rice Date: Sat, 27 Jan 2018 19:19:24 +0100 Subject: doc, gnu: Fix spelling of screen-things. * doc/guix.texi (X Window): Write 'screen locker' and 'screen saver' in prose. * gnu/services/xorg.scm (screen-locker-service): Likewise. --- doc/guix.texi | 2 +- gnu/services/xorg.scm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'doc') diff --git a/doc/guix.texi b/doc/guix.texi index bcc19a60da..b0baa5f131 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -11284,7 +11284,7 @@ added verbatim to the configuration file. @end deffn @deffn {Scheme Procedure} screen-locker-service @var{package} [@var{program}] -Add @var{package}, a package for a screen-locker or screen-saver whose +Add @var{package}, a package for a screen locker or screen saver whose command is @var{program}, to the set of setuid programs and add a PAM entry for it. For example: diff --git a/gnu/services/xorg.scm b/gnu/services/xorg.scm index cef0d60b59..707dcb1c39 100644 --- a/gnu/services/xorg.scm +++ b/gnu/services/xorg.scm @@ -590,7 +590,7 @@ theme." #:optional (program (package-name package)) #:key allow-empty-passwords?) - "Add @var{package}, a package for a screen-locker or screen-saver whose + "Add @var{package}, a package for a screen locker or screen saver whose command is @var{program}, to the set of setuid programs and add a PAM entry for it. For example: -- cgit v1.2.3 From 01bd3b5eddbcf7e9c5dc196306ca58e1c58df1bb Mon Sep 17 00:00:00 2001 From: Tobias Geerinckx-Rice Date: Mon, 29 Jan 2018 20:31:18 +0100 Subject: doc: Unconfuse file systems and partitions. Partitions can have their own labels and UUIDs (e.g. under GPT) that are unrelated to those of the contained file system. Confusing the two ends poorly. * doc/guix.scm (File Systems, Proceeding with the Installation) (Using the Configuration System, Initial RAM Disk): Substitute `file system' for `partition' when talking about labels and UUIDs. --- doc/guix.texi | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'doc') diff --git a/doc/guix.texi b/doc/guix.texi index b0baa5f131..eba5da2908 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -8192,7 +8192,7 @@ parted /dev/sda set 1 esp on Once you are done partitioning the target hard disk drive, you have to create a file system on the relevant partition(s)@footnote{Currently GuixSD only supports ext4 and btrfs file systems. In particular, code -that reads partition UUIDs and labels only works for these file system +that reads file system UUIDs and labels only works for these file system types.}. For the ESP, if you have one and assuming it is @file{/dev/sda2}, run: @@ -8233,7 +8233,7 @@ root file system): mount LABEL=my-root /mnt @end example -Also mount any other partitions you would like to use on the target +Also mount any other file systems you would like to use on the target system relative to this path. If you have @file{/boot} on a separate partition for example, mount it at @file{/mnt/boot} now so it is found by @code{guix system init} afterwards. @@ -8320,7 +8320,7 @@ to a mounted EFI partition, like @code{/boot/efi}, and do make sure the path is actually mounted. @item -Be sure that your partition labels match the value of their respective +Be sure that your file system labels match the value of their respective @code{device} fields in your @code{file-system} configuration, assuming your @code{file-system} configuration sets the value of @code{title} to @code{'label}. @@ -8617,7 +8617,7 @@ instead of full-blown desktop environments would look like this: @include os-config-lightweight-desktop.texi @end lisp -This example refers to the @file{/boot/efi} partition by its UUID, +This example refers to the @file{/boot/efi} file system by its UUID, @code{1234-ABCD}. Replace this UUID with the right UUID on your system, as returned by the @command{blkid} command. @@ -8881,8 +8881,8 @@ interpreted. When it is the symbol @code{device}, then the @code{device} field is interpreted as a file name; when it is @code{label}, then @code{device} -is interpreted as a partition label name; when it is @code{uuid}, -@code{device} is interpreted as a partition unique identifier (UUID). +is interpreted as a file system label name; when it is @code{uuid}, +@code{device} is interpreted as a file system unique identifier (UUID). UUIDs may be converted from their string representation (as shown by the @command{tune2fs -l} command) using the @code{uuid} form@footnote{The @@ -8900,8 +8900,8 @@ like this: (device (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb"))) @end example -The @code{label} and @code{uuid} options offer a way to refer to disk -partitions without having to hard-code their actual device +The @code{label} and @code{uuid} options offer a way to refer to file +systems without having to hard-code their actual device name@footnote{Note that, while it is tempting to use @file{/dev/disk/by-uuid} and similar device names to achieve the same result, this is not recommended: These special device nodes are created @@ -18626,7 +18626,7 @@ initialization system. @item --root=@var{root} Mount @var{root} as the root file system. @var{root} can be a -device name like @code{/dev/sda1}, a partition label, or a partition +device name like @code{/dev/sda1}, a file system label, or a file system UUID. @item --system=@var{system} @@ -18667,7 +18667,7 @@ the root file system specified on the kernel command line via @code{--root}. @var{file-systems} are mounted (@pxref{Mapped Devices}). @var{helper-packages} is a list of packages to be copied in the initrd. It may include @code{e2fsck/static} or other packages needed by the initrd to check -root partition. +the root file system. When @var{qemu-networking?} is true, set up networking with the standard QEMU parameters. When @var{virtio?} is true, load additional modules so that the -- cgit v1.2.3 From 6f4e8693e7b0c5d830eafa8a69c3559390f13369 Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Sun, 28 Jan 2018 22:14:23 +0100 Subject: etc: Add installation script. * etc/guix-install.sh: New file. * Makefile.am (EXTRA_DIST): Add it. * doc/guix.texi (Binary Installation): Mention it. Co-authored-by: sharlatan --- Makefile.am | 1 + doc/guix.texi | 5 + etc/guix-install.sh | 425 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 431 insertions(+) create mode 100755 etc/guix-install.sh (limited to 'doc') diff --git a/Makefile.am b/Makefile.am index 9bafdab49b..8b762e7094 100644 --- a/Makefile.am +++ b/Makefile.am @@ -450,6 +450,7 @@ EXTRA_DIST = \ CODE-OF-CONDUCT \ .dir-locals.el \ bin/guix.in \ + etc/guix-install.sh \ build-aux/build-self.scm \ build-aux/compile-all.scm \ build-aux/hydra/evaluate.scm \ diff --git a/doc/guix.texi b/doc/guix.texi index eba5da2908..2b27a675cd 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -403,6 +403,11 @@ dependencies. This is often quicker than installing from source, which is described in the next sections. The only requirement is to have GNU@tie{}tar and Xz. +We provide a +@uref{https://git.savannah.gnu.org/cgit/guix.git/plain/etc/guix-install.sh, +shell installer script}, which automates the download, installation, and +initial configuration of Guix. It should be run as the root user. + Installing goes along these lines: @enumerate diff --git a/etc/guix-install.sh b/etc/guix-install.sh new file mode 100755 index 0000000000..75cff68d8b --- /dev/null +++ b/etc/guix-install.sh @@ -0,0 +1,425 @@ +#!/bin/bash +# GNU Guix --- Functional package management for GNU +# Copyright © 2017 sharlatan +# Copyright © 2018 Ricardo Wurmus +# +# This file is part of GNU Guix. +# +# GNU Guix 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. +# +# GNU Guix 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 . + +set -e + +[ "$UID" -eq 0 ] || { echo "This script must be run as root."; exit 1; } + +REQUIRE=( + "dirname" + "readlink" + "wget" + "gpg" + "grep" + "which" + "sed" + "sort" + "getent" + "mktemp" + "rm" + "chmod" + "uname" + "groupadd" + "tail" + "tr" +) + +PAS=$'[ \033[32;1mPASS\033[0m ] ' +ERR=$'[ \033[31;1mFAIL\033[0m ] ' +INF="[ INFO ] " + +DEBUG=0 +GNU_URL="https://alpha.gnu.org/gnu/guix/" +OPENPGP_SIGNING_KEY_ID="3CE464558A84FDC69DB40CFB090B11993D9AEBB5" + +# ------------------------------------------------------------------------------ +#+UTILITIES + +_err() +{ # All errors go to stderr. + printf "[%s]: %s\n" "$(date +%s.%3N)" "$1" +} + +_msg() +{ # Default message to stdout. + printf "[%s]: %s\n" "$(date +%s.%3N)" "$1" +} + +_debug() +{ + if [ "${DEBUG}" = '1' ]; then + printf "[%s]: %s\n" "$(date +%s.%3N)" "$1" + fi +} + + +chk_require() +{ # Check that every required command is available. + declare -a cmds + declare -a warn + + cmds=(${1}) + + _debug "--- [ $FUNCNAME ] ---" + + for c in ${cmds[@]}; do + command -v "$c" &>/dev/null + [ "$?" -eq "1" ] && + warn+=("$c") + done + + [ "${#warn}" -ne 0 ] && + { _err "${ERR}Missing commands: ${warn[*]}."; + return 1; } + + _msg "${PAS}verification of required commands completed" + + gpg --list-keys ${OPENPGP_SIGNING_KEY_ID} >/dev/null 2>&1 || ( + _err "${ERR}Missing OpenPGP public key. Fetch it with this command:" + echo " gpg --keyserver pgp.mit.edu --recv-keys ${OPENPGP_SIGNING_KEY_ID}" + exit 1 + ) +} + +chk_term() +{ # Check for ANSI terminal for color printing. + local ansi_term + + if [ -t 2 ]; then + if [ "${TERM+set}" = 'set' ]; then + case "$TERM" in + xterm*|rxvt*|urxvt*|linux*|vt*|eterm*|screen*) + ansi_term=true + ;; + *) + ansi_term=false + ERR="[ FAIL ] " + PAS="[ PASS ] " + ;; + esac + fi + fi +} + +chk_init_sys() +{ # Return init system type name. + if [[ $(/sbin/init --version 2>/dev/null) =~ upstart ]]; then + _msg "${INF}init system is: upstart" + INIT_SYS="upstart" + return 0 + elif [[ $(systemctl) =~ -\.mount ]]; then + _msg "${INF}init system is: systemd" + INIT_SYS="systemd" + return 0 + elif [[ -f /etc/init.d/cron && ! -h /etc/init.d/cron ]]; then + _msg "${INF}init system is: sysv-init" + INIT_SYS="sysv-init" + return 0 + else + INIT_SYS="NA" + _err "${ERR}Init system could not be detected." + fi +} + +chk_sys_arch() +{ # Check for operating system and architecture type. + local os + local arch + + os="$(uname -s)" + arch="$(uname -m)" + + case "$arch" in + i386 | i486 | i686 | i786 | x86) + local arch=i686 + ;; + x86_64 | x86-64 | x64 | amd64) + local arch=x86_64 + ;; + *) + _err "${ERR}Unsupported CPU type: ${arch}" + exit 1 + esac + + case "$os" in + Linux | linux) + local os=linux + ;; + *) + _err "${ERR}Your operation system (${os}) is not supported." + exit 1 + esac + + ARCH_OS="${arch}-${os}" +} + +# ------------------------------------------------------------------------------ +#+MAIN + +guix_get_bin_list() +{ # Scan GNU archive and save list of binaries + local gnu_url="$1" + local -a bin_ver_ls + local latest_ver + local default_ver + + _debug "--- [ $FUNCNAME ] ---" + + # Filter only version and architecture + bin_ver_ls=("$(wget -qO- "$gnu_url" \ + | sed -n -e 's/.*guix-binary-\([0-9.]*\)\..*.tar.xz.*/\1/p' \ + | sort -Vu)") + + latest_ver="$(echo "$bin_ver_ls" \ + | grep -oP "([0-9]{1,2}\.){2}[0-9]{1,2}" \ + | tail -n1)" + + default_ver="guix-binary-${latest_ver}.${ARCH_OS}" + + if [[ "${#bin_ver_ls}" -ne "0" ]]; then + _msg "${PAS}Release for your system: ${default_ver}" + else + _err "${ERR}Could not obtain list of Guix releases." + exit 1 + fi + + # Use default to download according to the list and local ARCH_OS. + BIN_VER="$default_ver" +} + +guix_get_bin() +{ # Download and verify binary package. + local url="$1" + local bin_ver="$2" + local dl_path="$3" + + _debug "--- [ $FUNCNAME ] ---" + + _msg "${INF}Downloading Guix release archive" + + wget --help | grep -q '\--show-progress' && \ + _PROGRESS_OPT="-q --show-progress" || _PROGRESS_OPT="" + wget $_PROGRESS_OPT -P "$dl_path" "${url}/${bin_ver}.tar.xz" "${url}/${bin_ver}.tar.xz.sig" + + if [[ "$?" -eq 0 ]]; then + _msg "${PAS}download completed." + else + _err "${ERR}could not download ${url}/${bin_ver}.tar.xz." + exit 1 + fi + + pushd $dl_path >/dev/null + gpg --verify "${bin_ver}.tar.xz.sig" >/dev/null 2>&1 + if [[ "$?" -eq 0 ]]; then + _msg "${PAS}Signature is valid." + popd >/dev/null + else + _err "${ERR}could not verify the signature." + exit 1 + fi +} + +sys_create_store() +{ # Unpack and install /gnu/store and /var/guix + local pkg="$1" + local tmp_path="$2" + + _debug "--- [ $FUNCNAME ] ---" + + cd "$tmp_path" + tar --warning=no-timestamp \ + --extract \ + --file "$pkg" && + _msg "${PAS}unpacked archive" + + if [[ -e "/var/guix" || -e "/gnu" ]]; then + _err "${ERR}A previous Guix installation was found. Refusing to overwrite." + exit 1 + else + _msg "${INF}Installing /var/guix and /gnu..." + mv "${tmp_path}/var/guix" /var/ + mv "${tmp_path}/gnu" / + fi + + _msg "${INF}Linking the root user's profile" + ln -sf /var/guix/profiles/per-user/root/guix-profile \ + ~root/.guix-profile + + GUIX_PROFILE="${HOME}/.guix-profile" + source "${GUIX_PROFILE}/etc/profile" + _msg "${PAS}activated root profile at /root/.guix-profile" +} + +sys_create_build_user() +{ # Create the group and user accounts for build users. + + _debug "--- [ $FUNCNAME ] ---" + + if [ $(getent group guixbuild) ]; then + _msg "${INF}group guixbuild exists" + else + groupadd --system guixbuild + _msg "${PAS}group created" + fi + + for i in $(seq -w 1 10); do + if id "guixbuilder${i}" &>/dev/null; then + _msg "${INF}user is already in the system, reset" + usermod -g guixbuild -G guixbuild \ + -d /var/empty -s "$(which nologin)" \ + -c "Guix build user $i" \ + "guixbuilder${i}"; + else + useradd -g guixbuild -G guixbuild \ + -d /var/empty -s "$(which nologin)" \ + -c "Guix build user $i" --system \ + "guixbuilder${i}"; + _msg "${PAS}user added " + fi + done +} + +sys_enable_guix_daemon() +{ # Run the daemon, and set it to automatically start on boot. + + local info_path + local local_bin + local var_guix + + _debug "--- [ $FUNCNAME ] ---" + + info_path="/usr/local/share/info" + local_bin="/usr/local/bin" + var_guix="/var/guix/profiles/per-user/root/guix-profile" + + case "$INIT_SYS" in + upstart) + { initctl reload-configuration; + cp ~root/.guix-profile/lib/upstart/system/guix-daemon.conf \ + /etc/init/ && + start guix-daemon; } && + _msg "${PAS}enabled Guix daemon via upstart" + ;; + systemd) + { cp ~root/.guix-profile/lib/systemd/system/guix-daemon.service \ + /etc/systemd/system/; + chmod 664 /etc/systemd/system/guix-daemon.service; + systemctl daemon-reload && + systemctl start guix-daemon && + systemctl enable guix-daemon; } && + _msg "${PAS}enabled Guix daemon via systemd" + ;; + NA|*) + _msg "${ERR}unsupported init system; run the daemon manually:" + echo " ~root/.guix-profile/bin/guix-daemon --build-users-group=guixbuild" + ;; + esac + + _msg "${INF}making the guix command available to other users" + + [ -e "$local_bin" ] || mkdir -p "$local_bin" + ln -sf "${var_guix}/bin/guix" "$local_bin" + + [ -e "$info_path" ] || mkdir -p "$info_path" + for i in ${var_guix}/share/info/*; do + ln -sf "$i" "$info_path" + done +} + +sys_authorize_build_farms() +{ # authorize the public keys of the two build farms + while true; do + read -p "Permit downloading pre-built package binaries from the project's build farms? (yes/no) " yn + case $yn in + [Yy]*) guix archive --authorize < ~root/.guix-profile/share/guix/hydra.gnu.org.pub && + _msg "${PAS}Authorized public key for hydra.gnu.org"; + guix archive --authorize < ~root/.guix-profile/share/guix/berlin.guixsd.org.pub && + _msg "${PAS}Authorized public key for berlin.guixsd.org"; + break;; + [Nn]*) _msg "${INF}Skipped authorizing build farm public keys" + break;; + *) _msg "Please answer yes or no."; + esac + done +} + +welcome() +{ + cat<<"EOF" + ░░░ ░░░ + ░░▒▒░░░░░░░░░ ░░░░░░░░░▒▒░░ + ░░▒▒▒▒▒░░░░░░░ ░░░░░░░▒▒▒▒▒░ + ░▒▒▒░░▒▒▒▒▒ ░░░░░░░▒▒░ + ░▒▒▒▒░ ░░░░░░ + ▒▒▒▒▒ ░░░░░░ + ▒▒▒▒▒ ░░░░░ + ░▒▒▒▒▒ ░░░░░ + ▒▒▒▒▒ ░░░░░ + ▒▒▒▒▒ ░░░░░ + ░▒▒▒▒▒░░░░░ + ▒▒▒▒▒▒░░░ + ▒▒▒▒▒▒░ + _____ _ _ _ _ _____ _ + / ____| \ | | | | | / ____| (_) + | | __| \| | | | | | | __ _ _ ___ __ + | | |_ | . ' | | | | | | |_ | | | | \ \/ / + | |__| | |\ | |__| | | |__| | |_| | |> < + \_____|_| \_|\____/ \_____|\__,_|_/_/\_\ + +This script installs GNU Guix on your system + +https://www.gnu.org/software/guix/ +EOF + echo -n "Press return to continue..." + read -r ANSWER +} + +main() +{ + local tmp_path + welcome + + _msg "Starting installation ($(date))" + + chk_term + chk_require "${REQUIRE[*]}" + chk_init_sys + chk_sys_arch + + _msg "${INF}system is ${ARCH_OS}" + + tmp_path="$(mktemp -t -d guix.XXX)" + + guix_get_bin_list "${GNU_URL}" + guix_get_bin "${GNU_URL}" "${BIN_VER}" "$tmp_path" + + sys_create_store "${BIN_VER}.tar.xz" "${tmp_path}" + sys_create_build_user + sys_enable_guix_daemon + sys_authorize_build_farms + + _msg "${INF}cleaning up ${tmp_path}" + rm -r "${tmp_path}" + + _msg "${PAS}Guix has successfully been installed!" + _msg "${INF}Run 'info guix' to read the manual." + } + +main "$@" -- cgit v1.2.3