diff options
author | Niels de Vos <ndevos@redhat.com> | 2015-01-01 13:15:45 +0100 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2015-03-15 07:01:38 -0700 |
commit | aa66b8404f45712c45d75d6a2a37f32e2792cc83 (patch) | |
tree | 11d7a95bd6286204ec0ec33e4cdd8ba0c5b48028 /libglusterfs | |
parent | aac1ec0a61d9267b6ae7a280b368dfd357b7dcdc (diff) |
gNFS: Export / Netgroup authentication on Gluster NFS mount
* Parses linux style export file/netgroups file into a structure that
can be lookedup.
* This parser turns each line into a structure called an "export
directory". Each of these has a dictionary of hosts and netgroups
which can be looked up during the mount authentication process.
(See Change-Id Ic060aac and I7e6aa6bc)
* A string beginning withan '@' is treated as a netgroup and a string
beginning without an @ is a host.
(See Change-Id Ie04800d)
* This parser does not currently support all the options in the man page
('man exports'), but we can easily add them.
BUG: 1143880
URL: http://www.gluster.org/community/documentation/index.php/Features/Exports_Netgroups_Authentication
Change-Id: I181e8c1814d6ef3cae5b4d88353622734f0c0f0b
Original-author: Shreyas Siravara <shreyas.siravara@gmail.com>
CC: Richard Wareing <rwareing@fb.com>
CC: Jiffin Tony Thottan <jthottan@redhat.com>
Signed-off-by: Niels de Vos <ndevos@redhat.com>
Reviewed-on: http://review.gluster.org/8758
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/common-utils.c | 112 | ||||
-rw-r--r-- | libglusterfs/src/common-utils.h | 3 |
2 files changed, 115 insertions, 0 deletions
diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 6dcfc098dc2..751dc8a2e50 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -34,6 +34,7 @@ #include <arpa/inet.h> #include <signal.h> #include <assert.h> +#include <libgen.h> /* for dirname() */ #if defined(GF_BSD_HOST_OS) || defined(GF_DARWIN_HOST_OS) #include <sys/sysctl.h> @@ -171,6 +172,86 @@ log_base2 (unsigned long x) return val; } +/** + * gf_rev_dns_lookup -- Perform a reverse DNS lookup on the IP address. + * + * @ip: The IP address to perform a reverse lookup on + * + * @return: success: Allocated string containing the hostname + * failure: NULL + */ +char * +gf_rev_dns_lookup (const char *ip) +{ + char *fqdn = NULL; + int ret = 0; + struct sockaddr_in sa = {0}; + char host_addr[256] = {0, }; + + GF_VALIDATE_OR_GOTO ("resolver", ip, out); + + sa.sin_family = AF_INET; + inet_pton (AF_INET, ip, &sa.sin_addr); + ret = getnameinfo ((struct sockaddr *)&sa, sizeof (sa), host_addr, + sizeof (host_addr), NULL, 0, 0); + + if (ret != 0) { + gf_log ("resolver", GF_LOG_INFO, "could not resolve hostname " + "for %s: %s", ip, strerror (errno)); + goto out; + } + + /* Get the FQDN */ + fqdn = gf_strdup (host_addr); + if (!fqdn) + gf_log ("resolver", GF_LOG_CRITICAL, "Allocation failed for " + "the host address"); + +out: + return fqdn; +} + +/** + * gf_resolve_parent_path -- Given a path, returns an allocated string + * containing the parent's path. + * @path: Path to parse + * @return: The parent path if found, NULL otherwise + */ +char * +gf_resolve_path_parent (const char *path) +{ + char *parent = NULL; + char *tmp = NULL; + char *pathc = NULL; + + GF_VALIDATE_OR_GOTO (THIS->name, path, out); + + if (strlen (path) <= 0) { + gf_log_callingfn (THIS->name, GF_LOG_DEBUG, + "invalid string for 'path'"); + goto out; + } + + /* dup the parameter, we don't want to modify it */ + pathc = strdupa (path); + if (!pathc) { + gf_log (THIS->name, GF_LOG_CRITICAL, + "Allocation failed for the parent"); + goto out; + } + + /* Get the parent directory */ + tmp = dirname (pathc); + if (strcmp (tmp, "/") == 0) + goto out; + + parent = gf_strdup (tmp); + if (!parent) + gf_log (THIS->name, GF_LOG_CRITICAL, + "Allocation failed for the parent"); +out: + return parent; +} int32_t gf_resolve_ip6 (const char *hostname, @@ -1689,6 +1770,37 @@ out: } /** + * get_file_mtime -- Given a path, get the mtime for the file + * + * @path: The filepath to check the mtime on + * @stamp: The parameter to set after we get the mtime + * + * @returns: success: 0 + * errors : Errors returned by the stat () call + */ +int +get_file_mtime (const char *path, time_t *stamp) +{ + struct stat f_stat = {0}; + int ret = -EINVAL; + + GF_VALIDATE_OR_GOTO (THIS->name, path, out); + GF_VALIDATE_OR_GOTO (THIS->name, stamp, out); + + ret = stat (path, &f_stat); + if (ret < 0) { + gf_log (THIS->name, GF_LOG_ERROR, "failed to stat %s: %s", + path, strerror (errno)); + goto out; + } + + /* Set the mtime */ + *stamp = f_stat.st_mtime; +out: + return ret; +} + +/** * gf_is_ip_in_net -- Checks if an IP Address is in a network. * A network should be specified by something like * '10.5.153.0/24' (in CIDR notation). diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index 64544126836..f76059b3082 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -609,6 +609,8 @@ int get_checksum_for_file (int fd, uint32_t *checksum); int log_base2 (unsigned long x); int get_checksum_for_path (char *path, uint32_t *checksum); +int get_file_mtime (const char *path, time_t *stamp); +char *gf_resolve_path_parent (const char *path); char *strtail (char *str, const char *pattern); void skipwhite (char **s); @@ -627,6 +629,7 @@ gf_boolean_t valid_mount_auth_address (char *address); gf_boolean_t valid_ipv4_subnetwork (const char *address); gf_boolean_t gf_sock_union_equal_addr (union gf_sock_union *a, union gf_sock_union *b); +char *gf_rev_dns_lookup (const char *ip); char *uuid_utoa (uuid_t uuid); char *uuid_utoa_r (uuid_t uuid, char *dst); |