service.h revision 6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny#ifndef SERVICE_H
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny#define SERVICE_H
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny#include "network.h"
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenystruct master_settings;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny/* If a service process doesn't send its first status notification in
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny this many seconds, kill the process */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny#define SERVICE_FIRST_STATUS_TIMEOUT_SECS 30
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyenum service_type {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SERVICE_TYPE_UNKNOWN,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SERVICE_TYPE_LOG,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SERVICE_TYPE_ANVIL,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SERVICE_TYPE_CONFIG,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SERVICE_TYPE_AUTH_SERVER,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SERVICE_TYPE_AUTH_SOURCE
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny};
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenyenum service_listener_type {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SERVICE_LISTENER_UNIX,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SERVICE_LISTENER_FIFO,
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny SERVICE_LISTENER_INET
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny};
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenystruct service_listener {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct service *service;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny enum service_listener_type type;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny int fd; /* may be -1 */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct io *io;
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny union {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct {
9822d4d468ec74e4e173f5adf0db12d02974cd18Sumit Bose const struct file_listener_settings *set;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny uid_t uid;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce gid_t gid;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny } fileset;
9822d4d468ec74e4e173f5adf0db12d02974cd18Sumit Bose struct {
9822d4d468ec74e4e173f5adf0db12d02974cd18Sumit Bose const struct inet_listener_settings *set;
9822d4d468ec74e4e173f5adf0db12d02974cd18Sumit Bose struct ip_addr ip;
9822d4d468ec74e4e173f5adf0db12d02974cd18Sumit Bose } inetset;
9822d4d468ec74e4e173f5adf0db12d02974cd18Sumit Bose } set;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny};
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zelenystruct service {
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct service_list *list;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny enum service_type type;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce const struct service_settings *set;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *config_file_path;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *executable;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny uid_t uid;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce gid_t gid;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny gid_t privileged_gid;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny const char *extra_gids; /* comma-separated list */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* all listeners, even those that aren't currently listening */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny ARRAY_DEFINE(listeners, struct service_listener *);
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* number of processes currently created for this service */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce unsigned int process_count;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce /* number of processes currently accepting new connections */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce unsigned int process_avail;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce /* max number of processes allowed */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce unsigned int process_limit;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce /* log process pipe file descriptors. */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce int log_fd[2];
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* fd that log process sees log_fd[0] as. can be used to identify
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny service name when sending commands via master_log_fd. */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny int log_process_internal_fd;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce /* status report pipe file descriptors */
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce int status_fd[2];
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce struct io *io_status;
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce /* if a process fails before servicing its first request, assume it's
7fe69bb6ec70bce439c6b975a9a0044c98ff502bSimo Sorce broken and start throtting new process creations */
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny struct timeout *to_throttle;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* SERVICE_TYPE_AUTH_SOURCE: Destination service to run after
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny successful authentication. */
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce struct service *auth_dest_service;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny /* all processes are in use and new connections are coming */
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce unsigned int listen_pending:1;
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce};
204cfc89a076fd32bf34f2abb3f809304aaa88abSimo Sorce
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorcestruct service_list {
aab938c5975f0e3b85c7c79a5d718e5fefed7217Simo Sorce pool_t pool;
e76d78338026fa47dca32eaf7f5c15eabb1b951aJan Zeleny
9822d4d468ec74e4e173f5adf0db12d02974cd18Sumit Bose struct service *config;
9822d4d468ec74e4e173f5adf0db12d02974cd18Sumit Bose struct service *log;
9822d4d468ec74e4e173f5adf0db12d02974cd18Sumit Bose struct hash_table *pids;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce const char *const *child_process_env;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce /* nonblocking log fds usd by master */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce int master_log_fd[2];
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce struct service_process_notify *log_byes;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce /* passed to auth destination processes */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce int blocking_anvil_fd[2];
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce /* used by master process to notify about dying processes */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce int nonblocking_anvil_fd[2];
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce struct service_process_notify *anvil_kills;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce ARRAY_DEFINE(services, struct service *);
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce};
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce/* Create all services from settings */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorcestruct service_list *
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorceservices_create(const struct master_settings *set,
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce const char *const *child_process_env, const char **error_r);
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce/* Destroy services */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorcevoid services_destroy(struct service_list *service_list);
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce/* Send a signal to all processes in a given service */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorcevoid service_signal(struct service *service, int signo);
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorcevoid service_error(struct service *service, const char *format, ...)
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce ATTR_FORMAT(2, 3);
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce#endif
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce