Ver código fonte

qdevice: Add option to change socket file gid

Both qnetd and qdevice are not changing gid so local socket file
was usually not accessible by user if daemon is running as a root.

This is mainly problem if it is needed to run corosync-qdevice-tool as
non-root user.

Patch adds advanced option (local_socket_gid) which allows to change
group ownership after socket is created.

Signed-off-by: Jan Friesse <jfriesse@redhat.com>
Jan Friesse 4 meses atrás
pai
commit
b0278e6987

+ 6 - 1
man/corosync-qdevice.8

@@ -31,7 +31,7 @@
 .\" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 .\" * THE POSSIBILITY OF SUCH DAMAGE.
 .\" */
-.TH COROSYNC-QDEVICE 8 2025-10-13
+.TH COROSYNC-QDEVICE 8 2025-10-16
 .SH NAME
 corosync-qdevice \- QDevice daemon
 .SH SYNOPSIS
@@ -361,6 +361,11 @@ Internal IPC socket file location. (/var/run/corosync-qdevice/corosync-qdevice.s
 Octal value of umask used before creating of internal IPC socket file or empty if umask
 shouldn't be modified. ()
 .TP
+.B local_socket_gid
+Sets the group ownership for the internal IPC socket file.
+This can be specified as a group name or a numeric GID.
+An empty value or the default of -1 leaves the group ownership unchanged. (-1)
+.TP
 .B local_socket_backlog
 Parameter passed to listen syscall. (10)
 .TP

+ 6 - 1
man/corosync-qnetd.8

@@ -31,7 +31,7 @@
 .\" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 .\" * THE POSSIBILITY OF SUCH DAMAGE.
 .\" */
-.TH COROSYNC-QNETD 8 2025-10-13
+.TH COROSYNC-QNETD 8 2025-10-16
 .SH NAME
 corosync-qnetd \- QNet daemon
 .SH SYNOPSIS
@@ -230,6 +230,11 @@ Internal IPC socket file location. (/var/run/corosync-qnetd/corosync-qnetd.sock)
 Octal value of umask used before creating of internal IPC socket file or empty if umask
 shouldn't be modified. ()
 .TP
+.B local_socket_gid
+Sets the group ownership for the internal IPC socket file.
+This can be specified as a group name or a numeric GID.
+An empty value or the default of -1 leaves the group ownership unchanged. (-1)
+.TP
 .B local_socket_backlog
 Parameter passed to listen syscall on the local socket. (10)
 .TP

+ 5 - 0
qdevices/qdevice-advanced-settings.c

@@ -61,6 +61,7 @@ qdevice_advanced_settings_init(struct qdevice_advanced_settings *settings)
 		return (-1);
 	}
 	settings->set_local_socket_umask = 0;
+	settings->local_socket_gid = -1;
 	settings->local_socket_backlog = QDEVICE_DEFAULT_LOCAL_SOCKET_BACKLOG;
 	settings->max_cs_try_again = QDEVICE_DEFAULT_MAX_CS_TRY_AGAIN;
 	if ((settings->votequorum_device_name = strdup(QDEVICE_DEFAULT_VOTEQUORUM_DEVICE_NAME)) == NULL) {
@@ -150,6 +151,10 @@ qdevice_advanced_settings_set(struct qdevice_advanced_settings *settings,
 		    &settings->local_socket_umask) != 0) {
 			return (-2);
 		}
+	} else if (strcasecmp(option, "local_socket_gid") == 0) {
+		if (utils_get_group_gid(value, &settings->local_socket_gid) != 0) {
+			return (-2);
+		}
 	} else if (strcasecmp(option, "local_socket_backlog") == 0) {
 		if (utils_strtonum(value, QDEVICE_MIN_LOCAL_SOCKET_BACKLOG, INT_MAX, &tmpll) == -1) {
 			return (-2);

+ 1 - 0
qdevices/qdevice-advanced-settings.h

@@ -52,6 +52,7 @@ struct qdevice_advanced_settings {
 	char *local_socket_file;
 	int set_local_socket_umask;
 	mode_t local_socket_umask;
+	gid_t local_socket_gid;
 	int local_socket_backlog;
 	int max_cs_try_again;
 	char *votequorum_device_name;

+ 1 - 0
qdevices/qdevice-ipc.c

@@ -177,6 +177,7 @@ qdevice_ipc_init(struct qdevice_instance *instance)
 	    instance->advanced_settings->local_socket_file,
 	    instance->advanced_settings->set_local_socket_umask,
 	    instance->advanced_settings->local_socket_umask,
+	    instance->advanced_settings->local_socket_gid,
 	    instance->advanced_settings->local_socket_backlog,
 	    instance->advanced_settings->ipc_max_clients,
 	    instance->advanced_settings->ipc_max_receive_size,

+ 5 - 0
qdevices/qnetd-advanced-settings.c

@@ -74,6 +74,7 @@ qnetd_advanced_settings_init(struct qnetd_advanced_settings *settings)
 		return (-1);
 	}
 	settings->set_local_socket_umask = 0;
+	settings->local_socket_gid = -1;
 	settings->local_socket_backlog = QNETD_DEFAULT_LOCAL_SOCKET_BACKLOG;
 	settings->ipc_max_clients = QNETD_DEFAULT_IPC_MAX_CLIENTS;
 	settings->ipc_max_receive_size = QNETD_DEFAULT_IPC_MAX_RECEIVE_SIZE;
@@ -187,6 +188,10 @@ qnetd_advanced_settings_set(struct qnetd_advanced_settings *settings,
 		    &settings->local_socket_umask) != 0) {
 			return (-2);
 		}
+	} else if (strcasecmp(option, "local_socket_gid") == 0) {
+		if (utils_get_group_gid(value, &settings->local_socket_gid) != 0) {
+			return (-2);
+		}
 	} else if (strcasecmp(option, "local_socket_backlog") == 0) {
 		if (utils_strtonum(value, QNETD_MIN_LOCAL_SOCKET_BACKLOG, INT_MAX, &tmpll) == -1) {
 			return (-2);

+ 1 - 0
qdevices/qnetd-advanced-settings.h

@@ -55,6 +55,7 @@ struct qnetd_advanced_settings {
 	char *local_socket_file;
 	int set_local_socket_umask;
 	mode_t local_socket_umask;
+	gid_t local_socket_gid;
 	int local_socket_backlog;
 	size_t ipc_max_clients;
 	size_t ipc_max_send_size;

+ 1 - 0
qdevices/qnetd-ipc.c

@@ -177,6 +177,7 @@ qnetd_ipc_init(struct qnetd_instance *instance)
 	    instance->advanced_settings->local_socket_file,
 	    instance->advanced_settings->set_local_socket_umask,
 	    instance->advanced_settings->local_socket_umask,
+	    instance->advanced_settings->local_socket_gid,
 	    instance->advanced_settings->local_socket_backlog,
 	    instance->advanced_settings->ipc_max_clients,
 	    instance->advanced_settings->ipc_max_receive_size,

+ 3 - 3
qdevices/unix-socket-ipc.c

@@ -40,8 +40,8 @@
 
 int
 unix_socket_ipc_init(struct unix_socket_ipc *ipc, const char *socket_file_name,
-    int set_socket_umask, mode_t socket_umask, int backlog, size_t max_clients,
-    size_t max_receive_size, size_t max_send_size)
+    int set_socket_umask, mode_t socket_umask, gid_t socket_gid, int backlog,
+    size_t max_clients, size_t max_receive_size, size_t max_send_size)
 {
 
 	memset(ipc, 0, sizeof(*ipc));
@@ -55,7 +55,7 @@ unix_socket_ipc_init(struct unix_socket_ipc *ipc, const char *socket_file_name,
 
 	ipc->backlog = backlog;
 	ipc->socket = unix_socket_server_create(ipc->socket_file_name,
-	    set_socket_umask, socket_umask, 1, backlog);
+	    set_socket_umask, socket_umask, socket_gid, 1, backlog);
 	if (ipc->socket < 0) {
 		free(ipc->socket_file_name);
 		return (-1);

+ 1 - 1
qdevices/unix-socket-ipc.h

@@ -54,7 +54,7 @@ struct unix_socket_ipc {
 
 extern int		unix_socket_ipc_init(struct unix_socket_ipc *ipc,
     const char *socket_file_name, int set_socket_umask, mode_t socket_umask,
-    int backlog, size_t max_clients, size_t max_receive_size,
+    gid_t socket_gid, int backlog, size_t max_clients, size_t max_receive_size,
     size_t max_send_size);
 
 extern int		unix_socket_ipc_destroy(struct unix_socket_ipc *ipc);

+ 9 - 3
qdevices/unix-socket.c

@@ -46,7 +46,7 @@
 
 int
 unix_socket_server_create(const char *path, int set_socket_umask, mode_t socket_umask,
-    int non_blocking, int backlog)
+    gid_t socket_gid, int non_blocking, int backlog)
 {
 	int s;
 	struct sockaddr_un sun;
@@ -78,6 +78,14 @@ unix_socket_server_create(const char *path, int set_socket_umask, mode_t socket_
 		(void)umask(old_umask);
 	}
 
+	if (socket_gid != -1) {
+		if (chown(path, -1, socket_gid) != 0) {
+			close(s);
+
+			return (-1);
+		}
+	}
+
 	if (bind_res != 0) {
 		close(s);
 
@@ -138,8 +146,6 @@ unix_socket_client_create(const char *path, int non_blocking)
 	return (s);
 }
 
-
-
 int
 unix_socket_server_destroy(int sock, const char *path)
 {

+ 2 - 1
qdevices/unix-socket.h

@@ -44,7 +44,8 @@ extern "C" {
 #endif
 
 extern int		unix_socket_server_create(const char *path,
-    int set_socket_umask, mode_t socket_umask, int non_blocking, int backlog);
+    int set_socket_umask, mode_t socket_umask, gid_t socket_gid,
+    int non_blocking, int backlog);
 
 extern int		unix_socket_client_create(const char *path, int non_blocking);