diff --git a/etc/example.conf b/etc/example.conf index fc24e48..9c6adfd 100644 --- a/etc/example.conf +++ b/etc/example.conf @@ -7,6 +7,11 @@ ; 5: debug verbosity=1 +; unique server id. If you have more than 1 piler hosts combined, +; then assign a unique value to each host. Possible values: 0-255 +server_id=0 + + ; piler daemon will use this user (and its group) ; it it was started by root username=piler diff --git a/src/cfg.c b/src/cfg.c index d7d5f17..2792bf7 100644 --- a/src/cfg.c +++ b/src/cfg.c @@ -91,6 +91,7 @@ { "pidfile", "string", (void*) string_parser, offsetof(struct __config, pidfile), PIDFILE, MAXVAL-1}, { "piler_header_field", "string", (void*) string_parser, offsetof(struct __config, piler_header_field), "", MAXVAL-1}, { "queuedir", "string", (void*) string_parser, offsetof(struct __config, queuedir), QUEUE_DIR, MAXVAL-1}, + { "server_id", "integer", (void*) int_parser, offsetof(struct __config, server_id), "0", sizeof(int)}, { "session_timeout", "integer", (void*) int_parser, offsetof(struct __config, session_timeout), "420", sizeof(int)}, { "spam_header_line", "string", (void*) string_parser, offsetof(struct __config, spam_header_line), "", MAXVAL-1}, { "tls_enable", "integer", (void*) int_parser, offsetof(struct __config, tls_enable), "0", sizeof(int)}, diff --git a/src/cfg.h b/src/cfg.h index fcc403a..3c12789 100644 --- a/src/cfg.h +++ b/src/cfg.h @@ -8,6 +8,7 @@ #include "config.h" struct __config { + int server_id; char username[MAXVAL]; char hostid[MAXVAL]; diff --git a/src/import.c b/src/import.c index b972b3b..e271289 100644 --- a/src/import.c +++ b/src/import.c @@ -26,7 +26,7 @@ struct __counters counters; - init_session_data(sdata); + init_session_data(sdata, cfg->server_id); if(cfg->verbosity > 1) printf("processing: %s\n", filename); diff --git a/src/misc.c b/src/misc.c index 98f9dd3..a7702ab 100644 --- a/src/misc.c +++ b/src/misc.c @@ -211,13 +211,13 @@ } -void create_id(char *id){ +void create_id(char *id, unsigned char server_id){ int i; unsigned char buf[RND_STR_LEN/2]; memset(id, 0, SMALLBUFSIZE); - get_random_bytes(buf, RND_STR_LEN/2); + get_random_bytes(buf, RND_STR_LEN/2, server_id); for(i=0; i < RND_STR_LEN/2; i++){ sprintf(id, "%02x", buf[i]); @@ -231,7 +231,7 @@ * reading from pool */ -int get_random_bytes(unsigned char *buf, int len){ +int get_random_bytes(unsigned char *buf, int len, unsigned char server_id){ int fd, ret=0; struct taia now; char nowpack[TAIA_PACK]; @@ -246,7 +246,9 @@ fd = open(RANDOM_POOL, O_RDONLY); if(fd == -1) return ret; - if(readFromEntropyPool(fd, buf+12, len-12) != len-12){ + *(buf + 12) = server_id; + + if(readFromEntropyPool(fd, buf+12+1, len-12-1) != len-12-1){ syslog(LOG_PRIORITY, "%s: %s", ERR_CANNOT_READ_FROM_POOL, RANDOM_POOL); } @@ -447,13 +449,13 @@ } -void init_session_data(struct session_data *sdata){ +void init_session_data(struct session_data *sdata, unsigned char server_id){ int i; sdata->fd = -1; - create_id(&(sdata->ttmpfile[0])); + create_id(&(sdata->ttmpfile[0]), server_id); unlink(sdata->ttmpfile); snprintf(sdata->filename, SMALLBUFSIZE-1, "%s", sdata->ttmpfile); diff --git a/src/misc.h b/src/misc.h index 28167bb..4732333 100644 --- a/src/misc.h +++ b/src/misc.h @@ -24,8 +24,8 @@ char *split_str(char *row, char *what, char *s, int size); int trimBuffer(char *s); int extractEmail(char *rawmail, char *email); -void create_id(char *id); -int get_random_bytes(unsigned char *buf, int len); +void create_id(char *id, unsigned char server_id); +int get_random_bytes(unsigned char *buf, int len, unsigned char server_id); int readFromEntropyPool(int fd, void *_s, size_t n); int recvtimeout(int s, char *buf, int len, int timeout); int write1(int sd, char *buf, int use_ssl, SSL *ssl); @@ -35,7 +35,7 @@ int drop_privileges(struct passwd *pwd); int is_email_address_on_my_domains(char *email, struct __config *cfg); -void init_session_data(struct session_data *sdata); +void init_session_data(struct session_data *sdata, unsigned char server_id); int read_from_stdin(struct session_data *sdata); void strtolower(char *s); diff --git a/src/pilerexport.c b/src/pilerexport.c index fc45ed5..196a72b 100644 --- a/src/pilerexport.c +++ b/src/pilerexport.c @@ -400,7 +400,7 @@ if(read_key(&cfg)) p_clean_exit(ERR_READING_KEY, 1); - init_session_data(&sdata); + init_session_data(&sdata, cfg.server_id); mysql_init(&(sdata.mysql)); diff --git a/src/pilerpurge.c b/src/pilerpurge.c index b74222e..1197edc 100644 --- a/src/pilerpurge.c +++ b/src/pilerpurge.c @@ -348,7 +348,7 @@ setlocale(LC_CTYPE, cfg.locale); - init_session_data(&sdata); + init_session_data(&sdata, cfg.server_id); i = is_purge_allowed(&sdata, &cfg); if(i == 1){ diff --git a/src/reindex.c b/src/reindex.c index 66fdccc..a255d26 100644 --- a/src/reindex.c +++ b/src/reindex.c @@ -212,7 +212,7 @@ } } - init_session_data(&sdata); + init_session_data(&sdata, cfg.server_id); mysql_init(&(sdata.mysql)); diff --git a/src/session.c b/src/session.c index 4a146de..d1937f3 100644 --- a/src/session.c +++ b/src/session.c @@ -54,7 +54,7 @@ state = SMTP_STATE_INIT; - init_session_data(&sdata); + init_session_data(&sdata, cfg->server_id); sdata.tls = 0; bzero(&counters, sizeof(counters)); @@ -370,7 +370,7 @@ unlink(sdata.ttmpfile); unlink(sdata.tmpframe); - init_session_data(&sdata); + init_session_data(&sdata, cfg->server_id); } state = SMTP_STATE_MAIL_FROM; @@ -476,7 +476,7 @@ unlink(sdata.ttmpfile); unlink(sdata.tmpframe); - init_session_data(&sdata); + init_session_data(&sdata, cfg->server_id); state = SMTP_STATE_HELO; diff --git a/src/test.c b/src/test.c index ef03ff9..be3d7b3 100644 --- a/src/test.c +++ b/src/test.c @@ -60,7 +60,7 @@ load_rules(&sdata, &(data.archiving_rules), SQL_ARCHIVING_RULE_TABLE); load_rules(&sdata, &(data.retention_rules), SQL_RETENTION_RULE_TABLE); - init_session_data(&sdata); + init_session_data(&sdata, cfg.server_id); sdata.sent = 0; sdata.delivered = 0; diff --git a/test/debug.c b/test/debug.c index df4e624..f1a2b2a 100644 --- a/test/debug.c +++ b/test/debug.c @@ -33,7 +33,7 @@ cfg = read_config(CONFIG_FILE); - init_session_data(&sdata); + init_session_data(&sdata, cfg.server_id); sdata.sent = 0; sdata.tot_len = st.st_size; diff --git a/test/ptest.c b/test/ptest.c index 6c2a406..5b09bdd 100644 --- a/test/ptest.c +++ b/test/ptest.c @@ -40,7 +40,7 @@ struct _state state; - init_session_data(sdata); + init_session_data(sdata, cfg->server_id); if(stat(filename, &st) != 0){ printf("cannot stat() %s\n", filename);