This sets a global dryrun_only variable, which individual commands are
expected to honour. To avoid accidents, we introduce a new can_dryrun
member in the command table, which is initially set to 0 for each
command.
Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
---
tools/libxl/xl.c | 17 +++++--
tools/libxl/xl.h | 2 +
tools/libxl/xl_cmdimpl.c | 5 +-
tools/libxl/xl_cmdtable.c | 124 ++++++++++++++++++++++----------------------
4 files changed, 80 insertions(+), 68 deletions(-)
diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c
index 5bab2ff..1f231a8 100644
--- a/tools/libxl/xl.c
+++ b/tools/libxl/xl.c
@@ -34,6 +34,7 @@
#include "xl.h"
xentoollog_logger_stdiostream *logger;
+int dryrun_only;
int autoballoon = 1;
char *lockfile;
char *default_vifscript = NULL;
@@ -90,11 +91,14 @@ int main(int argc, char **argv)
void *config_data = 0;
int config_len = 0;
- while ((opt = getopt(argc, argv, "+v")) >= 0) {
+ while ((opt = getopt(argc, argv, "+vN")) >= 0) {
switch (opt) {
case 'v':
if (minmsglevel > 0) minmsglevel--;
break;
+ case 'N':
+ dryrun_only = 1;
+ break;
default:
fprintf(stderr, "unknown global option\n");
exit(2);
@@ -138,9 +142,14 @@ int main(int argc, char **argv)
optind = 1;
cspec = cmdtable_lookup(cmd);
- if (cspec)
+ if (cspec) {
+ if (dryrun_only && !cspec->can_dryrun) {
+ fprintf(stderr, "command does not implement -N (dryrun) option\n");
+ ret = 1;
+ goto xit;
+ }
ret = cspec->cmd_impl(argc, argv);
- else if (!strcmp(cmd, "help")) {
+ } else if (!strcmp(cmd, "help")) {
help(argv[1]);
ret = 0;
} else {
@@ -148,8 +157,8 @@ int main(int argc, char **argv)
ret = 1;
}
+ xit:
libxl_ctx_free(ctx);
xtl_logger_destroy((xentoollog_logger*)logger);
-
return ret;
}
diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h
index bce135a..04f9045 100644
--- a/tools/libxl/xl.h
+++ b/tools/libxl/xl.h
@@ -20,6 +20,7 @@
struct cmd_spec {
char *cmd_name;
int (*cmd_impl)(int argc, char **argv);
+ int can_dryrun;
char *cmd_desc;
char *cmd_usage;
char *cmd_option;
@@ -103,6 +104,7 @@ extern xentoollog_logger_stdiostream *logger;
/* global options */
extern int autoballoon;
+extern int dryrun_only;
extern char *lockfile;
extern char *default_vifscript;
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index d2e343d..208e745 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -1651,7 +1651,7 @@ void help(const char *command)
struct cmd_spec *cmd;
if (!command || !strcmp(command, "help")) {
- printf("Usage xl [-v] <subcommand> [args]\n\n");
+ printf("Usage xl [-vN] <subcommand> [args]\n\n");
printf("xl full list of subcommands:\n\n");
for (i = 0; i < cmdtable_len; i++)
printf(" %-20s%s\n",
@@ -1659,7 +1659,8 @@ void help(const char *command)
} else {
cmd = cmdtable_lookup(command);
if (cmd) {
- printf("Usage: xl [-v] %s %s\n\n%s.\n\n",
+ printf("Usage: xl [-v%s] %s %s\n\n%s.\n\n",
+ cmd->can_dryrun ? "N" : "",
cmd->cmd_name,
cmd->cmd_usage,
cmd->cmd_desc);
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
index a899803..5308288 100644
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -19,7 +19,7 @@
struct cmd_spec cmd_table[] = {
{ "create",
- &main_create,
+ &main_create, 0,
"Create a domain from config file <filename>",
"<ConfigFile> [options] [vars]",
"-h Print this help.\n"
@@ -32,7 +32,7 @@ struct cmd_spec cmd_table[] = {
"-e Do not wait in the background for the death of
the domain."
},
{ "list",
- &main_list,
+ &main_list, 0,
"List information about all/some domains",
"[options] [Domain]\n",
"-l, --long Output all VM details\n"
@@ -40,59 +40,59 @@ struct cmd_spec cmd_table[] = {
"-Z, --context Prints out security context"
},
{ "destroy",
- &main_destroy,
+ &main_destroy, 0,
"Terminate a domain immediately",
"<Domain>",
},
{ "shutdown",
- &main_shutdown,
+ &main_shutdown, 0,
"Issue a shutdown signal to a domain",
"<Domain>",
},
{ "reboot",
- &main_reboot,
+ &main_reboot, 0,
"Issue a reboot signal to a domain",
"<Domain>",
},
{ "pci-attach",
- &main_pciattach,
+ &main_pciattach, 0,
"Insert a new pass-through pci device",
"<Domain> <BDF> [Virtual Slot]",
},
{ "pci-detach",
- &main_pcidetach,
+ &main_pcidetach, 0,
"Remove a domain's pass-through pci device",
"<Domain> <BDF>",
},
{ "pci-list",
- &main_pcilist,
+ &main_pcilist, 0,
"List pass-through pci devices for a domain",
"<Domain>",
},
{ "pci-list-assignable-devices",
- &main_pcilist_assignable,
+ &main_pcilist_assignable, 0,
"List all the assignable pci devices",
"",
},
{ "pause",
- &main_pause,
+ &main_pause, 0,
"Pause execution of a domain",
"<Domain>",
},
{ "unpause",
- &main_unpause,
+ &main_unpause, 0,
"Unpause a paused domain",
"<Domain>",
},
{ "console",
- &main_console,
+ &main_console, 0,
"Attach to domain's console",
"[options] <Domain>\n"
"-t <type> console type, pv or serial\n"
"-n <number> console number"
},
{ "vncviewer",
- &main_vncviewer,
+ &main_vncviewer, 0,
"Attach to domain's VNC server.",
"[options] <Domain>\n"
"--autopass Pass VNC password to viewer via stdin and\n"
@@ -100,14 +100,14 @@ struct cmd_spec cmd_table[] = {
"--vncviewer-autopass (consistency alias for --autopass)"
},
{ "save",
- &main_save,
+ &main_save, 0,
"Save a domain state to restore later",
"[options] <Domain> <CheckpointFile> [<ConfigFile>]",
"-h Print this help.\n"
"-c Leave domain running after creating the snapshot."
},
{ "migrate",
- &main_migrate,
+ &main_migrate, 0,
"Save a domain state to restore later",
"[options] <Domain> <host>",
"-h Print this help.\n"
@@ -119,12 +119,12 @@ struct cmd_spec cmd_table[] = {
" of the domain."
},
{ "dump-core",
- &main_dump_core,
+ &main_dump_core, 0,
"Core dump a domain",
"<Domain> <filename>"
},
{ "restore",
- &main_restore,
+ &main_restore, 0,
"Restore a domain from a saved state",
"[options] [<ConfigFile>] <CheckpointFile>",
"-h Print this help.\n"
@@ -133,63 +133,63 @@ struct cmd_spec cmd_table[] = {
"-d Enable debug messages."
},
{ "migrate-receive",
- &main_migrate_receive,
+ &main_migrate_receive, 0,
"Restore a domain from a saved state",
"- for internal use only",
},
{ "cd-insert",
- &main_cd_insert,
+ &main_cd_insert, 0,
"Insert a cdrom into a guest's cd drive",
"<Domain> <VirtualDevice> <type:path>",
},
{ "cd-eject",
- &main_cd_eject,
+ &main_cd_eject, 0,
"Eject a cdrom from a guest's cd drive",
"<Domain> <VirtualDevice>",
},
{ "mem-max",
- &main_memmax,
+ &main_memmax, 0,
"Set the maximum amount reservation for a domain",
"<Domain> <MemMB['b'[bytes]|'k'[KB]|'m'[MB]|'g'[GB]|'t'[TB]]>",
},
{ "mem-set",
- &main_memset,
+ &main_memset, 0,
"Set the current memory usage for a domain",
"<Domain> <MemMB['b'[bytes]|'k'[KB]|'m'[MB]|'g'[GB]|'t'[TB]]>",
},
{ "button-press",
- &main_button_press,
+ &main_button_press, 0,
"Indicate an ACPI button press to the domain",
"<Domain> <Button>",
"<Button> may be 'power' or 'sleep'."
},
{ "vcpu-list",
- &main_vcpulist,
+ &main_vcpulist, 0,
"List the VCPUs for all/some domains",
"[Domain, ...]",
},
{ "vcpu-pin",
- &main_vcpupin,
+ &main_vcpupin, 0,
"Set which CPUs a VCPU can use",
"<Domain> <VCPU|all> <CPUs|all>",
},
{ "vcpu-set",
- &main_vcpuset,
+ &main_vcpuset, 0,
"Set the number of active VCPUs allowed for the domain",
"<Domain> <vCPUs>",
},
{ "list-vm",
- &main_list_vm,
+ &main_list_vm, 0,
"List the VMs,without DOM0",
"",
},
{ "info",
- &main_info,
+ &main_info, 0,
"Get information about Xen host",
"-n, --numa List host NUMA topology information",
},
{ "sched-credit",
- &main_sched_credit,
+ &main_sched_credit, 0,
"Get/set credit scheduler parameters",
"[-d <Domain> [-w[=WEIGHT]|-c[=CAP]]]",
"-d DOMAIN, --domain=DOMAIN Domain to modify\n"
@@ -197,109 +197,109 @@ struct cmd_spec cmd_table[] = {
"-c CAP, --cap=CAP Cap (int)"
},
{ "domid",
- &main_domid,
+ &main_domid, 0,
"Convert a domain name to domain id",
"<DomainName>",
},
{ "domname",
- &main_domname,
+ &main_domname, 0,
"Convert a domain id to domain name",
"<DomainId>",
},
{ "rename",
- &main_rename,
+ &main_rename, 0,
"Rename a domain",
"<Domain> <NewDomainName>",
},
{ "trigger",
- &main_trigger,
+ &main_trigger, 0,
"Send a trigger to a domain",
"<Domain> <nmi|reset|init|power|sleep> [<VCPU>]",
},
{ "sysrq",
- &main_sysrq,
+ &main_sysrq, 0,
"Send a sysrq to a domain",
"<Domain> <letter>",
},
{ "debug-keys",
- &main_debug_keys,
+ &main_debug_keys, 0,
"Send debug keys to Xen",
"<Keys>",
},
{ "dmesg",
- &main_dmesg,
+ &main_dmesg, 0,
"Read and/or clear dmesg buffer",
"[-c]",
" -c Clear dmesg buffer as well as printing it",
},
{ "top",
- &main_top,
+ &main_top, 0,
"Monitor a host and the domains in real time",
"",
},
{ "network-attach",
- &main_networkattach,
+ &main_networkattach, 0,
"Create a new virtual network device",
"<Domain> [type=<type>] [mac=<mac>] [bridge=<bridge>] "
"[ip=<ip>] [script=<script>] [backend=<BackDomain>] [vifname=<name>] "
"[rate=<rate>] [model=<model>] [accel=<accel>]",
},
{ "network-list",
- &main_networklist,
+ &main_networklist, 0,
"List virtual network interfaces for a domain",
"<Domain(s)>",
},
{ "network-detach",
- &main_networkdetach,
+ &main_networkdetach, 0,
"Destroy a domain's virtual network device",
"<Domain> <DevId|mac>",
},
{ "block-attach",
- &main_blockattach,
+ &main_blockattach, 0,
"Create a new virtual block device",
"<Domain> <disk-spec-component(s)>...",
},
{ "block-list",
- &main_blocklist,
+ &main_blocklist, 0,
"List virtual block devices for a domain",
"<Domain(s)>",
},
{ "block-detach",
- &main_blockdetach,
+ &main_blockdetach, 0,
"Destroy a domain's virtual block device",
"<Domain> <DevId>",
},
{ "uptime",
- &main_uptime,
+ &main_uptime, 0,
"Print uptime for all/some domains",
"[-s] [Domain]",
},
{ "tmem-list",
- &main_tmem_list,
+ &main_tmem_list, 0,
"List tmem pools",
"[-l] [<Domain>|-a]",
" -l List tmem stats",
},
{ "tmem-freeze",
- &main_tmem_freeze,
+ &main_tmem_freeze, 0,
"Freeze tmem pools",
"[<Domain>|-a]",
" -a Freeze all tmem",
},
{ "tmem-destroy",
- &main_tmem_destroy,
+ &main_tmem_destroy, 0,
"Destroy tmem pools",
"[<Domain>|-a]",
" -a Destroy all tmem",
},
{ "tmem-thaw",
- &main_tmem_thaw,
+ &main_tmem_thaw, 0,
"Thaw tmem pools",
"[<Domain>|-a]",
" -a Thaw all tmem",
},
{ "tmem-set",
- &main_tmem_set,
+ &main_tmem_set, 0,
"Change tmem settings",
"[<Domain>|-a] [-w[=WEIGHT]|-c[=CAP]|-p[=COMPRESS]]",
" -a Operate on all tmem\n"
@@ -308,7 +308,7 @@ struct cmd_spec cmd_table[] = {
" -p COMPRESS Compress (int)",
},
{ "tmem-shared-auth",
- &main_tmem_shared_auth,
+ &main_tmem_shared_auth, 0,
"De/authenticate shared tmem pool",
"[<Domain>|-a] [-u[=UUID] [-A[=AUTH]",
" -a Authenticate for all tmem pools\n"
@@ -317,12 +317,12 @@ struct cmd_spec cmd_table[] = {
" -A AUTH 0=auth,1=deauth",
},
{ "tmem-freeable",
- &main_tmem_freeable,
+ &main_tmem_freeable, 0,
"Get information about how much freeable memory (MB) is in-use by tmem",
"",
},
{ "cpupool-create",
- &main_cpupoolcreate,
+ &main_cpupoolcreate, 0,
"Create a CPU pool based an ConfigFile",
"[options] <ConfigFile> [vars]",
"-h, --help Print this help.\n"
@@ -330,53 +330,53 @@ struct cmd_spec cmd_table[] = {
"-n, --dryrun Dry run - prints the resulting
configuration."
},
{ "cpupool-list",
- &main_cpupoollist,
+ &main_cpupoollist, 0,
"List CPU pools on host",
"[-c|--cpus] [<CPU Pool>]",
"-c, --cpus Output list of CPUs used by a pool"
},
{ "cpupool-destroy",
- &main_cpupooldestroy,
+ &main_cpupooldestroy, 0,
"Deactivates a CPU pool",
"<CPU Pool>",
},
{ "cpupool-rename",
- &main_cpupoolrename,
+ &main_cpupoolrename, 0,
"Renames a CPU pool",
"<CPU Pool> <new name>",
},
{ "cpupool-cpu-add",
- &main_cpupoolcpuadd,
+ &main_cpupoolcpuadd, 0,
"Adds a CPU to a CPU pool",
"<CPU Pool> <CPU nr>|node:<node nr>",
},
{ "cpupool-cpu-remove",
- &main_cpupoolcpuremove,
+ &main_cpupoolcpuremove, 0,
"Removes a CPU from a CPU pool",
"<CPU Pool> <CPU nr>|node:<node nr>",
},
{ "cpupool-migrate",
- &main_cpupoolmigrate,
+ &main_cpupoolmigrate, 0,
"Moves a domain into a CPU pool",
"<Domain> <CPU Pool>",
},
{ "cpupool-numa-split",
- &main_cpupoolnumasplit,
+ &main_cpupoolnumasplit, 0,
"Splits up the machine into one CPU pool per NUMA node",
"",
},
{ "getenforce",
- &main_getenforce,
+ &main_getenforce, 0,
"Returns the current enforcing mode of the Flask Xen security module",
"",
},
{ "setenforce",
- &main_setenforce,
+ &main_setenforce, 0,
"Sets the current enforcing mode of the Flask Xen security module",
"<1|0|Enforcing|Permissive>",
},
{ "loadpolicy",
- &main_loadpolicy,
+ &main_loadpolicy, 0,
"Loads a new policy int the Flask Xen security module",
"<policy file>",
},
--
1.5.6.5
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|