Hello! Jan Nieuwenhuizen <jann...@gnu.org> skribis:
>>> ‘rottlog’ was looking for config files in OUT/etc, which made it >>> impossible for people to configure it. So in commit >>> 268ad34e0eadf8a015798b5c5587aad65b9f3a61 I changed it to look for >>> configuration files in /etc/rottlog. >>> >>> Consequently, running “rottlog” alone won’t work; one has to provide >>> /etc/rottlog/{rc,daily} first. We should have a GuixSD service that >>> does that. >> >> Ah, yes configuration was the bit I was wondering about. A service >> that initializes/writes these sounds like a good idea! > > I made an attempt at a simple version of such a service. Its currently > just copying rc and writing a daily/weekly, find a working example > attached. Great! Comments below. > From cf93c7b59d0dc71ff23b4f9d435106d3844a9b9a Mon Sep 17 00:00:00 2001 > From: Jan Nieuwenhuizen <jann...@gnu.org> > Date: Thu, 8 Sep 2016 01:20:43 +0200 > Subject: [PATCH] gnu: services: add rottlog. > > * gnu/services/admin.scm: New file. > * gnu/local.mk (GNU_SYSTEM_MODULES): Add it. [...] > +;;; Add to operating-system services > +;;; > +;;; (mcron-service (list rottlog-job)) > +;;; (rottlog-service) It’s possible to make it so that users only need to write: (mcron-service) (rottlog-service) (See below.) > +(define-record-type* <rottlog-configuration> > + rottlog-configuration make-rottlog-configuration > + rottlog-configuration? > + (period rottlog-period) > + (initialize? rottlog-initialize?)) It should also have a ‘rottlog’ field, to specify the rottlog package being used. > +(define (rottlog-initialization period) > + "Return the gexp to initialize the ROTTLOG service for PERIOD." > + #~(begin > + (use-modules (ice-9 rdelim)) > + (let* ((dir "/etc/rottlog") > + (period-config (format #f "~a/~a" dir '#$period)) > + (rc-config (string-append dir "/rc"))) > + > + (mkdir-p dir) > + > + ;; TODO: substitutions > + (unless (file-exists? rc-config) > + (format #t "creating rottlog config '~a'...~%" rc-config) > + (let* ((file (open-file rc-config "w")) > + (template (string-append #$rottlog "/etc/rc")) > + (config (with-input-from-file template read-string))) > + (display config file) > + (close file))) > + > + ;; TODO: list of periods? > + (if (not (memq '#$period '(hourly daily weekly))) > + (format (current-error-port) "cowardly refusing to create > rottlog config for unknown period: '~a'~%" '#$period) > + (unless (file-exists? period-config) > + (format #t "creating rottlog config'~a'...~%" period-config) > + (let* ((file (open-file period-config "w"))) > + (format file "/var/log/messages { > + sharedscripts > + postrotate > + ~a/bin/kill -HUP $(~a/bin/cat /var/run/syslog.pid) 2> /dev/null > + endscript > + nocompress > +} > +" #$coreutils #$coreutils) > + (close file))))))) > + > +(define (rottlog-activation config) > + "Return the activation gexp for CONFIG." > + #~(begin > + #$(if (rottlog-initialize? config) > + (rottlog-initialization (rottlog-period config)) > + #t))) I think it’d be best to let the user pass the files, and put them in /etc/rottlog by extending ‘etc-service-type’. > +(define rottlog-service-type > + (service-type (name 'rottlog) > + (extensions > + (list (service-extension activation-service-type > + rottlog-activation))))) Thus, this would also extend mcron-service-type and etc-service-type. > +(define* (rottlog-service #:key (period 'daily) (initialize? #t)) > + (service rottlog-service-type > + (rottlog-configuration (period period) > + (initialize? initialize?)))) The configuration probably contain something like an list of name/config pairs as well as an ‘rc’ file, along these lines: (rottlog-configuration (periods `(("weekly" . ,(file-append rottlog "/etc/weekly)) ("daily" . ,(plain-file "daily" "…")))) (rc-file (file-append rottlog "/etc/rc"))) That way users would have all the latitude to configure the behavior of rottlog. Of course we should provide default config values that take care of common files such as /var/log/{messages,Xorg.0.log} in a reasonable way. WDYT? Thank you! Ludo’.