#include "conf-parser.h"
#include "journal-upload.h"
-#define 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"
+#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;
easy_setopt(curl, CURLOPT_POST, 1L,
LOG_ERR, return -EXFULL);
- easy_setopt(curl, CURLOPT_ERRORBUFFER, &u->error,
+ easy_setopt(curl, CURLOPT_ERRORBUFFER, u->error,
LOG_ERR, return -EXFULL);
/* set where to write to */
if (arg_key || startswith(u->url, "https://")) {
assert(arg_cert);
- easy_setopt(curl, CURLOPT_SSLKEY, arg_key ?: KEY_FILE,
+ easy_setopt(curl, CURLOPT_SSLKEY, arg_key ?: PRIV_KEY_FILE,
LOG_ERR, return -EXFULL);
easy_setopt(curl, CURLOPT_SSLCERT, arg_cert ?: CERT_FILE,
LOG_ERR, return -EXFULL);
}
static int open_file_for_upload(Uploader *u, const char *filename) {
- int fd, r;
+ int fd, r = 0;
if (streq(filename, "-"))
fd = STDIN_FILENO;
{ "Upload", "ServerCertificateFile", config_parse_path, 0, &arg_cert },
{ "Upload", "TrustedCertificateFile", config_parse_path, 0, &arg_trust },
{}};
- int r;
-
- r = config_parse(NULL, PKGSYSCONFDIR "/journal-upload.conf", NULL,
- "Upload\0",
- config_item_table_lookup, items,
- false, false, NULL);
- if (r < 0)
- log_error("Failed to parse configuration file: %s", strerror(-r));
- return r;
+ 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_parse_environment();
r = parse_config();
- if (r <= 0)
+ if (r < 0)
goto finish;
r = parse_argv(argc, argv);
}
cleanup:
- sd_notify(false, "STATUS=Shutting down...");
+ sd_notify(false,
+ "STOPPING=1\n"
+ "STATUS=Shutting down...");
+
destroy_uploader(&u);
finish: