lxc-start can output the console to a file

Add the ability to specify a file to output the console.

Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
This commit is contained in:
Daniel Lezcano 2011-02-01 14:49:40 +01:00 committed by Daniel Lezcano
parent 9dd97e4414
commit 829dd9183c
4 changed files with 51 additions and 18 deletions

View File

@ -49,7 +49,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
<refsynopsisdiv>
<cmdsynopsis><command>lxc-start <replaceable>-n
name</replaceable> <optional>-f
config_file</optional> <optional>-s KEY=VAL</optional>
config_file</optional> <optional>-c
console_file</optional> <optional>-d</optional> <optional>-s
KEY=VAL</optional>
<optional>command</optional></command></cmdsynopsis>
</refsynopsisdiv>
@ -118,6 +120,20 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>-c,
--console <replaceable>console_file</replaceable></option>
</term>
<listitem>
<para>
Specify a file to output the container console. If the
option is not specified the output will go the terminal
except if the <option>-d</option> is specified.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>-s, --define <replaceable>KEY=VAL</replaceable></option>

View File

@ -168,6 +168,7 @@ extern int lxc_arguments_parse(struct lxc_arguments *args,
case 'n': args->name = optarg; break;
case 'o': args->log_file = optarg; break;
case 'l': args->log_priority = optarg; break;
case 'c': args->console = optarg; break;
case 'q': args->quiet = 1; break;
case OPT_USAGE: print_usage(args->options, args);
case '?': print_help(args, 1);

View File

@ -44,6 +44,7 @@ struct lxc_arguments {
int quiet;
int daemonize;
const char *rcfile;
const char *console;
/* for lxc-checkpoint/restart */
const char *statefile;

View File

@ -57,6 +57,7 @@ static struct lxc_list defines;
static int my_parser(struct lxc_arguments* args, int c, char* arg)
{
switch (c) {
case 'c': args->console = arg; break;
case 'd': args->daemonize = 1; break;
case 'f': args->rcfile = arg; break;
case 's': return lxc_config_define_add(&defines, arg);
@ -68,6 +69,7 @@ static const struct option my_longopts[] = {
{"daemon", no_argument, 0, 'd'},
{"rcfile", required_argument, 0, 'f'},
{"define", required_argument, 0, 's'},
{"console", required_argument, 0, 'c'},
LXC_COMMON_OPTIONS
};
@ -82,6 +84,7 @@ Options :\n\
-n, --name=NAME NAME for name of the container\n\
-d, --daemon daemonize the container\n\
-f, --rcfile=FILE Load configuration file FILE\n\
-c, --console=FILE Set the file output for the container console\n\
-s, --define KEY=VAL Assign VAL to configuration variable KEY\n",
.options = my_longopts,
.parser = my_parser,
@ -160,28 +163,40 @@ int main(int argc, char *argv[])
return err;
}
if (my_args.daemonize) {
if (my_args.console) {
/* do not chdir as we want to open the log file,
* change the directory right after.
* do not close 0, 1, 2, we want to do that
* ourself because we don't want /dev/null
* being reopened.
*/
if (daemon(1, 1)) {
SYSERROR("failed to daemonize '%s'", my_args.name);
char *console, fd;
if (access(my_args.console, W_OK)) {
fd = creat(my_args.console, 0600);
if (fd < 0) {
SYSERROR("failed to touch file '%s'",
my_args.console);
return err;
}
close(fd);
}
console = realpath(my_args.console, NULL);
if (!console) {
SYSERROR("failed to get the real path of '%s'",
my_args.console);
return err;
}
close(0);
close(1);
close(2);
if (my_args.log_file) {
open(my_args.log_file, O_WRONLY | O_CLOEXEC);
open(my_args.log_file, O_RDONLY | O_CLOEXEC);
open(my_args.log_file, O_RDONLY | O_CLOEXEC);
conf->console.path = strdup(console);
if (!conf->console.path) {
ERROR("failed to dup string '%s'", console);
return err;
}
free(console);
}
if (my_args.daemonize && daemon(0, 0)) {
SYSERROR("failed to daemonize '%s'", my_args.name);
return err;
}
err = lxc_start(my_args.name, args, conf);