services: Add samba service.

* gnu/services/samba.scm: New file.
* gnu/tests/samba.scm: New file.
* gnu/local.mk (GNU_SYSTEM_MODULES): Add them.
* po/guix/POTFILES.in Add 'gnu/services/samba.scm'.
* doc/guix.texi: Document it.

Signed-off-by: Lars-Dominik Braun <lars@6xq.net>
This commit is contained in:
Simon Streit 2022-08-08 16:56:41 +02:00 committed by Lars-Dominik Braun
parent 4cbc162296
commit d68721c55a
No known key found for this signature in database
GPG key ID: F663943E08D8092A
5 changed files with 396 additions and 0 deletions

View file

@ -106,6 +106,7 @@ Copyright @copyright{} 2022 Philip M@sup{c}Grath@*
Copyright @copyright{} 2022 Karl Hallsby@*
Copyright @copyright{} 2022 Justin Veilleux@*
Copyright @copyright{} 2022 Reily Siegel@*
Copyright @copyright{} 2022 Simon Streit@*
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
@ -385,6 +386,7 @@ Services
* DNS Services:: DNS daemons.
* VPN Services:: VPN daemons.
* Network File System:: NFS related services.
* Samba Services:: Samba services.
* Continuous Integration:: Cuirass and Laminar services.
* Power Management Services:: Extending battery life.
* Audio Services:: The MPD.
@ -17516,6 +17518,7 @@ declaration.
* DNS Services:: DNS daemons.
* VPN Services:: VPN daemons.
* Network File System:: NFS related services.
* Samba Services:: Samba services.
* Continuous Integration:: Cuirass and Laminar services.
* Power Management Services:: Extending battery life.
* Audio Services:: The MPD.
@ -31297,6 +31300,56 @@ The verbosity level of the daemon.
@end table
@end deftp
@node Samba Services, Continuous Integration, Network File System, Services
@subsection Samba Services
@cindex Samba
@cindex SMB
The @code{(gnu services samba)} module provides service definitions for
Samba as well as additional helper services. Currently it provides the
following services.
@subsubheading Samba
@uref{https://www.samba.org, Samba} provides network shares for folders
and printers using the SMB/CIFS protocol commonly used on Windows. It
can also act as an Active Directory Domain Controller (AD DC) for other
hosts in an heterougenious network with different types of Computer
systems.
@defvar {Scheme variable} samba-service-type
The service type to enable the samba services @code{samba}, @code{nmbd},
@code{smbd} and @code{winbindd}. By default this service type does not
run as an AD DC, hence @code{samba} remains disabled.
@end defvar
@deftp{Data Type} samba-service-configuration
Configuration record for the Samba suite.
@table @asis
@item @code{package} (default: @code{samba})
The samba package to use.
@item @code{config-file} (default: @code{#f})
The config file to use.
@item @code{enable-samba?} (default: @code{#f})
Manually enable the @code{samba} daemon.
@item @code{enable-smbd?} (default: @code{#f})
Manually enable the @code{smbd} daemon.
@item @code{enable-nmbd?} (default: @code{#f})
Manually enable the @code{nmbd} daemon.
@item @code{enable-winbindd?} (default: @code{#f})
Manually enable the @code{winbindd} daemon.
@end table
@end deftp
@node Continuous Integration
@subsection Continuous Integration

View file

@ -682,6 +682,7 @@ GNU_SYSTEM_MODULES = \
%D%/services/herd.scm \
%D%/services/pm.scm \
%D%/services/rsync.scm \
%D%/services/samba.scm \
%D%/services/sddm.scm \
%D%/services/spice.scm \
%D%/services/ssh.scm \
@ -761,6 +762,7 @@ GNU_SYSTEM_MODULES = \
%D%/tests/package-management.scm \
%D%/tests/reconfigure.scm \
%D%/tests/rsync.scm \
%D%/tests/samba.scm \
%D%/tests/security.scm \
%D%/tests/security-token.scm \
%D%/tests/singularity.scm \

182
gnu/services/samba.scm Normal file
View file

@ -0,0 +1,182 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2022 Simon Streit <simon@netpanic.org>
;;;
;;; 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 samba)
#:use-module (gnu packages)
#:use-module (gnu packages base)
#:use-module (gnu packages admin)
#:use-module (gnu packages samba)
#:use-module (gnu services)
#:use-module (gnu services configuration)
#:use-module (gnu services shepherd)
#:use-module (gnu services base)
#:use-module (gnu system shadow)
#:use-module (guix gexp)
#:use-module (guix packages)
#:use-module (guix modules)
#:use-module (guix records)
#:use-module (ice-9 format)
#:use-module (ice-9 match)
#:use-module (ice-9 textual-ports)
#:use-module (srfi srfi-1)
#:export (samba-service-type
samba-configuration
samba-smb-conf))
(define %smb-conf
(plain-file "smb.conf" "[global]
workgroup = WORKGROUP
server string = Samba Server
server role = standalone server
log file = /var/log/samba/log.%m
logging = file
"))
(define-record-type* <samba-configuration>
samba-configuration
make-samba-configuration
samba-configuration?
(package samba-configuration-package
(default samba))
(config-file samba-configuration-config-file
(default #f))
(enable-samba? samba-configuration-enable-samba?
(default #f))
(enable-smbd? samba-configuration-enable-smbd?
(default #t))
(enable-nmbd? samba-configuration-enable-nmbd?
(default #t))
(enable-winbindd? samba-configuration-enable-winbindd?
(default #t)))
(define (samba-activation config)
(let ((package (samba-configuration-package config))
(config-file (samba-configuration-config-file config)))
(with-imported-modules '((guix build utils))
(let ((lib-dir "/var/lib/samba")
(log-dir "/var/log/samba")
(run-dir "/var/run/samba")
(lock-dir "/var/lock/samba")
(cache-dir "/var/cache/samba")
(etc-dir "/etc/samba")
(smb.conf "/etc/samba/smb.conf"))
#~(begin
(use-modules (guix build utils))
(mkdir-p #$etc-dir)
(mkdir-p #$lib-dir)
(mkdir-p/perms (string-append #$lib-dir "/private")
(getpwnam "root") #o700)
(mkdir-p #$log-dir)
(mkdir-p #$run-dir)
(mkdir-p #$lock-dir)
(mkdir-p #$cache-dir)
(copy-file #$config-file #$smb.conf)
(invoke #$(file-append package "/bin/testparm")
"--suppress-prompt" #$smb.conf))))))
(define (samba-samba-shepherd-service config)
(let ((package (samba-configuration-package config))
(config-file (samba-configuration-config-file config)))
(list (shepherd-service
(documentation "Run Samba")
(provision '(samba-samba))
(requirement '(networking))
(start #~(make-forkexec-constructor
(list #$(file-append package "/sbin/samba")
(string-append "--configfile=" #$config-file)
"--foreground"
"--no-process-group")))
(stop #~(make-kill-destructor))))))
(define (samba-nmbd-shepherd-service config)
(let ((package (samba-configuration-package config))
(config-file (samba-configuration-config-file config)))
(list (shepherd-service
(documentation "Run NMBD")
(provision '(samba-nmbd))
(requirement '(networking))
(start #~(make-forkexec-constructor
(list #$(file-append package "/sbin/nmbd")
(string-append "--configfile=" #$config-file)
"--foreground"
"--no-process-group")))
(stop #~(make-kill-destructor))))))
(define (samba-smbd-shepherd-service config)
(let ((package (samba-configuration-package config))
(config-file (samba-configuration-config-file config)))
(list (shepherd-service
(documentation "Run SMBD")
(provision '(samba-smbd))
(requirement '(networking))
(start #~(make-forkexec-constructor
(list #$(file-append package "/sbin/smbd")
(string-append "--configfile=" #$config-file)
"--foreground"
"--no-process-group")))
(stop #~(make-kill-destructor))))))
(define (samba-winbindd-shepherd-service config)
(let ((package (samba-configuration-package config))
(config-file (samba-configuration-config-file config)))
(list (shepherd-service
(documentation "Run Winnbindd for Name Service Switch")
(provision '(samba-winbindd))
(requirement '(networking))
(start #~(make-forkexec-constructor
(list #$(file-append package "/sbin/winbindd")
(string-append "--configfile=" #$config-file)
"--foreground"
"--no-process-group")))
(stop #~(make-kill-destructor))))))
(define (samba-shepherd-services config)
(append (if (samba-configuration-enable-samba? config)
(samba-samba-shepherd-service config)
'())
(if (samba-configuration-enable-nmbd? config)
(samba-nmbd-shepherd-service config)
'())
(if (samba-configuration-enable-smbd? config)
(samba-smbd-shepherd-service config)
'())
(if (samba-configuration-enable-winbindd? config)
(samba-winbindd-shepherd-service config)
'())))
(define samba-service-type
(service-type
(name 'samba)
(description "Run @uref{https://www.samba.org/, Samba}, a network file and
print service for all clients using the SMB/CIFS protocol. Samba is an
important component to seamlessly integrate Linux/Unix Servers and Desktops
into Active Directory environments. It can function both as a domain
controller or as a regular domain member.")
(extensions
(list (service-extension shepherd-root-service-type
samba-shepherd-services)
(service-extension activation-service-type
samba-activation)
(service-extension profile-service-type
(compose list samba-configuration-package))))
(default-value (samba-configuration))))

158
gnu/tests/samba.scm Normal file
View file

@ -0,0 +1,158 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2022 Simon Streit <simon@netpanic.org>
;;;
;;; 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 tests samba)
#:use-module (gnu tests)
#:use-module (gnu system)
#:use-module (gnu system vm)
#:use-module (gnu services)
#:use-module (gnu services networking)
#:use-module (gnu services samba)
#:use-module (gnu packages samba)
#:use-module (guix gexp)
#:use-module (guix store)
#:export (%test-samba))
;;;
;;; The Samba service.
;;;
(define %samba-os
(let ((base-os (simple-operating-system
(simple-service 'create-target-directory activation-service-type
#~(begin
(mkdir-p "/srv/samba/guest")
(chown "/srv/samba/guest"
(passwd:uid (getpw "nobody"))
(passwd:gid (getpw "nobody")))))
(service dhcp-client-service-type)
(service samba-service-type
(samba-configuration
(config-file (plain-file "smb.conf" "
[global]
workgroup = WORKGROUP
server string = Samba Server
server role = standalone server
log file = /var/log/samba/log.%m
logging = file
[guest]
path = /srv/samba/guest
read only = no
guest ok = yes
guest only = yes
")))))))
(operating-system
(inherit base-os)
(packages (cons samba (operating-system-packages base-os))))))
(define* (run-samba-test)
"Return a test of an OS running Samba service."
(define vm
(virtual-machine
(operating-system (marionette-operating-system
%samba-os
#:imported-modules '((gnu services herd))))
(port-forwardings '((8135 . 135)
(8137 . 137)
(8138 . 138)
(8445 . 445)))))
(define test
(with-imported-modules '((gnu build marionette))
#~(begin
(use-modules (gnu build marionette)
(srfi srfi-26)
(srfi srfi-64))
(define marionette
(make-marionette '(#$vm)))
(test-runner-current (system-test-runner #$output))
(test-begin "samba")
(test-assert "samba-smbd running"
(marionette-eval
'(begin
(use-modules (gnu services herd))
(start-service 'samba-smbd))
marionette))
(test-assert "samba-nmbd running"
(marionette-eval
'(begin
(use-modules (gnu services herd))
(start-service 'samba-nmbd))
marionette))
(test-assert "samba-winbindd running"
(marionette-eval
'(begin
(use-modules (gnu services herd))
(start-service 'samba-winbindd))
marionette))
(test-assert "smbd service process id"
(let ((pid
(number->string (wait-for-file "/var/run/samba/smbd.pid"
marionette))))
(marionette-eval `(file-exists? (string-append "/proc/" ,pid))
marionette)))
(test-assert "nmbd service process id"
(let ((pid
(number->string (wait-for-file "/var/run/samba/nmbd.pid"
marionette))))
(marionette-eval `(file-exists? (string-append "/proc/" ,pid))
marionette)))
(test-assert "winbindd service process id"
(let ((pid
(number->string (wait-for-file "/var/run/samba/winbindd.pid"
marionette))))
(marionette-eval `(file-exists? (string-append "/proc/" ,pid))
marionette)))
(test-assert "samba-smbd is listening for peers"
(wait-for-tcp-port 445 marionette))
(test-equal "smbclient connect"
0
(marionette-eval
'(system* #$(file-append samba "/bin/smbclient")
"--list=localhost" "--no-pass")
marionette))
(test-equal "smbclient connect"
0
(marionette-eval
'(system* #$(file-append samba "/bin/smbclient")
"--list=localhost" "--no-pass")
marionette))
(test-end))))
(gexp->derivation "samba-test" test))
(define %test-samba
(system-test
(name "samba")
(description "Connect to a running Samba daemon.")
(value (run-samba-test))))

View file

@ -6,6 +6,7 @@ gnu/services.scm
gnu/system.scm
gnu/services/configuration.scm
gnu/services/shepherd.scm
gnu/services/samba.scm
gnu/home/services.scm
gnu/home/services/ssh.scm
gnu/home/services/symlink-manager.scm