Browse Source
* gnu/services/linux.scm: New file. * tests/services/linux.scm: Add test. * Makefile.am (SCM_TESTS): Register test. * doc/guix.texi (Linux Services): Add a new section and document the new service and its configuration.guile-daemon

4 changed files with 251 additions and 1 deletions
@ -0,0 +1,125 @@ |
|||
;;; GNU Guix --- Functional package management for GNU |
|||
;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com> |
|||
;;; |
|||
;;; 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 <http://www.gnu.org/licenses/>. |
|||
|
|||
(define-module (gnu services linux) |
|||
#:use-module (guix gexp) |
|||
#:use-module (guix records) |
|||
#:use-module (guix modules) |
|||
#:use-module (gnu services) |
|||
#:use-module (gnu services shepherd) |
|||
#:use-module (gnu packages linux) |
|||
#:use-module (srfi srfi-1) |
|||
#:use-module (srfi srfi-26) |
|||
#:use-module (ice-9 match) |
|||
#:export (earlyoom-configuration |
|||
earlyoom-configuration? |
|||
earlyoom-configuration-earlyoom |
|||
earlyoom-configuration-minimum-available-memory |
|||
earlyoom-configuration-minimum-free-swap |
|||
earlyoom-configuration-prefer-regexp |
|||
earlyoom-configuration-avoid-regexp |
|||
earlyoom-configuration-memory-report-interval |
|||
earlyoom-configuration-ignore-positive-oom-score-adj? |
|||
earlyoom-configuration-show-debug-messages? |
|||
earlyoom-configuration-send-notification-command |
|||
earlyoom-service-type)) |
|||
|
|||
|
|||
;;; |
|||
;;; Early OOM daemon. |
|||
;;; |
|||
|
|||
(define-record-type* <earlyoom-configuration> |
|||
earlyoom-configuration make-earlyoom-configuration |
|||
earlyoom-configuration? |
|||
(earlyoom earlyoom-configuration-earlyoom |
|||
(default earlyoom)) |
|||
(minimum-available-memory earlyoom-configuration-minimum-available-memory |
|||
(default 10)) ; in percent |
|||
(minimum-free-swap earlyoom-configuration-minimum-free-swap |
|||
(default 10)) ; in percent |
|||
(prefer-regexp earlyoom-configuration-prefer-regexp ; <string> |
|||
(default #f)) |
|||
(avoid-regexp earlyoom-configuration-avoid-regexp ; <string> |
|||
(default #f)) |
|||
(memory-report-interval earlyoom-configuration-memory-report-interval |
|||
(default 0)) ; in seconds; 0 means disabled |
|||
(ignore-positive-oom-score-adj? |
|||
earlyoom-configuration-ignore-positive-oom-score-adj? (default #f)) |
|||
(run-with-higher-priority? earlyoom-configuration-run-with-higher-priority? |
|||
(default #f)) |
|||
(show-debug-messages? earlyoom-configuration-show-debug-messages? |
|||
(default #f)) |
|||
(send-notification-command |
|||
earlyoom-configuration-send-notification-command ; <string> |
|||
(default #f))) |
|||
|
|||
(define (earlyoom-configuration->command-line-args config) |
|||
"Translate a <earlyoom-configuration> object to its command line arguments |
|||
representation." |
|||
(match config |
|||
(($ <earlyoom-configuration> earlyoom minimum-available-memory |
|||
minimum-free-swap prefer-regexp avoid-regexp |
|||
memory-report-interval |
|||
ignore-positive-oom-score-adj? |
|||
run-with-higher-priority? show-debug-messages? |
|||
send-notification-command) |
|||
`(,(file-append earlyoom "/bin/earlyoom") |
|||
,@(if minimum-available-memory |
|||
(list "-m" (format #f "~s" minimum-available-memory)) |
|||
'()) |
|||
,@(if minimum-free-swap |
|||
(list "-s" (format #f "~s" minimum-free-swap)) |
|||
'()) |
|||
,@(if prefer-regexp |
|||
(list "--prefer" prefer-regexp) |
|||
'()) |
|||
,@(if avoid-regexp |
|||
(list "--avoid" avoid-regexp) |
|||
'()) |
|||
"-r" ,(format #f "~s" memory-report-interval) |
|||
,@(if ignore-positive-oom-score-adj? |
|||
(list "-i") |
|||
'()) |
|||
,@(if run-with-higher-priority? |
|||
(list "-p") |
|||
'()) |
|||
,@(if show-debug-messages? |
|||
(list "-d") |
|||
'()) |
|||
,@(if send-notification-command |
|||
(list "-N" send-notification-command) |
|||
'()))))) |
|||
|
|||
(define (earlyoom-shepherd-service config) |
|||
(shepherd-service |
|||
(documentation "Run the Early OOM daemon.") |
|||
(provision '(earlyoom)) |
|||
(start #~(make-forkexec-constructor |
|||
'#$(earlyoom-configuration->command-line-args config) |
|||
#:log-file "/var/log/earlyoom.log")) |
|||
(stop #~(make-kill-destructor)))) |
|||
|
|||
(define earlyoom-service-type |
|||
(service-type |
|||
(name 'earlyoom) |
|||
(default-value (earlyoom-configuration)) |
|||
(extensions |
|||
(list (service-extension shepherd-root-service-type |
|||
(compose list earlyoom-shepherd-service)))) |
|||
(description "Run @command{earlyoom}, the Early OOM daemon."))) |
@ -0,0 +1,57 @@ |
|||
;;; GNU Guix --- Functional package management for GNU |
|||
;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com> |
|||
;;; |
|||
;;; 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 <http://www.gnu.org/licenses/>. |
|||
|
|||
(define-module (tests services linux) |
|||
#:use-module (ice-9 match) |
|||
#:use-module (gnu packages linux) |
|||
#:use-module (gnu services linux) |
|||
#:use-module (guix gexp) |
|||
#:use-module (srfi srfi-64)) |
|||
|
|||
;;; Tests for the (gnu services linux) module. |
|||
|
|||
(test-begin "linux-services") |
|||
|
|||
|
|||
;;; |
|||
;;; Early OOM daemon. |
|||
;;; |
|||
|
|||
(define earlyoom-configuration->command-line-args |
|||
(@@ (gnu services linux) earlyoom-configuration->command-line-args)) |
|||
|
|||
(define %earlyoom-configuration-sample |
|||
(earlyoom-configuration |
|||
(minimum-available-memory 10) |
|||
(minimum-free-swap 20) |
|||
(prefer-regexp "icecat") |
|||
(avoid-regexp "guix-daemon") |
|||
(memory-report-interval 60) |
|||
(ignore-positive-oom-score-adj? #f) |
|||
(run-with-higher-priority? #t) |
|||
(show-debug-messages? #f) |
|||
(send-notification-command "python \"/some/path/notify-all-users.py\""))) |
|||
|
|||
(test-equal "earlyoom-configuration->command-line-args" |
|||
(list (file-append earlyoom "/bin/earlyoom") |
|||
"-m" "10" "-s" "20" "--prefer" "icecat" |
|||
"--avoid" "guix-daemon" "-r" "60" "-p" |
|||
"-N" "python \"/some/path/notify-all-users.py\"") |
|||
(earlyoom-configuration->command-line-args %earlyoom-configuration-sample)) |
|||
|
|||
(test-end "linux-services") |
Loading…
Reference in new issue