From patchwork Sun Jul 16 18:29:50 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bruno Victal X-Patchwork-Id: 51740 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 6D13927BBE9; Sun, 16 Jul 2023 19:31:09 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00,MAILING_LIST_MULTI, SPF_HELO_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id 6B43E27BBE2 for ; Sun, 16 Jul 2023 19:31:07 +0100 (BST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qL6WN-0005lG-SL; Sun, 16 Jul 2023 14:31:03 -0400 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 1qL6WM-0005jk-Gp for guix-patches@gnu.org; Sun, 16 Jul 2023 14:31:02 -0400 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qL6WM-0007KC-8m for guix-patches@gnu.org; Sun, 16 Jul 2023 14:31:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qL6WM-0000oF-3s for guix-patches@gnu.org; Sun, 16 Jul 2023 14:31:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#64669] [PATCH 1/2] Revert "services: Add ddclient service." Resent-From: Bruno Victal Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 16 Jul 2023 18:31:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 64669 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 64669@debbugs.gnu.org Cc: Bruno Victal Received: via spool by 64669-submit@debbugs.gnu.org id=B64669.16895322042963 (code B ref 64669); Sun, 16 Jul 2023 18:31:02 +0000 Received: (at 64669) by debbugs.gnu.org; 16 Jul 2023 18:30:04 +0000 Received: from localhost ([127.0.0.1]:48544 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qL6VO-0000lZ-Pk for submit@debbugs.gnu.org; Sun, 16 Jul 2023 14:30:04 -0400 Received: from smtpm2.myservices.hosting ([185.26.105.233]:38172) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qL6VL-0000kp-SF for 64669@debbugs.gnu.org; Sun, 16 Jul 2023 14:30:00 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpm2.myservices.hosting (Postfix) with ESMTP id EF06121154 for <64669@debbugs.gnu.org>; Sun, 16 Jul 2023 20:29:58 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 442168009D; Sun, 16 Jul 2023 20:29:58 +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 gMyefFQyYPm1; Sun, 16 Jul 2023 20:29:57 +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 64CD88009A; Sun, 16 Jul 2023 20:29:57 +0200 (CEST) From: Bruno Victal Date: Sun, 16 Jul 2023 19:29:50 +0100 Message-Id: <683dc606aeb902eb572cbf7893f54dd7e39da229.1689532167.git.mirai@makinata.eu> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org X-getmail-retrieved-from-mailbox: Patches ddclient is unmaintained as of 2023-07-04 [1] and this service has been broken for a while [2]. Remove it rather than shipping a broken service for an unmaintained program that's unlikely to be fixed. [1]: [2]: This reverts commit 8490a8346b5c8207f5798be55bea1de865b0bd42. --- doc/guix.texi | 107 --------------------------- gnu/services/dns.scm | 168 +------------------------------------------ 2 files changed, 1 insertion(+), 274 deletions(-) base-commit: 796c823a0d1d0aec9f4af908eca462e58e5675b5 diff --git a/doc/guix.texi b/doc/guix.texi index 9af1b4417b..6467b09ff4 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -32383,113 +32383,6 @@ DNS Services @end table @end deftp -@subsubheading ddclient Service - -@cindex ddclient -The ddclient service described below runs the ddclient daemon, which takes -care of automatically updating DNS entries for service providers such as -@uref{https://dyn.com/dns/, Dyn}. - -The following example show instantiates the service with its default -configuration: - -@lisp -(service ddclient-service-type) -@end lisp - -Note that ddclient needs to access credentials that are stored in a -@dfn{secret file}, by default @file{/etc/ddclient/secrets} (see -@code{secret-file} below). You are expected to create this file manually, in -an ``out-of-band'' fashion (you @emph{could} make this file part of the -service configuration, for instance by using @code{plain-file}, but it will be -world-readable @i{via} @file{/gnu/store}). See the examples in the -@file{share/ddclient} directory of the @code{ddclient} package. - -@c %start of fragment - -Available @code{ddclient-configuration} fields are: - -@deftypevr {@code{ddclient-configuration} parameter} package ddclient -The ddclient package. - -@end deftypevr - -@deftypevr {@code{ddclient-configuration} parameter} integer daemon -The period after which ddclient will retry to check IP and domain name. - -Defaults to @samp{300}. - -@end deftypevr - -@deftypevr {@code{ddclient-configuration} parameter} boolean syslog -Use syslog for the output. - -Defaults to @samp{#t}. - -@end deftypevr - -@deftypevr {@code{ddclient-configuration} parameter} string mail -Mail to user. - -Defaults to @samp{"root"}. - -@end deftypevr - -@deftypevr {@code{ddclient-configuration} parameter} string mail-failure -Mail failed update to user. - -Defaults to @samp{"root"}. - -@end deftypevr - -@deftypevr {@code{ddclient-configuration} parameter} string pid -The ddclient PID file. - -Defaults to @samp{"/var/run/ddclient/ddclient.pid"}. - -@end deftypevr - -@deftypevr {@code{ddclient-configuration} parameter} boolean ssl -Enable SSL support. - -Defaults to @samp{#t}. - -@end deftypevr - -@deftypevr {@code{ddclient-configuration} parameter} string user -Specifies the user name or ID that is used when running ddclient -program. - -Defaults to @samp{"ddclient"}. - -@end deftypevr - -@deftypevr {@code{ddclient-configuration} parameter} string group -Group of the user who will run the ddclient program. - -Defaults to @samp{"ddclient"}. - -@end deftypevr - -@deftypevr {@code{ddclient-configuration} parameter} string secret-file -Secret file which will be appended to @file{ddclient.conf} file. This -file contains credentials for use by ddclient. You are expected to -create it manually. - -Defaults to @samp{"/etc/ddclient/secrets.conf"}. - -@end deftypevr - -@deftypevr {@code{ddclient-configuration} parameter} list extra-options -Extra options will be appended to @file{ddclient.conf} file. - -Defaults to @samp{'()}. - -@end deftypevr - - -@c %end of fragment - @node VNC Services @subsection VNC Services @cindex VNC (virtual network computing) diff --git a/gnu/services/dns.scm b/gnu/services/dns.scm index f45fc99c69..6608046909 100644 --- a/gnu/services/dns.scm +++ b/gnu/services/dns.scm @@ -1,6 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Julien Lepiller -;;; Copyright © 2018 Oleg Pykhalov ;;; Copyright © 2020 Pierre Langlois ;;; Copyright © 2021 Maxime Devos ;;; Copyright © 2022 Remco van 't Veer @@ -53,10 +52,7 @@ (define-module (gnu services dns) knot-resolver-configuration dnsmasq-service-type - dnsmasq-configuration - - ddclient-service-type - ddclient-configuration)) + dnsmasq-configuration)) ;;; ;;; Knot DNS. @@ -901,165 +897,3 @@ (define dnsmasq-service-type dnsmasq-activation))) (default-value (dnsmasq-configuration)) (description "Run the dnsmasq DNS server."))) - - -;;; -;;; ddclient -;;; - -(define (uglify-field-name field-name) - (string-delete #\? (symbol->string field-name))) - -(define (serialize-field field-name val) - (when (not (member field-name '(group secret-file user))) - (format #t "~a=~a\n" (uglify-field-name field-name) val))) - -(define (serialize-boolean field-name val) - (serialize-field field-name (if val "yes" "no"))) - -(define (serialize-integer field-name val) - (serialize-field field-name (number->string val))) - -(define (serialize-string field-name val) - (if (and (string? val) (string=? val "")) - "" - (serialize-field field-name val))) - -(define (serialize-list field-name val) - (if (null? val) "" (serialize-field field-name (string-join val)))) - -(define (serialize-extra-options extra-options) - (string-join extra-options "\n" 'suffix)) - -(define-configuration ddclient-configuration - (ddclient - (file-like ddclient) - "The ddclient package.") - (daemon - (integer 300) - "The period after which ddclient will retry to check IP and domain name.") - (syslog - (boolean #t) - "Use syslog for the output.") - (mail - (string "root") - "Mail to user.") - (mail-failure - (string "root") - "Mail failed update to user.") - (pid - (string "/var/run/ddclient/ddclient.pid") - "The ddclient PID file.") - (ssl - (boolean #t) - "Enable SSL support.") - (user - (string "ddclient") - "Specifies the user name or ID that is used when running ddclient -program.") - (group - (string "ddclient") - "Group of the user who will run the ddclient program.") - (secret-file - (string "/etc/ddclient/secrets.conf") - "Secret file which will be appended to @file{ddclient.conf} file. This -file contains credentials for use by ddclient. You are expected to create it -manually.") - (extra-options - (list '()) - "Extra options will be appended to @file{ddclient.conf} file.")) - -(define (ddclient-account config) - "Return the user accounts and user groups for CONFIG." - (let ((ddclient-user (ddclient-configuration-user config)) - (ddclient-group (ddclient-configuration-group config))) - (list (user-group - (name ddclient-group) - (system? #t)) - (user-account - (name ddclient-user) - (system? #t) - (group ddclient-group) - (comment "ddclientd privilege separation user") - (home-directory (string-append "/var/run/" ddclient-user)))))) - -(define (ddclient-activation config) - "Return the activation GEXP for CONFIG." - (with-imported-modules '((guix build utils)) - #~(begin - (use-modules (guix build utils) - (ice-9 rdelim)) - (let ((ddclient-user - (passwd:uid (getpw #$(ddclient-configuration-user config)))) - (ddclient-group - (passwd:gid (getpw #$(ddclient-configuration-group config)))) - (ddclient-secret-file - #$(ddclient-configuration-secret-file config))) - ;; 'ddclient' complains about ddclient.conf file permissions, which - ;; rules out /gnu/store. Thus we copy the ddclient.conf to /etc. - (for-each (lambda (dir) - (mkdir-p dir) - (chmod dir #o700) - (chown dir ddclient-user ddclient-group)) - '("/var/cache/ddclient" "/var/run/ddclient" - "/etc/ddclient")) - (with-output-to-file "/etc/ddclient/ddclient.conf" - (lambda () - (display - (string-append - "# Generated by 'ddclient-service'.\n\n" - #$(with-output-to-string - (lambda () - (serialize-configuration config - ddclient-configuration-fields))) - (if (string-null? ddclient-secret-file) - "" - (format #f "\n\n# Appended from '~a'.\n\n~a" - ddclient-secret-file - (with-input-from-file ddclient-secret-file - read-string))))))) - (chmod "/etc/ddclient/ddclient.conf" #o600) - (chown "/etc/ddclient/ddclient.conf" - ddclient-user ddclient-group))))) - -(define (ddclient-shepherd-service config) - "Return a for ddclient with CONFIG." - (let ((ddclient (ddclient-configuration-ddclient config)) - (ddclient-pid (ddclient-configuration-pid config)) - (ddclient-user (ddclient-configuration-user config)) - (ddclient-group (ddclient-configuration-group config))) - (list (shepherd-service - (provision '(ddclient)) - (documentation "Run ddclient daemon.") - (start #~(make-forkexec-constructor - (list #$(file-append ddclient "/bin/ddclient") - "-foreground" - "-file" "/etc/ddclient/ddclient.conf") - #:pid-file #$ddclient-pid - #:environment-variables - (list "SSL_CERT_DIR=/run/current-system/profile\ -/etc/ssl/certs" - "SSL_CERT_FILE=/run/current-system/profile\ -/etc/ssl/certs/ca-certificates.crt") - #:user #$ddclient-user - #:group #$ddclient-group)) - (stop #~(make-kill-destructor)))))) - -(define ddclient-service-type - (service-type - (name 'ddclient) - (extensions - (list (service-extension account-service-type - ddclient-account) - (service-extension shepherd-root-service-type - ddclient-shepherd-service) - (service-extension activation-service-type - ddclient-activation))) - (default-value (ddclient-configuration)) - (description "Configure address updating utility for dynamic DNS services, -ddclient."))) - -(define (generate-ddclient-documentation) - (generate-documentation - `((ddclient-configuration ,ddclient-configuration-fields)) - 'ddclient-configuration)) From patchwork Sun Jul 16 18:29:51 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bruno Victal X-Patchwork-Id: 51741 Return-Path: X-Original-To: patchwork@mira.cbaines.net Delivered-To: patchwork@mira.cbaines.net Received: by mira.cbaines.net (Postfix, from userid 113) id 9A50F27BBE9; Sun, 16 Jul 2023 19:31:14 +0100 (BST) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on mira.cbaines.net X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00,MAILING_LIST_MULTI, SPF_HELO_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mira.cbaines.net (Postfix) with ESMTPS id 3406727BBE2 for ; Sun, 16 Jul 2023 19:31:12 +0100 (BST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qL6WO-0005lH-78; Sun, 16 Jul 2023 14:31:04 -0400 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 1qL6WM-0005l3-Tb for guix-patches@gnu.org; Sun, 16 Jul 2023 14:31:02 -0400 Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qL6WM-0007KM-Kl for guix-patches@gnu.org; Sun, 16 Jul 2023 14:31:02 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qL6WM-0000oM-H7 for guix-patches@gnu.org; Sun, 16 Jul 2023 14:31:02 -0400 X-Loop: help-debbugs@gnu.org Subject: [bug#64669] [PATCH 2/2] Revert "gnu: Add ddclient." Resent-From: Bruno Victal Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Sun, 16 Jul 2023 18:31:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 64669 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 64669@debbugs.gnu.org Cc: Bruno Victal Received: via spool by 64669-submit@debbugs.gnu.org id=B64669.16895322153057 (code B ref 64669); Sun, 16 Jul 2023 18:31:02 +0000 Received: (at 64669) by debbugs.gnu.org; 16 Jul 2023 18:30:15 +0000 Received: from localhost ([127.0.0.1]:48547 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qL6Va-0000nE-FP for submit@debbugs.gnu.org; Sun, 16 Jul 2023 14:30:15 -0400 Received: from smtpmciv4.myservices.hosting ([185.26.107.240]:46858) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qL6VX-0000n4-Ri for 64669@debbugs.gnu.org; Sun, 16 Jul 2023 14:30:12 -0400 Received: from mail1.netim.hosting (unknown [185.26.106.173]) by smtpmciv4.myservices.hosting (Postfix) with ESMTP id 3349420CE6 for <64669@debbugs.gnu.org>; Sun, 16 Jul 2023 20:30:10 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by mail1.netim.hosting (Postfix) with ESMTP id 803DA8009B; Sun, 16 Jul 2023 20:30:10 +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 TxQNQGwf2jvc; Sun, 16 Jul 2023 20:30:09 +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 E3B128009A; Sun, 16 Jul 2023 20:30:08 +0200 (CEST) From: Bruno Victal Date: Sun, 16 Jul 2023 19:29:51 +0100 Message-Id: X-Mailer: git-send-email 2.40.1 In-Reply-To: References: MIME-Version: 1.0 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org Sender: guix-patches-bounces+patchwork=mira.cbaines.net@gnu.org X-getmail-retrieved-from-mailbox: Patches ddclient is unmaintained as of 2023-07-04 [1]. This reverts commit 0bc2d3e42b8800e875f24973f999739297f1f502. [1]: --- gnu/packages/dns.scm | 71 ++------------------------------------------ 1 file changed, 2 insertions(+), 69 deletions(-) diff --git a/gnu/packages/dns.scm b/gnu/packages/dns.scm index 9879998776..adbb1c9439 100644 --- a/gnu/packages/dns.scm +++ b/gnu/packages/dns.scm @@ -9,7 +9,7 @@ ;;; Copyright © 2016, 2020 Marius Bakke ;;; Copyright © 2017 Vasile Dumitrascu ;;; Copyright © 2017 Gregor Giesen -;;; Copyright © 2018, 2022 Oleg Pykhalov +;;; Copyright © 2022 Oleg Pykhalov ;;; Copyright © 2019 Mathieu Othacehe ;;; Copyright © 2019 Chris Marusich ;;; Copyright © 2019 Rutger Helling @@ -91,8 +91,7 @@ (define-module (gnu packages dns) #:use-module (guix build-system copy) #:use-module (guix build-system glib-or-gtk) #:use-module (guix build-system gnu) - #:use-module (guix build-system meson) - #:use-module (guix build-system trivial)) + #:use-module (guix build-system meson)) (define-public cloudflare-cli (let ((commit "2d986d3ec1b0e3158c4bd40e8918947cb74aa392") @@ -1069,72 +1068,6 @@ (define-public knot-resolver license:cc0 license:lgpl2.0)))) -(define-public ddclient - (package - (name "ddclient") - (version "3.10.0") - (source - (origin - (method git-fetch) - (uri (git-reference - (url "https://github.com/ddclient/ddclient") - (commit (string-append "v" version)))) - (file-name (git-file-name name version)) - (sha256 - (base32 "0l87d72apwrg6ipc9gix5gv64d4hr1ykxmss8x4r8d8mgj6j8rf1")) - (modules '((guix build utils))) - (snippet - ;; XXX: erroneous version value, this is fixed in master - #~(begin - (substitute* "configure.ac" - (("3.10.0_2") #$version)))) - (patches (search-patches "ddclient-skip-test.patch")))) - (build-system gnu-build-system) - (native-inputs - (list autoconf automake libtool - perl-test-warnings perl-test-mockmodule)) - (inputs - (list inetutils ; logger - net-tools - bash-minimal ;for 'wrap-program' - perl - perl-digest-sha1 - perl-io-socket-ssl - perl-io-socket-inet6 ;; XXX: this is likely to be removed in a future ddclient release - ;; https://github.com/ddclient/ddclient/issues/461 - perl-json)) - (arguments - (list - #:configure-flags #~(list "--localstatedir=/var") - #:phases - #~(modify-phases %standard-phases - (replace 'install - (lambda _ - ;; XXX: Do not create /var - (invoke "make" "localstatedir=/tmp/discard" "install"))) - (add-after 'wrap 'wrap-ddclient - (lambda* (#:key inputs #:allow-other-keys) - (wrap-program (string-append #$output "/bin/ddclient") - `("PERL5LIB" ":" prefix ,(string-split (getenv "PERL5LIB") #\:)) - `("PATH" prefix ,(map (lambda (x) - (string-append (assoc-ref inputs x) "/bin")) - '("inetutils" "net-tools"))))))))) - (native-search-paths - (list $SSL_CERT_DIR $SSL_CERT_FILE)) - (home-page "https://ddclient.net/") - (synopsis "Address updating utility for dynamic DNS services") - (description "This package provides a client to update dynamic IP -addresses with several dynamic DNS service providers, such as -@uref{https://www.dyndns.com/account/login.html,DynDNS.com}. - -This makes it possible to use a fixed hostname (such as myhost.dyndns.org) to -access a machine with a dynamic IP address. - -The client supports both dynamic and (near) static services, as well as MX -record and alternative name management. It caches the address, and only -attempts the update when it has changed.") - (license license:gpl2+))) - (define-public hnsd (package (name "hnsd")