]> git.proxmox.com Git - mirror_lxc.git/blob - src/tests/console_log.c
tests: include config.h
[mirror_lxc.git] / src / tests / console_log.c
1 /* liblxcapi
2 *
3 * Copyright © 2017 Christian Brauner <christian.brauner@ubuntu.com>.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2, as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17 */
18
19 #include "config.h"
20
21 #include <errno.h>
22 #include <fcntl.h>
23 #include <inttypes.h>
24 #include <signal.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <unistd.h>
29 #include <sys/stat.h>
30 #include <sys/types.h>
31 #include <sys/wait.h>
32
33 #include <lxc/lxccontainer.h>
34
35 #include "lxctest.h"
36 #include "utils.h"
37
38 int main(int argc, char *argv[])
39 {
40 int ret;
41 struct stat st_log_file;
42 struct lxc_container *c;
43 struct lxc_console_log log;
44 bool do_unlink = false;
45 int fret = EXIT_FAILURE;
46
47 c = lxc_container_new("console-log", NULL);
48 if (!c) {
49 lxc_error("%s", "Failed to create container \"console-log\"");
50 exit(fret);
51 }
52
53 if (c->is_defined(c)) {
54 lxc_error("%s\n", "Container \"console-log\" is defined");
55 goto on_error_put;
56 }
57
58 /* Set console ringbuffer size. */
59 if (!c->set_config_item(c, "lxc.console.buffer.size", "4096")) {
60 lxc_error("%s\n", "Failed to set config item \"lxc.console.buffer.size\"");
61 goto on_error_put;
62 }
63
64 /* Set console log file. */
65 if (!c->set_config_item(c, "lxc.console.logfile", "/tmp/console-log.log")) {
66 lxc_error("%s\n", "Failed to set config item \"lxc.console.logfile\"");
67 goto on_error_put;
68 }
69
70 if (!c->createl(c, "busybox", NULL, NULL, 0, NULL)) {
71 lxc_error("%s\n", "Failed to create busybox container \"console-log\"");
72 goto on_error_put;
73 }
74
75 if (!c->is_defined(c)) {
76 lxc_error("%s\n", "Container \"console-log\" is not defined");
77 goto on_error_put;
78 }
79
80 c->clear_config(c);
81
82 if (!c->load_config(c, NULL)) {
83 lxc_error("%s\n", "Failed to load config for container \"console-log\"");
84 goto on_error_stop;
85 }
86
87 if (!c->want_daemonize(c, true)) {
88 lxc_error("%s\n", "Failed to mark container \"console-log\" daemonized");
89 goto on_error_stop;
90 }
91
92 if (!c->startl(c, 0, NULL)) {
93 lxc_error("%s\n", "Failed to start container \"console-log\" daemonized");
94 goto on_error_stop;
95 }
96
97 /* Leave some time for the container to write something to the log. */
98 sleep(2);
99
100 /* Retrieve the contents of the ringbuffer. */
101 log.clear = false;
102 log.read_max = &(uint64_t){0};
103 log.read = true;
104
105 ret = c->console_log(c, &log);
106 if (ret < 0) {
107 lxc_error("%s - Failed to retrieve console log \n", strerror(-ret));
108 goto on_error_stop;
109 } else {
110 lxc_debug("Retrieved %" PRIu64
111 " bytes from console log. Contents are \"%s\"\n",
112 *log.read_max, log.data);
113 free(log.data);
114 }
115
116 /* Leave another two seconds to ensure boot is finished. */
117 sleep(2);
118
119 /* Clear the console ringbuffer. */
120 log.read_max = &(uint64_t){0};
121 log.read = false;
122 log.clear = true;
123 ret = c->console_log(c, &log);
124 if (ret < 0) {
125 if (ret != -ENODATA) {
126 lxc_error("%s - Failed to retrieve console log\n", strerror(-ret));
127 goto on_error_stop;
128 }
129 }
130
131 if (!c->stop(c)) {
132 lxc_error("%s\n", "Failed to stop container \"console-log\"");
133 goto on_error_stop;
134 }
135
136 c->clear_config(c);
137
138 if (!c->load_config(c, NULL)) {
139 lxc_error("%s\n", "Failed to load config for container \"console-log\"");
140 goto on_error_stop;
141 }
142
143 if (!c->startl(c, 0, NULL)) {
144 lxc_error("%s\n", "Failed to start container \"console-log\" daemonized");
145 goto on_error_destroy;
146 }
147
148 /* Leave some time for the container to write something to the log. */
149 sleep(2);
150
151 ret = stat("/tmp/console-log.log", &st_log_file);
152 if (ret < 0) {
153 lxc_error("%s - Failed to stat on-disk logfile\n", strerror(errno));
154 goto on_error_stop;
155 }
156
157 /* Turn on rotation for the console log file. */
158 if (!c->set_config_item(c, "lxc.console.rotate", "1")) {
159 lxc_error("%s\n", "Failed to set config item \"lxc.console.rotate\"");
160 goto on_error_put;
161 }
162
163 if (!c->stop(c)) {
164 lxc_error("%s\n", "Failed to stop container \"console-log\"");
165 goto on_error_stop;
166 }
167
168 if (!c->startl(c, 0, NULL)) {
169 lxc_error("%s\n", "Failed to start container \"console-log\" daemonized");
170 goto on_error_destroy;
171 }
172
173 /* Leave some time for the container to write something to the log. */
174 sleep(2);
175
176 fret = 0;
177
178 on_error_stop:
179 if (c->is_running(c) && !c->stop(c))
180 lxc_error("%s\n", "Failed to stop container \"console-log\"");
181
182 on_error_destroy:
183 if (!c->destroy(c))
184 lxc_error("%s\n", "Failed to destroy container \"console-log\"");
185
186 on_error_put:
187 lxc_container_put(c);
188 if (do_unlink) {
189 ret = unlink("/tmp/console-log.log");
190 if (ret < 0)
191 lxc_error("%s - Failed to remove container log file\n",
192 strerror(errno));
193
194 ret = unlink("/tmp/console-log.log.1");
195 if (ret < 0)
196 lxc_error("%s - Failed to remove container log file\n",
197 strerror(errno));
198 }
199 exit(fret);
200 }