int logfd, ret;
char buf[4096 + 1];
ssize_t bytes;
- struct stat st;
+ struct stat st_buffer_log_file, st_log_file, st_log_file_old;
struct lxc_container *c;
struct lxc_console_log log;
bool do_unlink = false;
}
/* Set console ringbuffer size. */
- if (!c->set_config_item(c, "lxc.console.logsize", "4096")) {
- lxc_error("%s\n", "Failed to set config item \"lxc.console.logsize\"");
+ if (!c->set_config_item(c, "lxc.console.buffer.size", "4096")) {
+ lxc_error("%s\n", "Failed to set config item \"lxc.console.buffer.size\"");
goto on_error_put;
}
- /* Set on-disk logfile. */
+ /* Set ringbuffer log file. */
+ if (!c->set_config_item(c, "lxc.console.buffer.logfile", "/tmp/console-buffer-log.log")) {
+ lxc_error("%s\n", "Failed to set config item \"lxc.console.buffer.logfile\"");
+ goto on_error_put;
+ }
+
+ /* Set console log file. */
if (!c->set_config_item(c, "lxc.console.logfile", "/tmp/console-log.log")) {
lxc_error("%s\n", "Failed to set config item \"lxc.console.logfile\"");
goto on_error_put;
goto on_error_stop;
}
+ c->clear_config(c);
+
+ if (!c->load_config(c, NULL)) {
+ lxc_error("%s\n", "Failed to load config for container \"console-log\"");
+ goto on_error_stop;
+ }
+
if (!c->startl(c, 0, NULL)) {
lxc_error("%s\n", "Failed to start container \"console-log\" daemonized");
goto on_error_destroy;
}
- do_unlink = true;
/* Leave some time for the container to write something to the log. */
sleep(2);
*log.read_max, log.data);
}
- logfd = open("/tmp/console-log.log", O_RDONLY);
+ logfd = open("/tmp/console-buffer-log.log", O_RDONLY);
if (logfd < 0) {
- lxc_error("%s - Failed to open console log file "
- "\"/tmp/console-log.log\"\n", strerror(errno));
+ lxc_error("%s - Failed to open console ringbuffer log file "
+ "\"/tmp/console-buffer-log.log\"\n", strerror(errno));
goto on_error_stop;
}
bytes = lxc_read_nointr(logfd, buf, 4096 + 1);
close(logfd);
if (bytes < 0 || ((uint64_t)bytes != *log.read_max)) {
- lxc_error("%s - Failed to read console log file "
- "\"/tmp/console-log.log\"\n", strerror(errno));
+ lxc_error("%s - Failed to read console ringbuffer log file "
+ "\"/tmp/console-buffer-log.log\"\n", strerror(errno));
goto on_error_stop;
}
- ret = stat("/tmp/console-log.log", &st);
+ ret = stat("/tmp/console-buffer-log.log", &st_buffer_log_file);
if (ret < 0) {
lxc_error("%s - Failed to stat on-disk logfile\n", strerror(errno));
goto on_error_stop;
}
- if ((uint64_t)st.st_size != *log.read_max) {
+ if ((uint64_t)st_buffer_log_file.st_size != *log.read_max) {
lxc_error("On-disk logfile size and used ringbuffer size do "
"not match: %" PRIu64 " != %" PRIu64 "\n",
- (uint64_t)st.st_size, *log.read_max);
+ (uint64_t)st_buffer_log_file.st_size, *log.read_max);
goto on_error_stop;
}
goto on_error_stop;
} else {
lxc_debug("Retrieved %" PRIu64 " bytes from console log and "
- "console log file. Contents are: \"%s\" - \"%s\"\n",
- *log.read_max, log.data, buf);
+ "console ringbuffer log file. Contents are: \"%s\" - "
+ "\"%s\"\n", *log.read_max, log.data, buf);
+ }
+
+ ret = stat("/tmp/console-log.log", &st_log_file);
+ if (ret < 0) {
+ lxc_error("%s - Failed to stat on-disk logfile\n", strerror(errno));
+ goto on_error_stop;
+ }
+
+ /* Turn on rotation for the console log file. */
+ if (!c->set_config_item(c, "lxc.console.rotate", "1")) {
+ lxc_error("%s\n", "Failed to set config item \"lxc.console.rotate\"");
+ goto on_error_put;
+ }
+
+ if (!c->stop(c)) {
+ lxc_error("%s\n", "Failed to stop container \"console-log\"");
+ goto on_error_stop;
+ }
+
+ if (!c->startl(c, 0, NULL)) {
+ lxc_error("%s\n", "Failed to start container \"console-log\" daemonized");
+ goto on_error_destroy;
+ }
+
+ /* Leave some time for the container to write something to the log. */
+ sleep(2);
+
+ /* The console log file size must be greater than the console log file
+ * size since we append to the latter and we truncated the former
+ * already.
+ */
+ if (st_log_file.st_size <= st_buffer_log_file.st_size) {
+ lxc_error("%s - Console log file size was smaller than the "
+ "console buffer log file size: %zu < %zu\n",
+ strerror(errno), (size_t)st_log_file.st_size,
+ (size_t)st_buffer_log_file.st_size);
+ goto on_error_stop;
+ } else {
+ lxc_debug("Console log file size is %zu bytes and console "
+ "buffer log file size is %zu bytes\n",
+ (size_t)st_log_file.st_size,
+ (size_t)st_buffer_log_file.st_size);
+ }
+
+ ret = stat("/tmp/console-log.log", &st_log_file);
+ if (ret < 0) {
+ lxc_error("%s - Failed to stat on-disk logfile\n", strerror(errno));
+ goto on_error_stop;
+ }
+
+ log.read_max = &(uint64_t){0};
+ log.read = false;
+ log.write_logfile = false;
+ log.clear = true;
+ ret = c->console_log(c, &log);
+ if (ret < 0) {
+ lxc_error("%s - Failed to retrieve console log \n", strerror(-ret));
+ goto on_error_stop;
+ }
+
+ /* There should now be a rotated log file called
+ * "/tmp/console-log.log.1"
+ */
+ ret = stat("/tmp/console-log.log.1", &st_log_file_old);
+ if (ret < 0) {
+ lxc_error("%s - Failed to stat on-disk logfile\n", strerror(errno));
+ goto on_error_stop;
+ }
+
+ /* The rotated log file should have the same size as before the
+ * rotation.
+ */
+ if (st_log_file.st_size != st_log_file_old.st_size) {
+ lxc_error("%s - Console log file size changed during log "
+ "rotation: %zu != %zu\n",
+ strerror(errno), (size_t)st_log_file.st_size,
+ (size_t)st_log_file_old.st_size);
+ goto on_error_stop;
}
fret = 0;
if (do_unlink) {
ret = unlink("/tmp/console-log.log");
if (ret < 0)
- lxc_error("%s - Failed to remove container log file\n", strerror(errno));
+ lxc_error("%s - Failed to remove container log file\n",
+ strerror(errno));
+
+ ret = unlink("/tmp/console-log.log.1");
+ if (ret < 0)
+ lxc_error("%s - Failed to remove container log file\n",
+ strerror(errno));
}
exit(fret);
}