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>master
parent
4cbc162296
commit
d68721c55a
|
@ -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
|
||||
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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))))
|
|
@ -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))))
|
|
@ -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
|
||||
|
|
Reference in New Issue