blob: 2bc18334ac98177a7a2136abb30f37ffbc6d4b57 [file] [log] [blame] [raw]
#include <stdlib.h>
#include <string.h>
#include "cli.h"
#include "fio.h"
#include "fio_cli.h"
#include "http.h"
#include "redis_engine.h"
static void redis_cleanup(void *e_) {
redis_engine_destroy(e_);
FIO_LOG_DEBUG("Cleaned up redis engine object.");
FIO_PUBSUB_DEFAULT = FIO_PUBSUB_CLUSTER;
}
void initialize_cli(int argc, char const *argv[]) {
/* **** Command line arguments **** */
fio_cli_start(
argc, argv, 0, 0, NULL, FIO_CLI_PRINT_HEADER("Address binding:"),
FIO_CLI_INT("-port -p port number to listen to. defaults port 3000"),
FIO_CLI_STRING("-bind -b address to listen to. defaults any available."),
FIO_CLI_PRINT_HEADER("Concurrency:"),
FIO_CLI_INT("-workers -w number of processes to use."),
FIO_CLI_INT("-threads -t number of threads per process."),
FIO_CLI_PRINT_HEADER("HTTP Server:"),
FIO_CLI_STRING("-public -www public folder, for static file service."),
FIO_CLI_INT(
"-keep-alive -k HTTP keep-alive timeout (0..255). default: ~5s"),
FIO_CLI_INT("-max-body -maxbd HTTP upload limit. default: ~50Mb"),
FIO_CLI_BOOL("-log -v request verbosity (logging)."),
FIO_CLI_PRINT_HEADER("WebSocket Server:"),
FIO_CLI_INT("-ping websocket ping interval (0..255). default: ~40s"),
FIO_CLI_INT("-max-msg -maxms incoming websocket message size limit. "
"default: ~250Kb"),
FIO_CLI_PRINT_HEADER("Redis support:"),
FIO_CLI_STRING("-redis -r an optional Redis URL server address."),
FIO_CLI_PRINT("\t\ti.e.: redis://user:password@localhost:6379/"));
/* Test and set any default options */
if (!fio_cli_get("-b")) {
char *tmp = getenv("ADDRESS");
if (tmp) {
fio_cli_set("-b", tmp);
fio_cli_set("-bind", tmp);
}
}
if (!fio_cli_get("-p")) {
/* Test environment as well and make sure address is missing */
char *tmp = getenv("PORT");
if (!tmp && !fio_cli_get("-b"))
tmp = "3000";
/* Set default (unlike cmd line arguments, aliases are manually set) */
fio_cli_set("-p", tmp);
fio_cli_set("-port", tmp);
}
if (!fio_cli_get("-public")) {
char *tmp = getenv("HTTP_PUBLIC_FOLDER");
if (tmp) {
fio_cli_set("-public", tmp);
fio_cli_set("-www", tmp);
}
}
if (!fio_cli_get("-redis")) {
char *tmp = getenv("REDIS_URL");
if (tmp) {
fio_cli_set("-redis", tmp);
fio_cli_set("-r", tmp);
}
}
if (fio_cli_get("-redis") && strlen(fio_cli_get("-redis"))) {
FIO_LOG_INFO("* Initializing Redis connection to %s\n",
fio_cli_get("-redis"));
http_url_s info =
http_url_parse(fio_cli_get("-redis"), strlen(fio_cli_get("-redis")));
fio_pubsub_engine_s *e =
redis_engine_create(.address = info.host, .port = info.port,
.auth = info.password);
if (e) {
fio_state_callback_add(FIO_CALL_ON_FINISH, redis_cleanup, e);
FIO_PUBSUB_DEFAULT = e;
} else {
FIO_LOG_ERROR("Failed to create redis engine object.");
}
}
}
void free_cli(void) { fio_cli_end(); }