Add -C --clean
This commit is contained in:
@ -15,21 +15,26 @@
|
|||||||
|
|
||||||
|
|
||||||
int path_is_directory(const char *path) {
|
int path_is_directory(const char *path) {
|
||||||
struct stat statbuf;
|
int e = errno;
|
||||||
return stat(path, &statbuf) == 0 && S_ISDIR(statbuf.st_mode) != 0;
|
struct stat stat_buf;
|
||||||
|
int ret = stat(path, &stat_buf);
|
||||||
|
errno = e;
|
||||||
|
return ret == 0 && S_ISDIR(stat_buf.st_mode) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int path_is_file(const char *path) {
|
int path_is_file(const char *path) {
|
||||||
struct stat statbuf;
|
int e = errno;
|
||||||
int ret = stat(path, &statbuf);
|
struct stat stat_buf;
|
||||||
errno = 0;
|
int ret = stat(path, &stat_buf);
|
||||||
return ret == 0 && S_ISDIR(statbuf.st_mode) == 0;
|
errno = e;
|
||||||
|
return ret == 0 && S_ISDIR(stat_buf.st_mode) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int path_exists(const char *path) {
|
int path_exists(const char *path) {
|
||||||
struct stat statbuf;
|
int e = errno;
|
||||||
int ret = stat(path, &statbuf);
|
struct stat stat_buf;
|
||||||
errno = 0;
|
int ret = stat(path, &stat_buf);
|
||||||
|
errno = e;
|
||||||
return ret == 0;
|
return ret == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,10 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
|
||||||
|
|
||||||
static const char base64_encode_table[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
static const char base64_encode_table[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||||
@ -216,3 +220,45 @@ long clock_cpu(void) {
|
|||||||
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &time);
|
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &time);
|
||||||
return time.tv_sec * 1000000000 + time.tv_nsec;
|
return time.tv_sec * 1000000000 + time.tv_nsec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int rm_rf(const char *path) {
|
||||||
|
struct stat stat_buf;
|
||||||
|
if (lstat(path, &stat_buf) != 0)
|
||||||
|
return (errno == ENOENT) ? 0 : -1;
|
||||||
|
|
||||||
|
if (S_ISREG(stat_buf.st_mode)) {
|
||||||
|
// regular file
|
||||||
|
return unlink(path);
|
||||||
|
} else if (S_ISLNK(stat_buf.st_mode)) {
|
||||||
|
// link
|
||||||
|
return unlink(path);
|
||||||
|
} else if (S_ISDIR(stat_buf.st_mode)) {
|
||||||
|
// directory
|
||||||
|
char buf[FILENAME_MAX];
|
||||||
|
DIR *dir;
|
||||||
|
|
||||||
|
// open directory
|
||||||
|
if ((dir = opendir(path)) == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// read directory
|
||||||
|
for (struct dirent *ent; (ent = readdir(dir)) != NULL;) {
|
||||||
|
if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
snprintf(buf, sizeof(buf), "%s/%s", path, ent->d_name);
|
||||||
|
if (rm_rf(buf) != 0) {
|
||||||
|
closedir(dir);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// close and remove directory
|
||||||
|
closedir(dir);
|
||||||
|
return rmdir(path);
|
||||||
|
} else {
|
||||||
|
// other - not supported
|
||||||
|
errno = ENOTSUP;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -41,4 +41,6 @@ long clock_micros(void);
|
|||||||
|
|
||||||
long clock_cpu(void);
|
long clock_cpu(void);
|
||||||
|
|
||||||
|
int rm_rf(const char *path);
|
||||||
|
|
||||||
#endif //SESIMOS_UTILS_H
|
#endif //SESIMOS_UTILS_H
|
||||||
|
@ -278,4 +278,9 @@ int logger_init(void) {
|
|||||||
|
|
||||||
void logger_stop(void) {
|
void logger_stop(void) {
|
||||||
alive = 0;
|
alive = 0;
|
||||||
|
pthread_kill(thread, SIGUSR1);
|
||||||
|
}
|
||||||
|
|
||||||
|
int logger_join(void) {
|
||||||
|
return pthread_join(thread, NULL);
|
||||||
}
|
}
|
||||||
|
@ -37,4 +37,6 @@ int logger_init(void);
|
|||||||
|
|
||||||
void logger_stop(void);
|
void logger_stop(void);
|
||||||
|
|
||||||
|
int logger_join(void);
|
||||||
|
|
||||||
#endif //SESIMOS_LOGGER_H
|
#endif //SESIMOS_LOGGER_H
|
||||||
|
54
src/server.c
54
src/server.c
@ -43,10 +43,35 @@ static client_ctx_t **clients;
|
|||||||
|
|
||||||
static const char *color_table[] = {"\x1B[31m", "\x1B[32m", "\x1B[33m", "\x1B[34m", "\x1B[35m", "\x1B[36m"};
|
static const char *color_table[] = {"\x1B[31m", "\x1B[32m", "\x1B[33m", "\x1B[34m", "\x1B[35m", "\x1B[36m"};
|
||||||
|
|
||||||
static int clean() {
|
static void clean(void) {
|
||||||
remove("/var/sesimos/server/cache");
|
notice("Cleaning sesimos cache and metadata files...");
|
||||||
rmdir("/var/sesimos/server/");
|
|
||||||
return 0;
|
// remove legacy files
|
||||||
|
// /.../server/, /.../server/cache
|
||||||
|
if (rm_rf("/var/sesimos/server") != 0) {
|
||||||
|
error("Unable to remove /var/sesimos/server/");
|
||||||
|
} else if (!errno) {
|
||||||
|
notice("Successfully removed /var/sesimos/server/");
|
||||||
|
}
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
// remove cache and metadata files
|
||||||
|
char buf[512];
|
||||||
|
for (int i = 0; i < CONFIG_MAX_HOST_CONFIG; i++) {
|
||||||
|
host_config_t *hc = &config.hosts[i];
|
||||||
|
if (hc->type == CONFIG_TYPE_UNSET) break;
|
||||||
|
if (hc->type != CONFIG_TYPE_LOCAL) continue;
|
||||||
|
|
||||||
|
snprintf(buf, sizeof(buf), "%s/.sesimos", hc->local.webroot);
|
||||||
|
if (rm_rf(buf) != 0) {
|
||||||
|
error("Unable to remove %s/", buf);
|
||||||
|
} else if (!errno) {
|
||||||
|
notice("Successfully removed %s/", buf);
|
||||||
|
}
|
||||||
|
errno = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
notice("Cleaned all sesimos cache and metadata files!");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ssl_servername_cb(SSL *ssl, int *ad, void *arg) {
|
static int ssl_servername_cb(SSL *ssl, int *ad, void *arg) {
|
||||||
@ -154,6 +179,7 @@ static void nothing(int sig) {}
|
|||||||
int main(int argc, char *const argv[]) {
|
int main(int argc, char *const argv[]) {
|
||||||
const int YES = 1;
|
const int YES = 1;
|
||||||
int ret;
|
int ret;
|
||||||
|
int mode = 0;
|
||||||
|
|
||||||
memset(sockets, 0, sizeof(sockets));
|
memset(sockets, 0, sizeof(sockets));
|
||||||
clients = list_create(sizeof(void *), 64);
|
clients = list_create(sizeof(void *), 64);
|
||||||
@ -167,8 +193,6 @@ int main(int argc, char *const argv[]) {
|
|||||||
{.sin6_family = AF_INET6, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_port = htons(443)}
|
{.sin6_family = AF_INET6, .sin6_addr = IN6ADDR_ANY_INIT, .sin6_port = htons(443)}
|
||||||
};
|
};
|
||||||
|
|
||||||
logger_init();
|
|
||||||
|
|
||||||
logger_set_name("server");
|
logger_set_name("server");
|
||||||
|
|
||||||
if (setvbuf(stdout, NULL, _IOLBF, 0) != 0 || setvbuf(stderr, NULL, _IOLBF, 0) != 0) {
|
if (setvbuf(stdout, NULL, _IOLBF, 0) != 0 || setvbuf(stderr, NULL, _IOLBF, 0) != 0) {
|
||||||
@ -179,13 +203,13 @@ int main(int argc, char *const argv[]) {
|
|||||||
|
|
||||||
static const struct option long_opts[] = {
|
static const struct option long_opts[] = {
|
||||||
{"help", no_argument, 0, 'h'},
|
{"help", no_argument, 0, 'h'},
|
||||||
|
{"clean", no_argument, 0, 'C'},
|
||||||
{"config", required_argument, 0, 'c'},
|
{"config", required_argument, 0, 'c'},
|
||||||
{ 0, 0, 0, 0 }
|
{ 0, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
config_file = NULL;
|
config_file = NULL;
|
||||||
int c, opt_idx;
|
for (int c, opt_idx; (c = getopt_long(argc, argv, "hCc:", long_opts, &opt_idx)) != -1;) {
|
||||||
while ((c = getopt_long(argc, argv, "hc:", long_opts, &opt_idx)) != -1) {
|
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'h':
|
case 'h':
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
@ -193,11 +217,15 @@ int main(int argc, char *const argv[]) {
|
|||||||
"\n"
|
"\n"
|
||||||
"Options:\n"
|
"Options:\n"
|
||||||
" -c, --config <CONFIG-FILE> path to the config file. If not provided, default will be used\n"
|
" -c, --config <CONFIG-FILE> path to the config file. If not provided, default will be used\n"
|
||||||
|
" -C, --clean clear cached files and other metadata\n"
|
||||||
" -h, --help print this dialogue\n");
|
" -h, --help print this dialogue\n");
|
||||||
return 0;
|
return 0;
|
||||||
case 'c':
|
case 'c':
|
||||||
config_file = optarg;
|
config_file = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'C':
|
||||||
|
mode = 1;
|
||||||
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
default:
|
default:
|
||||||
critical("Unable to parse arguments");
|
critical("Unable to parse arguments");
|
||||||
@ -213,6 +241,11 @@ int main(int argc, char *const argv[]) {
|
|||||||
if (config_load(config_file == NULL ? DEFAULT_CONFIG_FILE : config_file) != 0)
|
if (config_load(config_file == NULL ? DEFAULT_CONFIG_FILE : config_file) != 0)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
if (mode == 1) {
|
||||||
|
clean();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if ((sockets[0] = socket(AF_INET6, SOCK_STREAM, 0)) == -1 ||
|
if ((sockets[0] = socket(AF_INET6, SOCK_STREAM, 0)) == -1 ||
|
||||||
(sockets[1] = socket(AF_INET6, SOCK_STREAM, 0)) == -1)
|
(sockets[1] = socket(AF_INET6, SOCK_STREAM, 0)) == -1)
|
||||||
{
|
{
|
||||||
@ -303,6 +336,9 @@ int main(int argc, char *const argv[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger_init();
|
||||||
|
logger_set_name("server");
|
||||||
|
|
||||||
workers_init();
|
workers_init();
|
||||||
|
|
||||||
for (int i = 0; i < NUM_SOCKETS; i++) {
|
for (int i = 0; i < NUM_SOCKETS; i++) {
|
||||||
@ -321,5 +357,7 @@ int main(int argc, char *const argv[]) {
|
|||||||
proxy_unload();
|
proxy_unload();
|
||||||
cache_join();
|
cache_join();
|
||||||
async_free();
|
async_free();
|
||||||
|
logger_stop();
|
||||||
|
logger_join();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user