mirror of https://git.kore.io/kore.git
Add access logging to Kore.
This commit is contained in:
parent
4dff38ebb0
commit
a1b400c400
2
Makefile
2
Makefile
|
@ -4,7 +4,7 @@ CC=gcc
|
||||||
BIN=kore
|
BIN=kore
|
||||||
|
|
||||||
S_SRC+= src/kore.c src/buf.c src/config.c src/net.c src/spdy.c src/http.c \
|
S_SRC+= src/kore.c src/buf.c src/config.c src/net.c src/spdy.c src/http.c \
|
||||||
src/module.c src/utils.c src/zlib_dict.c
|
src/accesslog.c src/module.c src/utils.c src/zlib_dict.c
|
||||||
S_OBJS= $(S_SRC:.c=.o)
|
S_OBJS= $(S_SRC:.c=.o)
|
||||||
|
|
||||||
CFLAGS+=-I/usr/local/ssl/include
|
CFLAGS+=-I/usr/local/ssl/include
|
||||||
|
|
|
@ -30,7 +30,8 @@ load example/example.module
|
||||||
# the directives that follow are to be applied upon.
|
# the directives that follow are to be applied upon.
|
||||||
#
|
#
|
||||||
# Additionally you can specify the following in a domain configuration:
|
# Additionally you can specify the following in a domain configuration:
|
||||||
# - Nothing yet
|
#
|
||||||
|
# accesslog: File where all requests are logged.
|
||||||
#
|
#
|
||||||
# Handlers
|
# Handlers
|
||||||
#
|
#
|
||||||
|
@ -42,10 +43,7 @@ load example/example.module
|
||||||
|
|
||||||
# Example domain that responds to 10.211.55.33.
|
# Example domain that responds to 10.211.55.33.
|
||||||
domain 10.211.55.3
|
domain 10.211.55.3
|
||||||
|
accesslog /var/log/kore_access.log
|
||||||
static /css/style.css serve_style_css
|
static /css/style.css serve_style_css
|
||||||
static / serve_index
|
static / serve_index
|
||||||
dynamic ^/[a-z0-9_]*$ serve_profile
|
dynamic ^/[a-z0-9_]*$ serve_profile
|
||||||
|
|
||||||
# Another domain that responds to foo.bar.
|
|
||||||
#domain foo.bar
|
|
||||||
#dynamic ^/*$ serve_foobar
|
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#define __H_HTTP_H
|
#define __H_HTTP_H
|
||||||
|
|
||||||
#define HTTP_HEADER_MAX_LEN 8192
|
#define HTTP_HEADER_MAX_LEN 8192
|
||||||
|
#define HTTP_URI_LEN 2000
|
||||||
|
#define HTTP_USERAGENT_LEN 256
|
||||||
#define HTTP_REQ_HEADER_MAX 25
|
#define HTTP_REQ_HEADER_MAX 25
|
||||||
#define HTTP_MAX_QUERY_ARGS 10
|
#define HTTP_MAX_QUERY_ARGS 10
|
||||||
|
|
||||||
|
@ -44,8 +46,12 @@ struct http_arg {
|
||||||
struct http_request {
|
struct http_request {
|
||||||
u_int8_t method;
|
u_int8_t method;
|
||||||
u_int8_t flags;
|
u_int8_t flags;
|
||||||
|
int status;
|
||||||
|
u_int64_t start;
|
||||||
|
u_int64_t end;
|
||||||
char *host;
|
char *host;
|
||||||
char *path;
|
char *path;
|
||||||
|
char *agent;
|
||||||
struct connection *owner;
|
struct connection *owner;
|
||||||
struct spdy_stream *stream;
|
struct spdy_stream *stream;
|
||||||
struct kore_buf *post_data;
|
struct kore_buf *post_data;
|
||||||
|
@ -76,4 +82,6 @@ int http_populate_arguments(struct http_request *);
|
||||||
int http_argument_lookup(struct http_request *,
|
int http_argument_lookup(struct http_request *,
|
||||||
const char *, char **);
|
const char *, char **);
|
||||||
|
|
||||||
|
void kore_accesslog(struct http_request *);
|
||||||
|
|
||||||
#endif /* !__H_HTTP_H */
|
#endif /* !__H_HTTP_H */
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#define errno_s strerror(errno)
|
#define errno_s strerror(errno)
|
||||||
#define ssl_errno_s ERR_error_string(ERR_get_error(), NULL)
|
#define ssl_errno_s ERR_error_string(ERR_get_error(), NULL)
|
||||||
|
|
||||||
|
#define KORE_DOMAINNAME_LEN 254
|
||||||
#define KORE_PIDFILE_DEFAULT "/var/run/kore.pid"
|
#define KORE_PIDFILE_DEFAULT "/var/run/kore.pid"
|
||||||
|
|
||||||
#define kore_debug(fmt, ...) \
|
#define kore_debug(fmt, ...) \
|
||||||
|
@ -113,6 +114,13 @@ struct kore_worker {
|
||||||
|
|
||||||
TAILQ_HEAD(kore_worker_h, kore_worker);
|
TAILQ_HEAD(kore_worker_h, kore_worker);
|
||||||
|
|
||||||
|
struct module_domain {
|
||||||
|
char *domain;
|
||||||
|
int accesslog;
|
||||||
|
TAILQ_HEAD(, kore_module_handle) handlers;
|
||||||
|
TAILQ_ENTRY(module_domain) list;
|
||||||
|
};
|
||||||
|
|
||||||
#define KORE_BUF_INITIAL 128
|
#define KORE_BUF_INITIAL 128
|
||||||
#define KORE_BUF_INCREMENT KORE_BUF_INITIAL
|
#define KORE_BUF_INCREMENT KORE_BUF_INITIAL
|
||||||
|
|
||||||
|
@ -142,21 +150,26 @@ extern u_int16_t cpu_count;
|
||||||
extern u_int8_t worker_count;
|
extern u_int8_t worker_count;
|
||||||
|
|
||||||
extern struct listener server;
|
extern struct listener server;
|
||||||
|
extern struct kore_worker *worker;
|
||||||
extern struct kore_worker_h kore_workers;
|
extern struct kore_worker_h kore_workers;
|
||||||
|
|
||||||
void kore_init(void);
|
|
||||||
void kore_worker_init(void);
|
void kore_worker_init(void);
|
||||||
void kore_worker_wait(int);
|
void kore_worker_wait(int);
|
||||||
void kore_event_init(void);
|
void kore_event_init(void);
|
||||||
void kore_event_wait(int);
|
void kore_event_wait(int);
|
||||||
|
void kore_platform_init(void);
|
||||||
|
void kore_accesslog_init(void);
|
||||||
|
int kore_accesslog_wait(void);
|
||||||
void kore_set_proctitle(char *);
|
void kore_set_proctitle(char *);
|
||||||
void kore_worker_spawn(u_int16_t);
|
void kore_worker_spawn(u_int16_t);
|
||||||
|
void kore_accesslog_worker_init(void);
|
||||||
void kore_worker_entry(struct kore_worker *);
|
void kore_worker_entry(struct kore_worker *);
|
||||||
void kore_worker_setcpu(struct kore_worker *);
|
void kore_worker_setcpu(struct kore_worker *);
|
||||||
void kore_event_schedule(int, int, int, void *);
|
void kore_event_schedule(int, int, int, void *);
|
||||||
int kore_connection_handle(struct connection *);
|
int kore_connection_handle(struct connection *);
|
||||||
int kore_server_accept(struct listener *, struct connection **);
|
int kore_server_accept(struct listener *, struct connection **);
|
||||||
|
|
||||||
|
u_int64_t kore_time_ms(void);
|
||||||
void kore_log_init(void);
|
void kore_log_init(void);
|
||||||
void *kore_malloc(size_t);
|
void *kore_malloc(size_t);
|
||||||
void *kore_calloc(size_t, size_t);
|
void *kore_calloc(size_t, size_t);
|
||||||
|
@ -175,8 +188,10 @@ void kore_module_load(char *);
|
||||||
void kore_module_reload(void);
|
void kore_module_reload(void);
|
||||||
int kore_module_loaded(void);
|
int kore_module_loaded(void);
|
||||||
int kore_module_domain_new(char *);
|
int kore_module_domain_new(char *);
|
||||||
|
void kore_module_domain_closelogs(void);
|
||||||
void *kore_module_handler_find(char *, char *);
|
void *kore_module_handler_find(char *, char *);
|
||||||
int kore_module_handler_new(char *, char *, char *, int);
|
int kore_module_handler_new(char *, char *, char *, int);
|
||||||
|
struct module_domain *kore_module_domain_lookup(char *);
|
||||||
|
|
||||||
void fatal(const char *, ...);
|
void fatal(const char *, ...);
|
||||||
void kore_debug_internal(char *, int, const char *, ...);
|
void kore_debug_internal(char *, int, const char *, ...);
|
||||||
|
|
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Joris Vink <joris@coders.se>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/param.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/queue.h>
|
||||||
|
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
#include <openssl/err.h>
|
||||||
|
#include <openssl/ssl.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <poll.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <regex.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
#include "spdy.h"
|
||||||
|
#include "kore.h"
|
||||||
|
#include "http.h"
|
||||||
|
|
||||||
|
static int accesslog_fd[2];
|
||||||
|
|
||||||
|
struct kore_log_packet {
|
||||||
|
u_int8_t method;
|
||||||
|
int status;
|
||||||
|
u_int16_t time_req;
|
||||||
|
u_int16_t worker_id;
|
||||||
|
u_int16_t worker_cpu;
|
||||||
|
struct in_addr src;
|
||||||
|
char host[KORE_DOMAINNAME_LEN];
|
||||||
|
char path[HTTP_URI_LEN];
|
||||||
|
char agent[HTTP_USERAGENT_LEN];
|
||||||
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
kore_accesslog_init(void)
|
||||||
|
{
|
||||||
|
if (socketpair(AF_UNIX, SOCK_STREAM, 0, accesslog_fd) == -1)
|
||||||
|
fatal("kore_accesslog_init(): socketpair() %s", errno_s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
kore_accesslog_worker_init(void)
|
||||||
|
{
|
||||||
|
close(accesslog_fd[0]);
|
||||||
|
kore_module_domain_closelogs();
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
kore_accesslog_wait(void)
|
||||||
|
{
|
||||||
|
ssize_t len;
|
||||||
|
time_t now;
|
||||||
|
size_t slen;
|
||||||
|
int nfds;
|
||||||
|
struct module_domain *dom;
|
||||||
|
struct pollfd pfd[1];
|
||||||
|
struct kore_log_packet logpacket;
|
||||||
|
char *method, buf[4096], *tbuf;
|
||||||
|
|
||||||
|
pfd[0].fd = accesslog_fd[0];
|
||||||
|
pfd[0].events = POLLIN;
|
||||||
|
pfd[0].revents = 0;
|
||||||
|
|
||||||
|
nfds = poll(pfd, 1, 1000);
|
||||||
|
if (nfds == -1 || (pfd[0].revents & (POLLERR | POLLHUP | POLLNVAL))) {
|
||||||
|
if (nfds == -1 && errno == EINTR)
|
||||||
|
return (KORE_RESULT_OK);
|
||||||
|
kore_log(LOG_WARNING, "poll(): %s", errno_s);
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nfds == 0)
|
||||||
|
return (KORE_RESULT_OK);
|
||||||
|
|
||||||
|
len = recv(accesslog_fd[0], &logpacket, sizeof(logpacket), 0);
|
||||||
|
if (len == -1) {
|
||||||
|
kore_log(LOG_WARNING, "recv(): %s", errno_s);
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len != sizeof(logpacket))
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
|
||||||
|
if ((dom = kore_module_domain_lookup(logpacket.host)) == NULL) {
|
||||||
|
kore_log(LOG_WARNING,
|
||||||
|
"got accesslog packet for unknown domain: %s",
|
||||||
|
logpacket.host);
|
||||||
|
return (KORE_RESULT_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (logpacket.method == HTTP_METHOD_GET)
|
||||||
|
method = "GET";
|
||||||
|
else
|
||||||
|
method = "POST";
|
||||||
|
|
||||||
|
time(&now);
|
||||||
|
tbuf = kore_time_to_date(now);
|
||||||
|
snprintf(buf, sizeof(buf), "[%s] %s %d %s %s (w#%d) (%dms) (%s)\n",
|
||||||
|
tbuf, inet_ntoa(logpacket.src), logpacket.status, method,
|
||||||
|
logpacket.path, logpacket.worker_id, logpacket.time_req,
|
||||||
|
logpacket.agent);
|
||||||
|
slen = strlen(buf);
|
||||||
|
|
||||||
|
len = write(dom->accesslog, buf, slen);
|
||||||
|
if (len == -1) {
|
||||||
|
kore_log(LOG_WARNING,
|
||||||
|
"kore_accesslog_wait(): write(): %s", errno_s);
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((size_t)len != slen)
|
||||||
|
kore_log(LOG_NOTICE, "accesslog: %s", buf);
|
||||||
|
|
||||||
|
return (KORE_RESULT_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
kore_accesslog(struct http_request *req)
|
||||||
|
{
|
||||||
|
ssize_t len;
|
||||||
|
struct kore_log_packet logpacket;
|
||||||
|
|
||||||
|
logpacket.status = req->status;
|
||||||
|
logpacket.method = req->method;
|
||||||
|
logpacket.worker_id = worker->id;
|
||||||
|
logpacket.worker_cpu = worker->cpu;
|
||||||
|
logpacket.src = req->owner->sin.sin_addr;
|
||||||
|
logpacket.time_req = req->end - req->start;
|
||||||
|
kore_strlcpy(logpacket.host, req->host, sizeof(logpacket.host));
|
||||||
|
kore_strlcpy(logpacket.path, req->path, sizeof(logpacket.path));
|
||||||
|
kore_strlcpy(logpacket.agent, req->agent, sizeof(logpacket.agent));
|
||||||
|
|
||||||
|
len = send(accesslog_fd[1], &logpacket, sizeof(logpacket), 0);
|
||||||
|
if (len == -1) {
|
||||||
|
kore_log(LOG_WARNING, "kore_accesslog(): send(): %s", errno_s);
|
||||||
|
} else if (len != sizeof(logpacket)) {
|
||||||
|
kore_log(LOG_WARNING, "short accesslog packet sent");
|
||||||
|
}
|
||||||
|
}
|
|
@ -51,7 +51,7 @@ static int nchanges;
|
||||||
static struct kevent *changelist;
|
static struct kevent *changelist;
|
||||||
|
|
||||||
void
|
void
|
||||||
kore_init(void)
|
kore_platform_init(void)
|
||||||
{
|
{
|
||||||
cpu_count = 0;
|
cpu_count = 0;
|
||||||
}
|
}
|
||||||
|
|
34
src/config.c
34
src/config.c
|
@ -49,6 +49,7 @@ static int configure_workers(char **);
|
||||||
static int configure_pidfile(char **);
|
static int configure_pidfile(char **);
|
||||||
static int configure_certfile(char **);
|
static int configure_certfile(char **);
|
||||||
static int configure_certkey(char **);
|
static int configure_certkey(char **);
|
||||||
|
static int configure_accesslog(char **);
|
||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
@ -66,6 +67,7 @@ static struct {
|
||||||
{ "pidfile", configure_pidfile },
|
{ "pidfile", configure_pidfile },
|
||||||
{ "certfile", configure_certfile },
|
{ "certfile", configure_certfile },
|
||||||
{ "certkey", configure_certkey },
|
{ "certkey", configure_certkey },
|
||||||
|
{ "accesslog", configure_accesslog },
|
||||||
{ NULL, NULL },
|
{ NULL, NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -302,3 +304,35 @@ configure_certkey(char **argv)
|
||||||
return (KORE_RESULT_OK);
|
return (KORE_RESULT_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
configure_accesslog(char **argv)
|
||||||
|
{
|
||||||
|
struct module_domain *dom;
|
||||||
|
|
||||||
|
if (argv[1] == NULL)
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
|
||||||
|
if (current_domain == NULL) {
|
||||||
|
kore_debug("missing domain for accesslog");
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((dom = kore_module_domain_lookup(current_domain)) == NULL) {
|
||||||
|
kore_debug("current_domain not found: (%s)", current_domain);
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dom->accesslog != -1) {
|
||||||
|
kore_debug("domain %s already has an open accesslog",
|
||||||
|
current_domain);
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
dom->accesslog = open(argv[1], O_CREAT | O_APPEND | O_WRONLY, 0755);
|
||||||
|
if (dom->accesslog == -1) {
|
||||||
|
kore_debug("open(%s): %s", argv[1], errno_s);
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (KORE_RESULT_OK);
|
||||||
|
}
|
||||||
|
|
28
src/http.c
28
src/http.c
|
@ -62,9 +62,17 @@ http_request_new(struct connection *c, struct spdy_stream *s, char *host,
|
||||||
kore_debug("http_request_new(%p, %p, %s, %s, %s)", c, s,
|
kore_debug("http_request_new(%p, %p, %s, %s, %s)", c, s,
|
||||||
host, method, path);
|
host, method, path);
|
||||||
|
|
||||||
|
if (strlen(host) >= KORE_DOMAINNAME_LEN - 1)
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
if (strlen(path) >= HTTP_URI_LEN - 1)
|
||||||
|
return (KORE_RESULT_ERROR);
|
||||||
|
|
||||||
req = (struct http_request *)kore_malloc(sizeof(*req));
|
req = (struct http_request *)kore_malloc(sizeof(*req));
|
||||||
|
req->end = 0;
|
||||||
|
req->start = 0;
|
||||||
req->flags = 0;
|
req->flags = 0;
|
||||||
req->owner = c;
|
req->owner = c;
|
||||||
|
req->status = 0;
|
||||||
req->stream = s;
|
req->stream = s;
|
||||||
req->post_data = NULL;
|
req->post_data = NULL;
|
||||||
req->host = kore_strdup(host);
|
req->host = kore_strdup(host);
|
||||||
|
@ -84,6 +92,13 @@ http_request_new(struct connection *c, struct spdy_stream *s, char *host,
|
||||||
return (KORE_RESULT_ERROR);
|
return (KORE_RESULT_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (s != NULL) {
|
||||||
|
if (!http_request_header_get(req, "user-agent", &(req->agent)))
|
||||||
|
req->agent = kore_strdup("unknown");
|
||||||
|
} else {
|
||||||
|
req->agent = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (out != NULL)
|
if (out != NULL)
|
||||||
*out = req;
|
*out = req;
|
||||||
|
|
||||||
|
@ -112,10 +127,12 @@ http_process(void)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
hdlr = kore_module_handler_find(req->host, req->path);
|
hdlr = kore_module_handler_find(req->host, req->path);
|
||||||
|
req->start = kore_time_ms();
|
||||||
if (hdlr == NULL)
|
if (hdlr == NULL)
|
||||||
r = http_generic_404(req);
|
r = http_generic_404(req);
|
||||||
else
|
else
|
||||||
r = hdlr(req);
|
r = hdlr(req);
|
||||||
|
req->end = kore_time_ms();
|
||||||
|
|
||||||
switch (r) {
|
switch (r) {
|
||||||
case KORE_RESULT_OK:
|
case KORE_RESULT_OK:
|
||||||
|
@ -131,6 +148,8 @@ http_process(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r != KORE_RESULT_RETRY) {
|
if (r != KORE_RESULT_RETRY) {
|
||||||
|
kore_accesslog(req);
|
||||||
|
|
||||||
TAILQ_REMOVE(&http_requests, req, list);
|
TAILQ_REMOVE(&http_requests, req, list);
|
||||||
http_request_free(req);
|
http_request_free(req);
|
||||||
http_request_count--;
|
http_request_count--;
|
||||||
|
@ -187,6 +206,8 @@ http_request_free(struct http_request *req)
|
||||||
|
|
||||||
free(req->path);
|
free(req->path);
|
||||||
free(req->host);
|
free(req->host);
|
||||||
|
if (req->agent != NULL)
|
||||||
|
free(req->agent);
|
||||||
free(req);
|
free(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,6 +223,7 @@ http_response(struct http_request *req, int status, u_int8_t *d, u_int32_t len)
|
||||||
|
|
||||||
kore_debug("http_response(%p, %d, %p, %d)", req, status, d, len);
|
kore_debug("http_response(%p, %d, %p, %d)", req, status, d, len);
|
||||||
|
|
||||||
|
req->status = status;
|
||||||
if (req->owner->proto == CONN_PROTO_SPDY) {
|
if (req->owner->proto == CONN_PROTO_SPDY) {
|
||||||
snprintf(sbuf, sizeof(sbuf), "%d", status);
|
snprintf(sbuf, sizeof(sbuf), "%d", status);
|
||||||
|
|
||||||
|
@ -368,10 +390,16 @@ http_header_recv(struct netbuf *nb)
|
||||||
}
|
}
|
||||||
|
|
||||||
*(p++) = '\0';
|
*(p++) = '\0';
|
||||||
|
if (*p == ' ')
|
||||||
|
p++;
|
||||||
hdr = (struct http_header *)kore_malloc(sizeof(*hdr));
|
hdr = (struct http_header *)kore_malloc(sizeof(*hdr));
|
||||||
hdr->header = kore_strdup(headers[i]);
|
hdr->header = kore_strdup(headers[i]);
|
||||||
hdr->value = kore_strdup(p);
|
hdr->value = kore_strdup(p);
|
||||||
TAILQ_INSERT_TAIL(&(req->req_headers), hdr, list);
|
TAILQ_INSERT_TAIL(&(req->req_headers), hdr, list);
|
||||||
|
|
||||||
|
if (req->agent == NULL &&
|
||||||
|
!strcasecmp(hdr->header, "user-agent"))
|
||||||
|
req->agent = kore_strdup(hdr->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(hbuf);
|
free(hbuf);
|
||||||
|
|
18
src/kore.c
18
src/kore.c
|
@ -58,6 +58,7 @@ struct listener server;
|
||||||
pid_t mypid = -1;
|
pid_t mypid = -1;
|
||||||
u_int16_t cpu_count = 1;
|
u_int16_t cpu_count = 1;
|
||||||
struct kore_worker_h kore_workers;
|
struct kore_worker_h kore_workers;
|
||||||
|
struct kore_worker *worker = NULL;
|
||||||
int kore_debug = 0;
|
int kore_debug = 0;
|
||||||
int server_port = 0;
|
int server_port = 0;
|
||||||
u_int8_t worker_count = 0;
|
u_int8_t worker_count = 0;
|
||||||
|
@ -91,9 +92,6 @@ main(int argc, char *argv[])
|
||||||
struct kore_worker *kw, *next;
|
struct kore_worker *kw, *next;
|
||||||
char *config_file;
|
char *config_file;
|
||||||
|
|
||||||
kore_log_init();
|
|
||||||
mypid = getpid();
|
|
||||||
|
|
||||||
if (getuid() != 0)
|
if (getuid() != 0)
|
||||||
fatal("kore must be started as root");
|
fatal("kore must be started as root");
|
||||||
|
|
||||||
|
@ -118,6 +116,7 @@ main(int argc, char *argv[])
|
||||||
if (config_file == NULL)
|
if (config_file == NULL)
|
||||||
fatal("please specify a configuration file to use (-c)");
|
fatal("please specify a configuration file to use (-c)");
|
||||||
|
|
||||||
|
mypid = getpid();
|
||||||
kore_parse_config(config_file);
|
kore_parse_config(config_file);
|
||||||
if (!kore_module_loaded())
|
if (!kore_module_loaded())
|
||||||
fatal("no site module was loaded");
|
fatal("no site module was loaded");
|
||||||
|
@ -133,7 +132,9 @@ main(int argc, char *argv[])
|
||||||
if (kore_certfile == NULL || kore_certkey == NULL)
|
if (kore_certfile == NULL || kore_certkey == NULL)
|
||||||
fatal("missing certificate information");
|
fatal("missing certificate information");
|
||||||
|
|
||||||
kore_init();
|
kore_log_init();
|
||||||
|
kore_platform_init();
|
||||||
|
kore_accesslog_init();
|
||||||
|
|
||||||
if (!kore_server_sslstart())
|
if (!kore_server_sslstart())
|
||||||
fatal("cannot initiate SSL");
|
fatal("cannot initiate SSL");
|
||||||
|
@ -174,8 +175,9 @@ main(int argc, char *argv[])
|
||||||
sig_recv = 0;
|
sig_recv = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!kore_accesslog_wait())
|
||||||
|
break;
|
||||||
kore_worker_wait(0);
|
kore_worker_wait(0);
|
||||||
sleep(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (kw = TAILQ_FIRST(&kore_workers); kw != NULL; kw = next) {
|
for (kw = TAILQ_FIRST(&kore_workers); kw != NULL; kw = next) {
|
||||||
|
@ -354,6 +356,8 @@ kore_worker_entry(struct kore_worker *kw)
|
||||||
struct connection *c, *cnext;
|
struct connection *c, *cnext;
|
||||||
struct kore_worker *k, *next;
|
struct kore_worker *k, *next;
|
||||||
|
|
||||||
|
worker = kw;
|
||||||
|
|
||||||
if (chroot(chroot_path) == -1)
|
if (chroot(chroot_path) == -1)
|
||||||
fatal("cannot chroot(): %s", errno_s);
|
fatal("cannot chroot(): %s", errno_s);
|
||||||
if (chdir("/") == -1)
|
if (chdir("/") == -1)
|
||||||
|
@ -385,9 +389,9 @@ kore_worker_entry(struct kore_worker *kw)
|
||||||
|
|
||||||
quit = 0;
|
quit = 0;
|
||||||
kore_event_init();
|
kore_event_init();
|
||||||
|
kore_accesslog_worker_init();
|
||||||
|
|
||||||
kore_log(LOG_NOTICE, "worker %d going to work (CPU: %d)",
|
kore_log(LOG_NOTICE, "worker %d started (cpu#%d)", kw->id, kw->cpu);
|
||||||
kw->id, kw->cpu);
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
if (sig_recv != 0) {
|
if (sig_recv != 0) {
|
||||||
if (sig_recv == SIGHUP)
|
if (sig_recv == SIGHUP)
|
||||||
|
|
|
@ -52,7 +52,7 @@ static int efd = -1;
|
||||||
static struct epoll_event *events = NULL;
|
static struct epoll_event *events = NULL;
|
||||||
|
|
||||||
void
|
void
|
||||||
kore_init(void)
|
kore_platform_init(void)
|
||||||
{
|
{
|
||||||
if ((cpu_count = sysconf(_SC_NPROCESSORS_ONLN)) == -1) {
|
if ((cpu_count = sysconf(_SC_NPROCESSORS_ONLN)) == -1) {
|
||||||
kore_debug("could not get number of cpu's falling back to 1");
|
kore_debug("could not get number of cpu's falling back to 1");
|
||||||
|
|
19
src/module.c
19
src/module.c
|
@ -46,14 +46,7 @@ static char *mod_name = NULL;
|
||||||
static time_t mod_last_mtime = 0;
|
static time_t mod_last_mtime = 0;
|
||||||
char *kore_module_onload = NULL;
|
char *kore_module_onload = NULL;
|
||||||
|
|
||||||
struct module_domain {
|
|
||||||
char *domain;
|
|
||||||
TAILQ_HEAD(, kore_module_handle) handlers;
|
|
||||||
TAILQ_ENTRY(module_domain) list;
|
|
||||||
};
|
|
||||||
|
|
||||||
static TAILQ_HEAD(, module_domain) domains;
|
static TAILQ_HEAD(, module_domain) domains;
|
||||||
static struct module_domain *kore_module_domain_lookup(char *);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
kore_module_load(char *module_name)
|
kore_module_load(char *module_name)
|
||||||
|
@ -132,6 +125,7 @@ kore_module_domain_new(char *domain)
|
||||||
return (KORE_RESULT_ERROR);
|
return (KORE_RESULT_ERROR);
|
||||||
|
|
||||||
dom = (struct module_domain *)kore_malloc(sizeof(*dom));
|
dom = (struct module_domain *)kore_malloc(sizeof(*dom));
|
||||||
|
dom->accesslog = -1;
|
||||||
dom->domain = kore_strdup(domain);
|
dom->domain = kore_strdup(domain);
|
||||||
TAILQ_INIT(&(dom->handlers));
|
TAILQ_INIT(&(dom->handlers));
|
||||||
TAILQ_INSERT_TAIL(&domains, dom, list);
|
TAILQ_INSERT_TAIL(&domains, dom, list);
|
||||||
|
@ -200,7 +194,7 @@ kore_module_handler_find(char *domain, char *path)
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct module_domain *
|
struct module_domain *
|
||||||
kore_module_domain_lookup(char *domain)
|
kore_module_domain_lookup(char *domain)
|
||||||
{
|
{
|
||||||
struct module_domain *dom;
|
struct module_domain *dom;
|
||||||
|
@ -212,3 +206,12 @@ kore_module_domain_lookup(char *domain)
|
||||||
|
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
kore_module_domain_closelogs(void)
|
||||||
|
{
|
||||||
|
struct module_domain *dom;
|
||||||
|
|
||||||
|
TAILQ_FOREACH(dom, &domains, list)
|
||||||
|
close(dom->accesslog);
|
||||||
|
}
|
||||||
|
|
17
src/utils.c
17
src/utils.c
|
@ -18,6 +18,7 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <sys/queue.h>
|
#include <sys/queue.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
|
@ -132,7 +133,10 @@ kore_log(int prio, const char *fmt, ...)
|
||||||
vsnprintf(buf, sizeof(buf), fmt, args);
|
vsnprintf(buf, sizeof(buf), fmt, args);
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
syslog(prio, "%s", buf);
|
if (worker != NULL)
|
||||||
|
syslog(prio, "[wrk %d]: %s", worker->id, buf);
|
||||||
|
else
|
||||||
|
syslog(prio, "[parent]: %s", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -298,6 +302,17 @@ kore_time_to_date(time_t now)
|
||||||
return (tbuf);
|
return (tbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u_int64_t
|
||||||
|
kore_time_ms(void)
|
||||||
|
{
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
if (gettimeofday(&tv, NULL) == -1)
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
return (tv.tv_sec * 1000 + (tv.tv_usec / 100));
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fatal(const char *fmt, ...)
|
fatal(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue