From patchwork Fri Jul 10 16:39:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Mitchell X-Patchwork-Id: 11657113 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4889E13B4 for ; Fri, 10 Jul 2020 16:39:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2F0092078B for ; Fri, 10 Jul 2020 16:39:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="DBoLW6Hl" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726942AbgGJQjU (ORCPT ); Fri, 10 Jul 2020 12:39:20 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:52481 "EHLO us-smtp-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726920AbgGJQjU (ORCPT ); Fri, 10 Jul 2020 12:39:20 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594399159; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7cV6ZwytJy9ukH+GFGjzRhyoRphGRe/Q6NSvOCB+KPI=; b=DBoLW6Hlnxt9x9Jp9AWiOcGmDr1X5L0E8XJOuzsSDawJLxUDpaxDZXAKKMny4Cnwhv9oyn afr4kfwo2qPpk6u3q8TdOW6GgMmQlOokiSk8fqQOY4bgIqlC9HDS9gLRlMCha5BPH3B3lL lpJTr+RXcbd1L3Wp5jfE1hoeaFsfHoI= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-319-6PaaxWd_MQyoa2y3C6JRKw-1; Fri, 10 Jul 2020 12:39:17 -0400 X-MC-Unique: 6PaaxWd_MQyoa2y3C6JRKw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 968DD1015DA7 for ; Fri, 10 Jul 2020 16:39:16 +0000 (UTC) Received: from ovpn-112-86.ams2.redhat.com (ovpn-112-86.ams2.redhat.com [10.36.112.86]) by smtp.corp.redhat.com (Postfix) with ESMTPS id BAB7B60E1C; Fri, 10 Jul 2020 16:39:15 +0000 (UTC) Message-ID: <21c590d9d1064ed7940322b688f3da3e0e1094a4.camel@redhat.com> Subject: [PATCH 1/4] nfs-utils: Factor out common structure cleanup calls From: Alice Mitchell To: Linux NFS Mailing list Cc: Steve Dickson Date: Fri, 10 Jul 2020 17:39:13 +0100 In-Reply-To: <5a84777afb9ed8c866841471a1a7e3c9b295604d.camel@redhat.com> References: <5a84777afb9ed8c866841471a1a7e3c9b295604d.camel@redhat.com> Mime-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org support/nfs/conffile.c | 84 +++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c index 3d13610e..aea35917 100644 --- a/support/nfs/conffile.c +++ b/support/nfs/conffile.c @@ -128,6 +128,39 @@ conf_hash(const char *s) return hash; } +/* + * free all the component parts of a conf_binding struct + */ +static void free_confbind(struct conf_binding *cb) +{ + if (!cb) + return; + if (cb->section) + free(cb->section); + if (cb->arg) + free(cb->arg); + if (cb->tag) + free(cb->tag); + if (cb->value) + free(cb->value); + free(cb); +} + +static void free_conftrans(struct conf_trans *ct) +{ + if (!ct) + return; + if (ct->section) + free(ct->section); + if (ct->arg) + free(ct->arg); + if (ct->tag) + free(ct->tag); + if (ct->value) + free(ct->value); + free(ct); +} + /* * Insert a tag-value combination from LINE (the equal sign is at POS) */ @@ -143,11 +176,7 @@ conf_remove_now(const char *section, const char *tag) && strcasecmp(cb->tag, tag) == 0) { LIST_REMOVE(cb, link); xlog(LOG_INFO,"[%s]:%s->%s removed", section, tag, cb->value); - free(cb->section); - free(cb->arg); - free(cb->tag); - free(cb->value); - free(cb); + free_confbind(cb); return 0; } } @@ -167,11 +196,7 @@ conf_remove_section_now(const char *section) unseen = 0; LIST_REMOVE(cb, link); xlog(LOG_INFO, "[%s]:%s->%s removed", section, cb->tag, cb->value); - free(cb->section); - free(cb->arg); - free(cb->tag); - free(cb->value); - free(cb); + free_confbind(cb); } } return unseen; @@ -567,11 +592,7 @@ static void conf_free_bindings(void) for (; cb; cb = next) { next = LIST_NEXT(cb, link); LIST_REMOVE(cb, link); - free(cb->section); - free(cb->arg); - free(cb->tag); - free(cb->value); - free(cb); + free_confbind(cb); } LIST_INIT(&conf_bindings[i]); } @@ -635,11 +656,7 @@ conf_cleanup(void) for (node = TAILQ_FIRST(&conf_trans_queue); node; node = next) { next = TAILQ_NEXT(node, link); TAILQ_REMOVE (&conf_trans_queue, node, link); - if (node->section) free(node->section); - if (node->arg) free(node->arg); - if (node->tag) free(node->tag); - if (node->value) free(node->value); - free (node); + free_conftrans(node); } TAILQ_INIT(&conf_trans_queue); } @@ -1005,14 +1022,7 @@ conf_set(int transaction, const char *section, const char *arg, return 0; fail: - if (node->tag) - free(node->tag); - if (node->arg) - free(node->arg); - if (node->section) - free(node->section); - if (node) - free(node); + free_conftrans(node); return 1; } @@ -1038,10 +1048,7 @@ conf_remove(int transaction, const char *section, const char *tag) return 0; fail: - if (node && node->section) - free (node->section); - if (node) - free (node); + free_conftrans(node); return 1; } @@ -1062,8 +1069,7 @@ conf_remove_section(int transaction, const char *section) return 0; fail: - if (node) - free(node); + free_conftrans(node); return 1; } @@ -1094,15 +1100,7 @@ conf_end(int transaction, int commit) } } TAILQ_REMOVE (&conf_trans_queue, node, link); - if (node->section) - free(node->section); - if (node->arg) - free(node->arg); - if (node->tag) - free(node->tag); - if (node->value) - free(node->value); - free (node); + free_conftrans(node); } } return 0; From patchwork Fri Jul 10 16:40:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Mitchell X-Patchwork-Id: 11657119 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DEEB813BD for ; Fri, 10 Jul 2020 16:40:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C0D66206A1 for ; Fri, 10 Jul 2020 16:40:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="R41cSO8l" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727771AbgGJQkn (ORCPT ); Fri, 10 Jul 2020 12:40:43 -0400 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:47145 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727818AbgGJQkn (ORCPT ); Fri, 10 Jul 2020 12:40:43 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594399241; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=J7A2MQSehuvbyagUfsvEZPpgeGThLTCrn7SXwFpoK6k=; b=R41cSO8l8M5Xtz3GEhILlR/q8TAjyrxEV/A8nR2C4AFFVxLVKyMhCwDTQXmQXQvIzZbP3g e888Ta9hX2YTOcpAgEgtv+SFgFF6ynBMvEpE+tjqZ4QMMKlapq1oHiDv8bUwKpiEEv9jm9 Eelvoh8Z7RijowKrxO9oz03VkdE/Hzk= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-313-5h-dKMP0NaqDV5kM62hYiw-1; Fri, 10 Jul 2020 12:40:39 -0400 X-MC-Unique: 5h-dKMP0NaqDV5kM62hYiw-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 0A2821015DA1 for ; Fri, 10 Jul 2020 16:40:39 +0000 (UTC) Received: from ovpn-112-86.ams2.redhat.com (ovpn-112-86.ams2.redhat.com [10.36.112.86]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 30645610F3; Fri, 10 Jul 2020 16:40:37 +0000 (UTC) Message-ID: <27c44cad99aacd597e498a434046c5f340d98d42.camel@redhat.com> Subject: [PATCH 2/4] nfs-utils: Enable the retrieval of raw config settings without expansion From: Alice Mitchell To: Linux NFS Mailing list Cc: Steve Dickson Date: Fri, 10 Jul 2020 17:40:36 +0100 In-Reply-To: <5a84777afb9ed8c866841471a1a7e3c9b295604d.camel@redhat.com> References: <5a84777afb9ed8c866841471a1a7e3c9b295604d.camel@redhat.com> Mime-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org Config entries sometimes contain variable expansions, this adds options to retrieve the config entry rather than its current expanded value. --- support/include/conffile.h | 1 + support/nfs/conffile.c | 23 +++++++++++++++++++++++ tools/nfsconf/nfsconfcli.c | 22 ++++++++++++++++------ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/support/include/conffile.h b/support/include/conffile.h index 7d974fe9..c4a3ca62 100644 --- a/support/include/conffile.h +++ b/support/include/conffile.h @@ -61,6 +61,7 @@ extern _Bool conf_get_bool(const char *, const char *, _Bool); extern char *conf_get_str(const char *, const char *); extern char *conf_get_str_with_def(const char *, const char *, char *); extern char *conf_get_section(const char *, const char *, const char *); +extern char *conf_get_entry(const char *, const char *, const char *); extern int conf_init_file(const char *); extern void conf_cleanup(void); extern int conf_match_num(const char *, const char *, int); diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c index aea35917..cbeef10d 100644 --- a/support/nfs/conffile.c +++ b/support/nfs/conffile.c @@ -752,6 +752,29 @@ conf_get_str_with_def(const char *section, const char *tag, char *def) return result; } +/* + * Retrieve an entry without interpreting its contents + */ +char * +conf_get_entry(const char *section, const char *arg, const char *tag) +{ + struct conf_binding *cb; + + cb = LIST_FIRST (&conf_bindings[conf_hash (section)]); + for (; cb; cb = LIST_NEXT (cb, link)) { + if (strcasecmp(section, cb->section) != 0) + continue; + if (arg && (cb->arg == NULL || strcasecmp(arg, cb->arg) != 0)) + continue; + if (!arg && cb->arg) + continue; + if (strcasecmp(tag, cb->tag) != 0) + continue; + return cb->value; + } + return 0; +} + /* * Find a section that may or may not have an argument */ diff --git a/tools/nfsconf/nfsconfcli.c b/tools/nfsconf/nfsconfcli.c index 361d386e..b2ef96d1 100644 --- a/tools/nfsconf/nfsconfcli.c +++ b/tools/nfsconf/nfsconfcli.c @@ -11,6 +11,7 @@ typedef enum { MODE_NONE, MODE_GET, + MODE_ENTRY, MODE_ISSET, MODE_DUMP, MODE_SET, @@ -30,6 +31,8 @@ static void usage(const char *name) fprintf(stderr, " Outputs the configuration to the named file\n"); fprintf(stderr, " --get [--arg subsection] {section} {tag}\n"); fprintf(stderr, " Output one specific config value\n"); + fprintf(stderr, " --entry [--arg subsection] {section} {tag}\n"); + fprintf(stderr, " Output the uninterpreted config entry\n"); fprintf(stderr, " --isset [--arg subsection] {section} {tag}\n"); fprintf(stderr, " Return code indicates if config value is present\n"); fprintf(stderr, " --set [--arg subsection] {section} {tag} {value}\n"); @@ -55,6 +58,7 @@ int main(int argc, char **argv) int index = 0; struct option long_options[] = { {"get", no_argument, 0, 'g' }, + {"entry", no_argument, 0, 'e' }, {"set", no_argument, 0, 's' }, {"unset", no_argument, 0, 'u' }, {"arg", required_argument, 0, 'a' }, @@ -66,7 +70,7 @@ int main(int argc, char **argv) {NULL, 0, 0, 0 } }; - c = getopt_long(argc, argv, "gsua:id::f:vm:", long_options, &index); + c = getopt_long(argc, argv, "gesua:id::f:vm:", long_options, &index); if (c == -1) break; switch (c) { @@ -86,6 +90,9 @@ int main(int argc, char **argv) case 'g': mode = MODE_GET; break; + case 'e': + mode = MODE_ENTRY; + break; case 's': mode = MODE_SET; break; @@ -167,8 +174,8 @@ int main(int argc, char **argv) if (dumpfile) fclose(out); } else - /* --iset and --get share a lot of code */ - if (mode == MODE_GET || mode == MODE_ISSET) { + /* --isset and --get share a lot of code */ + if (mode == MODE_GET || mode == MODE_ISSET || mode == MODE_ENTRY) { char * section = NULL; char * tag = NULL; const char * val; @@ -186,14 +193,17 @@ int main(int argc, char **argv) tag = argv[optind++]; /* retrieve the specified tags value */ - val = conf_get_section(section, arg, tag); + if (mode == MODE_ENTRY) + val = conf_get_entry(section, arg, tag); + else + val = conf_get_section(section, arg, tag); if (val != NULL) { /* ret=0, success, mode --get wants to output the value as well */ - if (mode == MODE_GET) + if (mode != MODE_ISSET) printf("%s\n", val); } else { /* ret=1, no value found, tell the user if they asked */ - if (mode == MODE_GET && verbose) + if (mode != MODE_ISSET && verbose) fprintf(stderr, "Tag '%s' not found\n", tag); ret = 1; } From patchwork Fri Jul 10 16:42:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Mitchell X-Patchwork-Id: 11657123 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 961E013B4 for ; Fri, 10 Jul 2020 16:42:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 77CE320767 for ; Fri, 10 Jul 2020 16:42:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="ez9Y8q/X" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726965AbgGJQmZ (ORCPT ); Fri, 10 Jul 2020 12:42:25 -0400 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:49288 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726920AbgGJQmZ (ORCPT ); Fri, 10 Jul 2020 12:42:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594399344; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7zTM0JLS0M1X2UooxcSNiUmiXZw5XN9kGoKw5DyD/sw=; b=ez9Y8q/XhBWKvy64lVIRnBuPCl7vbsHj7oiiaBTx9/DlUjITf9IMWRRtC9xEkeWpxq7QoM e1qBDG8RIM0Nleh+KkuMM3w5dJItyWUdhd7/QAZBZSkhs7eFk+ol+GWFS7J3T0A1q7H8Gk 0HInbNbZcz9CMXCbbdRn43HoTidiBV8= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-257-f03jvGefPoK-_Xe_DONN6A-1; Fri, 10 Jul 2020 12:42:14 -0400 X-MC-Unique: f03jvGefPoK-_Xe_DONN6A-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 88EB819200CD for ; Fri, 10 Jul 2020 16:42:13 +0000 (UTC) Received: from ovpn-112-86.ams2.redhat.com (ovpn-112-86.ams2.redhat.com [10.36.112.86]) by smtp.corp.redhat.com (Postfix) with ESMTPS id AEB0578A41; Fri, 10 Jul 2020 16:42:12 +0000 (UTC) Message-ID: Subject: [PATCH 3/4] nfs-utils: Add support for further ${variable} expansions in nfs.conf From: Alice Mitchell To: Linux NFS Mailing list Cc: Steve Dickson Date: Fri, 10 Jul 2020 17:42:10 +0100 In-Reply-To: <5a84777afb9ed8c866841471a1a7e3c9b295604d.camel@redhat.com> References: <5a84777afb9ed8c866841471a1a7e3c9b295604d.camel@redhat.com> Mime-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org This adds support for substituting in the systems machine_id as well as random generated uuid or hostname, and caches the results --- support/nfs/conffile.c | 268 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 257 insertions(+), 11 deletions(-) diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c index cbeef10d..58c03911 100644 --- a/support/nfs/conffile.c +++ b/support/nfs/conffile.c @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -110,12 +111,66 @@ struct conf_binding { char *tag; char *value; int is_default; + char *cache; }; LIST_HEAD (conf_bindings, conf_binding) conf_bindings[256]; +typedef char * (*expand_fn_t)(void); +struct expansion_types { + const char *name; + expand_fn_t func; +}; + +typedef struct { + uint8_t bytes[16]; +} id128_t; + +/* + * Application ID for use with generating a machine-id string + */ +static id128_t nfs_appid = {.bytes = {0xff,0x3b,0xf0,0x0f,0x34,0xa6,0x43,0xc5, \ + 0x93,0xdd,0x16,0xdc,0x7c,0xeb,0x88,0xc8}}; + const char *modified_by = NULL; +static __inline__ char +hexchar(int x) { + static const char table[16] = "0123456789abcdef"; + return table[x & 15]; +} + +static __inline__ int +unhexchar(char h) +{ + if (h >= '0' && h <= '9') + return h - '0'; + if (h >= 'a' && h <= 'f') + return h - 'a' + 10; + if (h >= 'A' && h <= 'F') + return h - 'A' + 10; + return -1; +} + +static char * +tohexstr(const unsigned char *data, int len) +{ + int i; + char *result = NULL; + + result = calloc(1, (len*2)+1); + if (!result) { + xlog(L_ERROR, "malloc error formatting string"); + return NULL; + } + + for (i = 0; i < len; i++) { + result[i*2] = hexchar(data[i] >> 4); + result[i*2+1] = hexchar(data[i] & 0x0F); + } + return result; +} + static __inline__ uint8_t conf_hash(const char *s) { @@ -128,6 +183,201 @@ conf_hash(const char *s) return hash; } +static int +id128_from_string(const char s[], id128_t *ret) +{ + id128_t t; + unsigned int n, i; + for (n=0, i=0; n<16; ) { + int a, b; + a = unhexchar(s[i++]); + if (a < 0) + return 1; + b = unhexchar(s[i++]); + if (b < 0) + return 1; + + t.bytes[n++] = (a << 4) | b; + } + if (s[i] != 0) + return 1; + if (ret) + *ret = t; + return 0; +} + +/* + * cryptographic hash (sha256) data into a hex encoded string + */ +static char * +strhash(unsigned char *key, size_t keylen, unsigned char *data, size_t dlen) +{ + union { + struct sockaddr sa; + struct sockaddr_alg alg; + } sa; + int sock = -1; + int hfd = -1; + uint8_t digest[129]; + int n; + char *result = NULL; + + memset(&sa, 0, sizeof(sa)); + sa.alg.salg_family = AF_ALG; + strcpy((char *)sa.alg.salg_type, "hash"); + strcpy((char *)sa.alg.salg_name, "hmac(sha256)"); + + sock = socket(AF_ALG, SOCK_SEQPACKET|SOCK_CLOEXEC, 0); + if (sock < 0) { + xlog(L_ERROR, "error creating socket"); + goto cleanup; + } + + if (bind(sock, (struct sockaddr *)&sa.sa, sizeof(sa)) < 0) { + xlog(L_ERROR, "error opening khash interface"); + goto cleanup; + } + + if (key && keylen > 0) { + if (setsockopt(sock, SOL_ALG, ALG_SET_KEY, key, keylen) < 0) { + xlog(L_ERROR, "Error setting key: %s", strerror(errno)); + goto cleanup; + } + } + + hfd = accept4(sock, NULL, 0, SOCK_CLOEXEC); + if (hfd < 0) { + xlog(L_ERROR, "Error initiating khash: %s", strerror(errno)); + goto cleanup; + } + + n = send(hfd, data, dlen, 0); + if (n < 0) { + xlog(L_ERROR, "Error updating khash: %s", strerror(errno)); + goto cleanup; + } + + n = recv(hfd, digest, sizeof(digest), 0); + if (n < 0) { + xlog(L_ERROR, "Error fetching khash: %s", strerror(errno)); + goto cleanup; + } + + result = tohexstr(digest, n); +cleanup: + if (sock != -1) + close(sock); + if (hfd != -1) + close(hfd); + if (hfd != -1) + close(hfd); + + return result; +} + +/* + * Read one line of content from a file + */ +static char * +read_oneline(const char *filename) +{ + char *content = conf_readfile(filename); + char *end; + + if (content == NULL) + return NULL; + + /* trim to only the first line */ + end = strchr(content, '\n'); + if (end != NULL) + *end = '\0'; + end = strchr(content, '\r'); + if (end != NULL) + *end = '\0'; + + return content; +} + +static char * +expand_machine_id(void) +{ + char *key = read_oneline("/etc/machine-id"); + id128_t mid; + char * result = NULL; + size_t idlen = 0; + + if (key == NULL) + return NULL; + + idlen = strlen(key); + if (!id128_from_string(key, &mid)) { + result = strhash(mid.bytes, sizeof(mid), nfs_appid.bytes, sizeof(nfs_appid)); + if (result && strlen(result) > idlen) + result[idlen]=0; + } + free(key); + return result; +} + +static char * +expand_random_uuid(void) +{ + return read_oneline("/proc/sys/kernel/random/uuid"); +} + +static char * +expand_hostname(void) +{ + int maxlen = HOST_NAME_MAX + 1; + char * hostname = calloc(1, maxlen); + + if (!hostname) + return NULL; + if ((gethostname(hostname, maxlen)) == -1) { + free(hostname); + return NULL; + } + return hostname; +} + +static struct expansion_types var_expansions[] = { + { "machine_id", expand_machine_id }, + { "machine-id", expand_machine_id }, + { "random-uuid", expand_random_uuid }, + { "hostname", expand_hostname }, +}; + +/* Deal with more complex variable substitutions */ +static char * +expand_variable(const char *name) +{ + size_t len; + + if (name == NULL || name[0] != '$') + return NULL; + + len = strlen(name); + if (name[1] == '{' && name[len-1] == '}') { + char *varname = strndupa(&name[2], len-3); + + for (size_t i=0; itag); if (cb->value) free(cb->value); + if (cb->cache) + free(cb->cache); free(cb); } @@ -782,7 +1034,7 @@ char * conf_get_section(const char *section, const char *arg, const char *tag) { struct conf_binding *cb; -retry: + cb = LIST_FIRST (&conf_bindings[conf_hash (section)]); for (; cb; cb = LIST_NEXT (cb, link)) { if (strcasecmp(section, cb->section) != 0) @@ -794,19 +1046,13 @@ retry: if (strcasecmp(tag, cb->tag) != 0) continue; if (cb->value[0] == '$') { - /* expand $name from [environment] section, - * or from environment - */ - char *env = getenv(cb->value+1); - if (env && *env) - return env; - section = "environment"; - tag = cb->value + 1; - goto retry; + if (!cb->cache) + cb->cache = expand_variable(cb->value); + return cb->cache; } return cb->value; } - return 0; + return NULL; } /* From patchwork Fri Jul 10 16:44:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Mitchell X-Patchwork-Id: 11657127 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 757C813B4 for ; Fri, 10 Jul 2020 16:44:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5B73C2078B for ; Fri, 10 Jul 2020 16:44:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="SG4D1UAy" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727828AbgGJQoN (ORCPT ); Fri, 10 Jul 2020 12:44:13 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:24636 "EHLO us-smtp-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727031AbgGJQoN (ORCPT ); Fri, 10 Jul 2020 12:44:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594399451; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yeb+RZv1xYQtYICll/cRVg75bIL08GNuV0mDaHvQlEg=; b=SG4D1UAypU5ypLT78h4zrTbR9F3hKFtL4eSUdN57AJ+JzTXiL6KT2D29otZiZ7OSoz/3H9 II4zvO6ZI5WGzcHZGC/AfwUtHJz2fqtOrfFSFkF+VBT9hFUBQj5+Pl0pXHkiiD/bO05NxR DpMyyiA6fsuiSaPuv80BZwPIfsiXrDs= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-344-xpekWpHEMGiwUX8SPSEgZA-1; Fri, 10 Jul 2020 12:44:08 -0400 X-MC-Unique: xpekWpHEMGiwUX8SPSEgZA-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 361E8100AA2E for ; Fri, 10 Jul 2020 16:44:07 +0000 (UTC) Received: from ovpn-112-86.ams2.redhat.com (ovpn-112-86.ams2.redhat.com [10.36.112.86]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 5D39674F56; Fri, 10 Jul 2020 16:44:06 +0000 (UTC) Message-ID: <115d8b45e84f3cecc9f5623e39f5078315d3ebbd.camel@redhat.com> Subject: [PATCH 4/4] nfs-utils: Update nfs4_unique_id module parameter from the nfs.conf value From: Alice Mitchell To: Linux NFS Mailing list Cc: Steve Dickson Date: Fri, 10 Jul 2020 17:44:04 +0100 In-Reply-To: <5a84777afb9ed8c866841471a1a7e3c9b295604d.camel@redhat.com> References: <5a84777afb9ed8c866841471a1a7e3c9b295604d.camel@redhat.com> Mime-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org systemd service to grab the config value and feed it to the kernel module --- nfs.conf | 1 + systemd/Makefile.am | 3 +++ systemd/nfs-conf-export.sh | 28 ++++++++++++++++++++++++++++ systemd/nfs-config.service.in | 17 +++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100755 systemd/nfs-conf-export.sh create mode 100644 systemd/nfs-config.service.in diff --git a/nfs.conf b/nfs.conf index 186a5b19..8bb41227 100644 --- a/nfs.conf +++ b/nfs.conf @@ -4,6 +4,7 @@ # [general] # pipefs-directory=/var/lib/nfs/rpc_pipefs +# nfs4_unique_id = ${machine-id} # [exports] # rootdir=/export diff --git a/systemd/Makefile.am b/systemd/Makefile.am index 75cdd9f5..51acdc3f 100644 --- a/systemd/Makefile.am +++ b/systemd/Makefile.am @@ -9,6 +9,7 @@ unit_files = \ nfs-mountd.service \ nfs-server.service \ nfs-utils.service \ + nfs-config.service \ rpc-statd-notify.service \ rpc-statd.service \ \ @@ -69,4 +70,6 @@ genexec_PROGRAMS = nfs-server-generator rpc-pipefs-generator install-data-hook: $(unit_files) mkdir -p $(DESTDIR)/$(unitdir) cp $(unit_files) $(DESTDIR)/$(unitdir) + mkdir -p $(DESTDIR)/$(libexecdir)/nfs-utils + install nfs-conf-export.sh $(DESTDIR)/$(libexecdir)/nfs-utils/ endif diff --git a/systemd/nfs-conf-export.sh b/systemd/nfs-conf-export.sh new file mode 100755 index 00000000..486e8df9 --- /dev/null +++ b/systemd/nfs-conf-export.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# +# This script pulls values out of /etc/nfs.conf and configures +# the appropriate kernel modules which cannot read it directly + +NFSMOD=/sys/module/nfs/parameters/nfs4_unique_id +NFSPROBE=/etc/modprobe.d/nfs.conf + +# Now read the values from nfs.conf +MACHINEID=`nfsconf --get general nfs4_unique_id` +if [ $? -ne 0 ] || [ "$MACHINEID" == "" ] +then +# No config vaue found, assume blank +MACHINEID="" +fi + +# Kernel module is already loaded, update the live one +if [ -e $NFSMOD ]; then +echo -n "$MACHINEID" >> $NFSMOD +fi + +# Rewrite the modprobe file for next reboot +echo "# This file is overwritten by systemd nfs-config.service" > $NFSPROBE +echo "# with values taken from /etc/nfs.conf" >> $NFSPROBE +echo "# Do not hand modify" >> $NFSPROBE +echo "options nfs nfs4_unique_id=\"$MACHINEID\"" >> $NFSPROBE + +echo "Set to: $MACHINEID" diff --git a/systemd/nfs-config.service.in b/systemd/nfs-config.service.in new file mode 100644 index 00000000..c5ef1024 --- /dev/null +++ b/systemd/nfs-config.service.in @@ -0,0 +1,17 @@ +[Unit] +Description=Preprocess NFS configuration +PartOf=nfs-client.target +After=nfs-client.target +DefaultDependencies=no + +[Service] +Type=oneshot +# This service needs to run any time any nfs service +# is started, so changes to local config files get +# incorporated. Having "RemainAfterExit=no" (the default) +# ensures this happens. +RemainAfterExit=no +ExecStart=@_libexecdir@/nfs-utils/nfs-conf-export.sh + +[Install] +WantedBy=nfs-client.target