| /*****************************************************************************\ |
| * persist_conn.h - Definitions for communicating over a persistent |
| * connection within Slurm. |
| ****************************************************************************** |
| * Copyright (C) SchedMD LLC. |
| * |
| * This file is part of Slurm, a resource management program. |
| * For details, see <https://slurm.schedmd.com/>. |
| * Please also read the included file: DISCLAIMER. |
| * |
| * Slurm 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 2 of the License, or (at your option) |
| * any later version. |
| * |
| * In addition, as a special exception, the copyright holders give permission |
| * to link the code of portions of this program with the OpenSSL library under |
| * certain conditions as described in each individual source file, and |
| * distribute linked combinations including the two. You must obey the GNU |
| * General Public License in all respects for all of the code used other than |
| * OpenSSL. If you modify file(s) with this exception, you may extend this |
| * exception to your version of the file(s), but you are not obligated to do |
| * so. If you do not wish to do so, delete this exception statement from your |
| * version. If you delete this exception statement from all source files in |
| * the program, then also delete it here. |
| * |
| * Slurm 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 Slurm; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| \*****************************************************************************/ |
| #ifndef _SLURM_PERSIST_CONN_H |
| #define _SLURM_PERSIST_CONN_H |
| |
| #include "slurm/slurm.h" |
| #include "pack.h" |
| |
| #define PERSIST_FLAG_NONE 0x0000 |
| #define PERSIST_FLAG_DBD SLURM_BIT(0) |
| #define PERSIST_FLAG_RECONNECT SLURM_BIT(1) |
| #define PERSIST_FLAG_ALREADY_INITED SLURM_BIT(2) |
| #define PERSIST_FLAG_P_USER_CASE SLURM_BIT(3) |
| #define PERSIST_FLAG_SUPPRESS_ERR SLURM_BIT(4) |
| #define PERSIST_FLAG_EXT_DBD SLURM_BIT(5) |
| #define PERSIST_FLAG_DONT_UPDATE_CLUSTER SLURM_BIT(6) |
| |
| #define PERSIST_CONN_NOT_INITED -2 |
| |
| typedef enum { |
| PERSIST_TYPE_NONE = 0, |
| PERSIST_TYPE_DBD, |
| PERSIST_TYPE_FED, |
| PERSIST_TYPE_HA_CTL, |
| PERSIST_TYPE_HA_DBD, |
| PERSIST_TYPE_ACCT_UPDATE, |
| } persist_conn_type_t; |
| |
| typedef struct { |
| void *conn; /* persist_conn_t */ |
| void *data; /* pointer to a message type below */ |
| uint16_t msg_type; /* slurmdbd_msg_type_t / slurm_msg_type_t */ |
| } persist_msg_t; |
| |
| typedef struct { |
| void *auth_cred; |
| uid_t auth_uid; |
| gid_t auth_gid; |
| bool auth_ids_set; |
| int (*callback_proc)(void *arg, persist_msg_t *msg, buf_t **out_buffer); |
| void (*callback_fini)(void *arg); |
| char *cluster_name; |
| time_t comm_fail_time; /* avoid constant error messages */ |
| uint16_t my_port; |
| uint16_t flags; |
| bool inited; |
| persist_conn_type_t persist_type; |
| uid_t r_uid; |
| char *rem_host; |
| uint16_t rem_port; |
| time_t *shutdown; |
| pthread_t thread_id; |
| int timeout; |
| void *tls_conn; |
| slurm_trigger_callbacks_t trigger_callbacks; |
| uint16_t version; |
| } persist_conn_t; |
| |
| typedef struct { |
| char *cluster_name; /* cluster this message is coming from */ |
| uint16_t persist_type; /* really persist_conn_type_t, uint16_t on wire */ |
| uint16_t port; /* If you want to open a new connection, this is |
| * the port to talk to. */ |
| uint16_t version; /* protocol version */ |
| uint32_t uid; /* UID originating connection, |
| * filled by authtentication plugin*/ |
| } persist_init_req_msg_t; |
| |
| typedef struct { |
| char *comment; |
| uint16_t flags; |
| uint32_t rc; |
| uint16_t ret_info; /* protocol version we are connecting to since we |
| * sent the lowest one to begin with, or the return |
| * of a message type sent. */ |
| } persist_rc_msg_t; |
| |
| /* setup a daemon to receive incoming persistent connections. */ |
| extern void slurm_persist_conn_recv_server_init(void); |
| |
| /* finish up any persistent connections we are listening to */ |
| extern void slurm_persist_conn_recv_server_fini(void); |
| |
| /* |
| * Create a thread that will wait listening on the fd in the persist_conn_t. |
| * |
| * IN - persist_conn - persistent connection to listen to. This will be freed |
| * internally, so forget about once it enters here. |
| * IN - thread_loc - location in the persist_conn thread pool. This number can |
| * be got from slurm_persist_conn_wait_for_thread_loc or given |
| * -1 to get one inside the function. |
| * IN - arg - arbitrary argument that will be sent to the callback as well as |
| * the callback in the persist_conn. |
| */ |
| extern void slurm_persist_conn_recv_thread_init(persist_conn_t *persist_conn, |
| int fd, int thread_loc, |
| void *arg); |
| |
| /* Increment thread_count and don't return until its value is no larger |
| * than MAX_THREAD_COUNT, |
| * RET index of free index in persist_pthread_id or -1 to exit */ |
| extern int slurm_persist_conn_wait_for_thread_loc(void); |
| |
| /* Free the index given from slurm_persist_conn_wait_for_thread_loc */ |
| extern void slurm_persist_conn_free_thread_loc(int thread_loc); |
| |
| /* Open a persistent socket connection and sends an init message to establish |
| * the connection. |
| * IN/OUT - persistent connection needing host and port filled in. Returned |
| * completely filled in. |
| * Returns SLURM_SUCCESS on success or SLURM_ERROR on failure */ |
| extern int slurm_persist_conn_open(persist_conn_t *persist_conn); |
| |
| /* Close the persistent connection don't free structure or members */ |
| extern void slurm_persist_conn_close(persist_conn_t *persist_conn); |
| |
| extern int slurm_persist_conn_reopen(persist_conn_t *persist_conn); |
| |
| /* Close the persistent connection members, but don't free structure */ |
| extern void slurm_persist_conn_members_destroy(persist_conn_t *persist_conn); |
| |
| /* Close the persistent connection and free structure */ |
| extern void slurm_persist_conn_destroy(persist_conn_t *persist_conn); |
| |
| extern int slurm_persist_conn_process_msg(persist_conn_t *persist_conn, |
| persist_msg_t *persist_msg, |
| char *msg_char, uint32_t msg_size, |
| buf_t **out_buffer, bool first); |
| |
| extern int slurm_persist_conn_writeable(persist_conn_t *persist_conn); |
| |
| extern int slurm_persist_send_msg(persist_conn_t *persist_conn, |
| buf_t *buffer); |
| extern buf_t *slurm_persist_recv_msg(persist_conn_t *persist_conn); |
| |
| |
| extern buf_t *slurm_persist_msg_pack(persist_conn_t *persist_conn, |
| persist_msg_t *req_msg); |
| extern int slurm_persist_msg_unpack(persist_conn_t *persist_conn, |
| persist_msg_t *resp_msg, buf_t *buffer); |
| |
| extern void slurm_persist_pack_init_req_msg(persist_init_req_msg_t *msg, |
| buf_t *buffer); |
| extern int slurm_persist_unpack_init_req_msg(persist_init_req_msg_t **msg, |
| buf_t *buffer); |
| extern void slurm_persist_free_init_req_msg(persist_init_req_msg_t *msg); |
| |
| extern void slurm_persist_pack_rc_msg(persist_rc_msg_t *msg, buf_t *buffer, |
| uint16_t protocol_version); |
| extern int slurm_persist_unpack_rc_msg(persist_rc_msg_t **msg, buf_t *buffer, |
| uint16_t protocol_version); |
| extern void slurm_persist_free_rc_msg(persist_rc_msg_t *msg); |
| |
| extern buf_t *slurm_persist_make_rc_msg(persist_conn_t *persist_conn, |
| uint32_t rc, char *comment, |
| uint16_t ret_info); |
| |
| extern buf_t *slurm_persist_make_rc_msg_flags(persist_conn_t *persist_conn, |
| uint32_t rc, char *comment, |
| uint16_t flags, |
| uint16_t ret_info); |
| |
| #endif |