From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45187) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1daqs5-0003LF-31 for guix-patches@gnu.org; Thu, 27 Jul 2017 18:03:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1daqs2-00037T-Ef for guix-patches@gnu.org; Thu, 27 Jul 2017 18:03:05 -0400 Received: from debbugs.gnu.org ([208.118.235.43]:56323) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1daqs2-00037A-BV for guix-patches@gnu.org; Thu, 27 Jul 2017 18:03:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1daqs2-0007KW-0Y for guix-patches@gnu.org; Thu, 27 Jul 2017 18:03:02 -0400 Subject: [bug#27855] [PATCH] gnu: Add rsync service. Resent-Message-ID: Received: from eggs.gnu.org ([2001:4830:134:3::10]:44652) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1daqrB-0003JG-N3 for guix-patches@gnu.org; Thu, 27 Jul 2017 18:02:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1daqr7-0002SD-PQ for guix-patches@gnu.org; Thu, 27 Jul 2017 18:02:09 -0400 Received: from mail-lf0-x22e.google.com ([2a00:1450:4010:c07::22e]:38695) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1daqr7-0002QW-EP for guix-patches@gnu.org; Thu, 27 Jul 2017 18:02:05 -0400 Received: by mail-lf0-x22e.google.com with SMTP id y15so85114844lfd.5 for ; Thu, 27 Jul 2017 15:02:03 -0700 (PDT) From: Oleg Pykhalov Date: Fri, 28 Jul 2017 01:01:51 +0300 Message-Id: <20170727220151.2116-1-go.wigust@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: 27855@debbugs.gnu.org * doc/guix.texi (Incremental file transfer): Add documentation. * gnu/services/rsync.scm (): New record type. (rsync-accounts, rsync-shepherd-service): New service extensions. (rsync-service-type): New service type. --- doc/guix.texi | 58 ++++++++++++++++++ gnu/local.mk | 1 + gnu/services/rsync.scm | 162 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+) create mode 100644 gnu/services/rsync.scm diff --git a/doc/guix.texi b/doc/guix.texi index e8c4e0eaf..a3745ae01 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -15661,6 +15661,64 @@ Extra options will be passed to @code{git daemon}, please run @end table @end deftp +@subsubsection Incremental file transfer + +The @code{(gnu services rsync)} module provides the following services: + +@subsubheading Rsync service + +@deffn {Scheme Variable} rsync-service-type +This is the type for the @uref{https://rsync.samba.org} rsync daemon, +@command{rsync-configuration} record as in this example: + +@example +(service rsync-service-type + (rsync-configuration)) +@end example + +See below for details about @code{rsync-configuration}. +@end deffn + +@deftp {Data Type} rsync-configuration +Data type representing the configuration for @code{rsync-service}. + +@table @asis +@item @code{package} (default: @var{rsync}) +Package object of the Rsync utility for efficiently transferring and +synchronizing files. + +@item @code{port-number} (default: @code{873}) +TCP port on which @command{rsync} listens for incoming connections. If +port is less than @code{1024} @command{rsync} will be started as the +@code{root} user and group. + +@item @code{pid-file} (default: @code{"/var/run/rsyncd.pid"}) +Name of the file where @command{rsync} writes its PID. + +@item @code{lock-file} (default: @code{"/var/run/rsyncd.lock"}) +Name of the file where @command{rsync} writes its lock file. + +@item @code{log-file} (default: @code{"/var/log/rsyncd.log"}) +Name of the file where @command{rsync} writes its log file. + +@item @code{use-choot?} (default: @var{#f}) +Whether to use chroot for @command{rsync} shared directory. + +@item @code{share-path} (default: @file{/srv/rsync}) +Location of the @command{rsync} shared directory. + +@item @code{share-comment} (default: @code{"Rsync share"}) +Comment of the @command{rsync} shared directory. + +@item @code{read-only?} (default: @var{#f}) +Read-write permissions to shared directory. + +@item @code{timeout} (default: @code{300}) +I/O timeout in seconds. + +@end table +@end deftp + @node Setuid Programs @subsection Setuid Programs diff --git a/gnu/local.mk b/gnu/local.mk index 724c6b675..fa514b278 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -444,6 +444,7 @@ GNU_SYSTEM_MODULES = \ %D%/services/shepherd.scm \ %D%/services/herd.scm \ %D%/services/pm.scm \ + %D%/services/rsync.scm \ %D%/services/sddm.scm \ %D%/services/spice.scm \ %D%/services/ssh.scm \ diff --git a/gnu/services/rsync.scm b/gnu/services/rsync.scm new file mode 100644 index 000000000..49c4cb7e2 --- /dev/null +++ b/gnu/services/rsync.scm @@ -0,0 +1,162 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2017 Oleg Pykhalov +;;; +;;; 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 . + +(define-module (gnu services rsync) + #:use-module (gnu services) + #:use-module (gnu services base) + #:use-module (gnu services shepherd) + #:use-module (gnu system shadow) + #:use-module (gnu packages rsync) + #:use-module (gnu packages admin) + #:use-module (guix records) + #:use-module (guix gexp) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:use-module (ice-9 match) + #:export (rsync-configuration + rsync-configuration? + rsync-service-type)) + +;;; +;;; Rsync. +;;; + +(define-record-type* + rsync-configuration make-rsync-configuration + rsync-configuration? + ;; + (package rsync-configuration-package + (default rsync)) + ;; integer + (port-number rsync-configuration-port-number + (default 873)) + ;; string + (pid-file rsync-configuration-pid-file + (default "/var/run/rsyncd.pid")) + ;; string + (lock-file rsync-configuration-lock-file + (default "/var/run/rsyncd.lock")) + ;; string + (log-file rsync-configuration-log-file + (default "/var/log/rsyncd.log")) + ;; Boolean + (use-chroot? rsync-configuration-use-chroot? + (default #f)) + ;; string + (share-path rsync-configuration-share-path + (default "/srv/rsync")) + ;; string + (share-comment rsync-configuration-share-comment + (default "Rsync share")) + ;; Boolean + (read-only? rsync-configuration-read-only? + (default #f)) + ;; integer + (timeout rsync-configuration-timeout + (default 300))) + +(define %rsync-accounts + ;; User account and group for rsync. + (list (user-group (name "rsyncd") (system? #t)) + (user-account + (name "rsyncd") + (system? #t) + (group "rsyncd") + (comment "rsyncd privilege separation user") + (home-directory "/var/run/rsyncd") + (shell #~(string-append #$shadow "/sbin/nologin"))))) + +(define (rsync-activation config) + "Return the activation GEXP for CONFIG." + #~(begin + (use-modules (guix build utils)) + (let ((share-directory #$(rsync-configuration-share-path config)) + (user (getpw "rsyncd"))) + (and=> share-directory mkdir-p) + (chown share-directory + (passwd:uid user) + (group:gid user))))) + +(define (rsync-config-file config) + "Return the rsync configuration file corresponding to CONFIG." + (computed-file + "rsync.conf" + #~(begin + (call-with-output-file #$output + (lambda (port) + (display "# Generated by 'rsync-service'.\n" port) + (format port "pid file = ~a\n" + #$(rsync-configuration-pid-file config)) + (format port "lock file = ~a\n" + #$(rsync-configuration-lock-file config)) + (format port "log file = ~a\n" + #$(rsync-configuration-log-file config)) + (format port "port = ~a\n" + #$(number->string + (rsync-configuration-port-number config))) + (format port "use chroot = ~a\n" + #$(if (rsync-configuration-use-chroot? config) + "true" "false")) + (display "[files]\n" port) + (format port "path = ~a\n" + #$(rsync-configuration-share-path config)) + (format port "comment = ~a\n" + #$(rsync-configuration-share-comment config)) + (format port "read only = ~a\n" + #$(if (rsync-configuration-read-only? config) + "true" "false")) + (format port "timeout = ~a\n" + #$(number->string + (rsync-configuration-timeout config))) + #t))))) + +(define (rsync-shepherd-service config) + "Return a for rsync with CONFIG." + + (define rsync-command + #~(list (string-append #$(rsync-configuration-package config) "/bin/rsync") + "--daemon" "--config" #$(rsync-config-file config))) + + (define pid-file + (rsync-configuration-pid-file config)) + + (define user + (let ((port (rsync-configuration-port-number config))) + (if (> port 1024) + "rsyncd" + "root"))) + + (list (shepherd-service + (provision '(rsync)) + (documentation "Run rsync daemon.") + (start #~(make-forkexec-constructor #$rsync-command + #:pid-file #$pid-file + #:user #$user + #:group #$user)) + (stop #~(make-kill-destructor))))) + +(define rsync-service-type + (service-type + (name 'rsync) + (extensions + (list (service-extension shepherd-root-service-type + rsync-shepherd-service) + (service-extension account-service-type + (const %rsync-accounts)) + (service-extension activation-service-type + rsync-activation))))) -- 2.13.3