diff --git a/doc/common_options.sgml.in b/doc/common_options.sgml.in index 38783dd1e..978c0ba0d 100644 --- a/doc/common_options.sgml.in +++ b/doc/common_options.sgml.in @@ -106,6 +106,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + + + + + Specify the configuration file to configure the virtualization + and isolation functionalities for the container. + + + This configuration file if present will be used even if there is + already a configuration file present in the previously created + container (via lxc-create). + + + + diff --git a/src/lxc/arguments.c b/src/lxc/arguments.c index c2f7b67a6..0d2b2031b 100644 --- a/src/lxc/arguments.c +++ b/src/lxc/arguments.c @@ -203,6 +203,7 @@ extern int lxc_arguments_parse(struct lxc_arguments *args, case 'o': args->log_file = optarg; break; case 'l': args->log_priority = optarg; break; case 'q': args->quiet = 1; break; + case OPT_RCFILE: args->rcfile = optarg; break; case 'P': remove_trailing_slashes(optarg); ret = lxc_arguments_lxcpath_add(args, optarg); diff --git a/src/lxc/arguments.h b/src/lxc/arguments.h index f68f8ab90..39bedf566 100644 --- a/src/lxc/arguments.h +++ b/src/lxc/arguments.h @@ -151,11 +151,13 @@ struct lxc_arguments { {"logfile", required_argument, 0, 'o'}, \ {"logpriority", required_argument, 0, 'l'}, \ {"lxcpath", required_argument, 0, 'P'}, \ + {"rcfile", required_argument, 0, OPT_RCFILE}, \ {0, 0, 0, 0} /* option keys for long only options */ #define OPT_USAGE 0x1000 #define OPT_VERSION OPT_USAGE-1 +#define OPT_RCFILE OPT_USAGE-2 extern int lxc_arguments_parse(struct lxc_arguments *args, int argc, char *const argv[]); diff --git a/src/lxc/tools/lxc_attach.c b/src/lxc/tools/lxc_attach.c index 281f97aca..9d7138835 100644 --- a/src/lxc/tools/lxc_attach.c +++ b/src/lxc/tools/lxc_attach.c @@ -385,6 +385,12 @@ int main(int argc, char *argv[]) lxc_container_put(c); exit(EXIT_FAILURE); } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + ERROR("Out of memory setting new config filename"); + lxc_container_put(c); + exit(EXIT_FAILURE); + } } if (!c->may_control(c)) { diff --git a/src/lxc/tools/lxc_cgroup.c b/src/lxc/tools/lxc_cgroup.c index dd60fd107..4dc2682b8 100644 --- a/src/lxc/tools/lxc_cgroup.c +++ b/src/lxc/tools/lxc_cgroup.c @@ -56,7 +56,8 @@ Get or set the value of a state object (for example, 'cpuset.cpus')\n\ in the container's cgroup for the corresponding subsystem.\n\ \n\ Options :\n\ - -n, --name=NAME NAME of the container", + -n, --name=NAME NAME of the container\n\ + --rcfile=FILE Load configuration file FILE\n", .options = my_longopts, .parser = NULL, .checker = my_checker, @@ -84,6 +85,21 @@ int main(int argc, char *argv[]) if (!c) return 1; + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + ERROR("Failed to load rcfile"); + lxc_container_put(c); + return 1; + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + ERROR("Out of memory setting new config filename"); + lxc_container_put(c); + return 1; + } + } + if (!c->may_control(c)) { ERROR("Insufficent privileges to control %s:%s", my_args.lxcpath[0], my_args.name); lxc_container_put(c); diff --git a/src/lxc/tools/lxc_checkpoint.c b/src/lxc/tools/lxc_checkpoint.c index 7130245a7..6de3d239b 100644 --- a/src/lxc/tools/lxc_checkpoint.c +++ b/src/lxc/tools/lxc_checkpoint.c @@ -114,6 +114,7 @@ Options :\n\ Restore options:\n\ -d, --daemon Daemonize the container (default)\n\ -F, --foreground Start with the current tty attached to /dev/console\n\ + --rcfile=FILE Load configuration file FILE\n\ ", .options = my_longopts, .parser = my_parser, @@ -214,6 +215,21 @@ int main(int argc, char *argv[]) exit(1); } + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + fprintf(stderr, "Failed to load rcfile\n"); + lxc_container_put(c); + exit(1); + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + fprintf(stderr, "Out of memory setting new config filename\n"); + lxc_container_put(c); + exit(1); + } + } + if (!c->may_control(c)) { fprintf(stderr, "Insufficent privileges to control %s\n", my_args.name); lxc_container_put(c); diff --git a/src/lxc/tools/lxc_console.c b/src/lxc/tools/lxc_console.c index adbd7e019..829c908d4 100644 --- a/src/lxc/tools/lxc_console.c +++ b/src/lxc/tools/lxc_console.c @@ -80,7 +80,8 @@ lxc-console logs on the container with the identifier NAME\n\ Options :\n\ -n, --name=NAME NAME of the container\n\ -t, --tty=NUMBER console tty number\n\ - -e, --escape=PREFIX prefix for escape command\n", + -e, --escape=PREFIX prefix for escape command\n\ + --rcfile=FILE Load configuration file FILE\n", .options = my_longopts, .parser = my_parser, .checker = NULL, @@ -112,6 +113,21 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + fprintf(stderr, "Failed to load rcfile\n"); + lxc_container_put(c); + exit(EXIT_FAILURE); + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + fprintf(stderr, "Out of memory setting new config filename\n"); + lxc_container_put(c); + exit(EXIT_FAILURE); + } + } + if (!c->may_control(c)) { fprintf(stderr, "Insufficent privileges to control %s\n", my_args.name); lxc_container_put(c); diff --git a/src/lxc/tools/lxc_copy.c b/src/lxc/tools/lxc_copy.c index 3257ab73b..80cfb27c0 100644 --- a/src/lxc/tools/lxc_copy.c +++ b/src/lxc/tools/lxc_copy.c @@ -112,21 +112,22 @@ Options :\n\ -n, --name=NAME NAME of the container\n\ -N, --newname=NEWNAME NEWNAME for the restored container\n\ -p, --newpath=NEWPATH NEWPATH for the container to be stored\n\ - -R, --rename rename container\n\ - -s, --snapshot create snapshot instead of clone\n\ - -F, --foreground start with current tty attached to /dev/console\n\ - -d, --daemon daemonize the container (default)\n\ - -e, --ephemeral start ephemeral container\n\ - -m, --mount directory to mount into container, either \n\ - {bind,aufs,overlay}=/src-path or {bind,aufs,overlay}=/src-path:/dst-path\n\ + -R, --rename rename container\n\ + -s, --snapshot create snapshot instead of clone\n\ + -F, --foreground start with current tty attached to /dev/console\n\ + -d, --daemon daemonize the container (default)\n\ + -e, --ephemeral start ephemeral container\n\ + -m, --mount directory to mount into container, either \n\ + {bind,aufs,overlay}=/src-path or {bind,aufs,overlay}=/src-path:/dst-path\n\ -B, --backingstorage=TYPE backingstorage type for the container\n\ - -t, --tmpfs place ephemeral container on a tmpfs\n\ - (WARNING: On reboot all changes made to the container will be lost.)\n\ - -L, --fssize size of the new block device for block device containers\n\ - -D, --keedata pass together with -e start a persistent snapshot \n\ - -K, --keepname keep the hostname of the original container\n\ - -- hook options arguments passed to the hook program\n\ - -M, --keepmac keep the MAC address of the original container\n", + -t, --tmpfs place ephemeral container on a tmpfs\n\ + (WARNING: On reboot all changes made to the container will be lost.)\n\ + -L, --fssize size of the new block device for block device containers\n\ + -D, --keedata pass together with -e start a persistent snapshot \n\ + -K, --keepname keep the hostname of the original container\n\ + -- hook options arguments passed to the hook program\n\ + -M, --keepmac keep the MAC address of the original container\n\ + --rcfile=FILE Load configuration file FILE\n", .options = my_longopts, .parser = my_parser, .task = CLONE, @@ -210,6 +211,19 @@ int main(int argc, char *argv[]) if (!c) exit(ret); + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + fprintf(stderr, "Failed to load rcfile\n"); + goto out; + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + fprintf(stderr, "Out of memory setting new config filename\n"); + goto out; + } + } + if (!c->may_control(c)) { if (!my_args.quiet) fprintf(stderr, "Insufficent privileges to control %s\n", c->name); diff --git a/src/lxc/tools/lxc_destroy.c b/src/lxc/tools/lxc_destroy.c index b521739be..3f46415df 100644 --- a/src/lxc/tools/lxc_destroy.c +++ b/src/lxc/tools/lxc_destroy.c @@ -53,7 +53,8 @@ lxc-destroy destroys a container with the identifier NAME\n\ Options :\n\ -n, --name=NAME NAME of the container\n\ -s, --snapshots destroy including all snapshots\n\ - -f, --force wait for the container to shut down\n", + -f, --force wait for the container to shut down\n\ + --rcfile=FILE Load configuration file FILE\n", .options = my_longopts, .parser = my_parser, .checker = NULL, @@ -88,6 +89,21 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + fprintf(stderr, "Failed to load rcfile\n"); + lxc_container_put(c); + exit(EXIT_FAILURE); + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + fprintf(stderr, "Out of memory setting new config filename\n"); + lxc_container_put(c); + exit(EXIT_FAILURE); + } + } + if (!c->may_control(c)) { if (!quiet) fprintf(stderr, "Insufficent privileges to control %s\n", my_args.name); diff --git a/src/lxc/tools/lxc_device.c b/src/lxc/tools/lxc_device.c index 0c9e06648..49af062e5 100644 --- a/src/lxc/tools/lxc_device.c +++ b/src/lxc/tools/lxc_device.c @@ -53,7 +53,8 @@ static struct lxc_arguments my_args = { lxc-device attach or detach DEV to or from container.\n\ \n\ Options :\n\ - -n, --name=NAME NAME of the container", + -n, --name=NAME NAME of the container\n\ + --rcfile=FILE Load configuration file FILE\n", .options = my_longopts, .parser = NULL, .checker = NULL, @@ -125,6 +126,19 @@ int main(int argc, char *argv[]) goto err; } + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + ERROR("Failed to load rcfile"); + goto err1; + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + ERROR("Out of memory setting new config filename"); + goto err1; + } + } + if (!c->is_running(c)) { ERROR("Container %s is not running.", c->name); goto err1; diff --git a/src/lxc/tools/lxc_execute.c b/src/lxc/tools/lxc_execute.c index 50d481f0e..c7c50962c 100644 --- a/src/lxc/tools/lxc_execute.c +++ b/src/lxc/tools/lxc_execute.c @@ -86,8 +86,8 @@ Options :\n\ -n, --name=NAME NAME of the container\n\ -f, --rcfile=FILE Load configuration file FILE\n\ -s, --define KEY=VAL Assign VAL to configuration variable KEY\n\ - -u, --uid=UID Execute COMMAND with UID inside the container\n\ - -g, --gid=GID Execute COMMAND with GID inside the container\n", + -u, --uid=UID Execute COMMAND with UID inside the container\n\ + -g, --gid=GID Execute COMMAND with GID inside the container\n", .options = my_longopts, .parser = my_parser, .checker = my_checker, diff --git a/src/lxc/tools/lxc_freeze.c b/src/lxc/tools/lxc_freeze.c index ea8bd3eae..ac0802e5a 100644 --- a/src/lxc/tools/lxc_freeze.c +++ b/src/lxc/tools/lxc_freeze.c @@ -47,7 +47,8 @@ static struct lxc_arguments my_args = { lxc-freeze freezes a container with the identifier NAME\n\ \n\ Options :\n\ - -n, --name=NAME NAME of the container", + -n, --name=NAME NAME of the container\n\ + --rcfile=FILE Load configuration file FILE\n", .options = my_longopts, .parser = NULL, .checker = NULL, @@ -74,6 +75,21 @@ int main(int argc, char *argv[]) exit(1); } + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + ERROR("Failed to load rcfile"); + lxc_container_put(c); + exit(1); + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + ERROR("Out of memory setting new config filename"); + lxc_container_put(c); + exit(1); + } + } + if (!c->may_control(c)) { ERROR("Insufficent privileges to control %s:%s", my_args.lxcpath[0], my_args.name); lxc_container_put(c); diff --git a/src/lxc/tools/lxc_info.c b/src/lxc/tools/lxc_info.c index 58ff619f2..08c698d61 100644 --- a/src/lxc/tools/lxc_info.c +++ b/src/lxc/tools/lxc_info.c @@ -93,7 +93,8 @@ Options :\n\ -p, --pid shows the process id of the init container\n\ -S, --stats shows usage stats\n\ -H, --no-humanize shows stats as raw numbers, not humanized\n\ - -s, --state shows the state of the container\n", + -s, --state shows the state of the container\n\ + --rcfile=FILE Load configuration file FILE\n", .name = NULL, .options = my_longopts, .parser = my_parser, @@ -295,6 +296,21 @@ static int print_info(const char *name, const char *lxcpath) return -1; } + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + fprintf(stderr, "Failed to load rcfile\n"); + lxc_container_put(c); + return -1; + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + fprintf(stderr, "Out of memory setting new config filename\n"); + lxc_container_put(c); + return -1; + } + } + if (!c->may_control(c)) { fprintf(stderr, "Insufficent privileges to control %s\n", c->name); lxc_container_put(c); diff --git a/src/lxc/tools/lxc_ls.c b/src/lxc/tools/lxc_ls.c index 0575277ca..e22c715ea 100644 --- a/src/lxc/tools/lxc_ls.c +++ b/src/lxc/tools/lxc_ls.c @@ -184,8 +184,8 @@ static struct lxc_arguments my_args = { lxc-ls list containers\n\ \n\ Options :\n\ - -1, --line show one entry per line\n\ - -f, --fancy column-based output\n\ + -1, --line show one entry per line\n\ + -f, --fancy column-based output\n\ -F, --fancy-format column-based output\n\ --active list only active containers\n\ --running list only running containers\n\ diff --git a/src/lxc/tools/lxc_snapshot.c b/src/lxc/tools/lxc_snapshot.c index 8f44891b5..1a79a7a1d 100644 --- a/src/lxc/tools/lxc_snapshot.c +++ b/src/lxc/tools/lxc_snapshot.c @@ -55,14 +55,15 @@ static struct lxc_arguments my_args = { lxc-snapshot snapshots a container\n\ \n\ Options :\n\ - -n, --name=NAME NAME of the container\n\ + -n, --name=NAME NAME of the container\n\ -L, --list list all snapshots\n\ -r, --restore=NAME restore snapshot NAME, e.g. 'snap0'\n\ -N, --newname=NEWNAME NEWNAME for the restored container\n\ -d, --destroy=NAME destroy snapshot NAME, e.g. 'snap0'\n\ use ALL to destroy all snapshots\n\ -c, --comment=FILE add FILE as a comment\n\ - -C, --showcomments show snapshot comments\n", + -C, --showcomments show snapshot comments\n\ + --rcfile=FILE Load configuration file FILE\n", .options = my_longopts, .parser = my_parser, .checker = NULL, @@ -107,6 +108,21 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); } + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + fprintf(stderr, "Failed to load rcfile\n"); + lxc_container_put(c); + exit(EXIT_FAILURE); + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + fprintf(stderr, "Out of memory setting new config filename\n"); + lxc_container_put(c); + exit(EXIT_FAILURE); + } + } + if (!c->may_control(c)) { fprintf(stderr, "Insufficent privileges to control %s\n", my_args.name); diff --git a/src/lxc/tools/lxc_stop.c b/src/lxc/tools/lxc_stop.c index 10ddce6a9..cb7cfe2e6 100644 --- a/src/lxc/tools/lxc_stop.c +++ b/src/lxc/tools/lxc_stop.c @@ -75,7 +75,8 @@ Options :\n\ -t, --timeout=T wait T seconds before hard-stopping\n\ -k, --kill kill container rather than request clean shutdown\n\ --nolock Avoid using API locks\n\ - --nokill Only request clean shutdown, don't force kill after timeout\n", + --nokill Only request clean shutdown, don't force kill after timeout\n\ + --rcfile=FILE Load configuration file FILE\n", .options = my_longopts, .parser = my_parser, .checker = NULL, @@ -203,6 +204,19 @@ int main(int argc, char *argv[]) goto out; } + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + fprintf(stderr, "Failed to load rcfile\n"); + goto out; + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + fprintf(stderr, "Out of memory setting new config filename\n"); + goto out; + } + } + if (!c->may_control(c)) { fprintf(stderr, "Insufficent privileges to control %s\n", c->name); goto out; diff --git a/src/lxc/tools/lxc_top.c b/src/lxc/tools/lxc_top.c index c4cb87168..47deddd62 100644 --- a/src/lxc/tools/lxc_top.c +++ b/src/lxc/tools/lxc_top.c @@ -91,7 +91,7 @@ static const struct option my_longopts[] = { static struct lxc_arguments my_args = { .progname = "lxc-top", .help = "\ -[--name=NAME]\n\ +\n\ \n\ lxc-top monitors the state of the active containers\n\ \n\ diff --git a/src/lxc/tools/lxc_unfreeze.c b/src/lxc/tools/lxc_unfreeze.c index 3a13d3723..24faf5e96 100644 --- a/src/lxc/tools/lxc_unfreeze.c +++ b/src/lxc/tools/lxc_unfreeze.c @@ -45,7 +45,8 @@ static struct lxc_arguments my_args = { lxc-unfreeze unfreezes a container with the identifier NAME\n\ \n\ Options :\n\ - -n, --name=NAME NAME of the container\n", + -n, --name=NAME NAME of the container\n\ + --rcfile=FILE Load configuration file FILE\n", .options = my_longopts, .parser = NULL, .checker = NULL, @@ -78,6 +79,21 @@ int main(int argc, char *argv[]) exit(1); } + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + ERROR("Failed to load rcfile"); + lxc_container_put(c); + exit(1); + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + ERROR("Out of memory setting new config filename"); + lxc_container_put(c); + exit(1); + } + } + if (!c->unfreeze(c)) { ERROR("Failed to unfreeze %s:%s", my_args.lxcpath[0], my_args.name); lxc_container_put(c); diff --git a/src/lxc/tools/lxc_usernsexec.c b/src/lxc/tools/lxc_usernsexec.c index 6745ac308..27d9cf5f6 100644 --- a/src/lxc/tools/lxc_usernsexec.c +++ b/src/lxc/tools/lxc_usernsexec.c @@ -59,7 +59,7 @@ static void usage(const char *name) { printf("usage: %s [-h] [-m ] -- [command [arg ..]]\n", name); printf("\n"); - printf(" -h this message\n"); + printf(" -h this message\n"); printf("\n"); printf(" -m uid maps to use\n"); printf("\n"); diff --git a/src/lxc/tools/lxc_wait.c b/src/lxc/tools/lxc_wait.c index 712ba52d6..61fd869d7 100644 --- a/src/lxc/tools/lxc_wait.c +++ b/src/lxc/tools/lxc_wait.c @@ -72,7 +72,8 @@ Options :\n\ -s, --state=STATE ORed states to wait for\n\ STOPPED, STARTING, RUNNING, STOPPING,\n\ ABORTING, FREEZING, FROZEN, THAWED\n\ - -t, --timeout=TMO Seconds to wait for state changes\n", + -t, --timeout=TMO Seconds to wait for state changes\n\ + --rcfile=FILE Load configuration file FILE\n", .options = my_longopts, .parser = my_parser, .checker = my_checker, @@ -104,6 +105,21 @@ int main(int argc, char *argv[]) return 1; } + if (my_args.rcfile) { + c->clear_config(c); + if (!c->load_config(c, my_args.rcfile)) { + fprintf(stderr, "Failed to load rcfile\n"); + lxc_container_put(c); + return 1; + } + c->configfile = strdup(my_args.rcfile); + if (!c->configfile) { + fprintf(stderr, "Out of memory setting new config filename\n"); + lxc_container_put(c); + return 1; + } + } + if (!c->wait(c, my_args.states, my_args.timeout)) { lxc_container_put(c); return 1;