summaryrefslogtreecommitdiffstats
path: root/src/lib-master/master-service-settings.h
blob: eceec0c6e208cfdea375af1dc7818251c5b7a634 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#ifndef MASTER_SERVICE_SETTINGS_H
#define MASTER_SERVICE_SETTINGS_H

#include "net.h"

struct setting_parser_info;
struct setting_parser_context;
struct master_service;

struct master_service_settings {
	/* NOTE: log process won't see any new settings unless they're
	   explicitly sent via environment variables by master process. */
	const char *base_dir;
	const char *state_dir;
	const char *instance_name;
	const char *log_path;
	const char *info_log_path;
	const char *debug_log_path;
	const char *log_timestamp;
	const char *log_debug;
	const char *log_core_filter;
	const char *process_shutdown_filter;
	const char *syslog_facility;
	const char *import_environment;
	const char *stats_writer_socket_path;
	uoff_t config_cache_size;
	bool version_ignore;
	bool shutdown_clients;
	bool verbose_proctitle;

	const char *haproxy_trusted_networks;
	unsigned int haproxy_timeout;
};

struct master_service_settings_input {
	const struct setting_parser_info *const *roots;
	const char *config_path;
	bool preserve_environment;
	bool preserve_user;
	bool preserve_home;
	bool never_exec;
	bool use_sysexits;
	bool parse_full_config;

	/* Either/both module and extra_modules can be set. Usually just one
	   is needed, so module is simpler to set. */
	const char *module;
	const char *const *extra_modules;
	const char *service;
	const char *username;
	struct ip_addr local_ip, remote_ip;
	const char *local_name;

	/* A bit of a memory saving kludge: Mail processes (especially imap)
	   shouldn't read ssl_ca setting since it's likely not needed and it
	   can use a lot of memory. */
	bool no_ssl_ca;
};

struct master_service_settings_output {
	/* if service was not given for lookup, this contains names of services
	   that have more specific settings */
	const char *const *specific_services;

	/* some settings for this service (or if service was not given,
	   all services) contain local/remote ip/host specific settings
	   (but this lookup didn't necessarily return any of them). */
	bool service_uses_local:1;
	bool service_uses_remote:1;
	/* returned settings contain settings specific to given
	   local/remote ip/host */
	bool used_local:1;
	bool used_remote:1;
	/* Config couldn't be read because we don't have enough permissions.
	   The process probably should be restarted and the settings read
	   before dropping privileges. */
	bool permission_denied:1;
};

extern const struct setting_parser_info master_service_setting_parser_info;

/* Try to open the config socket if it's going to be needed later by
   master_service_settings_read*() */
void master_service_config_socket_try_open(struct master_service *service);
int master_service_settings_get_filters(struct master_service *service,
					const char *const **filters,
					const char **error_r);
int master_service_settings_read(struct master_service *service,
				 const struct master_service_settings_input *input,
				 struct master_service_settings_output *output_r,
				 const char **error_r);
int master_service_settings_read_simple(struct master_service *service,
					const struct setting_parser_info **roots,
					const char **error_r) ATTR_NULL(2);
/* destroy settings parser and clear service's set_pool, so that
   master_service_settings_read*() can be called without freeing memory used
   by existing settings structures. */
pool_t master_service_settings_detach(struct master_service *service);

const struct master_service_settings *
master_service_settings_get(struct master_service *service);
void **master_service_settings_get_others(struct master_service *service);
void **master_service_settings_parser_get_others(struct master_service *service,
						 const struct setting_parser_context *set_parser);
struct setting_parser_context *
master_service_get_settings_parser(struct master_service *service);

int master_service_set(struct master_service *service, const char *line);

/* Returns TRUE if -o key=value parameter was used. Setting keys in overrides
   and parameter are unaliased before comparing. */
bool master_service_set_has_config_override(struct master_service *service,
					    const char *key);

#endif