From unknown Tue Aug 19 23:11:52 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#60788 <60788@debbugs.gnu.org> To: bug#60788 <60788@debbugs.gnu.org> Subject: Status: [PATCH] services: Add vnstat-service-type. Reply-To: bug#60788 <60788@debbugs.gnu.org> Date: Wed, 20 Aug 2025 06:11:52 +0000 retitle 60788 [PATCH] services: Add vnstat-service-type. reassign 60788 guix-patches submitter 60788 Bruno Victal severity 60788 normal tag 60788 patch thanks From debbugs-submit-bounces@debbugs.gnu.org Fri Jan 13 15:08:15 2023 Received: (at submit) by debbugs.gnu.org; 13 Jan 2023 20:08:15 +0000 Received: from localhost ([127.0.0.1]:52478 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pGQLW-0000o1-8O for submit@debbugs.gnu.org; Fri, 13 Jan 2023 15:08:15 -0500 Received: from lists.gnu.org ([209.51.188.17]:52552) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pGQLS-0000nq-LR for submit@debbugs.gnu.org; Fri, 13 Jan 2023 15:08:12 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pGQLQ-0000gv-J9 for guix-patches@gnu.org; Fri, 13 Jan 2023 15:08:10 -0500 Received: from smtpm4.myservices.hosting ([185.26.105.235]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pGQLK-000831-SX for guix-patches@gnu.org; Fri, 13 Jan 2023 15:08:07 -0500 Received: from mail1.netim.hosting (unknown [185.26.106.172]) by smtpm4.myservices.hosting (Postfix) with ESMTP id A8AE720C84 for ; Fri, 13 Jan 2023 21:07:49 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 5792E80098; Fri, 13 Jan 2023 21:07:49 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-1.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id bdzh-qY-r6G1; Fri, 13 Jan 2023 21:07:48 +0100 (CET) Received: from guix-nuc.home.arpa (bl9-118-236.dsl.telepac.pt [85.242.118.236]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id C3AA180097; Fri, 13 Jan 2023 21:07:47 +0100 (CET) From: Bruno Victal To: guix-patches@gnu.org Subject: [PATCH] services: Add vnstat-service-type. Date: Fri, 13 Jan 2023 20:07:36 +0000 Message-Id: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 tags: patch Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=185.26.105.235; envelope-from=mirai@makinata.eu; helo=smtpm4.myservices.hosting X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit Cc: Bruno Victal X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.3 (--) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- doc/guix.texi | 238 +++++++++++++++++++++ gnu/services/monitoring.scm | 413 ++++++++++++++++++++++++++++++++++++ 2 files changed, 651 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index 751d0957d8..b51a488a85 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -111,6 +111,7 @@ Copyright @copyright{} 2022 John Kehayias@* Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@* Copyright @copyright{} 2023 Giacomo Leidi@* +Copyright @copyright{} 2023 Bruno Victal@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -28219,6 +28220,243 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{#@{5-minute-hours@}#} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{#@{64bit-interface-counters@}#} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces lo, lo0 and sit0 are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-dir}. + +@item @code{daemon-group} (type: maybe-string) +Specify the group to which the daemon process should switch during +startup. The group can either be the name of the group or a numerical +group id. Leave empty to disable group switching. This option can only +be used when the process is started as root. + +@item @code{daemon-user} (type: maybe-string) +Specify the user to which the daemon process should switch during +startup. The user can either be the login of the user or a numerical +user id. Leave empty to disable user switching. This option can only +be used when the process is started as root. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-BW} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as symbols/strings to integer values. For example, +@lisp +(max-BW `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-BW} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. This option is ignored when the daemon is +started with .B "-n, --nodaemon" which results in all log output being +shown in terminal the daemon process is using. @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-UTC?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index 44e2e8886c..a83dcf315b 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,10 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +203,412 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map string-capitalize tail)) "")))) + +(define (dock-field-name field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (dock-field-name field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-dir + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required.") + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces lo, lo0 and sit0 are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-dirs? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-dir}.") + + (daemon-group + maybe-string + "\ +Specify the group to which the daemon process should switch during startup. +The group can either be the name of the group or a numerical group id. +Leave empty to disable group switching. This option can only be used when +the process is started as root.") + + (daemon-user + maybe-string + "\ +Specify the user to which the daemon process should switch during startup. +The user can either be the login of the user or a numerical user id. +Leave empty to disable user switching. This option can only be used when +the process is started as root.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-BW + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as symbols/strings to integer values. For example, +@lisp +(max-BW + `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-BW} +configuration. Value range: @samp{0}..@samp{50000}") + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. This option is ignored when the daemon is started with +.B \"-n, --nodaemon\" +which results in all log output being shown in terminal the daemon process is using. +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-UTC? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified.") + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (if (every maybe-value-set? (list daemon-group daemon-user)) + (list + (user-group + (name daemon-group) + (system? #t)) + (user-account + (name daemon-user) + (group daemon-group) + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + '()))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server base-commit: 0f85081ed1d99be57d3544e0307e7fa9ca043be9 -- 2.38.1 From debbugs-submit-bounces@debbugs.gnu.org Sat Jan 14 16:06:52 2023 Received: (at 60788) by debbugs.gnu.org; 14 Jan 2023 21:06:52 +0000 Received: from localhost ([127.0.0.1]:55636 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pGnjn-0001Fm-2h for submit@debbugs.gnu.org; Sat, 14 Jan 2023 16:06:52 -0500 Received: from smtpm1.myservices.hosting ([185.26.105.232]:43534) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pGnjj-0001Fc-He for 60788@debbugs.gnu.org; Sat, 14 Jan 2023 16:06:50 -0500 Received: from mail1.netim.hosting (unknown [185.26.106.172]) by smtpm1.myservices.hosting (Postfix) with ESMTP id 78C9C204EC for <60788@debbugs.gnu.org>; Sat, 14 Jan 2023 22:06:45 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 1FA1280096; Sat, 14 Jan 2023 22:06:45 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-1.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id vD_oSUQOgjcB; Sat, 14 Jan 2023 22:06:42 +0100 (CET) Received: from guix-nuc.home.arpa (bl9-118-236.dsl.telepac.pt [85.242.118.236]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 7E31380093; Sat, 14 Jan 2023 22:06:42 +0100 (CET) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v2] services: Add vnstat-service-type. Date: Sat, 14 Jan 2023 21:06:33 +0000 Message-Id: X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- Fix for camelfy-field-name. doc/guix.texi | 238 +++++++++++++++++++++ gnu/services/monitoring.scm | 413 ++++++++++++++++++++++++++++++++++++ 2 files changed, 651 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index c07ec89b2f..1f6e5d9ed6 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -111,6 +111,7 @@ Copyright @copyright{} 2022 John Kehayias@* Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@* Copyright @copyright{} 2023 Giacomo Leidi@* +Copyright @copyright{} 2023 Bruno Victal@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -28219,6 +28220,243 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{#@{5-minute-hours@}#} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{#@{64bit-interface-counters@}#} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces lo, lo0 and sit0 are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-dir}. + +@item @code{daemon-group} (type: maybe-string) +Specify the group to which the daemon process should switch during +startup. The group can either be the name of the group or a numerical +group id. Leave empty to disable group switching. This option can only +be used when the process is started as root. + +@item @code{daemon-user} (type: maybe-string) +Specify the user to which the daemon process should switch during +startup. The user can either be the login of the user or a numerical +user id. Leave empty to disable user switching. This option can only +be used when the process is started as root. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-BW} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as symbols/strings to integer values. For example, +@lisp +(max-BW `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-BW} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. This option is ignored when the daemon is +started with .B "-n, --nodaemon" which results in all log output being +shown in terminal the daemon process is using. @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-UTC?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index 44e2e8886c..7017c677ea 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,10 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +203,412 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map (cut string-upcase <> 0 1) tail)) "")))) + +(define (dock-field-name field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (dock-field-name field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-dir + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required.") + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces lo, lo0 and sit0 are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-dirs? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-dir}.") + + (daemon-group + maybe-string + "\ +Specify the group to which the daemon process should switch during startup. +The group can either be the name of the group or a numerical group id. +Leave empty to disable group switching. This option can only be used when +the process is started as root.") + + (daemon-user + maybe-string + "\ +Specify the user to which the daemon process should switch during startup. +The user can either be the login of the user or a numerical user id. +Leave empty to disable user switching. This option can only be used when +the process is started as root.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-BW + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as symbols/strings to integer values. For example, +@lisp +(max-BW + `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-BW} +configuration. Value range: @samp{0}..@samp{50000}") + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. This option is ignored when the daemon is started with +.B \"-n, --nodaemon\" +which results in all log output being shown in terminal the daemon process is using. +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-UTC? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified.") + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (if (every maybe-value-set? (list daemon-group daemon-user)) + (list + (user-group + (name daemon-group) + (system? #t)) + (user-account + (name daemon-user) + (group daemon-group) + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + '()))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server base-commit: fb3085e80fd3d4559057b60d9e2c1c1f1ff51022 -- 2.38.1 From debbugs-submit-bounces@debbugs.gnu.org Mon Jan 16 13:42:23 2023 Received: (at 60788) by debbugs.gnu.org; 16 Jan 2023 18:42:23 +0000 Received: from localhost ([127.0.0.1]:34874 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pHUR4-0006Fb-PF for submit@debbugs.gnu.org; Mon, 16 Jan 2023 13:42:23 -0500 Received: from mail-qt1-f179.google.com ([209.85.160.179]:42827) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pHUQu-0006F5-Oa for 60788@debbugs.gnu.org; Mon, 16 Jan 2023 13:42:21 -0500 Received: by mail-qt1-f179.google.com with SMTP id fd15so15377517qtb.9 for <60788@debbugs.gnu.org>; Mon, 16 Jan 2023 10:42:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=/kAavj0d7GuDH0kcUED/DhPZyFP1VIE6opHNzZADVjs=; b=SXiB/n8upzY9zNMlB5AWYviru0OBAMYMFcPvAlxNKSAh730mPO6fQjvrWYc3dwlVmm aw1vx+9Xdyf5eM/6LCQN8D0n8crnj9liFK+NfVbL2k08iL89wbrUzgx29sfotWrLWZfO AowtDpblAkxBFuDyR38SuMjwWWWUo4gFl5J88WeHJrv8dUFcRIzidluUdJ7FXIGuqlsj OgeKakvsOZ584nEM0EZqCtrCQdtO9bpNtzixzpUhnUUy5DVLhbguxPx/cZCsCGmIsAr/ A+PTw+g0efRvCzZqCzx1JIXl67Z+BEpw/we40SuxrfmewB5idaW9LlRRBDLzfgLBjuEn cPGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=/kAavj0d7GuDH0kcUED/DhPZyFP1VIE6opHNzZADVjs=; b=Mdf0luwYQvDOmpfPF5UIq0kjwkRSELfcy/4t1gnKjVFznwKyqqbQ4oC06myiWWZ+3s WZQhxvCuPoiJeOn9dCDMQuV+cr8P3kekIVcmvEC3BDG0yEXw1SiaB/ls3JX6wiP8cXFz C792MQHXykKHUp3t3ucQQjkvZnf1VAyfl6EfSMOmbfU5uI3oXWyQR+0hUgkAQGNL0N8M Go97GvtRGl8cMNhl8xDZOBMtij2UUHcNsBkoRKEOpqkc+JL0U2uCHNd2dBetQcG2n2l3 soNQa/uoDZl2iUehIaE0tV1BI/+S7tXRodTtDf4G3DHXO78VkSzb+jr9nIv6HFFwfM5h W5Wg== X-Gm-Message-State: AFqh2koI+OziSaCHOAp32lBbOnJCPCrtseM6pazUWkGQlk9MuTlIWBde Btoi0sWZSyKZo6gdczww3tdpsFzrdL+WjxZn X-Google-Smtp-Source: AMrXdXttyS1f2gNbhY15dQuYCIQp6mDrLLNR7lpNfqIGIX0vtg1graLa7xCBSP8UXgn1C16r2kL4aA== X-Received: by 2002:a05:622a:1e1b:b0:3b4:a6af:a2f2 with SMTP id br27-20020a05622a1e1b00b003b4a6afa2f2mr123685qtb.34.1673894526782; Mon, 16 Jan 2023 10:42:06 -0800 (PST) Received: from hurd (dsl-10-130-209.b2b2c.ca. [72.10.130.209]) by smtp.gmail.com with ESMTPSA id o5-20020a05620a2a0500b006f9e103260dsm18947235qkp.91.2023.01.16.10.42.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Jan 2023 10:42:06 -0800 (PST) From: Maxim Cournoyer To: Bruno Victal Subject: Re: bug#60788: [PATCH] services: Add vnstat-service-type. References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> Date: Mon, 16 Jan 2023 13:42:05 -0500 In-Reply-To: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> (Bruno Victal's message of "Fri, 13 Jan 2023 20:07:36 +0000") Message-ID: <87o7qy48zm.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hello! Bruno Victal writes: [...] > @@ -45,6 +48,10 @@ (define-module (gnu services monitoring) > prometheus-node-exporter-web-listen-address > prometheus-node-exporter-service-type > + vnstat-configuration > + vnstat-configuration? > + vnstat-service-type > + Normally, all the accessors are exported, otherwise there's no means to introspect a vnstat-configuration, which may be useful at the REPL. [...] > + > +;;; > +;;; vnstat daemon > +;;; > + > +(define* (camelfy-field-name field-name #:key (dromedary? #f)) > + (match (string-split (symbol->string field-name) #\-) > + ((head tail ...) > + (string-join (cons (if dromedary? head (string-upcase head 0 1)) > + (map string-capitalize tail)) "")))) I'd name this pascal-case-field-name, and drop the apparently unused dromerady? argument (fun, though :-)). If we need it, we could introduce a 2nd camel-case-field-name. > +(define (dock-field-name field-name) > + "Drop rightmost '?' character" > + (let ((str (symbol->string field-name))) > + (if (string-suffix? "?" str) > + (string->symbol (string-drop-right str 1)) > + field-name))) I'm not sure about the meaning of 'dock' in this procedure name. Perhaps 'strip-trailing-?-character' would be better? > +(define (vnstat-serialize-string field-name value) > + #~(format #f "~a ~s~%" > + #$(camelfy-field-name field-name) > + #$value)) > + > +(define vnstat-serialize-integer vnstat-serialize-string) > + > +(define (vnstat-serialize-boolean field-name value) > + #~(format #f "~a ~a~%" > + #$(camelfy-field-name (dock-field-name field-name)) > + #$(if value 1 0))) > + > +(define (vnstat-serialize-alist field-name value) > + (generic-serialize-alist string-append > + (lambda (iface val) > + (vnstat-serialize-integer > + (format #f "MaxBW~a" iface) val)) > + value)) > + > +(define-maybe string (prefix vnstat-)) > +(define-maybe integer (prefix vnstat-)) > +(define-maybe boolean (prefix vnstat-)) > +(define-maybe alist (prefix vnstat-)) > + > +;; Documentation strings from vnstat.conf manpage adapted to texinfo. > +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 > +(define-configuration vnstat-configuration > + (package > + (file-like vnstat) > + "The vnstat package." > + empty-serializer) > + > + (database-dir > + (string "/var/lib/vnstat") > + "\ > +Specifies the directory where the database is to be stored. > +A full path must be given and a leading '/' isn't required.") > + > + (5-minute-hours > + (maybe-integer 48) > + "\ > +Data retention duration for the 5 minute resolution entries. The configuration > +defines for how many past hours entries will be stored. Set to @code{-1} for > +unlimited entries or to @code{0} to disable the data collection of this > +resolution.") > + > + (64bit-interface-counters > + (maybe-integer -2) > + "\ > +Select interface counter handling. Set to @code{1} for defining that all interfaces > +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set > +to @code{-1} for using the old style logic used in earlier versions where counter > +values within 32-bits are assumed to be 32-bit and anything larger is assumed to > +be a 64-bit counter. This may produce false results if a 64-bit counter is > +reset within the 32-bits. Set to @code{-2} for using automatic detection based on > +available kernel datastructures.") Please reflow these paragraphs so they fit under the 80 characters width limit. Perhaps drop the \ escape, as it doesn't provide much and looks a bit worst, in my opinion. Each sentence should be separated by two spaces (that's a Texinfo convention). This comment applies to all similar documentation texts. > + (always-add-new-interfaces? > + (maybe-boolean #t) > + "\ > +Enable or disable automatic creation of new database entries for interfaces not > +currently in the database even if the database file already exists when the > +daemon is started. New database entries will also get created for new interfaces > +seen while the daemon is running. Pseudo interfaces lo, lo0 and sit0 are always > +excluded from getting added.") The lo, lo0 and sit0 could use a @samp{} or decorator. [...] > +(define (vnstat-serialize-configuration config) > + (mixed-text-file > + "vnstat.conf" > + (serialize-configuration config vnstat-configuration-fields))) > + > +(define (vnstat-shepherd-service config) > + (let ((config-file (vnstat-serialize-configuration config))) > + (match-record config (package pid-file) > + (shepherd-service > + (documentation "Run vnstatd.") > + (requirement `(networking)) > + (provision '(vnstatd)) > + (start #~(make-forkexec-constructor > + (list #$(file-append package "/sbin/vnstatd") > + "--daemon" > + "--config" #$config-file) > + #:pid-file #$pid-file)) > + (stop #~(make-kill-destructor)) > + (actions > + (list (shepherd-configuration-action config-file) I don't understand what (shepherd-configuration-action config-file) corresponds to? > + (shepherd-action > + (name 'reload) > + (documentation "Reload vnstatd.") > + (procedure > + #~(lambda (pid) > + (if pid > + (begin > + (kill pid SIGHUP) > + (format #t > + "Issued SIGHUP to vnstatd (PID ~a)." > + pid)) > + (format #t "vnstatd is not running."))))))))))) > +(define (vnstat-account-service config) > + (match-record config (daemon-group daemon-user) > + (if (every maybe-value-set? (list daemon-group daemon-user)) > + (list > + (user-group > + (name daemon-group) > + (system? #t)) > + (user-account > + (name daemon-user) > + (group daemon-group) > + (system? #t) > + (home-directory "/var/empty") > + (shell (file-append shadow "/sbin/nologin")))) > + '()))) > + > +(define vnstat-service-type > + (service-type > + (name 'vnstat) > + (description "vnStat network-traffic monitor service.") > + (extensions > + (list (service-extension shepherd-root-service-type > + (compose list vnstat-shepherd-service)) > + (service-extension account-service-type > + vnstat-account-service))) > + (default-value (vnstat-configuration)))) The rest LGTM (a system test would be nice, but since the Shepherd service definition is straightforward, it could come later, when the need arise). That appears carefully crafted, thank you! Could you send a v2 with my above comments addressed, keeping me in CC? -- Thanks, Maxim From debbugs-submit-bounces@debbugs.gnu.org Mon Jan 16 14:31:21 2023 Received: (at 60788) by debbugs.gnu.org; 16 Jan 2023 19:31:21 +0000 Received: from localhost ([127.0.0.1]:34906 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pHVCS-0007cJ-Oh for submit@debbugs.gnu.org; Mon, 16 Jan 2023 14:31:21 -0500 Received: from smtpmciv4.myservices.hosting ([185.26.107.240]:58092) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pHVCR-0007cC-Hu for 60788@debbugs.gnu.org; Mon, 16 Jan 2023 14:31:20 -0500 Received: from mail1.netim.hosting (unknown [185.26.106.172]) by smtpmciv4.myservices.hosting (Postfix) with ESMTP id 4AC592077D; Mon, 16 Jan 2023 20:31:16 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id ECC3980096; Mon, 16 Jan 2023 20:31:15 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-1.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id sUB8Spowd5qJ; Mon, 16 Jan 2023 20:31:15 +0100 (CET) Received: from [192.168.1.239] (unknown [10.192.1.83]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 6229480093; Mon, 16 Jan 2023 20:31:14 +0100 (CET) Message-ID: <7d22fea8-112d-1c01-6b6a-6cfe4e0fa9e3@makinata.eu> Date: Mon, 16 Jan 2023 19:31:10 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1 Subject: Re: bug#60788: [PATCH] services: Add vnstat-service-type. Content-Language: en-US To: Maxim Cournoyer References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> <87o7qy48zm.fsf@gmail.com> From: Bruno Victal In-Reply-To: <87o7qy48zm.fsf@gmail.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Score: -1.1 (-) X-Debbugs-Envelope-To: 60788 Cc: Maxim Cournoyer , 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.1 (--) On 2023-01-16 18:42, Maxim Cournoyer wrote: >> Bruno Victal writes: >> +;;; >> +;;; vnstat daemon >> +;;; >> + >> +(define* (camelfy-field-name field-name #:key (dromedary? #f)) >> + (match (string-split (symbol->string field-name) #\-) >> + ((head tail ...) >> + (string-join (cons (if dromedary? head (string-upcase head 0 1)) >> + (map string-capitalize tail)) "")))) > > I'd name this pascal-case-field-name, and drop the apparently unused > dromerady? argument (fun, though :-)). If we need it, we could > introduce a 2nd camel-case-field-name. I was anticipating that this snippet would get reused (i.e. copy-pasted) by other services so I wanted to generalize it before it starts spawning its dromedary cousin. If this isn't preferred, I can drop it and just leave it as pascal-case-field-name. (maybe these kinds of procedures could go into a new "configuration utils" module with useful auxiliary functions?) > >> +(define (dock-field-name field-name) >> + "Drop rightmost '?' character" >> + (let ((str (symbol->string field-name))) >> + (if (string-suffix? "?" str) >> + (string->symbol (string-drop-right str 1)) >> + field-name))) > > I'm not sure about the meaning of 'dock' in this procedure name. > Perhaps 'strip-trailing-?-character' would be better? I couldn't think of any other word that would essentially describe whats amounts to "dropping" the tail of a list/string. (here, 'dock': "the practice of cutting off or trimming the tail of an animal") >> +;; Documentation strings from vnstat.conf manpage adapted to texinfo. >> +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 >> +(define-configuration vnstat-configuration >> + (package >> + (file-like vnstat) >> + "The vnstat package." >> + empty-serializer) >> + >> + (database-dir >> + (string "/var/lib/vnstat") >> + "\ >> +Specifies the directory where the database is to be stored. >> +A full path must be given and a leading '/' isn't required.") >> + >> + (5-minute-hours >> + (maybe-integer 48) >> + "\ >> +Data retention duration for the 5 minute resolution entries. The configuration >> +defines for how many past hours entries will be stored. Set to @code{-1} for >> +unlimited entries or to @code{0} to disable the data collection of this >> +resolution.") >> + >> + (64bit-interface-counters >> + (maybe-integer -2) >> + "\ >> +Select interface counter handling. Set to @code{1} for defining that all interfaces >> +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set >> +to @code{-1} for using the old style logic used in earlier versions where counter >> +values within 32-bits are assumed to be 32-bit and anything larger is assumed to >> +be a 64-bit counter. This may produce false results if a 64-bit counter is >> +reset within the 32-bits. Set to @code{-2} for using automatic detection based on >> +available kernel datastructures.") > > Please reflow these paragraphs so they fit under the 80 characters width > limit. Perhaps drop the \ escape, as it doesn't provide much and looks > a bit worst, in my opinion. Each sentence should be separated by two > spaces (that's a Texinfo convention). This comment applies to all > similar documentation texts. They're formatted this way as I find it easier to compare against upstream troff sources. If they're reflowed or if the \ escape is dropped then the diffs get larger to compare against (most of the changes here are easier to compare using word-diffs) >> + (always-add-new-interfaces? >> + (maybe-boolean #t) >> + "\ >> +Enable or disable automatic creation of new database entries for interfaces not >> +currently in the database even if the database file already exists when the >> +daemon is started. New database entries will also get created for new interfaces >> +seen while the daemon is running. Pseudo interfaces lo, lo0 and sit0 are always >> +excluded from getting added.") > > The lo, lo0 and sit0 could use a @samp{} or decorator. Noted. > > [...] > >> +(define (vnstat-serialize-configuration config) >> + (mixed-text-file >> + "vnstat.conf" >> + (serialize-configuration config vnstat-configuration-fields))) >> + >> +(define (vnstat-shepherd-service config) >> + (let ((config-file (vnstat-serialize-configuration config))) >> + (match-record config (package pid-file) >> + (shepherd-service >> + (documentation "Run vnstatd.") >> + (requirement `(networking)) >> + (provision '(vnstatd)) >> + (start #~(make-forkexec-constructor >> + (list #$(file-append package "/sbin/vnstatd") >> + "--daemon" >> + "--config" #$config-file) >> + #:pid-file #$pid-file)) >> + (stop #~(make-kill-destructor)) >> + (actions >> + (list (shepherd-configuration-action config-file) > > I don't understand what (shepherd-configuration-action config-file) > corresponds to? It shows the path to the config file with `herd configuration vnstatd'. It was introduced with 'ebc7de6a1efb702fd0364128cbde19697966c4f4'. >> + (shepherd-action >> + (name 'reload) >> + (documentation "Reload vnstatd.") >> + (procedure >> + #~(lambda (pid) >> + (if pid >> + (begin >> + (kill pid SIGHUP) >> + (format #t >> + "Issued SIGHUP to vnstatd (PID ~a)." >> + pid)) >> + (format #t "vnstatd is not running."))))))))))) > >> +(define (vnstat-account-service config) >> + (match-record config (daemon-group daemon-user) >> + (if (every maybe-value-set? (list daemon-group daemon-user)) >> + (list >> + (user-group >> + (name daemon-group) >> + (system? #t)) >> + (user-account >> + (name daemon-user) >> + (group daemon-group) >> + (system? #t) >> + (home-directory "/var/empty") >> + (shell (file-append shadow "/sbin/nologin")))) >> + '()))) >> + >> +(define vnstat-service-type >> + (service-type >> + (name 'vnstat) >> + (description "vnStat network-traffic monitor service.") >> + (extensions >> + (list (service-extension shepherd-root-service-type >> + (compose list vnstat-shepherd-service)) >> + (service-extension account-service-type >> + vnstat-account-service))) >> + (default-value (vnstat-configuration)))) > > The rest LGTM (a system test would be nice, but since the Shepherd > service definition is straightforward, it could come later, when the > need arise). I've thought a bit about the system test though the way vnstat works is that it needs to collect some data and it also takes a while for the daemon to flag it as ready (~5 minutes). This would be a somewhat slow and non-trivial test to write. WDYT? Cheers, Bruno From debbugs-submit-bounces@debbugs.gnu.org Mon Jan 16 14:57:03 2023 Received: (at 60788) by debbugs.gnu.org; 16 Jan 2023 19:57:03 +0000 Received: from localhost ([127.0.0.1]:34916 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pHVbK-0008Eb-MJ for submit@debbugs.gnu.org; Mon, 16 Jan 2023 14:57:03 -0500 Received: from mail-qv1-f50.google.com ([209.85.219.50]:38681) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pHVbG-0008E2-Dy for 60788@debbugs.gnu.org; Mon, 16 Jan 2023 14:57:00 -0500 Received: by mail-qv1-f50.google.com with SMTP id qb7so20206826qvb.5 for <60788@debbugs.gnu.org>; Mon, 16 Jan 2023 11:56:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=76D+9zCiPLi96+MVmkv2aNFVPXmuxrNkDvuXvvJah/E=; b=blLK2Se82EWECyxqse24lfX1/nvKoqQf5z9NHL2/YFPhOjgbgAvY7ZM6bukXS1glwZ IkJsV4ojON8TOhnQiKXomUXJmlNw6T91ATvUSMn/iXi1ZNnTxbXrsZxtYYV6U91FEmCV jNK5D3Wkb0pmVN6KOICex4bwrapi7DiGLXyxUFQ/FTAR+IwVPO/q3L2Czwn6d7NN5cVd L11/dLPt2rd/8IKDMOWRnD2tOsfdZabfWFBVHlo8l/hbI/QE4UtH6sWNkhV8Og8J9Iak Zd4qLEaOLVRk22MgJLxr2Eu8vjt2GpBbgU2ZZDzn9IlK2dvzZmtqPKv+B94TLMlcVDKr 9WIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=76D+9zCiPLi96+MVmkv2aNFVPXmuxrNkDvuXvvJah/E=; b=x2/aLdbvqr/1OWkstj1F106qGVVFH7hQs3LVQGyyxV5CHVDxLqk9QnPOKzeFntVQ28 jiSc0eeQCpK33N1fmY0jBlRYZAk3wIyAc0SMuKsiFz3Dme8VaepqUu6a7tF0vTSNR07y K3J36HrYlAavPKe528wHdUi8b/hP0JvgD8lWbO4T0sF0TpGMbpMtcHZoVL2mx4DgfmkB s3EF/6Pe+Y3TCKYKB1IhYIYtUxi4d3yBDliKSZ+wjSPVZnVevrFL1X58mJfBN/qFzu/A F7xddQl/qeHsRpnp5iO8F4yWrOBZ7/fsHxTaHwQNGukkYyhmA7VtKKkco/NMG+LpdGPM 10hw== X-Gm-Message-State: AFqh2kq1DeKeUrsvWT4I9iI1dMM4f0CU3P+IvHnrOt6xqm5/Cknu2HBN ZJWfsNTQcDUlrqjG2Lu7dOP55kTdGx4I6RPi X-Google-Smtp-Source: AMrXdXvuyDD5EMSYzR7+8zQm1CmqTWvrUdU46NhHF/t0JXnJtON9aLZxnxdUhvYB9V9jOWIVIqCWdg== X-Received: by 2002:a05:6214:3248:b0:532:2c06:d514 with SMTP id mt8-20020a056214324800b005322c06d514mr28839qvb.34.1673899012615; Mon, 16 Jan 2023 11:56:52 -0800 (PST) Received: from hurd (dsl-10-130-209.b2b2c.ca. [72.10.130.209]) by smtp.gmail.com with ESMTPSA id cx15-20020a05620a51cf00b00704c62638f4sm18424362qkb.89.2023.01.16.11.56.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Jan 2023 11:56:52 -0800 (PST) From: Maxim Cournoyer To: Bruno Victal Subject: Re: bug#60788: [PATCH] services: Add vnstat-service-type. References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> <87o7qy48zm.fsf@gmail.com> <7d22fea8-112d-1c01-6b6a-6cfe4e0fa9e3@makinata.eu> Date: Mon, 16 Jan 2023 14:56:50 -0500 In-Reply-To: <7d22fea8-112d-1c01-6b6a-6cfe4e0fa9e3@makinata.eu> (Bruno Victal's message of "Mon, 16 Jan 2023 19:31:10 +0000") Message-ID: <87fsca45j1.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi Bruno, Bruno Victal writes: > On 2023-01-16 18:42, Maxim Cournoyer wrote: > >>> Bruno Victal writes: >>> +;;; >>> +;;; vnstat daemon >>> +;;; >>> + >>> +(define* (camelfy-field-name field-name #:key (dromedary? #f)) >>> + (match (string-split (symbol->string field-name) #\-) >>> + ((head tail ...) >>> + (string-join (cons (if dromedary? head (string-upcase head 0 1)) >>> + (map string-capitalize tail)) "")))) >> >> I'd name this pascal-case-field-name, and drop the apparently unused >> dromerady? argument (fun, though :-)). If we need it, we could >> introduce a 2nd camel-case-field-name. > > I was anticipating that this snippet would get reused (i.e. copy-pasted) by > other services so I wanted to generalize it before it starts spawning > its dromedary cousin. > > If this isn't preferred, I can drop it and just leave it as > pascal-case-field-name. (maybe these kinds of procedures could go into > a new "configuration utils" module with useful auxiliary functions?) > >> >>> +(define (dock-field-name field-name) >>> + "Drop rightmost '?' character" >>> + (let ((str (symbol->string field-name))) >>> + (if (string-suffix? "?" str) >>> + (string->symbol (string-drop-right str 1)) >>> + field-name))) >> >> I'm not sure about the meaning of 'dock' in this procedure name. >> Perhaps 'strip-trailing-?-character' would be better? > > I couldn't think of any other word that would essentially describe > whats amounts to "dropping" the tail of a list/string. > (here, 'dock': "the practice of cutting off or trimming the tail of an animal") Ouch. I'm even more in favor of an alternative name now that I know the meaning of 'dock' :-). >>> +;; Documentation strings from vnstat.conf manpage adapted to texinfo. >>> +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 >>> +(define-configuration vnstat-configuration >>> + (package >>> + (file-like vnstat) >>> + "The vnstat package." >>> + empty-serializer) >>> + >>> + (database-dir >>> + (string "/var/lib/vnstat") >>> + "\ >>> +Specifies the directory where the database is to be stored. >>> +A full path must be given and a leading '/' isn't required.") >>> + >>> + (5-minute-hours >>> + (maybe-integer 48) >>> + "\ >>> +Data retention duration for the 5 minute resolution entries. The configuration >>> +defines for how many past hours entries will be stored. Set to @code{-1} for >>> +unlimited entries or to @code{0} to disable the data collection of this >>> +resolution.") >>> + >>> + (64bit-interface-counters >>> + (maybe-integer -2) >>> + "\ >>> +Select interface counter handling. Set to @code{1} for defining that all interfaces >>> +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set >>> +to @code{-1} for using the old style logic used in earlier versions where counter >>> +values within 32-bits are assumed to be 32-bit and anything larger is assumed to >>> +be a 64-bit counter. This may produce false results if a 64-bit counter is >>> +reset within the 32-bits. Set to @code{-2} for using automatic detection based on >>> +available kernel datastructures.") >> >> Please reflow these paragraphs so they fit under the 80 characters width >> limit. Perhaps drop the \ escape, as it doesn't provide much and looks >> a bit worst, in my opinion. Each sentence should be separated by two >> spaces (that's a Texinfo convention). This comment applies to all >> similar documentation texts. > > They're formatted this way as I find it easier to compare against upstream troff sources. > If they're reflowed or if the \ escape is dropped then the diffs get larger to compare against > (most of the changes here are easier to compare using word-diffs) I think we should take ownership of that text, and update it when it makes sense without necessarily having to keep every details the same with upstream (especially for the double space rule and other conventions); in this view I'd opt to adjust it so the Guix source reads beautifully rather than for diffing against the orginal source :-). If this truly provides value to you (to be able to more easily diff against the troff source), then perhaps how to do so should be detailed in a comment for the next person to understand how this works and why it is this way. >>> + (always-add-new-interfaces? >>> + (maybe-boolean #t) >>> + "\ >>> +Enable or disable automatic creation of new database entries for interfaces not >>> +currently in the database even if the database file already exists when the >>> +daemon is started. New database entries will also get created for new interfaces >>> +seen while the daemon is running. Pseudo interfaces lo, lo0 and sit0 are always >>> +excluded from getting added.") >> >> The lo, lo0 and sit0 could use a @samp{} or decorator. > > Noted. > >> >> [...] >> >>> +(define (vnstat-serialize-configuration config) >>> + (mixed-text-file >>> + "vnstat.conf" >>> + (serialize-configuration config vnstat-configuration-fields))) >>> + >>> +(define (vnstat-shepherd-service config) >>> + (let ((config-file (vnstat-serialize-configuration config))) >>> + (match-record config (package pid-file) >>> + (shepherd-service >>> + (documentation "Run vnstatd.") >>> + (requirement `(networking)) >>> + (provision '(vnstatd)) >>> + (start #~(make-forkexec-constructor >>> + (list #$(file-append package "/sbin/vnstatd") >>> + "--daemon" >>> + "--config" #$config-file) >>> + #:pid-file #$pid-file)) >>> + (stop #~(make-kill-destructor)) >>> + (actions >>> + (list (shepherd-configuration-action config-file) >> >> I don't understand what (shepherd-configuration-action config-file) >> corresponds to? > > It shows the path to the config file with `herd configuration vnstatd'. > It was introduced with 'ebc7de6a1efb702fd0364128cbde19697966c4f4'. Thanks! That's news to me :-). >>> + (shepherd-action >>> + (name 'reload) >>> + (documentation "Reload vnstatd.") >>> + (procedure >>> + #~(lambda (pid) >>> + (if pid >>> + (begin >>> + (kill pid SIGHUP) >>> + (format #t >>> + "Issued SIGHUP to vnstatd (PID ~a)." >>> + pid)) >>> + (format #t "vnstatd is not running."))))))))))) >> >>> +(define (vnstat-account-service config) >>> + (match-record config (daemon-group daemon-user) >>> + (if (every maybe-value-set? (list daemon-group daemon-user)) >>> + (list >>> + (user-group >>> + (name daemon-group) >>> + (system? #t)) >>> + (user-account >>> + (name daemon-user) >>> + (group daemon-group) >>> + (system? #t) >>> + (home-directory "/var/empty") >>> + (shell (file-append shadow "/sbin/nologin")))) >>> + '()))) >>> + >>> +(define vnstat-service-type >>> + (service-type >>> + (name 'vnstat) >>> + (description "vnStat network-traffic monitor service.") >>> + (extensions >>> + (list (service-extension shepherd-root-service-type >>> + (compose list vnstat-shepherd-service)) >>> + (service-extension account-service-type >>> + vnstat-account-service))) >>> + (default-value (vnstat-configuration)))) >> >> The rest LGTM (a system test would be nice, but since the Shepherd >> service definition is straightforward, it could come later, when the >> need arise). > > I've thought a bit about the system test though the way vnstat works is that > it needs to collect some data and it also takes a while for the daemon to flag it > as ready (~5 minutes). This would be a somewhat slow and non-trivial test to write. Hm, not nice indeed. Then I guess it's fine without a test. One last thing: in general I think we should try to have our services run in a Linux namespace (unprivileged); have you tried running vnstat in a wrapper produced with least-authority-wrapper (from (guix least-authority)) ? -- Thanks, Maxim From debbugs-submit-bounces@debbugs.gnu.org Tue Jan 17 19:34:33 2023 Received: (at 60788) by debbugs.gnu.org; 18 Jan 2023 00:34:33 +0000 Received: from localhost ([127.0.0.1]:38528 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pHwPP-0005gs-Gl for submit@debbugs.gnu.org; Tue, 17 Jan 2023 19:34:33 -0500 Received: from smtpmciv5.myservices.hosting ([185.26.107.241]:49818) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pHwPM-0005gg-J5 for 60788@debbugs.gnu.org; Tue, 17 Jan 2023 19:34:31 -0500 Received: from mail1.netim.hosting (unknown [185.26.106.172]) by smtpmciv5.myservices.hosting (Postfix) with ESMTP id 0F01A20847; Wed, 18 Jan 2023 01:34:26 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id AEA3A80098; Wed, 18 Jan 2023 01:34:26 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-1.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id iEhocC2C045s; Wed, 18 Jan 2023 01:34:23 +0100 (CET) Received: from guix-nuc.home.arpa (bl9-118-236.dsl.telepac.pt [85.242.118.236]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 0C0F880097; Wed, 18 Jan 2023 01:34:22 +0100 (CET) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v2] services: Add vnstat-service-type. Date: Wed, 18 Jan 2023 00:34:10 +0000 Message-Id: X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- doc/guix.texi | 238 +++++++++++++++++++++ gnu/services/monitoring.scm | 415 ++++++++++++++++++++++++++++++++++++ 2 files changed, 653 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index 9b478733eb..6bda366750 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -112,6 +112,7 @@ Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@* Copyright @copyright{} 2023 Giacomo Leidi@* Copyright @copyright{} 2022 Antero Mejr@* +Copyright @copyright{} 2023 Bruno Victal@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -28266,6 +28267,243 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{5-minute-hours} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{64bit-interface-counters} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-dir}. + +@item @code{daemon-group} (type: maybe-string) +Specify the group to which the daemon process should switch during +startup. The group can either be the name of the group or a numerical +group id. Leave empty to disable group switching. This option can only +be used when the process is started as root. + +@item @code{daemon-user} (type: maybe-string) +Specify the user to which the daemon process should switch during +startup. The user can either be the login of the user or a numerical +user id. Leave empty to disable user switching. This option can only +be used when the process is started as root. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-BW} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as symbols/strings to integer values. For example, +@lisp +(max-BW `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-BW} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. This option is ignored when the daemon is +started with .B "-n, --nodaemon" which results in all log output being +shown in terminal the daemon process is using. @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-UTC?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index 44e2e8886c..78fc49da5c 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,10 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +203,414 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map (cut string-upcase <> 0 1) tail)) "")))) + +(define (strip-trailing-?-character field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (strip-trailing-?-character field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +;; Do not reflow these strings or drop the initial \ escape as it makes it +;; harder to diff against the manpage. +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-dir + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required.") + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-dirs? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-dir}.") + + (daemon-group + maybe-string + "\ +Specify the group to which the daemon process should switch during startup. +The group can either be the name of the group or a numerical group id. +Leave empty to disable group switching. This option can only be used when +the process is started as root.") + + (daemon-user + maybe-string + "\ +Specify the user to which the daemon process should switch during startup. +The user can either be the login of the user or a numerical user id. +Leave empty to disable user switching. This option can only be used when +the process is started as root.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-BW + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as symbols/strings to integer values. For example, +@lisp +(max-BW + `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-BW} +configuration. Value range: @samp{0}..@samp{50000}") + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. This option is ignored when the daemon is started with +.B \"-n, --nodaemon\" +which results in all log output being shown in terminal the daemon process is using. +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-UTC? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified.") + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (if (every maybe-value-set? (list daemon-group daemon-user)) + (list + (user-group + (name daemon-group) + (system? #t)) + (user-account + (name daemon-user) + (group daemon-group) + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + '()))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server -- 2.38.1 From debbugs-submit-bounces@debbugs.gnu.org Tue Jan 17 19:40:12 2023 Received: (at 60788) by debbugs.gnu.org; 18 Jan 2023 00:40:12 +0000 Received: from localhost ([127.0.0.1]:38539 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pHwUu-0005qA-7j for submit@debbugs.gnu.org; Tue, 17 Jan 2023 19:40:12 -0500 Received: from smtpmciv2.myservices.hosting ([185.26.107.238]:57868) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pHwUr-0005q0-Ho for 60788@debbugs.gnu.org; Tue, 17 Jan 2023 19:40:10 -0500 Received: from mail1.netim.hosting (unknown [185.26.106.172]) by smtpmciv2.myservices.hosting (Postfix) with ESMTP id 0A2BA20358; Wed, 18 Jan 2023 01:40:05 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id B23CA80096; Wed, 18 Jan 2023 01:40:05 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-1.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id vXiSNLV8gA3a; Wed, 18 Jan 2023 01:40:05 +0100 (CET) Received: from guix-nuc.home.arpa (bl9-118-236.dsl.telepac.pt [85.242.118.236]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 3E9BD80093; Wed, 18 Jan 2023 01:40:05 +0100 (CET) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v2] services: vnstat: Use least-authority-wrapper. Date: Wed, 18 Jan 2023 00:37:11 +0000 Message-Id: X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-shepherd-service): Use least-authority-wrapper. --- This patch SHOULD NOT be applied, this is a wip patch with least-authority-wrapper and it doesn't seem to work (at least when launched within a VM). I leave it here in case anyone interested wants to dig in further. gnu/services/monitoring.scm | 42 ++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index 78fc49da5c..c9e4f85701 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -29,6 +29,9 @@ (define-module (gnu services monitoring) #:use-module (gnu packages monitoring) #:use-module (gnu packages networking) #:use-module (gnu system shadow) + #:use-module ((gnu system file-systems) #:select (file-system-mapping)) + #:use-module (gnu build linux-container) + #:autoload (guix least-authority) (least-authority-wrapper) #:use-module (guix gexp) #:use-module (guix packages) #:use-module (guix records) @@ -448,7 +451,7 @@ (define-configuration vnstat-configuration @var{save-interval}..@samp{60}") (pid-file - (maybe-string "/var/run/vnstatd.pid") + (maybe-string "/var/run/vnstatd/vnstatd.pid") "\ Specify pid file path and name to be used.") @@ -558,17 +561,40 @@ (define (vnstat-serialize-configuration config) (serialize-configuration config vnstat-configuration-fields))) (define (vnstat-shepherd-service config) - (let ((config-file (vnstat-serialize-configuration config))) - (match-record config (package pid-file) + (match-record config (package database-dir pid-file use-logging) + (let* ((config-file (vnstat-serialize-configuration config)) + (vnstatd (least-authority-wrapper + (file-append package "/sbin/vnstatd") + #:name "vnstatd" + #:mappings (append (if (eqv? use-logging 2) + (list (file-system-mapping + (source "/dev/log") ; for syslog + (target source))) + '()) + (list (file-system-mapping + (source database-dir) + (target source) + (writable? #t)) + (file-system-mapping + (source (dirname pid-file)) + (target source) + (writable? #t)) + (file-system-mapping + (source config-file) + (target source)))) + #:namespaces (delq 'net %namespaces)))) (shepherd-service (documentation "Run vnstatd.") (requirement `(networking)) (provision '(vnstatd)) - (start #~(make-forkexec-constructor - (list #$(file-append package "/sbin/vnstatd") - "--daemon" - "--config" #$config-file) - #:pid-file #$pid-file)) + (start #~(begin + (mkdir-p #$database-dir) + (mkdir-p (dirname #$pid-file)) + (make-forkexec-constructor + (list #$vnstatd + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file))) (stop #~(make-kill-destructor)) (actions (list (shepherd-configuration-action config-file) -- 2.38.1 From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 02 09:21:48 2023 Received: (at 60788) by debbugs.gnu.org; 2 Feb 2023 14:21:48 +0000 Received: from localhost ([127.0.0.1]:32960 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pNaTC-0003cn-Ut for submit@debbugs.gnu.org; Thu, 02 Feb 2023 09:21:48 -0500 Received: from smtpm6.myservices.hosting ([185.26.105.207]:46074) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pNaT9-0003cY-2G for 60788@debbugs.gnu.org; Thu, 02 Feb 2023 09:21:45 -0500 Received: from mail1.netim.hosting (unknown [185.26.106.172]) by smtpm6.myservices.hosting (Postfix) with ESMTP id 9CBC420D26; Thu, 2 Feb 2023 15:21:41 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 5501A80096; Thu, 2 Feb 2023 15:21:41 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-1.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id 23XvifIUyiSf; Thu, 2 Feb 2023 15:21:38 +0100 (CET) Received: from guix-nuc.home.arpa (bl9-118-236.dsl.telepac.pt [85.242.118.236]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id DB1F180093; Thu, 2 Feb 2023 15:21:37 +0100 (CET) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v3] services: Add vnstat-service-type. Date: Thu, 2 Feb 2023 14:21:10 +0000 Message-Id: X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- Changes since v2: * Export accessors. doc/guix.texi | 238 +++++++++++++++++++ gnu/services/monitoring.scm | 451 ++++++++++++++++++++++++++++++++++++ 2 files changed, 689 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index 64873db00b..cb2c1c3c13 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -112,6 +112,7 @@ Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@* Copyright @copyright{} 2023 Giacomo Leidi@* Copyright @copyright{} 2022 Antero Mejr@* +Copyright @copyright{} 2023 Bruno Victal@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -28267,6 +28268,243 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{5-minute-hours} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{64bit-interface-counters} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-dir}. + +@item @code{daemon-group} (type: maybe-string) +Specify the group to which the daemon process should switch during +startup. The group can either be the name of the group or a numerical +group id. Leave empty to disable group switching. This option can only +be used when the process is started as root. + +@item @code{daemon-user} (type: maybe-string) +Specify the user to which the daemon process should switch during +startup. The user can either be the login of the user or a numerical +user id. Leave empty to disable user switching. This option can only +be used when the process is started as root. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-BW} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as symbols/strings to integer values. For example, +@lisp +(max-BW `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-BW} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. This option is ignored when the daemon is +started with .B "-n, --nodaemon" which results in all log output being +shown in terminal the daemon process is using. @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-UTC?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index 44e2e8886c..870943e80b 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,46 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + vnstat-configuration-package + vnstat-configuration-database-dir + vnstat-configuration-5-minute-hours + vnstat-configuration-64bit-interface-counters + vnstat-configuration-always-add-new-interfaces? + vnstat-configuration-bandwidth-detection? + vnstat-configuration-bandwidth-detection-interval + vnstat-configuration-boot-variation + vnstat-configuration-check-disk-space? + vnstat-configuration-create-dirs? + vnstat-configuration-daemon-group + vnstat-configuration-daemon-user + vnstat-configuration-daily-days + vnstat-configuration-database-synchronous + vnstat-configuration-database-write-ahead-logging? + vnstat-configuration-hourly-days + vnstat-configuration-log-file + vnstat-configuration-max-bandwidth + vnstat-configuration-max-BW + vnstat-configuration-monthly-months + vnstat-configuration-month-rotate + vnstat-configuration-month-rotate-affects-years? + vnstat-configuration-offline-save-interval + vnstat-configuration-pid-file + vnstat-configuration-poll-interval + vnstat-configuration-rescan-database-on-save? + vnstat-configuration-save-interval + vnstat-configuration-save-on-status-change? + vnstat-configuration-time-sync-wait + vnstat-configuration-top-day-entries + vnstat-configuration-trafficless-entries? + vnstat-configuration-update-file-owner? + vnstat-configuration-update-interval + vnstat-configuration-use-logging + vnstat-configuration-use-UTC? + vnstat-configuration-yearly-years + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +239,414 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map (cut string-upcase <> 0 1) tail)) "")))) + +(define (strip-trailing-?-character field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (strip-trailing-?-character field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +;; Do not reflow these strings or drop the initial \ escape as it makes it +;; harder to diff against the manpage. +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-dir + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required.") + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-dirs? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-dir}.") + + (daemon-group + maybe-string + "\ +Specify the group to which the daemon process should switch during startup. +The group can either be the name of the group or a numerical group id. +Leave empty to disable group switching. This option can only be used when +the process is started as root.") + + (daemon-user + maybe-string + "\ +Specify the user to which the daemon process should switch during startup. +The user can either be the login of the user or a numerical user id. +Leave empty to disable user switching. This option can only be used when +the process is started as root.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-BW + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as symbols/strings to integer values. For example, +@lisp +(max-BW + `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-BW} +configuration. Value range: @samp{0}..@samp{50000}") + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. This option is ignored when the daemon is started with +.B \"-n, --nodaemon\" +which results in all log output being shown in terminal the daemon process is using. +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-UTC? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified.") + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (if (every maybe-value-set? (list daemon-group daemon-user)) + (list + (user-group + (name daemon-group) + (system? #t)) + (user-account + (name daemon-user) + (group daemon-group) + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + '()))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server base-commit: f5446f721121c50a6e8fdf1e7285d861dfd180b8 -- 2.38.1 From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 07 09:25:37 2023 Received: (at 60788) by debbugs.gnu.org; 7 Feb 2023 14:25:37 +0000 Received: from localhost ([127.0.0.1]:51615 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pPOud-0003Gb-PR for submit@debbugs.gnu.org; Tue, 07 Feb 2023 09:25:37 -0500 Received: from smtpmciv1.myservices.hosting ([185.26.107.237]:41578) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pPOuZ-0003GQ-Hx for 60788@debbugs.gnu.org; Tue, 07 Feb 2023 09:25:34 -0500 Received: from mail1.netim.hosting (unknown [185.26.106.172]) by smtpmciv1.myservices.hosting (Postfix) with ESMTP id 0529E20783; Tue, 7 Feb 2023 15:25:29 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id B70D280097; Tue, 7 Feb 2023 15:25:29 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-1.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id buNYS4NhwGMb; Tue, 7 Feb 2023 15:25:27 +0100 (CET) Received: from guix-nuc.home.arpa (bl9-118-236.dsl.telepac.pt [85.242.118.236]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 555B180093; Tue, 7 Feb 2023 15:25:27 +0100 (CET) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v4] services: Add vnstat-service-type. Date: Tue, 7 Feb 2023 14:25:23 +0000 Message-Id: <8b62c1b5643a09163b53af4bf03bb12862770b50.1675779899.git.mirai@makinata.eu> X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- doc/guix.texi | 240 ++++++++++++++++++- gnu/services/monitoring.scm | 451 ++++++++++++++++++++++++++++++++++++ 2 files changed, 689 insertions(+), 2 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 359c9b7a47..7779aadd83 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -109,11 +109,10 @@ Copyright @copyright{} 2022 Simon Streit@* Copyright @copyright{} 2022 (@* Copyright @copyright{} 2022 John Kehayias@* -Copyright @copyright{} 2022 Bruno Victal@* Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@* Copyright @copyright{} 2023 Giacomo Leidi@* Copyright @copyright{} 2022 Antero Mejr@* -Copyright @copyright{} 2022 Bruno Victal@* +Copyright @copyright{} 2022⁠–⁠2023 Bruno Victal@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -28269,6 +28268,243 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{5-minute-hours} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{64bit-interface-counters} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-dir}. + +@item @code{daemon-group} (type: maybe-string) +Specify the group to which the daemon process should switch during +startup. The group can either be the name of the group or a numerical +group id. Leave empty to disable group switching. This option can only +be used when the process is started as root. + +@item @code{daemon-user} (type: maybe-string) +Specify the user to which the daemon process should switch during +startup. The user can either be the login of the user or a numerical +user id. Leave empty to disable user switching. This option can only +be used when the process is started as root. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-BW} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as symbols/strings to integer values. For example, +@lisp +(max-BW `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-BW} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. This option is ignored when the daemon is +started with .B "-n, --nodaemon" which results in all log output being +shown in terminal the daemon process is using. @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-UTC?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index 44e2e8886c..870943e80b 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,46 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + vnstat-configuration-package + vnstat-configuration-database-dir + vnstat-configuration-5-minute-hours + vnstat-configuration-64bit-interface-counters + vnstat-configuration-always-add-new-interfaces? + vnstat-configuration-bandwidth-detection? + vnstat-configuration-bandwidth-detection-interval + vnstat-configuration-boot-variation + vnstat-configuration-check-disk-space? + vnstat-configuration-create-dirs? + vnstat-configuration-daemon-group + vnstat-configuration-daemon-user + vnstat-configuration-daily-days + vnstat-configuration-database-synchronous + vnstat-configuration-database-write-ahead-logging? + vnstat-configuration-hourly-days + vnstat-configuration-log-file + vnstat-configuration-max-bandwidth + vnstat-configuration-max-BW + vnstat-configuration-monthly-months + vnstat-configuration-month-rotate + vnstat-configuration-month-rotate-affects-years? + vnstat-configuration-offline-save-interval + vnstat-configuration-pid-file + vnstat-configuration-poll-interval + vnstat-configuration-rescan-database-on-save? + vnstat-configuration-save-interval + vnstat-configuration-save-on-status-change? + vnstat-configuration-time-sync-wait + vnstat-configuration-top-day-entries + vnstat-configuration-trafficless-entries? + vnstat-configuration-update-file-owner? + vnstat-configuration-update-interval + vnstat-configuration-use-logging + vnstat-configuration-use-UTC? + vnstat-configuration-yearly-years + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +239,414 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map (cut string-upcase <> 0 1) tail)) "")))) + +(define (strip-trailing-?-character field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (strip-trailing-?-character field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +;; Do not reflow these strings or drop the initial \ escape as it makes it +;; harder to diff against the manpage. +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-dir + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required.") + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-dirs? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-dir}.") + + (daemon-group + maybe-string + "\ +Specify the group to which the daemon process should switch during startup. +The group can either be the name of the group or a numerical group id. +Leave empty to disable group switching. This option can only be used when +the process is started as root.") + + (daemon-user + maybe-string + "\ +Specify the user to which the daemon process should switch during startup. +The user can either be the login of the user or a numerical user id. +Leave empty to disable user switching. This option can only be used when +the process is started as root.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-BW + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as symbols/strings to integer values. For example, +@lisp +(max-BW + `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-BW} +configuration. Value range: @samp{0}..@samp{50000}") + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. This option is ignored when the daemon is started with +.B \"-n, --nodaemon\" +which results in all log output being shown in terminal the daemon process is using. +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-UTC? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified.") + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (if (every maybe-value-set? (list daemon-group daemon-user)) + (list + (user-group + (name daemon-group) + (system? #t)) + (user-account + (name daemon-user) + (group daemon-group) + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + '()))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server -- 2.38.1 From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 08 22:35:03 2023 Received: (at 60788) by debbugs.gnu.org; 9 Feb 2023 03:35:03 +0000 Received: from localhost ([127.0.0.1]:57103 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pPxiB-00060B-9L for submit@debbugs.gnu.org; Wed, 08 Feb 2023 22:35:03 -0500 Received: from mail-qv1-f49.google.com ([209.85.219.49]:46938) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pPxi6-0005zc-E2 for 60788@debbugs.gnu.org; Wed, 08 Feb 2023 22:35:02 -0500 Received: by mail-qv1-f49.google.com with SMTP id l6so178567qvl.13 for <60788@debbugs.gnu.org>; Wed, 08 Feb 2023 19:34:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=zM64E3OtC+1XlCBdr5msDSAmX58h1+QOjhm7HXRdcjE=; b=Eb3Wz6Cl5HYUs9J3pVnh3CSWKS5lLSLTOdunAv7HwlngNJOWx4EPLBwfWP2Yz5eKpz f92ztD5Uxz1l0iRj6wyyKYRsC86wcgEZ0tRWNLUHpLXp4kPqQhX9EicGWHJoZrvmhW8D /hAFoZDoJubmBLJBE8OJ7iIQ8kPe8ecwPQm0toV91FHq0WCLKXKHQxTEE4VS/OMauX+0 Ldi7Lcukibzk3LjtMlkcEnEj3OAHiicSlSULfeC2tBALDRqF4KSqfOs+uJzBEiuCnkiL yrrQF7RZGgVkqL/iXYkyanDezA0noC/xwl18Ds2k7KFl1fS5QHDB6Bpp/Fwk7gKJ9OJD zHJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=zM64E3OtC+1XlCBdr5msDSAmX58h1+QOjhm7HXRdcjE=; b=ePX+Y5urZGPW7pkorf7bbh/foAyrhaeLOvw0BUPMAHINcQOctwQ2jKyGLGYc5WzsD1 bxCx5k1unEuZEErXgmb4m0035sLFB2fJaG4xdrgEJNRbnRXNBszU5CEmDaEcjstX0UwT RHHf1c0bg5MbSVnoVL7ItqX3mQO8UKhZDGlaUhu/PxtCAz2mRX8DMFW9kpSAGyZidbXp INm4EEKQBz3MYYhje3KlzXS1xMYpsNq+dOfgRLznFjx8bqaG9Tf5knuMFVpSN4H5L0xM g3AB3V1nt4roQh+ukCtTIGhQLQh/XV6dM0jje7GpwjHVtSkHEL5vN3JKgdF/EXtTBTCp 0lTg== X-Gm-Message-State: AO0yUKUtC24pjcLePAIS4J7Gbj0bbk9QocWumUVDydu4wN0AzXMhbhR3 LQpjN3Q29M3janvc/DIMrIqxgVE6kW++1w== X-Google-Smtp-Source: AK7set8QiBAyaMyhWB3Mxv6fSs73zUKHoWeMh9scBL+2Xdqi/9cw7ATG0fwRS3eIPHtd0W2QrAH8Rg== X-Received: by 2002:a05:6214:e85:b0:567:d345:1019 with SMTP id hf5-20020a0562140e8500b00567d3451019mr16722780qvb.42.1675913692808; Wed, 08 Feb 2023 19:34:52 -0800 (PST) Received: from hurd (dsl-151-105.b2b2c.ca. [66.158.151.105]) by smtp.gmail.com with ESMTPSA id 2-20020a05620a040200b006fbb4b98a25sm484501qkp.109.2023.02.08.19.34.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Feb 2023 19:34:52 -0800 (PST) From: Maxim Cournoyer To: Bruno Victal Subject: Re: bug#60788: [PATCH] services: Add vnstat-service-type. References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> <8b62c1b5643a09163b53af4bf03bb12862770b50.1675779899.git.mirai@makinata.eu> Date: Wed, 08 Feb 2023 22:34:51 -0500 In-Reply-To: <8b62c1b5643a09163b53af4bf03bb12862770b50.1675779899.git.mirai@makinata.eu> (Bruno Victal's message of "Tue, 7 Feb 2023 14:25:23 +0000") Message-ID: <87357fjyuc.fsf_-_@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi Bruno, Bruno Victal writes: > * gnu/services/monitoring.scm (vnstat-service-type): New variable. > * doc/guix.texi (Monitoring Services): Document it. > --- > doc/guix.texi | 240 ++++++++++++++++++- > gnu/services/monitoring.scm | 451 ++++++++++++++++++++++++++++++++++++ > 2 files changed, 689 insertions(+), 2 deletions(-) Two remaining comments from me: 1. I'd normalize all the configuration field names to lowercase, so max-BW and use-UTC? would become max-bw and use-utc?, for example. 2. I'd add a simple example vnstat usage example to the manual. With this done, I think it should be good to go! -- Thanks, Maxim From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 08 23:19:50 2023 Received: (at 60788) by debbugs.gnu.org; 9 Feb 2023 04:19:50 +0000 Received: from localhost ([127.0.0.1]:57169 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pPyPV-0001H1-Nu for submit@debbugs.gnu.org; Wed, 08 Feb 2023 23:19:49 -0500 Received: from smtpm7.myservices.hosting ([185.26.105.208]:51750) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pPyPT-0001Gr-8q for 60788@debbugs.gnu.org; Wed, 08 Feb 2023 23:19:49 -0500 Received: from mail1.netim.hosting (unknown [185.26.106.172]) by smtpm7.myservices.hosting (Postfix) with ESMTP id B3B6E20CFC; Thu, 9 Feb 2023 05:19:45 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 6692080096; Thu, 9 Feb 2023 05:19:45 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-1.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id RiC9zi6VEQND; Thu, 9 Feb 2023 05:19:45 +0100 (CET) Received: from [192.168.1.239] (unknown [10.192.1.83]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id D46CC80093; Thu, 9 Feb 2023 05:19:44 +0100 (CET) Message-ID: Date: Thu, 9 Feb 2023 04:19:40 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.1 Subject: Re: bug#60788: [PATCH] services: Add vnstat-service-type. Content-Language: en-US To: Maxim Cournoyer References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> <8b62c1b5643a09163b53af4bf03bb12862770b50.1675779899.git.mirai@makinata.eu> <87357fjyuc.fsf_-_@gmail.com> From: Bruno Victal In-Reply-To: <87357fjyuc.fsf_-_@gmail.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Score: -1.1 (-) X-Debbugs-Envelope-To: 60788 Cc: 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.1 (--) Hi Maxim, On 2023-02-09 03:34, Maxim Cournoyer wrote: > Two remaining comments from me: > > 1. I'd normalize all the configuration field names to lowercase, so > max-BW and use-UTC? would become max-bw and use-utc?, for example. No, this is intentional so that uglify+case-conversion yields correct configuration directives. > 2. I'd add a simple example vnstat usage example to the manual. The service is "ready to be used" with the default values, so I didn't think it'd add much value adding an example here. Do you think we should add one? Cheers, Bruno From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 09 08:31:57 2023 Received: (at 60788) by debbugs.gnu.org; 9 Feb 2023 13:31:57 +0000 Received: from localhost ([127.0.0.1]:57933 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pQ71o-0004MM-Sa for submit@debbugs.gnu.org; Thu, 09 Feb 2023 08:31:57 -0500 Received: from mail-vk1-f177.google.com ([209.85.221.177]:46941) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pQ71n-0004M6-IM for 60788@debbugs.gnu.org; Thu, 09 Feb 2023 08:31:55 -0500 Received: by mail-vk1-f177.google.com with SMTP id t190so912565vkb.13 for <60788@debbugs.gnu.org>; Thu, 09 Feb 2023 05:31:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=vCfAP2ugkK4d7LfriweFYZsDUZzl0iJ5lQMkXYnLW+I=; b=IWXt2Q47wC4r+/r/bBm6Vb7WdwkGH5U7RfC5M5x37D3TNuT9jRQkFNG1fSCv4hEVtI ifsk//2vib8XoMikiBjIBvOwrCLFHKDwa3Ymf7P+anG38l0Ok+zNaKSUyOTj4xYDn+mg mLUECdYd5sW7TTGgztbmq7K9ePuKuHOFC7ofmii7Wfgi+m55S2nhGeeS/xo4MtR8RYNN a098WrIzrBCcA+aRITzatxXb0o2kBLqSbAml/mNYesHBt086tsfzfkWsQa2tcQ8o580r C1wr7zUa3uesIMEpU5SuidfIQ5Q2T/m96ewrknXozqbav76SsLQeLwUFreOTUogCGUaI qUSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=vCfAP2ugkK4d7LfriweFYZsDUZzl0iJ5lQMkXYnLW+I=; b=AJG7cwcrBv8KwOHjofyuMTLqJu350ijnHMz7PTSWQWx9eP2AiUxDmRLze7+b6vbbtA c/R0qTx1FJ0CJaQ6iAbgLqPE99Douo23HhEOsUheOVSbNcHAif46yc9zTK7evXx8JVdO tutc03QqHaDRvfGrvWu8Pkk7S59Pyu0WDbXI3EHJaEYkLh+mkKGEg9DyaLv4jkQbGRLR zLzbbbASWO9vLiEV145px5+DCSxGmmiihLEo3Exrv4Fg60+1JldNs9ssBWykr9t+PDiO DmpQ4myyjAnYJurOIM6co4Bwki5+wABf+zVISv7pwZGjQMX00fc5ZVF7EvdJ9zYdMeJR TjnQ== X-Gm-Message-State: AO0yUKUz+7XEdWFosstKJzo6fwyDUaxc3qWEX/TClwddfCIVIjRN7zEj DPjf3W/ZbqlckhS1vQNi5+sg0sGaj4Kh1w== X-Google-Smtp-Source: AK7set9o+gffN5EFB9QsoK/8XkWe3uRkQl9xYdyuexcYhvSnt7YwPZSrcmxojFabZXuyp9wEticFZg== X-Received: by 2002:a05:6122:d0d:b0:3e9:ffa6:71bd with SMTP id az13-20020a0561220d0d00b003e9ffa671bdmr4213540vkb.13.1675949509592; Thu, 09 Feb 2023 05:31:49 -0800 (PST) Received: from hurd (dsl-151-105.b2b2c.ca. [66.158.151.105]) by smtp.gmail.com with ESMTPSA id t66-20020a374645000000b007203bbbbb31sm1359487qka.47.2023.02.09.05.31.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Feb 2023 05:31:49 -0800 (PST) From: Maxim Cournoyer To: Bruno Victal Subject: Re: bug#60788: [PATCH] services: Add vnstat-service-type. References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> <8b62c1b5643a09163b53af4bf03bb12862770b50.1675779899.git.mirai@makinata.eu> <87357fjyuc.fsf_-_@gmail.com> Date: Thu, 09 Feb 2023 08:31:48 -0500 In-Reply-To: (Bruno Victal's message of "Thu, 9 Feb 2023 04:19:40 +0000") Message-ID: <87h6vvge2j.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi Bruno, Bruno Victal writes: > Hi Maxim, > > On 2023-02-09 03:34, Maxim Cournoyer wrote: >> Two remaining comments from me: >> >> 1. I'd normalize all the configuration field names to lowercase, so >> max-BW and use-UTC? would become max-bw and use-utc?, for example. > > No, this is intentional so that uglify+case-conversion yields correct configuration directives. OK; the case conversion could be special-cased (max-bw -> max-BW, use-utc? -> utc-UTC?) in the uglify+case-conversion logic. But it seems that vnstat doesn't care about case when parsing its options; it uses strcasecmp, which ignores the case of the characters per 'man 3 strcasecmp' [0]. [0] https://github.com/vergoh/vnstat/blob/master/src/cfg.c#L149 >> 2. I'd add a simple example vnstat usage example to the manual. > > The service is "ready to be used" with the default values, so I didn't think > it'd add much value adding an example here. Do you think we should add one? I think so; with so many switches it can appear intimidating; but a minimal working example would show to users that they can start simple. -- Thanks, Maxim From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 10 08:15:36 2023 Received: (at 60788) by debbugs.gnu.org; 10 Feb 2023 13:15:36 +0000 Received: from localhost ([127.0.0.1]:34474 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pQTFW-0003R2-Cl for submit@debbugs.gnu.org; Fri, 10 Feb 2023 08:15:36 -0500 Received: from smtpmciv7.myservices.hosting ([185.26.106.202]:49488) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pQTFR-0003Qr-EL for 60788@debbugs.gnu.org; Fri, 10 Feb 2023 08:15:32 -0500 Received: from mail1.netim.hosting (unknown [185.26.106.172]) by smtpmciv7.myservices.hosting (Postfix) with ESMTP id BCAED20D57; Fri, 10 Feb 2023 14:15:27 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 6FB7380097; Fri, 10 Feb 2023 14:15:27 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-1.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id 5MBHPy63nGY5; Fri, 10 Feb 2023 14:15:23 +0100 (CET) Received: from guix-nuc.home.arpa (bl9-118-236.dsl.telepac.pt [85.242.118.236]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 6863680093; Fri, 10 Feb 2023 14:15:23 +0100 (CET) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v5] services: Add vnstat-service-type. Date: Fri, 10 Feb 2023 13:15:13 +0000 Message-Id: <965e112603934b79ec784738a3ad075bfdb0dd51.1676034889.git.mirai@makinata.eu> X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- doc/guix.texi | 246 ++++++++++++++++++- gnu/services/monitoring.scm | 457 ++++++++++++++++++++++++++++++++++++ 2 files changed, 701 insertions(+), 2 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 5fb5850a6c..c54e9e5beb 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -109,11 +109,10 @@ Copyright @copyright{} 2022 Simon Streit@* Copyright @copyright{} 2022 (@* Copyright @copyright{} 2022 John Kehayias@* -Copyright @copyright{} 2022 Bruno Victal@* +Copyright @copyright{} 2022⁠–⁠2023 Bruno Victal@* Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@* Copyright @copyright{} 2023 Giacomo Leidi@* Copyright @copyright{} 2022 Antero Mejr@* -Copyright @copyright{} 2023 Bruno Victal@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -28241,6 +28240,249 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. + +The following example will configure the service with default values: + +@lisp +(service vnstat-service-type) +@end lisp +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{5-minute-hours} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{64bit-interface-counters} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-dir}. + +@item @code{daemon-group} (type: maybe-string) +Specify the group to which the daemon process should switch during +startup. The group can either be the name of the group or a numerical +group id. Leave empty to disable group switching. This option can only +be used when the process is started as root. + +@item @code{daemon-user} (type: maybe-string) +Specify the user to which the daemon process should switch during +startup. The user can either be the login of the user or a numerical +user id. Leave empty to disable user switching. This option can only +be used when the process is started as root. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-bw} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as symbols/strings to integer values. For example, +@lisp +(max-bw `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-bw} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. This option is ignored when the daemon is +started with .B "-n, --nodaemon" which results in all log output being +shown in terminal the daemon process is using. @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-utc?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index 44e2e8886c..e7b515d6b0 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,46 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + vnstat-configuration-package + vnstat-configuration-database-dir + vnstat-configuration-5-minute-hours + vnstat-configuration-64bit-interface-counters + vnstat-configuration-always-add-new-interfaces? + vnstat-configuration-bandwidth-detection? + vnstat-configuration-bandwidth-detection-interval + vnstat-configuration-boot-variation + vnstat-configuration-check-disk-space? + vnstat-configuration-create-dirs? + vnstat-configuration-daemon-group + vnstat-configuration-daemon-user + vnstat-configuration-daily-days + vnstat-configuration-database-synchronous + vnstat-configuration-database-write-ahead-logging? + vnstat-configuration-hourly-days + vnstat-configuration-log-file + vnstat-configuration-max-bandwidth + vnstat-configuration-max-BW + vnstat-configuration-monthly-months + vnstat-configuration-month-rotate + vnstat-configuration-month-rotate-affects-years? + vnstat-configuration-offline-save-interval + vnstat-configuration-pid-file + vnstat-configuration-poll-interval + vnstat-configuration-rescan-database-on-save? + vnstat-configuration-save-interval + vnstat-configuration-save-on-status-change? + vnstat-configuration-time-sync-wait + vnstat-configuration-top-day-entries + vnstat-configuration-trafficless-entries? + vnstat-configuration-update-file-owner? + vnstat-configuration-update-interval + vnstat-configuration-use-logging + vnstat-configuration-use-UTC? + vnstat-configuration-yearly-years + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +239,420 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map (cut string-upcase <> 0 1) tail)) "")))) + +(define (strip-trailing-?-character field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (strip-trailing-?-character field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +;; Do not reflow these strings or drop the initial \ escape as it makes it +;; harder to diff against the manpage. +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-dir + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required.") + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-dirs? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-dir}.") + + (daemon-group + maybe-string + "\ +Specify the group to which the daemon process should switch during startup. +The group can either be the name of the group or a numerical group id. +Leave empty to disable group switching. This option can only be used when +the process is started as root.") + + (daemon-user + maybe-string + "\ +Specify the user to which the daemon process should switch during startup. +The user can either be the login of the user or a numerical user id. +Leave empty to disable user switching. This option can only be used when +the process is started as root.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-bw + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as symbols/strings to integer values. For example, +@lisp +(max-bw + `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-bw} +configuration. Value range: @samp{0}..@samp{50000}" + (lambda (field-name value) + (if (maybe-value-set? value) + (vnstat-serialize-alist field-name value) ""))) + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. This option is ignored when the daemon is started with +.B \"-n, --nodaemon\" +which results in all log output being shown in terminal the daemon process is using. +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-utc? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified." + (lambda (_ value) + (if (maybe-value-set? value) + (vnstat-serialize-boolean 'use-UTC value) ""))) + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (if (every maybe-value-set? (list daemon-group daemon-user)) + (list + (user-group + (name daemon-group) + (system? #t)) + (user-account + (name daemon-user) + (group daemon-group) + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + '()))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server -- 2.38.1 From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 10 09:07:50 2023 Received: (at 60788) by debbugs.gnu.org; 10 Feb 2023 14:07:51 +0000 Received: from localhost ([127.0.0.1]:34517 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pQU46-0004lR-JI for submit@debbugs.gnu.org; Fri, 10 Feb 2023 09:07:50 -0500 Received: from mail-qt1-f179.google.com ([209.85.160.179]:36629) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pQU44-0004lD-38 for 60788@debbugs.gnu.org; Fri, 10 Feb 2023 09:07:49 -0500 Received: by mail-qt1-f179.google.com with SMTP id v17so5790678qto.3 for <60788@debbugs.gnu.org>; Fri, 10 Feb 2023 06:07:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=LXO+RIVi/2vc840MxuqwggkzN94MU/UdezH4x0r8krQ=; b=ilDUNEaH8IuK7is4CicEnBmfpRW17V9pXfguLuklL+SnU/CyOnhcuuFf6sPwKltq24 H+SYicSNzS1r+RVOgl2jgJj/WAfSfMSDL+1N9P9RYkET3n+UlMV0i/oTT+P0bBmfPda/ 5CMjsrVg4YMh1tBT3BVRvnO5SjOGiLupfUgqgBA1xazv+YQKvpacOP3EY6/zIiK/ZDJK 5Q4Y8/nzYRdLBbSMXB9hPfoyNh21ThofWUQ4sl0gLSNcOo4gn8Tvv3KQ0bTnRGIEbFzq yWzfG+dKKX0vWUouqBIkLEpHL3gc3aRJ/POlABwKarWwl56R7OTAQtzkkaqKz7jfH+eH 3uGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=mime-version:user-agent:message-id:in-reply-to:date:references :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=LXO+RIVi/2vc840MxuqwggkzN94MU/UdezH4x0r8krQ=; b=Pwu6Z9nhr7XFCVfKnUlb5vwK/0p3k8nuYcN37vp1DBP8Q84fSRWXeMkgzjVXWrLP8j 3s4Fq7CvELmhvOuDph6JKNMVUOhbzRf5zYPckx37/wKr4O3+eb4vJ/gRwRQTKt9KKXTR gS0ZQNsEQuuctnXLB2qWOBFnd0zKzNm6v7JhMD3ELswl7BDrUkyyKP/Hq/FWwyNta4ZE AAbTZeeQc4ZuyEjlnCXR747HmTWYmSB+SqMR4+Ipb9PSf1aPJ3t9VGmy45mOSNj61aRT mWpTnXC9k+GdZIts5DhbaC9Hc+KCvWXEB1XlYRQjJnBXVORl0/zv8hkES9bDfQJL/Y49 K0KQ== X-Gm-Message-State: AO0yUKUhUN0fiZAVYc8NT9aY4OEEmtEKpbcizlJ4exxv4H36Ov2IlRy0 57hA84GHXasIHOqbJJx+x8IlJzVY9M8s7v9i X-Google-Smtp-Source: AK7set/9ZThIsucTWVc1UYu5PZ55MfgaeXddIp/Wp8vcxwuV9Wmk+aLznFHdBGLNulZ2LbqgG913hQ== X-Received: by 2002:ac8:580f:0:b0:3b8:4b00:575e with SMTP id g15-20020ac8580f000000b003b84b00575emr25003944qtg.35.1676038062359; Fri, 10 Feb 2023 06:07:42 -0800 (PST) Received: from hurd (dsl-158-147.b2b2c.ca. [66.158.158.147]) by smtp.gmail.com with ESMTPSA id s4-20020a372c04000000b006f9f3c0c63csm3574924qkh.32.2023.02.10.06.07.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 10 Feb 2023 06:07:41 -0800 (PST) From: Maxim Cournoyer To: Bruno Victal Subject: Re: [PATCH v5] services: Add vnstat-service-type. References: <965e112603934b79ec784738a3ad075bfdb0dd51.1676034889.git.mirai@makinata.eu> Date: Fri, 10 Feb 2023 09:07:40 -0500 In-Reply-To: <965e112603934b79ec784738a3ad075bfdb0dd51.1676034889.git.mirai@makinata.eu> (Bruno Victal's message of "Fri, 10 Feb 2023 13:15:13 +0000") Message-ID: <87lel5fwb7.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi! Bruno Victal writes: [...] > + vnstat-configuration > + vnstat-configuration? > + vnstat-service-type > + vnstat-configuration-package > + vnstat-configuration-database-dir > + vnstat-configuration-5-minute-hours > + vnstat-configuration-64bit-interface-counters > + vnstat-configuration-always-add-new-interfaces? > + vnstat-configuration-bandwidth-detection? > + vnstat-configuration-bandwidth-detection-interval > + vnstat-configuration-boot-variation > + vnstat-configuration-check-disk-space? > + vnstat-configuration-create-dirs? > + vnstat-configuration-daemon-group > + vnstat-configuration-daemon-user > + vnstat-configuration-daily-days > + vnstat-configuration-database-synchronous > + vnstat-configuration-database-write-ahead-logging? > + vnstat-configuration-hourly-days > + vnstat-configuration-log-file > + vnstat-configuration-max-bandwidth > + vnstat-configuration-max-BW ^ Looks like you forgot to adjust to use the now all lowercase symbol here. > + vnstat-configuration-monthly-months > + vnstat-configuration-month-rotate > + vnstat-configuration-month-rotate-affects-years? > + vnstat-configuration-offline-save-interval > + vnstat-configuration-pid-file > + vnstat-configuration-poll-interval > + vnstat-configuration-rescan-database-on-save? > + vnstat-configuration-save-interval > + vnstat-configuration-save-on-status-change? > + vnstat-configuration-time-sync-wait > + vnstat-configuration-top-day-entries > + vnstat-configuration-trafficless-entries? > + vnstat-configuration-update-file-owner? > + vnstat-configuration-update-interval > + vnstat-configuration-use-logging > + vnstat-configuration-use-UTC? Ditto. The rest LGTM. -- Thanks, Maxim From debbugs-submit-bounces@debbugs.gnu.org Fri Feb 10 09:14:16 2023 Received: (at 60788) by debbugs.gnu.org; 10 Feb 2023 14:14:16 +0000 Received: from localhost ([127.0.0.1]:34521 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pQUAI-0004ua-GG for submit@debbugs.gnu.org; Fri, 10 Feb 2023 09:14:16 -0500 Received: from smtpm1.myservices.hosting ([185.26.105.232]:58884) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pQUAE-0004uP-6D for 60788@debbugs.gnu.org; Fri, 10 Feb 2023 09:14:13 -0500 Received: from mail1.netim.hosting (unknown [185.26.106.172]) by smtpm1.myservices.hosting (Postfix) with ESMTP id 9DA1920845; Fri, 10 Feb 2023 15:14:07 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 4E40C80098; Fri, 10 Feb 2023 15:14:07 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-1.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id qIc-9zH153L6; Fri, 10 Feb 2023 15:14:05 +0100 (CET) Received: from guix-nuc.home.arpa (bl9-118-236.dsl.telepac.pt [85.242.118.236]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 1772080097; Fri, 10 Feb 2023 15:14:05 +0100 (CET) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v6] services: Add vnstat-service-type. Date: Fri, 10 Feb 2023 14:14:03 +0000 Message-Id: <7754c52c58be91a73a2947bb43baba962749def2.1676038434.git.mirai@makinata.eu> X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- doc/guix.texi | 246 ++++++++++++++++++- gnu/services/monitoring.scm | 457 ++++++++++++++++++++++++++++++++++++ 2 files changed, 701 insertions(+), 2 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 5fb5850a6c..c54e9e5beb 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -109,11 +109,10 @@ Copyright @copyright{} 2022 Simon Streit@* Copyright @copyright{} 2022 (@* Copyright @copyright{} 2022 John Kehayias@* -Copyright @copyright{} 2022 Bruno Victal@* +Copyright @copyright{} 2022⁠–⁠2023 Bruno Victal@* Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@* Copyright @copyright{} 2023 Giacomo Leidi@* Copyright @copyright{} 2022 Antero Mejr@* -Copyright @copyright{} 2023 Bruno Victal@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or @@ -28241,6 +28240,249 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. + +The following example will configure the service with default values: + +@lisp +(service vnstat-service-type) +@end lisp +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{5-minute-hours} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{64bit-interface-counters} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-dir}. + +@item @code{daemon-group} (type: maybe-string) +Specify the group to which the daemon process should switch during +startup. The group can either be the name of the group or a numerical +group id. Leave empty to disable group switching. This option can only +be used when the process is started as root. + +@item @code{daemon-user} (type: maybe-string) +Specify the user to which the daemon process should switch during +startup. The user can either be the login of the user or a numerical +user id. Leave empty to disable user switching. This option can only +be used when the process is started as root. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-bw} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as symbols/strings to integer values. For example, +@lisp +(max-bw `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-bw} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. This option is ignored when the daemon is +started with .B "-n, --nodaemon" which results in all log output being +shown in terminal the daemon process is using. @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-utc?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index 44e2e8886c..ef88c82357 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,46 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + vnstat-configuration-package + vnstat-configuration-database-dir + vnstat-configuration-5-minute-hours + vnstat-configuration-64bit-interface-counters + vnstat-configuration-always-add-new-interfaces? + vnstat-configuration-bandwidth-detection? + vnstat-configuration-bandwidth-detection-interval + vnstat-configuration-boot-variation + vnstat-configuration-check-disk-space? + vnstat-configuration-create-dirs? + vnstat-configuration-daemon-group + vnstat-configuration-daemon-user + vnstat-configuration-daily-days + vnstat-configuration-database-synchronous + vnstat-configuration-database-write-ahead-logging? + vnstat-configuration-hourly-days + vnstat-configuration-log-file + vnstat-configuration-max-bandwidth + vnstat-configuration-max-bw + vnstat-configuration-monthly-months + vnstat-configuration-month-rotate + vnstat-configuration-month-rotate-affects-years? + vnstat-configuration-offline-save-interval + vnstat-configuration-pid-file + vnstat-configuration-poll-interval + vnstat-configuration-rescan-database-on-save? + vnstat-configuration-save-interval + vnstat-configuration-save-on-status-change? + vnstat-configuration-time-sync-wait + vnstat-configuration-top-day-entries + vnstat-configuration-trafficless-entries? + vnstat-configuration-update-file-owner? + vnstat-configuration-update-interval + vnstat-configuration-use-logging + vnstat-configuration-use-utc? + vnstat-configuration-yearly-years + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +239,420 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map (cut string-upcase <> 0 1) tail)) "")))) + +(define (strip-trailing-?-character field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (strip-trailing-?-character field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +;; Do not reflow these strings or drop the initial \ escape as it makes it +;; harder to diff against the manpage. +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-dir + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required.") + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-dirs? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-dir}.") + + (daemon-group + maybe-string + "\ +Specify the group to which the daemon process should switch during startup. +The group can either be the name of the group or a numerical group id. +Leave empty to disable group switching. This option can only be used when +the process is started as root.") + + (daemon-user + maybe-string + "\ +Specify the user to which the daemon process should switch during startup. +The user can either be the login of the user or a numerical user id. +Leave empty to disable user switching. This option can only be used when +the process is started as root.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-bw + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as symbols/strings to integer values. For example, +@lisp +(max-bw + `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-bw} +configuration. Value range: @samp{0}..@samp{50000}" + (lambda (field-name value) + (if (maybe-value-set? value) + (vnstat-serialize-alist field-name value) ""))) + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. This option is ignored when the daemon is started with +.B \"-n, --nodaemon\" +which results in all log output being shown in terminal the daemon process is using. +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-utc? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified." + (lambda (_ value) + (if (maybe-value-set? value) + (vnstat-serialize-boolean 'use-UTC value) ""))) + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (if (every maybe-value-set? (list daemon-group daemon-user)) + (list + (user-group + (name daemon-group) + (system? #t)) + (user-account + (name daemon-user) + (group daemon-group) + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + '()))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server -- 2.38.1 From debbugs-submit-bounces@debbugs.gnu.org Tue Mar 21 11:55:18 2023 Received: (at control) by debbugs.gnu.org; 21 Mar 2023 15:55:18 +0000 Received: from localhost ([127.0.0.1]:60319 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1peeKT-0004DF-PF for submit@debbugs.gnu.org; Tue, 21 Mar 2023 11:55:17 -0400 Received: from smtpm5.myservices.hosting ([185.26.105.236]:58326) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1peeKR-0004D6-1x for control@debbugs.gnu.org; Tue, 21 Mar 2023 11:55:16 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpm5.myservices.hosting (Postfix) with ESMTP id 3771920CE1 for ; Tue, 21 Mar 2023 16:55:13 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id D20068009A for ; Tue, 21 Mar 2023 16:55:13 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-2.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id IkhMiWF_vpN8 for ; Tue, 21 Mar 2023 16:55:13 +0100 (CET) Received: from [192.168.1.239] (unknown [10.192.1.83]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 867B780097 for ; Tue, 21 Mar 2023 16:55:13 +0100 (CET) Message-ID: <1be1f685-6ccc-9d11-7305-1d7c3706a341@makinata.eu> Date: Tue, 21 Mar 2023 15:54:58 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 Subject: control-msg Content-Language: en-US References: <8a453f83-5563-e306-9269-1121ee85b26e@makinata.eu> To: control From: Bruno Victal In-Reply-To: <8a453f83-5563-e306-9269-1121ee85b26e@makinata.eu> X-Forwarded-Message-Id: <8a453f83-5563-e306-9269-1121ee85b26e@makinata.eu> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) # fields 'user' and 'group' to be replaced from string to user-account + user-group # in the next patch revision tags 60788 + pending quit From debbugs-submit-bounces@debbugs.gnu.org Wed Mar 22 12:15:47 2023 Received: (at 60788) by debbugs.gnu.org; 22 Mar 2023 16:15:47 +0000 Received: from localhost ([127.0.0.1]:36431 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pf17p-0001of-Pl for submit@debbugs.gnu.org; Wed, 22 Mar 2023 12:15:47 -0400 Received: from smtpmciv1.myservices.hosting ([185.26.107.237]:39094) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pf17m-0001oV-Ls for 60788@debbugs.gnu.org; Wed, 22 Mar 2023 12:15:44 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpmciv1.myservices.hosting (Postfix) with ESMTP id 5D94220BEE; Wed, 22 Mar 2023 17:15:40 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 0D4D480079; Wed, 22 Mar 2023 17:15:40 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-2.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id lR24pREz6pOW; Wed, 22 Mar 2023 17:15:36 +0100 (CET) Received: from guix-nuc.home.arpa (bl9-119-177.dsl.telepac.pt [85.242.119.177]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 141C18009F; Wed, 22 Mar 2023 17:15:36 +0100 (CET) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v7] services: Add vnstat-service-type. Date: Wed, 22 Mar 2023 16:15:34 +0000 Message-Id: <7a6d4c5c48307b39198c63312d3d9ea06c2fba4d.1679501719.git.mirai@makinata.eu> X-Mailer: git-send-email 2.39.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- doc/guix.texi | 239 ++++++++++++++++++ gnu/services/monitoring.scm | 465 ++++++++++++++++++++++++++++++++++++ 2 files changed, 704 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index dfdb26103a..9353f06f07 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -28566,6 +28566,245 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. + +The following example will configure the service with default values: + +@lisp +(service vnstat-service-type) +@end lisp +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{5-minute-hours} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{64bit-interface-counters} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-dir}. + +@item @code{daemon-group} (type: maybe-user-group) +Specify the group to which the daemon process should switch during +startup. Set to @code{%unset-value} to disable group switching. + +@item @code{daemon-user} (type: maybe-user-account) +Specify the user to which the daemon process should switch during +startup. Set to @code{%unset-value} to disable user switching. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-bw} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as symbols/strings to integer values. For example, +@lisp +(max-bw `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-bw} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. This option is ignored when the daemon is +started with .B "-n, --nodaemon" which results in all log output being +shown in terminal the daemon process is using. @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-utc?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index bbf8b10f8b..0cfbff0946 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,46 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + vnstat-configuration-package + vnstat-configuration-database-dir + vnstat-configuration-5-minute-hours + vnstat-configuration-64bit-interface-counters + vnstat-configuration-always-add-new-interfaces? + vnstat-configuration-bandwidth-detection? + vnstat-configuration-bandwidth-detection-interval + vnstat-configuration-boot-variation + vnstat-configuration-check-disk-space? + vnstat-configuration-create-dirs? + vnstat-configuration-daemon-group + vnstat-configuration-daemon-user + vnstat-configuration-daily-days + vnstat-configuration-database-synchronous + vnstat-configuration-database-write-ahead-logging? + vnstat-configuration-hourly-days + vnstat-configuration-log-file + vnstat-configuration-max-bandwidth + vnstat-configuration-max-bw + vnstat-configuration-monthly-months + vnstat-configuration-month-rotate + vnstat-configuration-month-rotate-affects-years? + vnstat-configuration-offline-save-interval + vnstat-configuration-pid-file + vnstat-configuration-poll-interval + vnstat-configuration-rescan-database-on-save? + vnstat-configuration-save-interval + vnstat-configuration-save-on-status-change? + vnstat-configuration-time-sync-wait + vnstat-configuration-top-day-entries + vnstat-configuration-trafficless-entries? + vnstat-configuration-update-file-owner? + vnstat-configuration-update-interval + vnstat-configuration-use-logging + vnstat-configuration-use-utc? + vnstat-configuration-yearly-years + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +239,428 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map (cut string-upcase <> 0 1) tail)) "")))) + +(define (strip-trailing-?-character field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (strip-trailing-?-character field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define (vnstat-serialize-user-account field-name value) + (vnstat-serialize-string field-name (user-account-name value))) + +(define (vnstat-serialize-user-group field-name value) + (vnstat-serialize-string field-name (user-group-name value))) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) +(define-maybe user-account (prefix vnstat-)) +(define-maybe user-group (prefix vnstat-)) + +(define %vnstat-user + (user-account + (name "vnstat") + (group "vnstat") + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + +(define %vnstat-group + (user-group + (name "vnstat") + (system? #t))) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +;; Do not reflow these strings or drop the initial \ escape as it makes it +;; harder to diff against the manpage. +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-dir + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required.") + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-dirs? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-dir}.") + + ;; Note: Documentation for daemon-group and daemon-user adapted + ;; for user-group and user-account record-types. + (daemon-group + (maybe-user-group %vnstat-group) + "\ +Specify the group to which the daemon process should switch during startup. +Set to @code{%unset-value} to disable group switching.") + + (daemon-user + (maybe-user-account %vnstat-user) + "\ +Specify the user to which the daemon process should switch during startup. +Set to @code{%unset-value} to disable user switching.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-bw + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as symbols/strings to integer values. For example, +@lisp +(max-bw + `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-bw} +configuration. Value range: @samp{0}..@samp{50000}" + (lambda (field-name value) + (if (maybe-value-set? value) + (vnstat-serialize-alist field-name value) ""))) + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstat/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. This option is ignored when the daemon is started with +.B \"-n, --nodaemon\" +which results in all log output being shown in terminal the daemon process is using. +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-utc? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified." + (lambda (_ value) + (if (maybe-value-set? value) + (vnstat-serialize-boolean 'use-UTC value) ""))) + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking file-systems)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (filter-map maybe-value (list daemon-group daemon-user)))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server base-commit: 91f92f32d5a9317dd333d570b54c2ba34c9c14a9 -- 2.39.1 From debbugs-submit-bounces@debbugs.gnu.org Mon Apr 03 10:15:09 2023 Received: (at 60788) by debbugs.gnu.org; 3 Apr 2023 14:15:09 +0000 Received: from localhost ([127.0.0.1]:44931 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pjKxf-0002LF-CI for submit@debbugs.gnu.org; Mon, 03 Apr 2023 10:15:09 -0400 Received: from smtpmciv4.myservices.hosting ([185.26.107.240]:59366) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pjKxb-0002L1-Vb for 60788@debbugs.gnu.org; Mon, 03 Apr 2023 10:15:05 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpmciv4.myservices.hosting (Postfix) with ESMTP id 335C120788; Mon, 3 Apr 2023 16:14:59 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id EA5B2800BA; Mon, 3 Apr 2023 16:14:55 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-2.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id Nrt6t8xQXHn9; Mon, 3 Apr 2023 16:14:54 +0200 (CEST) Received: from guix-nuc.home.arpa (unknown [10.192.1.83]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id D7A6A800B5; Mon, 3 Apr 2023 16:14:53 +0200 (CEST) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v8] services: Add vnstat-service-type. Date: Mon, 3 Apr 2023 15:14:53 +0100 Message-Id: <2e611090530b4a45b15134fbece343fd4953e646.1680531257.git.mirai@makinata.eu> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Type: text/plain; charset= Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- Notable changes since v7: * Adapted to the recent changes in define-configuration. doc/guix.texi | 239 ++++++++++++++++++ gnu/services/monitoring.scm | 465 ++++++++++++++++++++++++++++++++++++ 2 files changed, 704 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index 4f72e2f34a..7e69098267 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -28569,6 +28569,245 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. + +The following example will configure the service with default values: + +@lisp +(service vnstat-service-type) +@end lisp +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{5-minute-hours} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{64bit-interface-counters} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-dir}. + +@item @code{daemon-group} (type: maybe-user-group) +Specify the group to which the daemon process should switch during +startup. Set to @code{%unset-value} to disable group switching. + +@item @code{daemon-user} (type: maybe-user-account) +Specify the user to which the daemon process should switch during +startup. Set to @code{%unset-value} to disable user switching. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-bw} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as symbols/strings to integer values. For example, +@lisp +(max-bw `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-bw} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. This option is ignored when the daemon is +started with .B "-n, --nodaemon" which results in all log output being +shown in terminal the daemon process is using. @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-utc?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index bbf8b10f8b..0cfbff0946 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,46 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + vnstat-configuration-package + vnstat-configuration-database-dir + vnstat-configuration-5-minute-hours + vnstat-configuration-64bit-interface-counters + vnstat-configuration-always-add-new-interfaces? + vnstat-configuration-bandwidth-detection? + vnstat-configuration-bandwidth-detection-interval + vnstat-configuration-boot-variation + vnstat-configuration-check-disk-space? + vnstat-configuration-create-dirs? + vnstat-configuration-daemon-group + vnstat-configuration-daemon-user + vnstat-configuration-daily-days + vnstat-configuration-database-synchronous + vnstat-configuration-database-write-ahead-logging? + vnstat-configuration-hourly-days + vnstat-configuration-log-file + vnstat-configuration-max-bandwidth + vnstat-configuration-max-bw + vnstat-configuration-monthly-months + vnstat-configuration-month-rotate + vnstat-configuration-month-rotate-affects-years? + vnstat-configuration-offline-save-interval + vnstat-configuration-pid-file + vnstat-configuration-poll-interval + vnstat-configuration-rescan-database-on-save? + vnstat-configuration-save-interval + vnstat-configuration-save-on-status-change? + vnstat-configuration-time-sync-wait + vnstat-configuration-top-day-entries + vnstat-configuration-trafficless-entries? + vnstat-configuration-update-file-owner? + vnstat-configuration-update-interval + vnstat-configuration-use-logging + vnstat-configuration-use-utc? + vnstat-configuration-yearly-years + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +239,428 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map (cut string-upcase <> 0 1) tail)) "")))) + +(define (strip-trailing-?-character field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (strip-trailing-?-character field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define (vnstat-serialize-user-account field-name value) + (vnstat-serialize-string field-name (user-account-name value))) + +(define (vnstat-serialize-user-group field-name value) + (vnstat-serialize-string field-name (user-group-name value))) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) +(define-maybe user-account (prefix vnstat-)) +(define-maybe user-group (prefix vnstat-)) + +(define %vnstat-user + (user-account + (name "vnstat") + (group "vnstat") + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + +(define %vnstat-group + (user-group + (name "vnstat") + (system? #t))) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +;; Do not reflow these strings or drop the initial \ escape as it makes it +;; harder to diff against the manpage. +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-dir + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required.") + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-dirs? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-dir}.") + + ;; Note: Documentation for daemon-group and daemon-user adapted + ;; for user-group and user-account record-types. + (daemon-group + (maybe-user-group %vnstat-group) + "\ +Specify the group to which the daemon process should switch during startup. +Set to @code{%unset-value} to disable group switching.") + + (daemon-user + (maybe-user-account %vnstat-user) + "\ +Specify the user to which the daemon process should switch during startup. +Set to @code{%unset-value} to disable user switching.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-bw + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as symbols/strings to integer values. For example, +@lisp +(max-bw + `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-bw} +configuration. Value range: @samp{0}..@samp{50000}" + (lambda (field-name value) + (if (maybe-value-set? value) + (vnstat-serialize-alist field-name value) ""))) + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstat/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. This option is ignored when the daemon is started with +.B \"-n, --nodaemon\" +which results in all log output being shown in terminal the daemon process is using. +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-utc? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified." + (lambda (_ value) + (if (maybe-value-set? value) + (vnstat-serialize-boolean 'use-UTC value) ""))) + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking file-systems)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (filter-map maybe-value (list daemon-group daemon-user)))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server base-commit: 86d580c82f984fe0a2929a75518fe9ad62fb8cb4 -- 2.39.2 From debbugs-submit-bounces@debbugs.gnu.org Tue Apr 04 09:08:58 2023 Received: (at 60788) by debbugs.gnu.org; 4 Apr 2023 13:08:58 +0000 Received: from localhost ([127.0.0.1]:46812 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pjgPA-0005Hr-JR for submit@debbugs.gnu.org; Tue, 04 Apr 2023 09:08:58 -0400 Received: from smtpm1.myservices.hosting ([185.26.105.232]:57326) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pjgP4-0005Hf-72 for 60788@debbugs.gnu.org; Tue, 04 Apr 2023 09:08:55 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpm1.myservices.hosting (Postfix) with ESMTP id 39BB0202E5; Tue, 4 Apr 2023 15:08:49 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id E247B800B4; Tue, 4 Apr 2023 15:08:48 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-2.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id n8yTm9RKXanK; Tue, 4 Apr 2023 15:08:47 +0200 (CEST) Received: from guix-nuc.home.arpa (unknown [10.192.1.83]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 826FE8009E; Tue, 4 Apr 2023 15:08:47 +0200 (CEST) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v9] services: Add vnstat-service-type. Date: Tue, 4 Apr 2023 14:08:36 +0100 Message-Id: X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- Changes since v8: * Forgot to amend commit in v8, v9 corrects this. doc/guix.texi | 239 ++++++++++++++++++ gnu/services/monitoring.scm | 467 ++++++++++++++++++++++++++++++++++++ 2 files changed, 706 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index 4f72e2f34a..7e69098267 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -28569,6 +28569,245 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. + +The following example will configure the service with default values: + +@lisp +(service vnstat-service-type) +@end lisp +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{5-minute-hours} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{64bit-interface-counters} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-dir}. + +@item @code{daemon-group} (type: maybe-user-group) +Specify the group to which the daemon process should switch during +startup. Set to @code{%unset-value} to disable group switching. + +@item @code{daemon-user} (type: maybe-user-account) +Specify the user to which the daemon process should switch during +startup. Set to @code{%unset-value} to disable user switching. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-bw} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as symbols/strings to integer values. For example, +@lisp +(max-bw `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-bw} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. This option is ignored when the daemon is +started with .B "-n, --nodaemon" which results in all log output being +shown in terminal the daemon process is using. @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-utc?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index bbf8b10f8b..09de7807c0 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,46 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + vnstat-configuration-package + vnstat-configuration-database-dir + vnstat-configuration-5-minute-hours + vnstat-configuration-64bit-interface-counters + vnstat-configuration-always-add-new-interfaces? + vnstat-configuration-bandwidth-detection? + vnstat-configuration-bandwidth-detection-interval + vnstat-configuration-boot-variation + vnstat-configuration-check-disk-space? + vnstat-configuration-create-dirs? + vnstat-configuration-daemon-group + vnstat-configuration-daemon-user + vnstat-configuration-daily-days + vnstat-configuration-database-synchronous + vnstat-configuration-database-write-ahead-logging? + vnstat-configuration-hourly-days + vnstat-configuration-log-file + vnstat-configuration-max-bandwidth + vnstat-configuration-max-bw + vnstat-configuration-monthly-months + vnstat-configuration-month-rotate + vnstat-configuration-month-rotate-affects-years? + vnstat-configuration-offline-save-interval + vnstat-configuration-pid-file + vnstat-configuration-poll-interval + vnstat-configuration-rescan-database-on-save? + vnstat-configuration-save-interval + vnstat-configuration-save-on-status-change? + vnstat-configuration-time-sync-wait + vnstat-configuration-top-day-entries + vnstat-configuration-trafficless-entries? + vnstat-configuration-update-file-owner? + vnstat-configuration-update-interval + vnstat-configuration-use-logging + vnstat-configuration-use-utc? + vnstat-configuration-yearly-years + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +239,430 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map (cut string-upcase <> 0 1) tail)) "")))) + +(define (strip-trailing-?-character field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (strip-trailing-?-character field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define (vnstat-serialize-user-account field-name value) + (vnstat-serialize-string field-name (user-account-name value))) + +(define (vnstat-serialize-user-group field-name value) + (vnstat-serialize-string field-name (user-group-name value))) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) +(define-maybe user-account (prefix vnstat-)) +(define-maybe user-group (prefix vnstat-)) + +(define %vnstat-user + (user-account + (name "vnstat") + (group "vnstat") + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + +(define %vnstat-group + (user-group + (name "vnstat") + (system? #t))) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +;; Do not reflow these strings or drop the initial \ escape as it makes it +;; harder to diff against the manpage. +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-dir + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required.") + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-dirs? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-dir}.") + + ;; Note: Documentation for daemon-group and daemon-user adapted + ;; for user-group and user-account record-types. + (daemon-group + (maybe-user-group %vnstat-group) + "\ +Specify the group to which the daemon process should switch during startup. +Set to @code{%unset-value} to disable group switching.") + + (daemon-user + (maybe-user-account %vnstat-user) + "\ +Specify the user to which the daemon process should switch during startup. +Set to @code{%unset-value} to disable user switching.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-bw + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as symbols/strings to integer values. For example, +@lisp +(max-bw + `((eth0 . 15000) + (ppp0 . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-bw} +configuration. Value range: @samp{0}..@samp{50000}" + (serializer + (lambda (field-name value) + (if (maybe-value-set? value) + (vnstat-serialize-alist field-name value) "")))) + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstat/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. This option is ignored when the daemon is started with +.B \"-n, --nodaemon\" +which results in all log output being shown in terminal the daemon process is using. +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-utc? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified." + (serializer + (lambda (_ value) + (if (maybe-value-set? value) + (vnstat-serialize-boolean 'use-UTC value) "")))) + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking file-systems)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (filter-map maybe-value (list daemon-group daemon-user)))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server base-commit: b9c9c23939a40a850a8c78579adaec25d1972bd1 -- 2.39.2 From debbugs-submit-bounces@debbugs.gnu.org Tue Apr 04 09:31:50 2023 Received: (at control) by debbugs.gnu.org; 4 Apr 2023 13:31:50 +0000 Received: from localhost ([127.0.0.1]:46831 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pjglK-0005pc-2e for submit@debbugs.gnu.org; Tue, 04 Apr 2023 09:31:50 -0400 Received: from smtpm5.myservices.hosting ([185.26.105.236]:53482) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pjglI-0005pT-01 for control@debbugs.gnu.org; Tue, 04 Apr 2023 09:31:48 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpm5.myservices.hosting (Postfix) with ESMTP id 1029020B2C for ; Tue, 4 Apr 2023 15:31:46 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id BA8148009B for ; Tue, 4 Apr 2023 15:31:46 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-2.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id hvqd3Mhg6OHq for ; Tue, 4 Apr 2023 15:31:46 +0200 (CEST) Received: from [192.168.1.239] (unknown [10.192.1.83]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 6EB0F8009A for ; Tue, 4 Apr 2023 15:31:46 +0200 (CEST) Message-ID: Date: Tue, 4 Apr 2023 14:31:42 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.1 From: Bruno Victal Subject: control-msg To: control Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) tags 62324 patch tags 61462 patch tags 60788 - pending tags 59971 wishlist tags 51737 patch tags 62624 + security tags 49817 + security # resend control-msg close 37740 quit From debbugs-submit-bounces@debbugs.gnu.org Fri Apr 07 11:22:37 2023 Received: (at 60788) by debbugs.gnu.org; 7 Apr 2023 15:22:37 +0000 Received: from localhost ([127.0.0.1]:57069 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pknvB-00087I-G6 for submit@debbugs.gnu.org; Fri, 07 Apr 2023 11:22:37 -0400 Received: from eggs.gnu.org ([209.51.188.92]:54912) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pknv9-000872-Au for 60788@debbugs.gnu.org; Fri, 07 Apr 2023 11:22:35 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pknv3-0005zq-3d; Fri, 07 Apr 2023 11:22:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:In-Reply-To:Date:References:Subject:To: From; bh=vtqeF2+iohMq1AZlnBn4oPogcWLQyPjeCW/TpmEqVlk=; b=C2ajJs3Jl3AcQeKE9HBs 8VZa3nmXYi4RrrZKP32RKKSUFHt9sHST5wViO9ynV1xT6ub8BsIeq66TAsY/Psxgg9zlSQFmG5f38 sGJ+jmCRhLEgsTsC6NOFdVqI+fomuQbqPLAZQvLoH+zNhx0rILXaZB81ur691L/OQ7KKkxZ69cgJ6 Kb31CmPvZZIqHQsH4l7fFmsWHd/AbwY6P9a/1OkHsh/WgZ/Pk6GrynuqiKSGPRpDmpxPM4vipxMzQ ZQE9tGl6JmPwBIlijaHtcRyeHaNLRv79HPMczs1OCrgXPJ9idMlft/SAxHEAJlz32cPSCIk6oIEUU Y16vgTRvXjJaww==; Received: from 91-160-117-201.subs.proxad.net ([91.160.117.201] helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pknv2-0006dQ-GR; Fri, 07 Apr 2023 11:22:28 -0400 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Bruno Victal Subject: Re: bug#60788: [PATCH] services: Add vnstat-service-type. References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> Date: Fri, 07 Apr 2023 17:22:25 +0200 In-Reply-To: (Bruno Victal's message of "Tue, 4 Apr 2023 14:08:36 +0100") Message-ID: <87edovd8em.fsf_-_@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 60788 Cc: maxim.cournoyer@gmail.com, 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hi! Bruno Victal skribis: > * gnu/services/monitoring.scm (vnstat-service-type): New variable. > * doc/guix.texi (Monitoring Services): Document it. > --- > > Changes since v8: > * Forgot to amend commit in v8, v9 corrects this. Sorry to chime in after 9 versions (!). I think a system test would be nice, we generally require it upfront, but since Maxim wrote it can come later, let=E2=80=99s not let it block this patch any longer. One comment: > +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: str= ing) [...] > +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) For consistency, both within this record and with the rest of Guix, I suggest avoiding abbreviations. Since this will be part of the API, better fix it now than later. > +@item @code{max-bandwidth} (type: maybe-integer) > +Maximum bandwidth for all interfaces. If the interface specific traffic > +exceeds the given value then the data is assumed to be invalid and > +rejected. Set to 0 in order to disable the feature. Value range: > +@samp{0}..@samp{50000} > + > +@item @code{max-bw} (type: maybe-alist) > +Same as @var{max-bandwidth} but can be used for setting individual > +limits for selected interfaces. This is an association list of > +interfaces as symbols/strings to integer values. For example, > +@lisp > +(max-bw `((eth0 . 15000) > + (ppp0 . 10000))) > +@end lisp Both the naming and semantics are a bit confusing to me. How about s/max-bw/per-interface-max-bandwidth/ ? Side note: I=E2=80=99d represent interfaces as strings because there=E2=80= =99s no guarantee they =E2=80=9Cfit=E2=80=9D in a symbol. That=E2=80=99s all, thanks! Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Fri Apr 07 16:04:34 2023 Received: (at 60788) by debbugs.gnu.org; 7 Apr 2023 20:04:34 +0000 Received: from localhost ([127.0.0.1]:57274 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pksK2-0006Bw-19 for submit@debbugs.gnu.org; Fri, 07 Apr 2023 16:04:34 -0400 Received: from mail-qt1-f182.google.com ([209.85.160.182]:38750) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pksK0-0006Bi-3b for 60788@debbugs.gnu.org; Fri, 07 Apr 2023 16:04:32 -0400 Received: by mail-qt1-f182.google.com with SMTP id y4so11453570qti.5 for <60788@debbugs.gnu.org>; Fri, 07 Apr 2023 13:04:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1680897866; x=1683489866; h=content-transfer-encoding:mime-version:user-agent:message-id :in-reply-to:date:references:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to; bh=UpjN8Y/29XZSR7rXzWFfztFAXNYrk34Tl5GBHijBA3M=; b=MHkclXeo3+OdOT6NRgdx1uqaE59QK3RRyQ74PfCtz6CbXz0wiRmii+8hIdgLLu6x0p fPrqkEEaCTsGa8fs0VH/97TJdvOu4wi0MZ3Z0V+3txOTB3KQQBne1KKfXFfPk5jBsbSj hbM7md5eFvSfJxO+7ULto1FnTT3FK/ST8ogim9kN+OdPclqD5EixjeVrQDqy151crr0D lZCOK/Hhq54zbnX2Bsv9nBxpQjmLD2weYEZ4TPK5uZq0wjsDiSHigBuzuRixyVvBHjGk 3KN2ol2zGVCHJSv+Ae0OlNGe/ZV9rh9kHmzZl9Yjzhfb+fhJ5wtBBCcrfBxqJmM5967Y alIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680897866; x=1683489866; h=content-transfer-encoding:mime-version:user-agent:message-id :in-reply-to:date:references:subject:cc:to:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=UpjN8Y/29XZSR7rXzWFfztFAXNYrk34Tl5GBHijBA3M=; b=G9HLoqbkfZOz/YB7vDkgT/w6DmQp/pi0BLjuzUd262fG523u0gIZTTJEjG7j4rJuRr hwi1EekhouO/AUhU+sV43jq0rJZS/LXFLbq0h2WgvXOBWDwmE+FpRWDqjzTQEvGYQYgd Zf8c+OiZL6FgtDOWlswilzXMXyhe4pglg04GpVjaqlQggF2+ysNSWB20jJtavYPotjdy +Shw4o9ZbxV8M0CTNNL8ZluunJaSOW6XXXEoBPzbS3S431S2TPW3pn4CAB4D11U0GvrG UDOSG+ayPL/IdStyW1wWZsh5S+rxEfUE/Zb7dWz3qCy2dU87AkK9vwpaPDZep9IWngC9 Ca8w== X-Gm-Message-State: AAQBX9d8GaoJ8Ikv3tPxqxlS9ygHr++r4zGosSHooageBKb4db2jD2C0 6TIpPHTwDyVivu8DAaY5cT40WYXYMjk= X-Google-Smtp-Source: AKy350YQc7Nd3pfAyYgxm8CxSKKyOl8gh+qW1cA1UmhHsS3orejc4UZvnsTA7KWxFGREX1vzaM0cUg== X-Received: by 2002:ac8:7fc2:0:b0:3e3:93ae:d104 with SMTP id b2-20020ac87fc2000000b003e393aed104mr5885677qtk.30.1680897866252; Fri, 07 Apr 2023 13:04:26 -0700 (PDT) Received: from hurd (dsl-205-233-125-210.b2b2c.ca. [205.233.125.210]) by smtp.gmail.com with ESMTPSA id o24-20020ac841d8000000b003de4e646d63sm1410489qtm.32.2023.04.07.13.04.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 07 Apr 2023 13:04:25 -0700 (PDT) From: Maxim Cournoyer To: Ludovic =?utf-8?Q?Court=C3=A8s?= Subject: Re: bug#60788: [PATCH] services: Add vnstat-service-type. References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> <87edovd8em.fsf_-_@gnu.org> Date: Fri, 07 Apr 2023 16:04:24 -0400 In-Reply-To: <87edovd8em.fsf_-_@gnu.org> ("Ludovic =?utf-8?Q?Court=C3=A8s?= =?utf-8?Q?=22's?= message of "Fri, 07 Apr 2023 17:22:25 +0200") Message-ID: <87cz4ftq5z.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Hi Ludo, Ludovic Court=C3=A8s writes: > Hi! > > Bruno Victal skribis: > >> * gnu/services/monitoring.scm (vnstat-service-type): New variable. >> * doc/guix.texi (Monitoring Services): Document it. >> --- >> >> Changes since v8: >> * Forgot to amend commit in v8, v9 corrects this. > > Sorry to chime in after 9 versions (!). > > I think a system test would be nice, we generally require it upfront, > but since Maxim wrote it can come later, let=E2=80=99s not let it block t= his > patch any longer. I didn't mean to lower our standards; I wasn't sure if that policy of ours was strict, since a few system services do not have corresponding tests, IIRC. I wary a bit that demanding a system test for each added service may cause scalability problems in the long run, as each demand a disk-heavy image to be generated and the test to run in a VM, which makes it expensive/slow. On the other hand, it's nice to know about any regressions when they happen rather than on a reboot... If we have such a policy, perhaps we should explicit it in our documented contribution guidelines? --=20 Thanks, Maxim From debbugs-submit-bounces@debbugs.gnu.org Sat Apr 08 08:40:56 2023 Received: (at 60788) by debbugs.gnu.org; 8 Apr 2023 12:40:56 +0000 Received: from localhost ([127.0.0.1]:57977 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pl7sF-00081H-NW for submit@debbugs.gnu.org; Sat, 08 Apr 2023 08:40:56 -0400 Received: from smtpm3.myservices.hosting ([185.26.105.234]:36422) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pl7sD-000818-IY for 60788@debbugs.gnu.org; Sat, 08 Apr 2023 08:40:54 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpm3.myservices.hosting (Postfix) with ESMTP id 47FC120F4F; Sat, 8 Apr 2023 14:40:52 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id D30F68009F; Sat, 8 Apr 2023 14:40:48 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-2.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id Elt0UqAbUdtr; Sat, 8 Apr 2023 14:40:48 +0200 (CEST) Received: from [192.168.1.239] (unknown [10.192.1.83]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id 1AE728009D; Sat, 8 Apr 2023 14:40:48 +0200 (CEST) Message-ID: <07feadac-18b2-7e82-9798-3e3872efcd4a@makinata.eu> Date: Sat, 8 Apr 2023 13:40:39 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.9.1 Subject: Re: bug#60788: [PATCH] services: Add vnstat-service-type. Content-Language: en-US To: =?UTF-8?Q?Ludovic_Court=c3=a8s?= References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> <87edovd8em.fsf_-_@gnu.org> From: Bruno Victal In-Reply-To: <87edovd8em.fsf_-_@gnu.org> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: -1.1 (-) X-Debbugs-Envelope-To: 60788 Cc: maxim.cournoyer@gmail.com, 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -2.1 (--) Hi Ludo’, On 2023-04-07 16:22, Ludovic Courtès wrote: > I think a system test would be nice, we generally require it upfront, > but since Maxim wrote it can come later, let’s not let it block this > patch any longer. Originally I thought it was unfeasible to write a test for this service since it required network activity within the VM and it seemed to take more than 10 minutes for it to pick it up. I did some manual experiments on it much later and I managed to get it down to approx. between 2 and 3 minutes for a partially automated test. What's blocking the test from being implemented in Guix is that my (incomplete) test-suite for this depends on guile 'spawn', which isn't available yet, For reference, I've attached the test-suite here [1], the plan is to finish it up and add it to Guix after the 'spawn' issue is resolved. (or perhaps refactor this to use another approach?) > > One comment: > >> +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: string) > > [...] > >> +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) > > For consistency, both within this record and with the rest of Guix, I > suggest avoiding abbreviations. Since this will be part of the API, > better fix it now than later. I should mention that almost all of the field names here are near verbatim vnstat config-file directives, i.e. a near 1-1 Scheme translation of vnstat config. This has the benefit that it makes serialization pretty much straightforward. It's possible to override their names by the use of the custom serializer parameter but would it be acceptable to leave them as-is? >> +@item @code{max-bandwidth} (type: maybe-integer) >> +Maximum bandwidth for all interfaces. If the interface specific traffic >> +exceeds the given value then the data is assumed to be invalid and >> +rejected. Set to 0 in order to disable the feature. Value range: >> +@samp{0}..@samp{50000} >> + >> +@item @code{max-bw} (type: maybe-alist) >> +Same as @var{max-bandwidth} but can be used for setting individual >> +limits for selected interfaces. This is an association list of >> +interfaces as symbols/strings to integer values. For example, >> +@lisp >> +(max-bw `((eth0 . 15000) >> + (ppp0 . 10000))) >> +@end lisp > > Both the naming and semantics are a bit confusing to me. > > How about s/max-bw/per-interface-max-bandwidth/ ? I found it a bit confusing as well but I'm not too familiar with this part of the config to comment about it. I lifted most of the field-names and documentations straight from the manpage. > Side note: I’d represent interfaces as strings because there’s no > guarantee they “fit” in a symbol. Thanks! I'll have this amended in the next revision. [1]: Listing of vnstat-test.scm --8<---------------cut here---------------start------------->8--- (define-module (gnu tests vnstat) #:use-module (gnu tests) #:use-module ((gnu packages networking) #:select (socat vnstat)) #:use-module (gnu services) #:use-module (gnu services networking) #:use-module (gnu services monitoring) #:use-module (gnu system) #:use-module (gnu system vm) #:use-module (guix gexp) #:use-module (ice-9 format) #:export (%test-vnstat)) (define (run-vnstat-test) "Run tests in a vm which has vnstat running." (define vnstat-config (vnstat-configuration (max-bandwidth 0) (time-sync-wait 0) (bandwidth-detection-interval 0))) (define os (marionette-operating-system (simple-operating-system (service dhcp-client-service-type) (service vnstat-service-type vnstat-config) (service inetd-service-type (inetd-configuration (entries (list (inetd-entry (name "discard") (socket-type 'stream) (protocol "tcp") ;; FIXME: originally this was UDP but port-forwardings hardcodes TCP (wait? #t) (user "nobody"))))))) #:imported-modules '((gnu services herd)))) (define forwarded-port 9999) (define vm (virtual-machine (operating-system os) ;; Note: port 9 corresponds to "discard" service. (port-forwardings `((,forwarded-port . 9))))) ;; FIXME: Allow UDP forward. (define test-timeout (* 60 2)) ; wait for 2 minutes tops. (define test (with-imported-modules '((gnu build marionette)) #~(begin (use-modules (gnu build marionette) (srfi srfi-64)) (let ((marionette (make-marionette (list #$vm))) (pid-file #$(vnstat-configuration-pid-file vnstat-config))) (test-runner-current (system-test-runner #$output)) (test-begin "vnstat") (test-assert "service is running" (marionette-eval '(begin (use-modules (gnu services herd)) (start-service 'vnstatd)) marionette)) (test-assert "vnstatd ready" (wait-for-file pid-file marionette)) (test-assert "vnstatd is logging" ;; pump garbage into the "discard" service within the vm ;; TODO: guile socket client instead? Is it feasible? (let* ((socat #$(file-append socat "/bin/socat")) (dest-addr #$(format #f "TCP4:localhost:~d" forwarded-port)) (args `("socat" "-u" "/dev/zero" ,dest-addr)) ;; XXX: Guile bug (22/03/2023, Guile 3.0.9) ;; Fixed in main: #;(output-port (%make-void-port "w")) (garbage-pump-pid (spawn socat args))) (let ((retval (marionette-eval '(begin (use-modules (ice-9 popen) ;(ice-9 rdelim) (ice-9 match) (sxml simple) (sxml xpath)) (define selector (let ((xpath '(vnstat interface traffic total))) (compose (node-pos 1) (sxpath xpath)))) (let loop ((i 0)) (let* ((vnstat #$(file-append vnstat "/bin/vnstat")) (query-cmd (format #f "~a --xml") vnstat) (result #;(call-with-port (open-input-pipe query-cmd) read-line) (call-with-port (open-input-pipe query-cmd) xml->sxml)) (iface-stats (selector result))) (match iface-stats ((('total ('rx "0") ('tx "0"))) (sleep 1) (if (< i #$test-timeout) (loop (+ i 1)) #f)) ((('total ('rx rx) ('tx tx))) #t) (_ #f))))) marionette))) ;; shutdown garbage pump (kill garbage-pump-pid SIGTERM) retval))) (test-end))))) (gexp->derivation "vnstat-test" test)) (define %test-vnstat (system-test (name "vnstat") (description "Basic tests for vnstat service.") (value (run-vnstat-test)))) --8<---------------cut here---------------end--------------->8--- Cheers, Bruno From debbugs-submit-bounces@debbugs.gnu.org Thu Apr 20 06:03:22 2023 Received: (at 60788) by debbugs.gnu.org; 20 Apr 2023 10:03:22 +0000 Received: from localhost ([127.0.0.1]:36638 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ppR8M-0004uu-9f for submit@debbugs.gnu.org; Thu, 20 Apr 2023 06:03:22 -0400 Received: from eggs.gnu.org ([209.51.188.92]:42902) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ppR8K-0004uh-JX for 60788@debbugs.gnu.org; Thu, 20 Apr 2023 06:03:21 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ppR8E-00037O-M5; Thu, 20 Apr 2023 06:03:14 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:In-Reply-To:Date:References:Subject:To: From; bh=oSiOiLkTrEmaMxfXfkVhsHzeezXOoOU/kQ7889sakfY=; b=elmIxUpQPX3IkMBIalsq xUZy9tpuUd1QBpdR8RYWf62wZlHgK0Zks1OFnnNXGDv8PjJQCXjB2p3GkR+Ezw6FYaLcXKs12X2cE 47nrV4OSh8kpYXlG7uAeJruEc8g/1Me7kd9wQ1hTDe4G+BMbjkuebEmxnmSI1njIqUQnNOyfWv2nf 4krNyK6LMIKbLhjD4rQxtqou33Vv9GdcBmaBl4oqM/1GrKmsKrBYtUcBNExLMm4ulorSiD0Fb3eFc StdbLTibDRxVyjOI5MleRTUBk+iZP/VM0k427/xU8RzWx08GGqOmAV+JRP7Tw7R37iNZuah3XGV0f VMnpcvWTzmphyg==; Received: from [193.50.110.118] (helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ppR86-0002hR-NT; Thu, 20 Apr 2023 06:03:14 -0400 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Maxim Cournoyer Subject: Policy for system tests? References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> <87edovd8em.fsf_-_@gnu.org> <87cz4ftq5z.fsf@gmail.com> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: Primidi 1 =?utf-8?Q?Flor=C3=A9al?= an 231 de la =?utf-8?Q?R=C3=A9volution=2C?= jour de la Rose X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Thu, 20 Apr 2023 12:03:04 +0200 In-Reply-To: <87cz4ftq5z.fsf@gmail.com> (Maxim Cournoyer's message of "Fri, 07 Apr 2023 16:04:24 -0400") Message-ID: <87bkjix44n.fsf_-_@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 60788 Cc: Bruno Victal , 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hi, Maxim Cournoyer skribis: > Ludovic Court=C3=A8s writes: [...] >> I think a system test would be nice, we generally require it upfront, >> but since Maxim wrote it can come later, let=E2=80=99s not let it block = this >> patch any longer. > > I didn't mean to lower our standards; I wasn't sure if that policy of > ours was strict, since a few system services do not have corresponding > tests, IIRC. I wary a bit that demanding a system test for each added > service may cause scalability problems in the long run, as each demand a > disk-heavy image to be generated and the test to run in a VM, which > makes it expensive/slow. On the other hand, it's nice to know about any > regressions when they happen rather than on a reboot... Yeah, it=E2=80=99s an unwritten policy; I think we=E2=80=99ve consistently = required it for some time now. It=E2=80=99s useful because otherwise it=E2=80=99s hard= to tell what the status is for a service. (Speaking of which, we do *not* have that policy for Home services, because we don=E2=80=99t even have a test strategy, and that=E2=80=99s some= thing we should fix before it=E2=80=99s too late.) > If we have such a policy, perhaps we should explicit it in > our documented contribution guidelines? Yes! Also, we should split the submission guidelines into different categories: packages, services, doc, core, etc. Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Thu Apr 20 06:10:06 2023 Received: (at 60788) by debbugs.gnu.org; 20 Apr 2023 10:10:07 +0000 Received: from localhost ([127.0.0.1]:36650 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ppREs-00056K-I5 for submit@debbugs.gnu.org; Thu, 20 Apr 2023 06:10:06 -0400 Received: from eggs.gnu.org ([209.51.188.92]:42312) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ppREo-00055g-T3 for 60788@debbugs.gnu.org; Thu, 20 Apr 2023 06:10:04 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ppREj-0007Gs-2D; Thu, 20 Apr 2023 06:09:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:In-Reply-To:Date:References:Subject:To: From; bh=cuSvwD/D5FkAxwFb0Uk+NQlcZcD6KxUAlA4GF5YUlEc=; b=kdojRE1A3PQ7uwhAhXl0 iqLsCB8Fe+1HnsNARrbRavgeuXz6v3NQNa7Dzhl4HL+Yx53YP8pXEa/8ctFmqOeNtQ/1BEd3d/V05 D6TgAaalw8R0ITQV7Zmh7gQozYV7UIFFrvFUHA3nMt4nwiCdwAGM6SaZ/OTEeMRxev0loM0vtA8Fz If8+N8kcYN/XrAuwKFkhbJn67gDLzMperv2HpIeps4QPo4EMlFubj8UIYBbx75tEJv6JBtYF/rQ+y buiXcN1pSq3PkkEMW+iJH+G6TtP9UC/NLCKvRGVwpMK1iB0Uwnz2wwANZJMxcycCMoH+XBlYH8DnM NqI/CbawiODVQg==; Received: from [193.50.110.118] (helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ppREi-0003IK-MI; Thu, 20 Apr 2023 06:09:56 -0400 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Bruno Victal Subject: Re: bug#60788: [PATCH] services: Add vnstat-service-type. References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> <87edovd8em.fsf_-_@gnu.org> <07feadac-18b2-7e82-9798-3e3872efcd4a@makinata.eu> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: Primidi 1 =?utf-8?Q?Flor=C3=A9al?= an 231 de la =?utf-8?Q?R=C3=A9volution=2C?= jour de la Rose X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Thu, 20 Apr 2023 12:09:54 +0200 In-Reply-To: <07feadac-18b2-7e82-9798-3e3872efcd4a@makinata.eu> (Bruno Victal's message of "Sat, 8 Apr 2023 13:40:39 +0100") Message-ID: <877cu6x3t9.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 60788 Cc: maxim.cournoyer@gmail.com, 60788@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hello! Bruno Victal skribis: >>> +@item @code{database-dir} (default: @code{"/var/lib/vnstat"}) (type: s= tring) >>=20 >> [...] >>=20 >>> +@item @code{create-dirs?} (default: @code{#t}) (type: maybe-boolean) >>=20 >> For consistency, both within this record and with the rest of Guix, I >> suggest avoiding abbreviations. Since this will be part of the API, >> better fix it now than later. > > I should mention that almost all of the field names here are near verbatim > vnstat config-file directives, i.e. a near 1-1 Scheme translation of vnst= at config. > This has the benefit that it makes serialization pretty much straightforw= ard. > > It's possible to override their names by the use of the custom serializer= parameter > but would it be acceptable to leave them as-is? Hmm, I=E2=80=99d say that if the cost of using =E2=80=9Cnice names=E2=80=9D= is =E2=80=9Creally high=E2=80=9D, then yes. But perhaps we can make that cost low by having a map for the few cases where we use a name different from upstream? (define field-name-mapping '((database-directory . "database_dir") =E2=80=A6)) > (define-module (gnu tests vnstat) Woohoo, you rock! > (test-assert "vnstatd is logging" > ;; pump garbage into the "discard" service within the vm > ;; TODO: guile socket client instead? Is it feasible? > (let* ((socat #$(file-append socat "/bin/socat")) > (dest-addr #$(format #f "TCP4:localhost:~d" > forwarded-port)) > (args `("socat" "-u" "/dev/zero" ,dest-addr)) > ;; XXX: Guile bug (22/03/2023, Guile 3.0.9) > ;; Fixed in main: > #;(output-port (%make-void-port "w")) > (garbage-pump-pid (spawn socat args))) You can probably connect directly to DEST-ADDR from Guile instead of going through =E2=80=98socat=E2=80=99? If not, you can either pass =E2=80=98#:guile guile-3.0-latest=E2=80=99 to =E2=80=98gexp->derivation=E2=80=99 so you get =E2=80=98spawn=E2=80=99 (3.0.= 9 is the default in =E2=80=98core-updates=E2=80=99 anyway), or use =E2=80=98primitive-fork=E2= =80=99. HTH! Ludo=E2=80=99. From debbugs-submit-bounces@debbugs.gnu.org Thu May 04 20:20:10 2023 Received: (at 60788) by debbugs.gnu.org; 5 May 2023 00:20:10 +0000 Received: from localhost ([127.0.0.1]:52358 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pujBA-0001ND-Np for submit@debbugs.gnu.org; Thu, 04 May 2023 20:20:10 -0400 Received: from smtpmciv2.myservices.hosting ([185.26.107.238]:51954) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pujB5-0001Mw-3W for 60788@debbugs.gnu.org; Thu, 04 May 2023 20:20:06 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpmciv2.myservices.hosting (Postfix) with ESMTP id B8BB320D5A; Fri, 5 May 2023 02:19:50 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 5A3B380097; Fri, 5 May 2023 02:18:57 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-2.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id I9ZaR6iwCwWv; Fri, 5 May 2023 02:18:42 +0200 (CEST) Received: from guix-nuc.home.arpa (unknown [10.192.1.83]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id B717D80060; Fri, 5 May 2023 02:18:41 +0200 (CEST) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v10 1/3] services: Add vnstat-service-type. Date: Fri, 5 May 2023 01:18:37 +0100 Message-Id: <4e67d41880a44306c5b5d0a39c776083c180cd15.1683245610.git.mirai@makinata.eu> X-Mailer: git-send-email 2.39.2 In-Reply-To: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: ludo@gnu.org, Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/monitoring.scm (vnstat-service-type): New variable. * doc/guix.texi (Monitoring Services): Document it. --- Notable changes since v9: * Fields create-dirs? and database-dir were renamed to create-directories? and database-directory. * Field maxbw description asks that interface names be supplied as strings instead. * Test suite was refactored and included in this series. * Exports accessors for inetd service. Notes: Regarding the MaxBW field, I don't understand this option enough to decide on a different naming for it. doc/guix.texi | 237 ++++++++++++++++++ gnu/services/monitoring.scm | 472 ++++++++++++++++++++++++++++++++++++ 2 files changed, 709 insertions(+) diff --git a/doc/guix.texi b/doc/guix.texi index 55221a10c3..bedc38cb73 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -28656,6 +28656,243 @@ Monitoring Services @end table @end deftp +@anchor{vnstat} +@subsubheading vnStat Network Traffic Monitor +@cindex vnstat + +vnStat is a network traffic monitor that uses interface statistics provided +by the kernel rather than traffic sniffing. This makes it a light resource +monitor, regardless of network traffic rate. + +@defvar vnstat-service-type +This is the service type for the @uref{https://humdi.net/vnstat/,vnStat} daemon +and accepts a @code{vnstat-configuration} value. + +The following example will configure the service with default values: + +@lisp +(service vnstat-service-type) +@end lisp +@end defvar + +@c %start of fragment +@deftp {Data Type} vnstat-configuration +Available @code{vnstat-configuration} fields are: + +@table @asis +@item @code{package} (default: @code{vnstat}) (type: file-like) +The vnstat package. + +@item @code{database-directory} (default: @code{"/var/lib/vnstat"}) (type: string) +Specifies the directory where the database is to be stored. A full path +must be given and a leading '/' isn't required. + +@item @code{5-minute-hours} (default: @code{48}) (type: maybe-integer) +Data retention duration for the 5 minute resolution entries. The +configuration defines for how many past hours entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{64bit-interface-counters} (default: @code{-2}) (type: maybe-integer) +Select interface counter handling. Set to @code{1} for defining that +all interfaces use 64-bit counters on the kernel side and @code{0} for +defining 32-bit counter. Set to @code{-1} for using the old style logic +used in earlier versions where counter values within 32-bits are assumed +to be 32-bit and anything larger is assumed to be a 64-bit counter. This +may produce false results if a 64-bit counter is reset within the +32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures. + +@item @code{always-add-new-interfaces?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable automatic creation of new database entries for +interfaces not currently in the database even if the database file +already exists when the daemon is started. New database entries will +also get created for new interfaces seen while the daemon is running. +Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always excluded from getting +added. + +@item @code{bandwidth-detection?} (default: @code{#t}) (type: maybe-boolean) +Try to automatically detect @var{max-bandwidth} value for each monitored +interface. Mostly only ethernet interfaces support this feature. +@var{max-bandwidth} will be used as fallback value if detection fails. +Any interface specific @var{max-BW} configuration will disable the +detection for the specified interface. In Linux, the detection is +disabled for tun interfaces due to the Linux kernel always reporting 10 +Mbit regardless of the used real interface. + +@item @code{bandwidth-detection-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes interface specific detection of @var{max-bandwidth} +is done for detecting possible changes when @var{bandwidth-detection} is +enabled. Can be disabled by setting to @code{0}. Value range: +@samp{0}..@samp{30} + +@item @code{boot-variation} (default: @code{15}) (type: maybe-integer) +Time in seconds how much the boot time reported by system kernel can +variate between updates. Value range: @samp{0}..@samp{300} + +@item @code{check-disk-space?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the availability check of at least some free disk +space before a database write. + +@item @code{create-directories?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the creation of directories when a configured path +doesn't exist. This includes @var{database-directory}. + +@item @code{daemon-group} (type: maybe-user-group) +Specify the group to which the daemon process should switch during +startup. Set to @code{%unset-value} to disable group switching. + +@item @code{daemon-user} (type: maybe-user-account) +Specify the user to which the daemon process should switch during +startup. Set to @code{%unset-value} to disable user switching. + +@item @code{daily-days} (default: @code{62}) (type: maybe-integer) +Data retention duration for the one day resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{database-synchronous} (default: @code{-1}) (type: maybe-integer) +Change the setting of the SQLite "synchronous" flag which controls how +much care is taken to ensure disk writes have fully completed when +writing data to the database before continuing other actions. Higher +values take extra steps to ensure data safety at the cost of slower +performance. A value of @code{0} will result in all handling being left +to the filesystem itself. Set to @code{-1} to select the default value +according to database mode controlled by +@var{database-write-ahead-logging} setting. See SQLite documentation +for more details regarding values from @code{1} to @code{3}. Value +range: @samp{-1}..@samp{3} + +@item @code{database-write-ahead-logging?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable SQLite Write-Ahead Logging mode for the database. See +SQLite documentation for more details and note that support for +read-only operations isn't available in older SQLite versions. + +@item @code{hourly-days} (default: @code{4}) (type: maybe-integer) +Data retention duration for the one hour resolution entries. The +configuration defines for how many past days entries will be stored. Set +to @code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{log-file} (type: maybe-string) +Specify log file path and name to be used if @var{use-logging} is set to +@code{1}. + +@item @code{max-bandwidth} (type: maybe-integer) +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and +rejected. Set to 0 in order to disable the feature. Value range: +@samp{0}..@samp{50000} + +@item @code{max-bw} (type: maybe-alist) +Same as @var{max-bandwidth} but can be used for setting individual +limits for selected interfaces. This is an association list of +interfaces as strings to integer values. For example, +@lisp +(max-bw `(("eth0" . 15000) + ("ppp0" . 10000))) +@end lisp +@var{bandwidth-detection} is disabled on an interface specific level for +each @var{max-bw} configuration. Value range: @samp{0}..@samp{50000} + +@item @code{monthly-months} (default: @code{25}) (type: maybe-integer) +Data retention duration for the one month resolution entries. The +configuration defines for how many past months entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@item @code{month-rotate} (default: @code{1}) (type: maybe-integer) +Day of month that months are expected to change. Usually set to 1 but +can be set to alternative values for example for tracking monthly billed +traffic where the billing period doesn't start on the first day. For +example, if set to 7, days of February up to and including the 6th will +count for January. Changing this option will not cause existing data to +be recalculated. Value range: @samp{1}..@samp{28} + +@item @code{month-rotate-affects-years?} (default: @code{#f}) (type: maybe-boolean) +Enable or disable @var{month-rotate} also affecting yearly data. +Applicable only when @var{month-rotate} has a value greater than one. + +@item @code{offline-save-interval} (default: @code{30}) (type: maybe-integer) +How often in minutes cached interface data is saved to file when all +monitored interfaces are offline. Value range: +@var{save-interval}..@samp{60} + +@item @code{pid-file} (default: @code{"/var/run/vnstatd.pid"}) (type: maybe-string) +Specify pid file path and name to be used. + +@item @code{poll-interval} (default: @code{5}) (type: maybe-integer) +How often in seconds interfaces are checked for status changes. Value +range: @samp{2}..@samp{60} + +@item @code{rescan-database-on-save?} (type: maybe-boolean) +Automatically discover added interfaces from the database and start +monitoring. The rescan is done every @var{save-interval} or +@var{offline-save-interval} minutes depending on the current activity +state. + +@item @code{save-interval} (default: @code{5}) (type: maybe-integer) +How often in minutes cached interface data is saved to file. Value +range: ( @var{update-interval} / 60 )..@samp{60} + +@item @code{save-on-status-change?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface +goes offline or comes online. + +@item @code{time-sync-wait} (default: @code{5}) (type: maybe-integer) +How many minutes to wait during daemon startup for system clock to sync +if most recent database update appears to be in the future. This may be +needed in systems without a real-time clock (RTC) which require some +time after boot to query and set the correct time. @code{0} = wait +disabled. Value range: @samp{0}..@samp{60} + +@item @code{top-day-entries} (default: @code{20}) (type: maybe-integer) +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to +@code{-1} for unlimited entries or to @code{0} to disable the data +collection of this resolution. + +@item @code{trafficless-entries?} (default: @code{#t}) (type: maybe-boolean) +Create database entries even when there is no traffic during the entry's +time period. + +@item @code{update-file-owner?} (default: @code{#t}) (type: maybe-boolean) +Enable or disable the update of file ownership during daemon process +startup. During daemon startup, only database, log and pid files will +be modified if the user or group change feature ( @var{daemon-user} or +@var{daemon-group} ) is enabled and the files don't match the requested +user or group. During manual database creation, this option will cause +file ownership to be inherited from the database directory if the +directory already exists. This option only has effect when the process +is started as root or via sudo. + +@item @code{update-interval} (default: @code{20}) (type: maybe-integer) +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300} + +@item @code{use-logging} (default: @code{2}) (type: maybe-integer) +Enable or disable logging. Accepted values are: @code{0} = disabled, +@code{1} = logfile and @code{2} = syslog. + +@item @code{use-utc?} (type: maybe-boolean) +Enable or disable using UTC as timezone in the database for all entries. +When enabled, all entries added to the database will use UTC regardless +of the configured system timezone. When disabled, the configured system +timezone will be used. Changing this setting will not result in already +existing data to be modified. + +@item @code{yearly-years} (default: @code{-1}) (type: maybe-integer) +Data retention duration for the one year resolution entries. The +configuration defines for how many past years entries will be stored. +Set to @code{-1} for unlimited entries or to @code{0} to disable the +data collection of this resolution. + +@end table +@end deftp +@c %end of fragment + @subsubheading Zabbix server @cindex zabbix zabbix-server Zabbix is a high performance monitoring system that can collect data from a diff --git a/gnu/services/monitoring.scm b/gnu/services/monitoring.scm index bbf8b10f8b..e698040078 100644 --- a/gnu/services/monitoring.scm +++ b/gnu/services/monitoring.scm @@ -3,6 +3,7 @@ ;;; Copyright © 2018, 2019 Gábor Boskovits ;;; Copyright © 2018, 2019, 2020 Oleg Pykhalov ;;; Copyright © 2022 Marius Bakke +;;; Copyright © 2023 Bruno Victal ;;; ;;; This file is part of GNU Guix. ;;; @@ -26,6 +27,7 @@ (define-module (gnu services monitoring) #:use-module (gnu services web) #:use-module (gnu packages admin) #:use-module (gnu packages monitoring) + #:use-module (gnu packages networking) #:use-module (gnu system shadow) #:use-module (guix gexp) #:use-module (guix packages) @@ -34,6 +36,7 @@ (define-module (gnu services monitoring) #:use-module ((guix ui) #:select (display-hint G_)) #:use-module (ice-9 match) #:use-module (ice-9 rdelim) + #:use-module (srfi srfi-1) #:use-module (srfi srfi-26) #:use-module (srfi srfi-35) #:export (darkstat-configuration @@ -45,6 +48,46 @@ (define-module (gnu services monitoring) prometheus-node-exporter-web-listen-address prometheus-node-exporter-service-type + vnstat-configuration + vnstat-configuration? + vnstat-service-type + vnstat-configuration-package + vnstat-configuration-database-directory + vnstat-configuration-5-minute-hours + vnstat-configuration-64bit-interface-counters + vnstat-configuration-always-add-new-interfaces? + vnstat-configuration-bandwidth-detection? + vnstat-configuration-bandwidth-detection-interval + vnstat-configuration-boot-variation + vnstat-configuration-check-disk-space? + vnstat-configuration-create-directories? + vnstat-configuration-daemon-group + vnstat-configuration-daemon-user + vnstat-configuration-daily-days + vnstat-configuration-database-synchronous + vnstat-configuration-database-write-ahead-logging? + vnstat-configuration-hourly-days + vnstat-configuration-log-file + vnstat-configuration-max-bandwidth + vnstat-configuration-max-bw + vnstat-configuration-monthly-months + vnstat-configuration-month-rotate + vnstat-configuration-month-rotate-affects-years? + vnstat-configuration-offline-save-interval + vnstat-configuration-pid-file + vnstat-configuration-poll-interval + vnstat-configuration-rescan-database-on-save? + vnstat-configuration-save-interval + vnstat-configuration-save-on-status-change? + vnstat-configuration-time-sync-wait + vnstat-configuration-top-day-entries + vnstat-configuration-trafficless-entries? + vnstat-configuration-update-file-owner? + vnstat-configuration-update-interval + vnstat-configuration-use-logging + vnstat-configuration-use-utc? + vnstat-configuration-yearly-years + zabbix-server-configuration zabbix-server-service-type zabbix-agent-configuration @@ -196,6 +239,435 @@ (define prometheus-node-exporter-service-type prometheus-node-exporter-shepherd-service))) (default-value (prometheus-node-exporter-configuration)))) + +;;; +;;; vnstat daemon +;;; + +(define* (camelfy-field-name field-name #:key (dromedary? #f)) + (match (string-split (symbol->string field-name) #\-) + ((head tail ...) + (string-join (cons (if dromedary? head (string-upcase head 0 1)) + (map (cut string-upcase <> 0 1) tail)) "")))) + +(define (strip-trailing-?-character field-name) + "Drop rightmost '?' character" + (let ((str (symbol->string field-name))) + (if (string-suffix? "?" str) + (string->symbol (string-drop-right str 1)) + field-name))) + +(define (vnstat-serialize-string field-name value) + #~(format #f "~a ~s~%" + #$(camelfy-field-name field-name) + #$value)) + +(define vnstat-serialize-integer vnstat-serialize-string) + +(define (vnstat-serialize-boolean field-name value) + #~(format #f "~a ~a~%" + #$(camelfy-field-name (strip-trailing-?-character field-name)) + #$(if value 1 0))) + +(define (vnstat-serialize-alist field-name value) + (generic-serialize-alist string-append + (lambda (iface val) + (vnstat-serialize-integer + (format #f "MaxBW~a" iface) val)) + value)) + +(define (vnstat-serialize-user-account field-name value) + (vnstat-serialize-string field-name (user-account-name value))) + +(define (vnstat-serialize-user-group field-name value) + (vnstat-serialize-string field-name (user-group-name value))) + +(define-maybe string (prefix vnstat-)) +(define-maybe integer (prefix vnstat-)) +(define-maybe boolean (prefix vnstat-)) +(define-maybe alist (prefix vnstat-)) +(define-maybe user-account (prefix vnstat-)) +(define-maybe user-group (prefix vnstat-)) + +(define %vnstat-user + (user-account + (name "vnstat") + (group "vnstat") + (system? #t) + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin")))) + +(define %vnstat-group + (user-group + (name "vnstat") + (system? #t))) + +;; Documentation strings from vnstat.conf manpage adapted to texinfo. +;; vnstat checkout: v2.10, commit b3408af1c609aa6265d296cab7bfe59a61d7cf70 +;; Do not reflow these strings or drop the initial \ escape as it makes it +;; harder to diff against the manpage. +(define-configuration vnstat-configuration + (package + (file-like vnstat) + "The vnstat package." + empty-serializer) + + (database-directory + (string "/var/lib/vnstat") + "\ +Specifies the directory where the database is to be stored. +A full path must be given and a leading '/' isn't required." + (serializer + (lambda (_ value) + (vnstat-serialize-string 'database-dir value)))) + + (5-minute-hours + (maybe-integer 48) + "\ +Data retention duration for the 5 minute resolution entries. The configuration +defines for how many past hours entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (64bit-interface-counters + (maybe-integer -2) + "\ +Select interface counter handling. Set to @code{1} for defining that all interfaces +use 64-bit counters on the kernel side and @code{0} for defining 32-bit counter. Set +to @code{-1} for using the old style logic used in earlier versions where counter +values within 32-bits are assumed to be 32-bit and anything larger is assumed to +be a 64-bit counter. This may produce false results if a 64-bit counter is +reset within the 32-bits. Set to @code{-2} for using automatic detection based on +available kernel datastructures.") + + (always-add-new-interfaces? + (maybe-boolean #t) + "\ +Enable or disable automatic creation of new database entries for interfaces not +currently in the database even if the database file already exists when the +daemon is started. New database entries will also get created for new interfaces +seen while the daemon is running. Pseudo interfaces @samp{lo}, @samp{lo0} and @samp{sit0} are always +excluded from getting added.") + + (bandwidth-detection? + (maybe-boolean #t) + "\ +Try to automatically detect +@var{max-bandwidth} +value for each monitored interface. Mostly only ethernet interfaces support +this feature. +@var{max-bandwidth} +will be used as fallback value if detection fails. Any interface specific +@var{max-BW} +configuration will disable the detection for the specified interface. +In Linux, the detection is disabled for tun interfaces due to the +Linux kernel always reporting 10 Mbit regardless of the used real interface.") + + (bandwidth-detection-interval + (maybe-integer 5) + "\ +How often in minutes interface specific detection of +@var{max-bandwidth} +is done for detecting possible changes when +@var{bandwidth-detection} +is enabled. Can be disabled by setting to @code{0}. Value range: @samp{0}..@samp{30}") + + (boot-variation + (maybe-integer 15) + "\ +Time in seconds how much the boot time reported by system kernel can variate +between updates. Value range: @samp{0}..@samp{300}") + + (check-disk-space? + (maybe-boolean #t) + "\ +Enable or disable the availability check of at least some free disk space before +a database write.") + + (create-directories? + (maybe-boolean #t) + "\ +Enable or disable the creation of directories when a configured path doesn't +exist. This includes @var{database-directory}." + (serializer + (lambda (_ value) + (if (maybe-value-set? value) + (vnstat-serialize-boolean 'create-dirs value) "")))) + + ;; Note: Documentation for daemon-group and daemon-user adapted + ;; for user-group and user-account record-types. + (daemon-group + (maybe-user-group %vnstat-group) + "\ +Specify the group to which the daemon process should switch during startup. +Set to @code{%unset-value} to disable group switching.") + + (daemon-user + (maybe-user-account %vnstat-user) + "\ +Specify the user to which the daemon process should switch during startup. +Set to @code{%unset-value} to disable user switching.") + + (daily-days + (maybe-integer 62) + "\ +Data retention duration for the one day resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (database-synchronous + (maybe-integer -1) + "\ +Change the setting of the SQLite \"synchronous\" flag which controls how much +care is taken to ensure disk writes have fully completed when writing data to +the database before continuing other actions. Higher values take extra steps +to ensure data safety at the cost of slower performance. A value of @code{0} will +result in all handling being left to the filesystem itself. Set to @code{-1} to +select the default value according to database mode controlled by +@var{database-write-ahead-logging} +setting. See SQLite documentation for more details regarding values from @code{1} +to @code{3}. Value range: @samp{-1}..@samp{3}") + + (database-write-ahead-logging? + (maybe-boolean #f) + "\ +Enable or disable SQLite Write-Ahead Logging mode for the database. See SQLite +documentation for more details and note that support for read-only operations +isn't available in older SQLite versions.") + + (hourly-days + (maybe-integer 4) + "\ +Data retention duration for the one hour resolution entries. The configuration +defines for how many past days entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (log-file + maybe-string + "\ +Specify log file path and name to be used if @var{use-logging} is set to @code{1}.") + + (max-bandwidth + maybe-integer + "\ +Maximum bandwidth for all interfaces. If the interface specific traffic +exceeds the given value then the data is assumed to be invalid and rejected. +Set to 0 in order to disable the feature. Value range: @samp{0}..@samp{50000}") + + ;; documentation adapted for alist type + (max-bw + maybe-alist + "\ +Same as +@var{max-bandwidth} +but can be used for setting individual limits +for selected interfaces. This is an association list of interfaces +as strings to integer values. For example, +@lisp +(max-bw + `((\"eth0\" . 15000) + (\"ppp0\" . 10000))) +@end lisp +@var{bandwidth-detection} +is disabled on an interface specific level for each +@var{max-bw} +configuration. Value range: @samp{0}..@samp{50000}" + (serializer + (lambda (field-name value) + (if (maybe-value-set? value) + (vnstat-serialize-alist field-name value) "")))) + + (monthly-months + (maybe-integer 25) + "\ +Data retention duration for the one month resolution entries. The configuration +defines for how many past months entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (month-rotate + (maybe-integer 1) + "\ +Day of month that months are expected to change. Usually set to +1 but can be set to alternative values for example for tracking +monthly billed traffic where the billing period doesn't start on +the first day. For example, if set to 7, days of February up to and +including the 6th will count for January. Changing this option will +not cause existing data to be recalculated. Value range: @samp{1}..@samp{28}") + + (month-rotate-affects-years? + (maybe-boolean #f) + "\ +Enable or disable +@var{month-rotate} +also affecting yearly data. Applicable only when +@var{month-rotate} +has a value greater than one.") + + (offline-save-interval + (maybe-integer 30) + "\ +How often in minutes cached interface data is saved to file when all monitored +interfaces are offline. Value range: +@var{save-interval}..@samp{60}") + + (pid-file + (maybe-string "/var/run/vnstat/vnstatd.pid") + "\ +Specify pid file path and name to be used.") + + (poll-interval + (maybe-integer 5) + "\ +How often in seconds interfaces are checked for status changes. +Value range: @samp{2}..@samp{60}") + + (rescan-database-on-save? + maybe-boolean + "\ +Automatically discover added interfaces from the database and start monitoring. +The rescan is done every +@var{save-interval} +or +@var{offline-save-interval} +minutes depending on the current activity state.") + + (save-interval + (maybe-integer 5) + "\ +How often in minutes cached interface data is saved to file. +Value range: ( +@var{update-interval} / 60 )..@samp{60}") + + (save-on-status-change? + (maybe-boolean #t) + "\ +Enable or disable the additional saving to file of cached interface data +when the availability of an interface changes, i.e., when an interface goes +offline or comes online.") + + (time-sync-wait + (maybe-integer 5) + "\ +How many minutes to wait during daemon startup for system clock to sync if +most recent database update appears to be in the future. This may be needed +in systems without a real-time clock (RTC) which require some time after boot +to query and set the correct time. @code{0} = wait disabled. +Value range: @samp{0}..@samp{60}") + + (top-day-entries + (maybe-integer 20) + "\ +Data retention duration for the top day entries. The configuration +defines how many of the past top day entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (trafficless-entries? + (maybe-boolean #t) + "\ +Create database entries even when there is no traffic during the entry's time +period.") + + (update-file-owner? + (maybe-boolean #t) + "\ +Enable or disable the update of file ownership during daemon process startup. +During daemon startup, only database, log and pid files will be modified if the +user or group change feature ( +@var{daemon-user} +or +@var{daemon-group} +) is enabled and the files don't match the requested user or group. During manual +database creation, this option will cause file ownership to be inherited from the +database directory if the directory already exists. This option only has effect +when the process is started as root or via sudo.") + + (update-interval + (maybe-integer 20) + "\ +How often in seconds the interface data is updated. Value range: +@var{poll-interval}..@samp{300}") + + (use-logging + (maybe-integer 2) + "\ +Enable or disable logging. Accepted values are: +@code{0} = disabled, @code{1} = logfile and @code{2} = syslog.") + + (use-utc? + maybe-boolean + "\ +Enable or disable using UTC as timezone in the database for all entries. When +enabled, all entries added to the database will use UTC regardless of the +configured system timezone. When disabled, the configured system timezone +will be used. Changing this setting will not result in already existing +data to be modified." + (serializer + (lambda (_ value) + (if (maybe-value-set? value) + (vnstat-serialize-boolean 'use-UTC value) "")))) + + (yearly-years + (maybe-integer -1) + "\ +Data retention duration for the one year resolution entries. The configuration +defines for how many past years entries will be stored. Set to @code{-1} for +unlimited entries or to @code{0} to disable the data collection of this +resolution.") + + (prefix vnstat-)) + +(define (vnstat-serialize-configuration config) + (mixed-text-file + "vnstat.conf" + (serialize-configuration config vnstat-configuration-fields))) + +(define (vnstat-shepherd-service config) + (let ((config-file (vnstat-serialize-configuration config))) + (match-record config (package pid-file) + (shepherd-service + (documentation "Run vnstatd.") + (requirement `(networking file-systems)) + (provision '(vnstatd)) + (start #~(make-forkexec-constructor + (list #$(file-append package "/sbin/vnstatd") + "--daemon" + "--config" #$config-file) + #:pid-file #$pid-file)) + (stop #~(make-kill-destructor)) + (actions + (list (shepherd-configuration-action config-file) + (shepherd-action + (name 'reload) + (documentation "Reload vnstatd.") + (procedure + #~(lambda (pid) + (if pid + (begin + (kill pid SIGHUP) + (format #t + "Issued SIGHUP to vnstatd (PID ~a)." + pid)) + (format #t "vnstatd is not running."))))))))))) + +(define (vnstat-account-service config) + (match-record config (daemon-group daemon-user) + (filter-map maybe-value (list daemon-group daemon-user)))) + +(define vnstat-service-type + (service-type + (name 'vnstat) + (description "vnStat network-traffic monitor service.") + (extensions + (list (service-extension shepherd-root-service-type + (compose list vnstat-shepherd-service)) + (service-extension account-service-type + vnstat-account-service))) + (default-value (vnstat-configuration)))) + ;;; ;;; Zabbix server base-commit: 3c91f4ca490a7ac56dc0aebbca9c4bf4df201877 -- 2.39.2 From debbugs-submit-bounces@debbugs.gnu.org Thu May 04 20:20:23 2023 Received: (at 60788) by debbugs.gnu.org; 5 May 2023 00:20:23 +0000 Received: from localhost ([127.0.0.1]:52361 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pujBO-0001Nm-IV for submit@debbugs.gnu.org; Thu, 04 May 2023 20:20:23 -0400 Received: from smtpm4.myservices.hosting ([185.26.105.235]:44664) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pujBM-0001Nc-Rn for 60788@debbugs.gnu.org; Thu, 04 May 2023 20:20:21 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpm4.myservices.hosting (Postfix) with ESMTP id A897F20B8B; Fri, 5 May 2023 02:20:19 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 349BA8009A; Fri, 5 May 2023 02:19:26 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-2.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id C2YjvVFtg2Zs; Fri, 5 May 2023 02:19:11 +0200 (CEST) Received: from guix-nuc.home.arpa (unknown [10.192.1.83]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id B750F80060; Fri, 5 May 2023 02:19:10 +0200 (CEST) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v10 3/3] tests: Add vnstat tests. Date: Fri, 5 May 2023 01:18:39 +0100 Message-Id: <2b1c8fa1c767cb2bcdec87109402fc42be17753d.1683245610.git.mirai@makinata.eu> X-Mailer: git-send-email 2.39.2 In-Reply-To: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: ludo@gnu.org, Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/tests/vnstat.scm: New file. * gnu/local.mk: Register it. --- gnu/local.mk | 1 + gnu/tests/vnstat.scm | 159 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 gnu/tests/vnstat.scm diff --git a/gnu/local.mk b/gnu/local.mk index 5f5de953d7..c462c41b9d 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -795,6 +795,7 @@ GNU_SYSTEM_MODULES = \ %D%/tests/version-control.scm \ %D%/tests/virtualization.scm \ %D%/tests/vnc.scm \ + %D%/tests/vnstat.scm \ %D%/tests/web.scm INSTALLER_MODULES = \ diff --git a/gnu/tests/vnstat.scm b/gnu/tests/vnstat.scm new file mode 100644 index 0000000000..d1be98e342 --- /dev/null +++ b/gnu/tests/vnstat.scm @@ -0,0 +1,159 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2023 Bruno Victal . +;;; +;;; 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 tests vnstat) + #:use-module (gnu tests) + #:use-module ((gnu packages networking) #:select (socat vnstat)) + #:use-module (gnu services) + #:use-module (gnu services networking) + #:use-module (gnu services monitoring) + #:use-module (gnu system) + #:use-module (gnu system vm) + #:use-module (guix gexp) + #:use-module (ice-9 format) + #:export (%test-vnstat)) + + +(define (run-vnstat-test) + "Run tests in a vm which has vnstat running." + + (define vnstat-config + (vnstat-configuration + (max-bandwidth 0) + (time-sync-wait 0) + (bandwidth-detection-interval 0))) + + (define inetd-service-entry-config + (inetd-entry + (name "discard") + (socket-type 'stream) + (protocol "tcp") + (wait? #t) + (user "nobody"))) + + (define os + (marionette-operating-system + (simple-operating-system + (service dhcp-client-service-type) + (service vnstat-service-type + vnstat-config) + (service inetd-service-type + (inetd-configuration + (entries + (list inetd-service-entry-config))))) + #:imported-modules '((gnu services herd)))) + + (define forwarded-port 9999) + + (define vm + (let* ((inetd-service-name "discard") + (inetd-service-proto + (inetd-entry-protocol inetd-service-entry-config)) + (guest-port + (servent:port (getservbyname inetd-service-name + inetd-service-proto)))) + (virtual-machine + (operating-system os) + (port-forwardings `((,forwarded-port . ,guest-port)))))) + + ;; The test duration is inconsistent, at times a test may complete under + ;; 2 minutes and at times it may take up to 5 minutes. + (define test-timeout (* 60 5)) + + (define test + (with-imported-modules '((gnu build marionette)) + #~(begin + (use-modules (gnu build marionette) + (srfi srfi-64)) + + (let ((marionette (make-marionette (list #$vm))) + (pid-file #$(vnstat-configuration-pid-file vnstat-config))) + + (test-runner-current (system-test-runner #$output)) + (test-begin "vnstat") + + (test-assert "service is running" + (marionette-eval + '(begin + (use-modules (gnu services herd)) + (start-service 'vnstatd)) + marionette)) + + (test-assert "vnstatd ready" + (wait-for-file pid-file marionette)) + + ;; Pump garbage into the 'discard' inetd service within the vm. + (let* ((socat #$(file-append socat "/bin/socat")) + (dest-addr #$(format #f "TCP4:localhost:~d" + forwarded-port)) + (args `("socat" "-u" "/dev/zero" ,dest-addr)) + ;; XXX: Guile bug (22/03/2023, Guile 3.0.9) + ;; Fixed in main: + ;; FIXME: re-add #:output (%make-void-port "w") below on + ;; next Guile release. + (garbage-pump-pid + (spawn socat args))) + (test-group-with-cleanup "Logging" + ;; To aid debugging, this test returns #t on success + ;; and either #f or 'timed-out otherwise. + (test-eq "vnstatd is logging" + #t + (marionette-eval + '(begin + (use-modules (ice-9 popen) + (ice-9 match) + (sxml simple) + (sxml xpath)) + + (define selector + (let ((xpath '(vnstat interface traffic total))) + (compose (node-pos 1) (sxpath xpath)))) + + (let loop ((i 0)) + (let* ((vnstat #$(file-append vnstat "/bin/vnstat")) + (query-cmd (format #f "~a --xml" vnstat)) + (proc (compose selector xml->sxml)) + (result + (call-with-port + (open-input-pipe query-cmd) proc))) + (match result + ;; Counter still warming up. + ((('total ('rx "0") ('tx "0"))) + (sleep 1) + (if (< i #$test-timeout) + (loop (+ i 1)) + 'timed-out)) + ;; Count of bytes on iface was non-zero. + ((('total ('rx rx) ('tx tx))) + #t) + ;; Unknown data encountered, perhaps the + ;; data format changed? + (_ #f))))) + marionette)) + ;; Cleanup: shutdown garbage pump. + (kill garbage-pump-pid SIGTERM))) + + (test-end))))) + + (gexp->derivation "vnstat-test" test)) + +(define %test-vnstat + (system-test + (name "vnstat") + (description "Basic tests for vnstat service.") + (value (run-vnstat-test)))) -- 2.39.2 From debbugs-submit-bounces@debbugs.gnu.org Thu May 04 20:36:16 2023 Received: (at 60788) by debbugs.gnu.org; 5 May 2023 00:36:16 +0000 Received: from localhost ([127.0.0.1]:52375 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pujQm-0001po-Ei for submit@debbugs.gnu.org; Thu, 04 May 2023 20:36:16 -0400 Received: from smtpm3.myservices.hosting ([185.26.105.234]:42144) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1pujQj-0001pc-6n for 60788@debbugs.gnu.org; Thu, 04 May 2023 20:36:14 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpm3.myservices.hosting (Postfix) with ESMTP id 88B4820FA1; Fri, 5 May 2023 02:36:11 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 6377380098; Fri, 5 May 2023 02:19:03 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at mail1.netim.hosting Received: from mail1.netim.hosting ([127.0.0.1]) by localhost (mail1-2.netim.hosting [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id q2ScEfx3tQTs; Fri, 5 May 2023 02:19:01 +0200 (CEST) Received: from guix-nuc.home.arpa (unknown [10.192.1.83]) (Authenticated sender: lumen@makinata.eu) by mail1.netim.hosting (Postfix) with ESMTPSA id D976B80060; Fri, 5 May 2023 02:19:00 +0200 (CEST) From: Bruno Victal To: 60788@debbugs.gnu.org Subject: [PATCH v10 2/3] services: inetd: Export accessors. Date: Fri, 5 May 2023 01:18:38 +0100 Message-Id: <0053c04412e34c5f9a6a28acc87560be8b8e6ff9.1683245610.git.mirai@makinata.eu> X-Mailer: git-send-email 2.39.2 In-Reply-To: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 60788 Cc: ludo@gnu.org, Bruno Victal , maxim.cournoyer@gmail.com X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) * gnu/services/networking.scm: Export inetd-configuration?, inetd-configuration-program, inetd-configuration-entries, inetd-entry?, inetd-entry-node, inetd-entry-name, inetd-entry-socket-type, inetd-entry-protocol, inetd-entry-wait?, inetd-entry-user, inetd-entry-program and inetd-entry-arguments. --- gnu/services/networking.scm | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gnu/services/networking.scm b/gnu/services/networking.scm index 866368aa90..554ab18234 100644 --- a/gnu/services/networking.scm +++ b/gnu/services/networking.scm @@ -121,7 +121,19 @@ (define-module (gnu services networking) openntpd-service-type inetd-configuration + inetd-configuration? + inetd-configuration-program + inetd-configuration-entries inetd-entry + inetd-entry? + inetd-entry-node + inetd-entry-name + inetd-entry-socket-type + inetd-entry-protocol + inetd-entry-wait? + inetd-entry-user + inetd-entry-program + inetd-entry-arguments inetd-service-type opendht-configuration -- 2.39.2 From debbugs-submit-bounces@debbugs.gnu.org Thu May 11 10:33:57 2023 Received: (at 60788-done) by debbugs.gnu.org; 11 May 2023 14:33:57 +0000 Received: from localhost ([127.0.0.1]:53107 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1px7Mi-0002a1-NU for submit@debbugs.gnu.org; Thu, 11 May 2023 10:33:56 -0400 Received: from eggs.gnu.org ([209.51.188.92]:33116) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1px7Mg-0002Zp-Ff for 60788-done@debbugs.gnu.org; Thu, 11 May 2023 10:33:55 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1px7Ma-0001Bx-FG; Thu, 11 May 2023 10:33:48 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:In-Reply-To:Date:References:Subject:To: From; bh=pS7OiTX2XkjzIuT+aDKariIlN2zaJvGLHmLeMU9v010=; b=KYfAYabLxlNYoTpve6PK ovWj189/k6Uw8vEHWO7uBLEcUBKveuKbbmHLBX0xhLuBBuZ9oCQY824x7jfUV4eZXB3TRjJC/cOFL sfWgmUe2sGCVl248/3cnLF01iVYNjeb22g2feqIu37vdza2keqlAKIBGjnSLHCzDKO17X15U2OBKA /ZjvDTdpPdz3ekb+tM17+tE5BDgi6JFUOe6IVvIKEE7ACqyX3RKIKOm6JnZXYGu9nMVzkLLJ68pkJ SSK1TjAYPRfMjCVFiDaSpU4iwj8UrUwOUW0mVrNlSv5gNcpLlPZHUf1NBs6ghVxSJIGYQMs4ScC4T SoiAqU+bqr26AQ==; Received: from 91-160-117-201.subs.proxad.net ([91.160.117.201] helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1px7Ma-00045Q-32; Thu, 11 May 2023 10:33:48 -0400 From: =?utf-8?Q?Ludovic_Court=C3=A8s?= To: Bruno Victal Subject: Re: [PATCH v10 1/3] services: Add vnstat-service-type. References: <95b646eb6b23dec213cba43b6e4e7ddc4a601d0f.1673640404.git.mirai@makinata.eu> <4e67d41880a44306c5b5d0a39c776083c180cd15.1683245610.git.mirai@makinata.eu> X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: Duodi 22 =?utf-8?Q?Flor=C3=A9al?= an 231 de la =?utf-8?Q?R=C3=A9volution=2C?= jour de la Fritillaire X-PGP-Key-ID: 0x090B11993D9AEBB5 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu Date: Thu, 11 May 2023 16:33:45 +0200 In-Reply-To: <4e67d41880a44306c5b5d0a39c776083c180cd15.1683245610.git.mirai@makinata.eu> (Bruno Victal's message of "Fri, 5 May 2023 01:18:37 +0100") Message-ID: <87cz372b06.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 60788-done Cc: maxim.cournoyer@gmail.com, 60788-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) Hi, Bruno Victal skribis: > * gnu/services/monitoring.scm (vnstat-service-type): New variable. > * doc/guix.texi (Monitoring Services): Document it. [...] > * gnu/tests/vnstat.scm: New file. > * gnu/local.mk: Register it. [...] > * gnu/services/networking.scm: Export inetd-configuration?, > inetd-configuration-program, inetd-configuration-entries, inetd-entry?, > inetd-entry-node, inetd-entry-name, inetd-entry-socket-type, > inetd-entry-protocol, inetd-entry-wait?, inetd-entry-user, inetd-entry-pr= ogram > and inetd-entry-arguments. Applied all three patches. Pheww, that was a long ride! Thanks for your patience and for your quality work! Ludo=E2=80=99. From unknown Tue Aug 19 23:11:52 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Fri, 09 Jun 2023 11:24:13 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator