mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-02 22:44:45 +00:00
Merge pull request #1122 from Blub/rcfile-as-common-arg
Rcfile as common arg
This commit is contained in:
commit
6fe6560698
@ -106,6 +106,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--rcfile=<replaceable>FILE</replaceable></option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Specify the configuration file to configure the virtualization
|
||||
and isolation functionalities for the container.
|
||||
</para>
|
||||
<para>
|
||||
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).
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><option>--version</option></term>
|
||||
<listitem>
|
||||
|
@ -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);
|
||||
|
@ -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[]);
|
||||
|
@ -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)) {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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\
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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\
|
||||
|
@ -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);
|
||||
|
@ -59,7 +59,7 @@ static void usage(const char *name)
|
||||
{
|
||||
printf("usage: %s [-h] [-m <uid-maps>] -- [command [arg ..]]\n", name);
|
||||
printf("\n");
|
||||
printf(" -h this message\n");
|
||||
printf(" -h this message\n");
|
||||
printf("\n");
|
||||
printf(" -m <uid-maps> uid maps to use\n");
|
||||
printf("\n");
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user