#include "util.h"
#include "build.h"
#include "fileio.h"
+#include "conf-parser.h"
#include "journal-upload.h"
+#define PRIV_KEY_FILE CERTIFICATE_ROOT "/private/journal-upload.pem"
+#define CERT_FILE CERTIFICATE_ROOT "/certs/journal-upload.pem"
+#define TRUST_FILE CERTIFICATE_ROOT "/ca/trusted.pem"
+
static const char* arg_url;
static void close_fd_input(Uploader *u);
"systemd-journal-upload " PACKAGE_STRING,
LOG_WARNING, );
- if (arg_key) {
+ if (arg_key || startswith(u->url, "https://")) {
assert(arg_cert);
- easy_setopt(curl, CURLOPT_SSLKEY, arg_key,
+ easy_setopt(curl, CURLOPT_SSLKEY, arg_key ?: PRIV_KEY_FILE,
LOG_ERR, return -EXFULL);
- easy_setopt(curl, CURLOPT_SSLCERT, arg_cert,
+ easy_setopt(curl, CURLOPT_SSLCERT, arg_cert ?: CERT_FILE,
LOG_ERR, return -EXFULL);
}
- if (arg_trust)
- easy_setopt(curl, CURLOPT_CAINFO, arg_trust,
+ if (arg_trust || startswith(u->url, "https://"))
+ easy_setopt(curl, CURLOPT_CAINFO, arg_trust ?: TRUST_FILE,
LOG_ERR, return -EXFULL);
if (arg_key || arg_trust)
}
static int open_file_for_upload(Uploader *u, const char *filename) {
- int fd, r;
+ int fd, r = 0;
if (streq(filename, "-"))
fd = STDIN_FILENO;
return update_cursor_state(u);
}
+static int parse_config(void) {
+ const ConfigTableItem items[] = {
+ { "Upload", "URL", config_parse_string, 0, &arg_url },
+ { "Upload", "ServerKeyFile", config_parse_path, 0, &arg_key },
+ { "Upload", "ServerCertificateFile", config_parse_path, 0, &arg_cert },
+ { "Upload", "TrustedCertificateFile", config_parse_path, 0, &arg_trust },
+ {}};
+
+ return config_parse(NULL, PKGSYSCONFDIR "/journal-upload.conf", NULL,
+ "Upload\0",
+ config_item_table_lookup, items,
+ false, false, true, NULL);
+}
+
static void help(void) {
printf("%s -u URL {FILE|-}...\n\n"
"Upload journal events to a remote server.\n\n"
- "Options:\n"
- " -u --url=URL Upload to this address\n"
- " --key=FILENAME Specify key in PEM format\n"
- " --cert=FILENAME Specify certificate in PEM format\n"
- " --trust=FILENAME Specify CA certificate in PEM format\n"
- " --system Use the system journal\n"
- " --user Use the user journal for the current user\n"
- " -m --merge Use all available journals\n"
- " -M --machine=CONTAINER Operate on local container\n"
- " -D --directory=PATH Use journal files from directory\n"
- " --file=PATH Use this journal file\n"
- " --cursor=CURSOR Start at the specified cursor\n"
- " --after-cursor=CURSOR Start after the specified cursor\n"
- " --[no-]follow Do [not] wait for input\n"
- " --save-state[=FILE] Save uploaded cursors (default \n"
- " " STATE_FILE ")\n"
- " -h --help Show this help and exit\n"
- " --version Print version string and exit\n"
+ " -h --help Show this help\n"
+ " --version Show package version\n"
+ " -u --url=URL Upload to this address\n"
+ " --key=FILENAME Specify key in PEM format\n"
+ " --cert=FILENAME Specify certificate in PEM format\n"
+ " --trust=FILENAME Specify CA certificate in PEM format\n"
+ " --system Use the system journal\n"
+ " --user Use the user journal for the current user\n"
+ " -m --merge Use all available journals\n"
+ " -M --machine=CONTAINER Operate on local container\n"
+ " -D --directory=PATH Use journal files from directory\n"
+ " --file=PATH Use this journal file\n"
+ " --cursor=CURSOR Start at the specified cursor\n"
+ " --after-cursor=CURSOR Start after the specified cursor\n"
+ " --follow[=BOOL] Do [not] wait for input\n"
+ " --save-state[=FILE] Save uploaded cursors (default \n"
+ " " STATE_FILE ")\n"
+ " -h --help Show this help and exit\n"
+ " --version Print version string and exit\n"
, program_invocation_short_name);
}
ARG_CURSOR,
ARG_AFTER_CURSOR,
ARG_FOLLOW,
- ARG_NO_FOLLOW,
ARG_SAVE_STATE,
};
{ "file", required_argument, NULL, ARG_FILE },
{ "cursor", required_argument, NULL, ARG_CURSOR },
{ "after-cursor", required_argument, NULL, ARG_AFTER_CURSOR },
- { "follow", no_argument, NULL, ARG_FOLLOW },
- { "no-follow", no_argument, NULL, ARG_NO_FOLLOW },
+ { "follow", optional_argument, NULL, ARG_FOLLOW },
{ "save-state", optional_argument, NULL, ARG_SAVE_STATE },
{}
};
break;
case ARG_FOLLOW:
- arg_follow = true;
- break;
+ if (optarg) {
+ r = parse_boolean(optarg);
+ if (r < 0) {
+ log_error("Failed to parse --follow= parameter.");
+ return -EINVAL;
+ }
+
+ arg_follow = !!r;
+ } else
+ arg_follow = true;
- case ARG_NO_FOLLOW:
- arg_follow = false;
break;
case ARG_SAVE_STATE:
log_show_color(true);
log_parse_environment();
+ r = parse_config();
+ if (r < 0)
+ goto finish;
+
r = parse_argv(argc, argv);
if (r <= 0)
goto finish;
}
cleanup:
- sd_notify(false, "STATUS=Shutting down...");
+ sd_notify(false,
+ "STOPPING=1\n"
+ "STATUS=Shutting down...");
+
destroy_uploader(&u);
finish: