unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* bug#26875: Non-graphical (and other types) of GRUB interfaces
@ 2017-05-11  7:36 Leo Famulari
  2017-05-11  7:46 ` ng0
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-11  7:36 UTC (permalink / raw)
  To: 26875


[-- Attachment #1.1: Type: text/plain, Size: 799 bytes --]

This patch exposes the GRUB configuration options that control where and
how the user interface is presented. Generally, you can use it to put
the GRUB menu on a serial port, get a text-only menu on the kernel
console, or even use Morse code on the PC speaker (untested!).

You can use it like this, for example:

(bootloader (grub-configuration
            (device "/dev/sda")
            (terminal-outputs '(gfxterm console))
            (terminal-inputs '(serial console usb_keyboard))
            (serial-speed 115200)
            (serial-unit 0)))

Since this offers new ways to break your system, the patch sets up some
input validation. Hopefully it's enough.

The general idea came from this conversation:

https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00053.html

Your feedback?

[-- Attachment #1.2: 0001-system-grub-Expose-GRUB-s-interactive-interface-sett.patch --]
[-- Type: text/plain, Size: 8105 bytes --]

From 21ed0a8f364ce3cb784c0752e28600e8e786e295 Mon Sep 17 00:00:00 2001
From: Leo Famulari <leo@famulari.name>
Date: Thu, 11 May 2017 03:12:44 -0400
Subject: [PATCH] system: grub: Expose GRUB's interactive interface settings.

* gnu/system/grub.scm (<grub-configuration>): Add new fields
terminal-outputs, terminal-inputs, serial-unit, and serial-speed.
(grub-setup-io, setup-gfxterm): New procedures.
* doc/guix.texi (GRUB Configuration): Document the new fields.
---
 doc/guix.texi       | 20 +++++++++++
 gnu/system/grub.scm | 99 ++++++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 102 insertions(+), 17 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 81aa957c6..a1f7fdee6 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -15223,6 +15223,26 @@ The @code{grub-theme} object describing the theme to use.
 
 @item @code{grub} (default: @code{grub})
 The GRUB package to use.
+
+@item @code{terminal-outputs} (default: @code{'gfxterm})
+The output terminals used for the GRUB boot menu, as a list of symbols.
+These values are accepted: console, serial, serial_{0-3}, gfxterm,
+vga_text, mda_text, morse, spkmodem
+
+@item @code{terminal-inputs} (default: @code{'()})
+The input terminals used for the GRUB boot menu, as a list of symbols.
+The default is the native platform terminal as determined by GRUB at
+run-time.  These values are accepted: console, serial, serial_{0-3},
+at_keyboard, usb_keyboard.
+
+@item @code{serial-unit} (default: @code{#f})
+The serial unit used by GRUB, as an integer from 0 to 3.  The default
+value is chosen by GRUB at run-time; currently GRUB chooses 0, which
+corresponds to COM1.
+
+@item @code{serial-speed} (default: @code{#f})
+The speed of the serial interface, as an integer.  The default value is
+chosen by GRUB at run-time; currently GRUB chooses 9600bps.
 @end table
 
 @end deftp
diff --git a/gnu/system/grub.scm b/gnu/system/grub.scm
index 58096429f..b5b8c8c8a 100644
--- a/gnu/system/grub.scm
+++ b/gnu/system/grub.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
+;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -108,17 +109,25 @@ denoting a file name."
 (define-record-type* <grub-configuration>
   grub-configuration make-grub-configuration
   grub-configuration?
-  (grub            grub-configuration-grub           ; package
-                   (default (@ (gnu packages bootloaders) grub)))
-  (device          grub-configuration-device)        ; string
-  (menu-entries    grub-configuration-menu-entries   ; list
-                   (default '()))
-  (default-entry   grub-configuration-default-entry  ; integer
-                   (default 0))
-  (timeout         grub-configuration-timeout        ; integer
-                   (default 5))
-  (theme           grub-configuration-theme          ; <grub-theme>
-                   (default %default-theme)))
+  (grub             grub-configuration-grub             ; package
+                    (default (@ (gnu packages bootloaders) grub)))
+  (device           grub-configuration-device)          ; string
+  (menu-entries     grub-configuration-menu-entries     ; list
+                    (default '()))
+  (default-entry    grub-configuration-default-entry    ; integer
+                    (default 0))
+  (timeout          grub-configuration-timeout          ; integer
+                    (default 5))
+  (theme            grub-configuration-theme            ; <grub-theme>
+                    (default %default-theme))
+  (terminal-outputs grub-configuration-terminal-outputs ; list of symbols
+                    (default '(gfxterm)))
+  (terminal-inputs  grub-configuration-terminal-inputs  ; list of symbols
+                    (default '()))
+  (serial-unit      grub-configuration-serial-unit      ; integer | #f
+                    (default #f))
+  (serial-speed     grub-configuration-serial-speed     ; integer | #f
+                    (default #f)))
 
 (define-record-type* <menu-entry>
   menu-entry make-menu-entry
@@ -199,11 +208,16 @@ system string---e.g., \"x86_64-linux\"."
     insmod vbe
     insmod vga
   fi
-
-  terminal_output gfxterm
 "
         ""))
 
+  (define (setup-gfxterm config font-file)
+    (if (memq 'gfxterm (grub-configuration-terminal-outputs config))
+      #~(format #f "if loadfont ~a; then
+  setup_gfxterm
+fi~%" #$font-file)
+      ""))
+
   (define (theme-colors type)
     (let* ((theme  (grub-configuration-theme config))
            (colors (type theme)))
@@ -222,9 +236,8 @@ function setup_gfxterm {~a}
 # Set 'root' to the partition that contains /gnu/store.
 ~a
 
-if loadfont ~a; then
-  setup_gfxterm
-fi
+~a
+~a
 
 insmod png
 if background_image ~a; then
@@ -236,7 +249,8 @@ else
 fi~%"
                            #$setup-gfxterm-body
                            #$(grub-root-search store-device font-file)
-                           #$font-file
+                           #$(grub-setup-io config)
+                           #$(setup-gfxterm config font-file)
 
                            #$(strip-mount-point store-mount-point image)
                            #$(theme-colors grub-theme-color-normal)
@@ -247,6 +261,57 @@ fi~%"
 ;;; Configuration file.
 ;;;
 
+(define (grub-setup-io config)
+  "Return GRUB commands to configure the input / output interfaces.  The result
+is a string that can be inserted in grub.cfg."
+  (let* ((symbols->string (lambda (list)
+                           (string-join (map symbol->string list) " ")))
+         (outputs (grub-configuration-terminal-outputs config))
+         (inputs (grub-configuration-terminal-inputs config))
+         (unit (grub-configuration-serial-unit config))
+         (speed (grub-configuration-serial-speed config))
+
+         ;; Respectively, GRUB_TERMINAL_OUTPUT and GRUB_TERMINAL_INPUT,
+         ;; as documented in GRUB manual section "Simple Configuration
+         ;; Handling".
+         (valid-outputs '(console serial serial_0 serial_1 serial_2 serial_3
+                          gfxterm vga_text mda_text morse spkmodem))
+         (valid-inputs '(console serial serial_0 serial_1 serial_2 serial_3
+                         at_keyboard usb_keyboard))
+
+         (io (string-append
+               "terminal_output "
+               (symbols->string
+                 (map
+                   (lambda (output)
+                     (if (memq output valid-outputs) output #f)) outputs)) "\n"
+               (if (null? inputs)
+                 ""
+                 (string-append
+                   "terminal_input "
+                   (symbols->string
+                     (map
+                       (lambda (input)
+                         (if (memq input valid-inputs) input #f)) inputs)) "\n"))
+               ;; UNIT and SPEED are arguments to the same GRUB command
+               ;; ("serial"), so we process them together.
+               (if (or unit speed)
+                 (string-append
+                   "serial"
+                   (if unit
+                     ;; COM ports 0 through 3
+                     (if (and (exact-integer? unit) (<= unit 3) (>= unit 0))
+                       (string-append " --unit=" (number->string unit))
+                       #f)
+                     "")
+                   (if speed
+                     (if (exact-integer? speed)
+                       (string-append " --speed=" (number->string speed))
+                       #f)
+                     ""))
+                 ""))))
+    (format #f "~a" io)))
+
 (define (grub-root-search device file)
   "Return the GRUB 'search' command to look for DEVICE, which contains FILE,
 a gexp.  The result is a gexp that can be inserted in the grub.cfg-generation
-- 
2.13.0


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* bug#26875: Non-graphical (and other types) of GRUB interfaces
  2017-05-11  7:36 bug#26875: Non-graphical (and other types) of GRUB interfaces Leo Famulari
@ 2017-05-11  7:46 ` ng0
  2017-05-13  5:15   ` Leo Famulari
  2017-05-13  5:21 ` bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings Leo Famulari
  2017-05-15  9:36 ` bug#26875: Non-graphical (and other types) of GRUB interfaces Brendan Tildesley
  2 siblings, 1 reply; 11+ messages in thread
From: ng0 @ 2017-05-11  7:46 UTC (permalink / raw)
  To: Leo Famulari; +Cc: 26875

Leo Famulari transcribed 9.9K bytes:
> This patch exposes the GRUB configuration options that control where and
> how the user interface is presented. Generally, you can use it to put
> the GRUB menu on a serial port, get a text-only menu on the kernel
> console, or even use Morse code on the PC speaker (untested!).
> 
> You can use it like this, for example:
> 
> (bootloader (grub-configuration
>             (device "/dev/sda")
>             (terminal-outputs '(gfxterm console))
>             (terminal-inputs '(serial console usb_keyboard))
>             (serial-speed 115200)
>             (serial-unit 0)))
> 
> Since this offers new ways to break your system, the patch sets up some
> input validation. Hopefully it's enough.
> 
> The general idea came from this conversation:
> 
> https://lists.gnu.org/archive/html/guix-devel/2017-04/msg00053.html
> 
> Your feedback?

Without testing it, this looks like it could fix the use of GuixSD
on IN-Berlin e.V. servers. At least the options are given, like
talked about in a level above this subthread.

> From 21ed0a8f364ce3cb784c0752e28600e8e786e295 Mon Sep 17 00:00:00 2001
> From: Leo Famulari <leo@famulari.name>
> Date: Thu, 11 May 2017 03:12:44 -0400
> Subject: [PATCH] system: grub: Expose GRUB's interactive interface settings.
> 
> * gnu/system/grub.scm (<grub-configuration>): Add new fields
> terminal-outputs, terminal-inputs, serial-unit, and serial-speed.
> (grub-setup-io, setup-gfxterm): New procedures.
> * doc/guix.texi (GRUB Configuration): Document the new fields.
> ---
>  doc/guix.texi       | 20 +++++++++++
>  gnu/system/grub.scm | 99 ++++++++++++++++++++++++++++++++++++++++++++---------
>  2 files changed, 102 insertions(+), 17 deletions(-)
> 
> diff --git a/doc/guix.texi b/doc/guix.texi
> index 81aa957c6..a1f7fdee6 100644
> --- a/doc/guix.texi
> +++ b/doc/guix.texi
> @@ -15223,6 +15223,26 @@ The @code{grub-theme} object describing the theme to use.
>  
>  @item @code{grub} (default: @code{grub})
>  The GRUB package to use.
> +
> +@item @code{terminal-outputs} (default: @code{'gfxterm})
> +The output terminals used for the GRUB boot menu, as a list of symbols.
> +These values are accepted: console, serial, serial_{0-3}, gfxterm,
> +vga_text, mda_text, morse, spkmodem
> +
> +@item @code{terminal-inputs} (default: @code{'()})
> +The input terminals used for the GRUB boot menu, as a list of symbols.
> +The default is the native platform terminal as determined by GRUB at
> +run-time.  These values are accepted: console, serial, serial_{0-3},
> +at_keyboard, usb_keyboard.
> +
> +@item @code{serial-unit} (default: @code{#f})
> +The serial unit used by GRUB, as an integer from 0 to 3.  The default
> +value is chosen by GRUB at run-time; currently GRUB chooses 0, which
> +corresponds to COM1.
> +
> +@item @code{serial-speed} (default: @code{#f})
> +The speed of the serial interface, as an integer.  The default value is
> +chosen by GRUB at run-time; currently GRUB chooses 9600bps.
>  @end table
>  
>  @end deftp
> diff --git a/gnu/system/grub.scm b/gnu/system/grub.scm
> index 58096429f..b5b8c8c8a 100644
> --- a/gnu/system/grub.scm
> +++ b/gnu/system/grub.scm
> @@ -1,6 +1,7 @@
>  ;;; GNU Guix --- Functional package management for GNU
>  ;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
>  ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
> +;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
>  ;;;
>  ;;; This file is part of GNU Guix.
>  ;;;
> @@ -108,17 +109,25 @@ denoting a file name."
>  (define-record-type* <grub-configuration>
>    grub-configuration make-grub-configuration
>    grub-configuration?
> -  (grub            grub-configuration-grub           ; package
> -                   (default (@ (gnu packages bootloaders) grub)))
> -  (device          grub-configuration-device)        ; string
> -  (menu-entries    grub-configuration-menu-entries   ; list
> -                   (default '()))
> -  (default-entry   grub-configuration-default-entry  ; integer
> -                   (default 0))
> -  (timeout         grub-configuration-timeout        ; integer
> -                   (default 5))
> -  (theme           grub-configuration-theme          ; <grub-theme>
> -                   (default %default-theme)))
> +  (grub             grub-configuration-grub             ; package
> +                    (default (@ (gnu packages bootloaders) grub)))
> +  (device           grub-configuration-device)          ; string
> +  (menu-entries     grub-configuration-menu-entries     ; list
> +                    (default '()))
> +  (default-entry    grub-configuration-default-entry    ; integer
> +                    (default 0))
> +  (timeout          grub-configuration-timeout          ; integer
> +                    (default 5))
> +  (theme            grub-configuration-theme            ; <grub-theme>
> +                    (default %default-theme))
> +  (terminal-outputs grub-configuration-terminal-outputs ; list of symbols
> +                    (default '(gfxterm)))
> +  (terminal-inputs  grub-configuration-terminal-inputs  ; list of symbols
> +                    (default '()))
> +  (serial-unit      grub-configuration-serial-unit      ; integer | #f
> +                    (default #f))
> +  (serial-speed     grub-configuration-serial-speed     ; integer | #f
> +                    (default #f)))
>  
>  (define-record-type* <menu-entry>
>    menu-entry make-menu-entry
> @@ -199,11 +208,16 @@ system string---e.g., \"x86_64-linux\"."
>      insmod vbe
>      insmod vga
>    fi
> -
> -  terminal_output gfxterm
>  "
>          ""))
>  
> +  (define (setup-gfxterm config font-file)
> +    (if (memq 'gfxterm (grub-configuration-terminal-outputs config))
> +      #~(format #f "if loadfont ~a; then
> +  setup_gfxterm
> +fi~%" #$font-file)
> +      ""))
> +
>    (define (theme-colors type)
>      (let* ((theme  (grub-configuration-theme config))
>             (colors (type theme)))
> @@ -222,9 +236,8 @@ function setup_gfxterm {~a}
>  # Set 'root' to the partition that contains /gnu/store.
>  ~a
>  
> -if loadfont ~a; then
> -  setup_gfxterm
> -fi
> +~a
> +~a
>  
>  insmod png
>  if background_image ~a; then
> @@ -236,7 +249,8 @@ else
>  fi~%"
>                             #$setup-gfxterm-body
>                             #$(grub-root-search store-device font-file)
> -                           #$font-file
> +                           #$(grub-setup-io config)
> +                           #$(setup-gfxterm config font-file)
>  
>                             #$(strip-mount-point store-mount-point image)
>                             #$(theme-colors grub-theme-color-normal)
> @@ -247,6 +261,57 @@ fi~%"
>  ;;; Configuration file.
>  ;;;
>  
> +(define (grub-setup-io config)
> +  "Return GRUB commands to configure the input / output interfaces.  The result
> +is a string that can be inserted in grub.cfg."
> +  (let* ((symbols->string (lambda (list)
> +                           (string-join (map symbol->string list) " ")))
> +         (outputs (grub-configuration-terminal-outputs config))
> +         (inputs (grub-configuration-terminal-inputs config))
> +         (unit (grub-configuration-serial-unit config))
> +         (speed (grub-configuration-serial-speed config))
> +
> +         ;; Respectively, GRUB_TERMINAL_OUTPUT and GRUB_TERMINAL_INPUT,
> +         ;; as documented in GRUB manual section "Simple Configuration
> +         ;; Handling".
> +         (valid-outputs '(console serial serial_0 serial_1 serial_2 serial_3
> +                          gfxterm vga_text mda_text morse spkmodem))
> +         (valid-inputs '(console serial serial_0 serial_1 serial_2 serial_3
> +                         at_keyboard usb_keyboard))
> +
> +         (io (string-append
> +               "terminal_output "
> +               (symbols->string
> +                 (map
> +                   (lambda (output)
> +                     (if (memq output valid-outputs) output #f)) outputs)) "\n"
> +               (if (null? inputs)
> +                 ""
> +                 (string-append
> +                   "terminal_input "
> +                   (symbols->string
> +                     (map
> +                       (lambda (input)
> +                         (if (memq input valid-inputs) input #f)) inputs)) "\n"))
> +               ;; UNIT and SPEED are arguments to the same GRUB command
> +               ;; ("serial"), so we process them together.
> +               (if (or unit speed)
> +                 (string-append
> +                   "serial"
> +                   (if unit
> +                     ;; COM ports 0 through 3
> +                     (if (and (exact-integer? unit) (<= unit 3) (>= unit 0))
> +                       (string-append " --unit=" (number->string unit))
> +                       #f)
> +                     "")
> +                   (if speed
> +                     (if (exact-integer? speed)
> +                       (string-append " --speed=" (number->string speed))
> +                       #f)
> +                     ""))
> +                 ""))))
> +    (format #f "~a" io)))
> +
>  (define (grub-root-search device file)
>    "Return the GRUB 'search' command to look for DEVICE, which contains FILE,
>  a gexp.  The result is a gexp that can be inserted in the grub.cfg-generation
> -- 
> 2.13.0
> 




-- 
https://pragmatique.xyz
PGP: https://people.pragmatique.xyz/ng0/

^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#26875: Non-graphical (and other types) of GRUB interfaces
  2017-05-11  7:46 ` ng0
@ 2017-05-13  5:15   ` Leo Famulari
  0 siblings, 0 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-13  5:15 UTC (permalink / raw)
  To: 26875

On Thu, May 11, 2017 at 07:46:36AM +0000, ng0 wrote:
> Without testing it, this looks like it could fix the use of GuixSD
> on IN-Berlin e.V. servers. At least the options are given, like
> talked about in a level above this subthread.

It works in QEMU, so hopefully it will work on VPS providers like
IN-Berlin.

I'm sending version 2 of the patch. It fixes a texinfo syntax error in
the manual that I added just before sending the earlier patch.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings.
  2017-05-11  7:36 bug#26875: Non-graphical (and other types) of GRUB interfaces Leo Famulari
  2017-05-11  7:46 ` ng0
@ 2017-05-13  5:21 ` Leo Famulari
  2017-05-13 13:51   ` Ludovic Courtès
  2017-05-15  9:36 ` bug#26875: Non-graphical (and other types) of GRUB interfaces Brendan Tildesley
  2 siblings, 1 reply; 11+ messages in thread
From: Leo Famulari @ 2017-05-13  5:21 UTC (permalink / raw)
  To: 26875

* gnu/system/grub.scm (<grub-configuration>): Add new fields
terminal-outputs, terminal-inputs, serial-unit, and serial-speed.
(grub-setup-io, setup-gfxterm): New procedures.
* doc/guix.texi (GRUB Configuration): Document the new fields.
---
 doc/guix.texi       | 20 +++++++++++
 gnu/system/grub.scm | 99 ++++++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 102 insertions(+), 17 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 5227ad4ba..207045b7b 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -15225,6 +15225,26 @@ The @code{grub-theme} object describing the theme to use.
 
 @item @code{grub} (default: @code{grub})
 The GRUB package to use.
+
+@item @code{terminal-outputs} (default: @code{'gfxterm})
+The output terminals used for the GRUB boot menu, as a list of symbols.
+These values are accepted: console, serial, serial_@{0-3@}, gfxterm,
+vga_text, mda_text, morse, spkmodem
+
+@item @code{terminal-inputs} (default: @code{'()})
+The input terminals used for the GRUB boot menu, as a list of symbols.
+The default is the native platform terminal as determined by GRUB at
+run-time.  These values are accepted: console, serial, serial_@{0-3@},
+at_keyboard, usb_keyboard.
+
+@item @code{serial-unit} (default: @code{#f})
+The serial unit used by GRUB, as an integer from 0 to 3.  The default
+value is chosen by GRUB at run-time; currently GRUB chooses 0, which
+corresponds to COM1.
+
+@item @code{serial-speed} (default: @code{#f})
+The speed of the serial interface, as an integer.  The default value is
+chosen by GRUB at run-time; currently GRUB chooses 9600bps.
 @end table
 
 @end deftp
diff --git a/gnu/system/grub.scm b/gnu/system/grub.scm
index 58096429f..97081d848 100644
--- a/gnu/system/grub.scm
+++ b/gnu/system/grub.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013, 2014, 2015, 2016, 2017 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2016 Chris Marusich <cmmarusich@gmail.com>
+;;; Copyright © 2017 Leo Famulari <leo@famulari.name>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -108,17 +109,25 @@ denoting a file name."
 (define-record-type* <grub-configuration>
   grub-configuration make-grub-configuration
   grub-configuration?
-  (grub            grub-configuration-grub           ; package
-                   (default (@ (gnu packages bootloaders) grub)))
-  (device          grub-configuration-device)        ; string
-  (menu-entries    grub-configuration-menu-entries   ; list
-                   (default '()))
-  (default-entry   grub-configuration-default-entry  ; integer
-                   (default 0))
-  (timeout         grub-configuration-timeout        ; integer
-                   (default 5))
-  (theme           grub-configuration-theme          ; <grub-theme>
-                   (default %default-theme)))
+  (grub             grub-configuration-grub             ; package
+                    (default (@ (gnu packages bootloaders) grub)))
+  (device           grub-configuration-device)          ; string
+  (menu-entries     grub-configuration-menu-entries     ; list
+                    (default '()))
+  (default-entry    grub-configuration-default-entry    ; integer
+                    (default 0))
+  (timeout          grub-configuration-timeout          ; integer
+                    (default 5))
+  (theme            grub-configuration-theme            ; <grub-theme>
+                    (default %default-theme))
+  (terminal-outputs grub-configuration-terminal-outputs ; list of symbols
+                    (default '(gfxterm)))
+  (terminal-inputs  grub-configuration-terminal-inputs  ; list of symbols
+                    (default '()))
+  (serial-unit      grub-configuration-serial-unit      ; integer | #f
+                    (default #f))
+  (serial-speed     grub-configuration-serial-speed     ; integer | #f
+                    (default #f)))
 
 (define-record-type* <menu-entry>
   menu-entry make-menu-entry
@@ -199,11 +208,16 @@ system string---e.g., \"x86_64-linux\"."
     insmod vbe
     insmod vga
   fi
-
-  terminal_output gfxterm
 "
         ""))
 
+  (define (setup-gfxterm config font-file)
+    (if (memq 'gfxterm (grub-configuration-terminal-outputs config))
+      #~(format #f "if loadfont ~a; then
+  setup_gfxterm
+fi~%" #$font-file)
+      ""))
+
   (define (theme-colors type)
     (let* ((theme  (grub-configuration-theme config))
            (colors (type theme)))
@@ -222,9 +236,8 @@ function setup_gfxterm {~a}
 # Set 'root' to the partition that contains /gnu/store.
 ~a
 
-if loadfont ~a; then
-  setup_gfxterm
-fi
+~a
+~a
 
 insmod png
 if background_image ~a; then
@@ -236,7 +249,8 @@ else
 fi~%"
                            #$setup-gfxterm-body
                            #$(grub-root-search store-device font-file)
-                           #$font-file
+                           #$(grub-setup-io config)
+                           #$(setup-gfxterm config font-file)
 
                            #$(strip-mount-point store-mount-point image)
                            #$(theme-colors grub-theme-color-normal)
@@ -247,6 +261,57 @@ fi~%"
 ;;; Configuration file.
 ;;;
 
+(define (grub-setup-io config)
+  "Return GRUB commands to configure the input / output interfaces.  The result
+is a string that can be inserted in grub.cfg."
+  (let* ((symbols->string (lambda (list)
+                           (string-join (map symbol->string list) " ")))
+         (outputs (grub-configuration-terminal-outputs config))
+         (inputs (grub-configuration-terminal-inputs config))
+         (unit (grub-configuration-serial-unit config))
+         (speed (grub-configuration-serial-speed config))
+
+         ;; Respectively, GRUB_TERMINAL_OUTPUT and GRUB_TERMINAL_INPUT,
+         ;; as documented in GRUB manual section "Simple Configuration
+         ;; Handling".
+         (valid-outputs '(console serial serial_0 serial_1 serial_2 serial_3
+                          gfxterm vga_text mda_text morse spkmodem))
+         (valid-inputs '(console serial serial_0 serial_1 serial_2 serial_3
+                         at_keyboard usb_keyboard))
+
+         (io (string-append
+               "terminal_output "
+               (symbols->string
+                 (map
+                   (lambda (output)
+                     (if (memq output valid-outputs) output #f)) outputs)) "\n"
+               (if (null? inputs)
+                 ""
+                 (string-append
+                   "terminal_input "
+                   (symbols->string
+                     (map
+                       (lambda (input)
+                         (if (memq input valid-inputs) input #f)) inputs)) "\n"))
+               ;; UNIT and SPEED are arguments to the same GRUB command
+               ;; ("serial"), so we process them together.
+               (if (or unit speed)
+                 (string-append
+                   "serial"
+                   (if unit
+                     ;; COM ports 1 through 4
+                     (if (and (exact-integer? unit) (<= unit 3) (>= unit 0))
+                       (string-append " --unit=" (number->string unit))
+                       #f)
+                     "")
+                   (if speed
+                     (if (exact-integer? speed)
+                       (string-append " --speed=" (number->string speed))
+                       #f)
+                     ""))
+                 ""))))
+    (format #f "~a" io)))
+
 (define (grub-root-search device file)
   "Return the GRUB 'search' command to look for DEVICE, which contains FILE,
 a gexp.  The result is a gexp that can be inserted in the grub.cfg-generation
-- 
2.13.0

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings.
  2017-05-13  5:21 ` bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings Leo Famulari
@ 2017-05-13 13:51   ` Ludovic Courtès
  2017-05-13 16:40     ` Leo Famulari
  2017-05-14  7:38     ` Mathieu Othacehe
  0 siblings, 2 replies; 11+ messages in thread
From: Ludovic Courtès @ 2017-05-13 13:51 UTC (permalink / raw)
  To: Leo Famulari; +Cc: 26875

Hi Leo,

Leo Famulari <leo@famulari.name> skribis:

> * gnu/system/grub.scm (<grub-configuration>): Add new fields
> terminal-outputs, terminal-inputs, serial-unit, and serial-speed.
> (grub-setup-io, setup-gfxterm): New procedures.
> * doc/guix.texi (GRUB Configuration): Document the new fields.

Overall LGTM.  Nice to see it taking shape!

Some minor comments and suggestions:

> +@item @code{terminal-outputs} (default: @code{'gfxterm})
> +The output terminals used for the GRUB boot menu, as a list of symbols.
> +These values are accepted: console, serial, serial_@{0-3@}, gfxterm,
> +vga_text, mda_text, morse, spkmodem

Please use @code for the possible, add a final period, and a
cross-reference to the relevant part of the GRUB manual with
“(@pxref{…})” if possible.

> +@item @code{terminal-inputs} (default: @code{'()})
> +The input terminals used for the GRUB boot menu, as a list of symbols.
> +The default is the native platform terminal as determined by GRUB at
> +run-time.  These values are accepted: console, serial, serial_@{0-3@},
> +at_keyboard, usb_keyboard.
> +
> +@item @code{serial-unit} (default: @code{#f})
> +The serial unit used by GRUB, as an integer from 0 to 3.  The default
> +value is chosen by GRUB at run-time; currently GRUB chooses 0, which
> +corresponds to COM1.

Likewise.

> +@item @code{serial-speed} (default: @code{#f})
> +The speed of the serial interface, as an integer.  The default value is
> +chosen by GRUB at run-time; currently GRUB chooses 9600bps.

9,600@tie{}bps.  :-)

Apart from that, as long as “make check-system TESTS=basic” and similar
pass, that’s all good for me!

Mathieu: is it OK to apply this before the patch series on non-GRUB
bootloaders?

Thanks,
Ludo’.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings.
  2017-05-13 13:51   ` Ludovic Courtès
@ 2017-05-13 16:40     ` Leo Famulari
  2017-05-14  7:38     ` Mathieu Othacehe
  1 sibling, 0 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-13 16:40 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 26875

[-- Attachment #1: Type: text/plain, Size: 1675 bytes --]

On Sat, May 13, 2017 at 03:51:27PM +0200, Ludovic Courtès wrote:
> > +@item @code{terminal-outputs} (default: @code{'gfxterm})
> > +The output terminals used for the GRUB boot menu, as a list of symbols.
> > +These values are accepted: console, serial, serial_@{0-3@}, gfxterm,
> > +vga_text, mda_text, morse, spkmodem
> 
> Please use @code for the possible, add a final period, and a
> cross-reference to the relevant part of the GRUB manual with
> “(@pxref{…})” if possible.

Okay!

> 
> > +@item @code{terminal-inputs} (default: @code{'()})
> > +The input terminals used for the GRUB boot menu, as a list of symbols.
> > +The default is the native platform terminal as determined by GRUB at
> > +run-time.  These values are accepted: console, serial, serial_@{0-3@},
> > +at_keyboard, usb_keyboard.
> > +
> > +@item @code{serial-unit} (default: @code{#f})
> > +The serial unit used by GRUB, as an integer from 0 to 3.  The default
> > +value is chosen by GRUB at run-time; currently GRUB chooses 0, which
> > +corresponds to COM1.
> 
> Likewise.

Yes!

> 
> > +@item @code{serial-speed} (default: @code{#f})
> > +The speed of the serial interface, as an integer.  The default value is
> > +chosen by GRUB at run-time; currently GRUB chooses 9600bps.
> 
> 9,600@tie{}bps.  :-)

Sure!

> Apart from that, as long as “make check-system TESTS=basic” and similar
> pass, that’s all good for me!

I tried the basic, btrfs-root-os, and encrypted-root-os tests. Testers
should note this is an ABI break.

> Mathieu: is it OK to apply this before the patch series on non-GRUB
> bootloaders?

I'll wait for this response.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings.
  2017-05-13 13:51   ` Ludovic Courtès
  2017-05-13 16:40     ` Leo Famulari
@ 2017-05-14  7:38     ` Mathieu Othacehe
  2017-05-14 18:17       ` Leo Famulari
  1 sibling, 1 reply; 11+ messages in thread
From: Mathieu Othacehe @ 2017-05-14  7:38 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 26875


> Mathieu: is it OK to apply this before the patch series on non-GRUB
> bootloaders?

Yes no problem ! This doesn't seems to difficult to rebase on top of my
serie. I guess "serial-unit" and "serial-speed" could fit in generic
"bootloader-configuration". I'm not sure for "terminal_inputs/outputs"
that seem grub specific.

Mathieu

^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings.
  2017-05-14  7:38     ` Mathieu Othacehe
@ 2017-05-14 18:17       ` Leo Famulari
  0 siblings, 0 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-14 18:17 UTC (permalink / raw)
  To: Mathieu Othacehe; +Cc: 26875-done

On Sun, May 14, 2017 at 09:38:24AM +0200, Mathieu Othacehe wrote:
> 
> > Mathieu: is it OK to apply this before the patch series on non-GRUB
> > bootloaders?
> 
> Yes no problem !

Awesome! Pushed as e0b2e93005188ab4d6c7413a27832ba2fb7388e8.

> This doesn't seems to difficult to rebase on top of my
> serie. I guess "serial-unit" and "serial-speed" could fit in generic
> "bootloader-configuration". I'm not sure for "terminal_inputs/outputs"
> that seem grub specific.

Yes, the serial-unit (aka COM port) and serial-speed seem generically
useful on their own, as long you take care to handle the different
numbering between GRUB's serial-unit (zero indexed) and the COM port
numbering (indexed from 1).

The terminal inputs and outputs are generic only at the highest level.
At least, the choice between a graphical and text / curses interface
seeems universal. But of course other bootloader implementations will
support their own set of interfaces, and they may require extra
configuration.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#26875: Non-graphical (and other types) of GRUB interfaces
  2017-05-11  7:36 bug#26875: Non-graphical (and other types) of GRUB interfaces Leo Famulari
  2017-05-11  7:46 ` ng0
  2017-05-13  5:21 ` bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings Leo Famulari
@ 2017-05-15  9:36 ` Brendan Tildesley
  2017-05-15 18:04   ` Leo Famulari
  2017-05-15 20:25   ` Leo Famulari
  2 siblings, 2 replies; 11+ messages in thread
From: Brendan Tildesley @ 2017-05-15  9:36 UTC (permalink / raw)
  To: 26875

I just updated to the latest git and rebooted to find the GRUB menu no
longer has the pretty GuixSD logo, but has fallen back to a
ncurses-looking blue box on black. Looks like it may be caused by this.
I haven't done any further investigation yet. What do you think?

^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#26875: Non-graphical (and other types) of GRUB interfaces
  2017-05-15  9:36 ` bug#26875: Non-graphical (and other types) of GRUB interfaces Brendan Tildesley
@ 2017-05-15 18:04   ` Leo Famulari
  2017-05-15 20:25   ` Leo Famulari
  1 sibling, 0 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-15 18:04 UTC (permalink / raw)
  To: Brendan Tildesley; +Cc: 26875

On Mon, May 15, 2017 at 07:36:01PM +1000, Brendan Tildesley wrote:
> I just updated to the latest git and rebooted to find the GRUB menu no
> longer has the pretty GuixSD logo, but has fallen back to a
> ncurses-looking blue box on black. Looks like it may be caused by this.
> I haven't done any further investigation yet. What do you think?

Hm, that's not supposed to happen unless you tell it to.
Investigating...

^ permalink raw reply	[flat|nested] 11+ messages in thread

* bug#26875: Non-graphical (and other types) of GRUB interfaces
  2017-05-15  9:36 ` bug#26875: Non-graphical (and other types) of GRUB interfaces Brendan Tildesley
  2017-05-15 18:04   ` Leo Famulari
@ 2017-05-15 20:25   ` Leo Famulari
  1 sibling, 0 replies; 11+ messages in thread
From: Leo Famulari @ 2017-05-15 20:25 UTC (permalink / raw)
  To: Brendan Tildesley; +Cc: 26875

[-- Attachment #1: Type: text/plain, Size: 896 bytes --]

On Mon, May 15, 2017 at 07:36:01PM +1000, Brendan Tildesley wrote:
> I just updated to the latest git and rebooted to find the GRUB menu no
> longer has the pretty GuixSD logo, but has fallen back to a
> ncurses-looking blue box on black. Looks like it may be caused by this.
> I haven't done any further investigation yet. What do you think?

The problem was that the elements of the generated GRUB configuration
file were in the wrong order. Even when the graphical menu should have
been displayed (it's still the default), various bits of GRUB scripting
failed.

Fixed in c48a145fbb613ac2b623f0a11278848923b312f1

Sorry for this! I tested that the correct menu got displayed in the
default case relatively early in development of this change. Later on I
only checked that the generated GRUB configuration looked correct,
because it's expensive (time and disk space) to test changes like this.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2017-05-15 20:26 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-05-11  7:36 bug#26875: Non-graphical (and other types) of GRUB interfaces Leo Famulari
2017-05-11  7:46 ` ng0
2017-05-13  5:15   ` Leo Famulari
2017-05-13  5:21 ` bug#26875: [v2] system: grub: Expose GRUB's interactive interface settings Leo Famulari
2017-05-13 13:51   ` Ludovic Courtès
2017-05-13 16:40     ` Leo Famulari
2017-05-14  7:38     ` Mathieu Othacehe
2017-05-14 18:17       ` Leo Famulari
2017-05-15  9:36 ` bug#26875: Non-graphical (and other types) of GRUB interfaces Brendan Tildesley
2017-05-15 18:04   ` Leo Famulari
2017-05-15 20:25   ` Leo Famulari

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).