diff options
-rw-r--r-- | doc/eclat.conf.5 | 51 | ||||
-rw-r--r-- | src/asscaddr.c | 2 | ||||
-rw-r--r-- | src/atvol.c | 4 | ||||
-rw-r--r-- | src/cmdline.opt | 6 | ||||
-rw-r--r-- | src/config.c | 3 | ||||
-rw-r--r-- | src/deimg.c | 2 | ||||
-rw-r--r-- | src/devol.c | 4 | ||||
-rw-r--r-- | src/eclat.c | 4 | ||||
-rw-r--r-- | src/eclat.h | 14 | ||||
-rw-r--r-- | src/getconout.c | 2 | ||||
-rw-r--r-- | src/lsattr.c | 2 | ||||
-rw-r--r-- | src/lsiattr.c | 2 | ||||
-rw-r--r-- | src/lsimg.c | 2 | ||||
-rw-r--r-- | src/lsinst.c | 2 | ||||
-rw-r--r-- | src/lsistat.c | 2 | ||||
-rw-r--r-- | src/lsreg.c | 2 | ||||
-rw-r--r-- | src/lssattr.c | 6 | ||||
-rw-r--r-- | src/lssg.c | 13 | ||||
-rw-r--r-- | src/lssnap.c | 2 | ||||
-rw-r--r-- | src/lstag-cl.opt | 8 | ||||
-rw-r--r-- | src/lsvol.c | 2 | ||||
-rw-r--r-- | src/lszon.c | 2 | ||||
-rw-r--r-- | src/mkimg.c | 2 | ||||
-rw-r--r-- | src/mksnap.c | 2 | ||||
-rw-r--r-- | src/mktags-cl.opt | 8 | ||||
-rw-r--r-- | src/rmsnap.c | 2 | ||||
-rw-r--r-- | src/rmvol.c | 2 | ||||
-rw-r--r-- | src/setiattr.c | 2 | ||||
-rw-r--r-- | src/startstop.c | 2 | ||||
-rw-r--r-- | src/util.c | 22 |
30 files changed, 120 insertions, 59 deletions
diff --git a/doc/eclat.conf.5 b/doc/eclat.conf.5 index 9b43dbe..30b5b81 100644 --- a/doc/eclat.conf.5 +++ b/doc/eclat.conf.5 @@ -10,13 +10,13 @@ .\" but WITHOUT ANY WARRANTY; without even the implied warranty of .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the .\" GNU General Public License for more details. .\" .\" You should have received a copy of the GNU General Public License .\" along with Eclat. If not, see <http://www.gnu.org/licenses/>. -.TH ECLAT.CONF 5 "January 19, 2013" "ECLAT" "Eclat User Reference" +.TH ECLAT.CONF 5 "April 26, 2013" "ECLAT" "Eclat User Reference" .SH NAME eclat.conf \- configuration file for .BR eclat (1). .SH DESCRIPTION .PP .B Eclat @@ -593,19 +593,19 @@ confirm tty (StopInstance, StartInstance); It instructs .B eclat to ask for confirmation if one of the destructive commands is requested, or if the command is start-instance or stop-instance. .PP Here is an example of how this modifies the behavior of -.B freeaddr +.B rmaddr command: .PP .nf .if +2 -$ \fBeclat freeaddr 192.168.0.1\fR -Proceed with freeaddr [Y/n] _ +$ \fBeclat rmaddr 192.168.0.1\fR +Proceed with release-address [Y/n] _ .fi .PP If the response begins with \fBY\fR (case-insensitive), it is taken for a positive answer, and the command will be executed. Otherwise, .B eclat exits returning code 16 to the shell. @@ -622,36 +622,57 @@ $ \fBeclat -Y rmvol vol-d1234aef\fR .SH MAPS Maps provide a way to translate arbitrary symbolic names to the Amazon resource identifiers. See the section .B MAPS in .BR eclat (1), -for the discussion of the subject. +for the discussion of the subject. The translation is disabled by +default. This can be changed using the following statement: +.TP +\fBtranslate\fR \fIBOOL\fR +Depending on its argument, enables or disables ID translation by +default. .PP A map is declared using the following statement: .sp .nf - map \fIname\fR { - type \fIbackend\-type\fR; - key \fItrans\fR; - /* \fIType-specific statements.\fR */ - } +.in +4 +\fBmap\fR \fIname\fR { + \fBtype\fR \fIbackend\-type\fR; + \fBkey\fR \fItrans\fR; + /* \fIType-specific statements.\fR */ +} .fi -.sp +.PP The \fIname\fR argument is used to identify the map. A map can be used from the command line using the \fB\--map=\fIname\fR option. The following names are special: .TP +.B ImageId +Translates AMI names to IDs. +.TP .B InstanceId -This map translates instance names to instance IDs. +Translates instance names to IDs. +.TP +.B GroupId +Translates security group names to Amazon group IDs. .TP .B GroupName -Translates the security group name to its Amazon name. +Translates security group names to Amazon names. .TP -.B GroupId -Translates the security group name to its Amazon group ID. +.B SnapshotId +Translates snapshot names to IDs. +.TP +.B VolumeId +Translates volume names to IDs. +.TP +.B AZ +Translates availability region names to Amazon names. +.TP +.B reg +Translates region names to Amazon region names. .PP The \fIbackend\-type\fR declares the type of this map. Depending on this type, several sets of type-specific statements can be present. These are described in detail below. .PP The optional diff --git a/src/asscaddr.c b/src/asscaddr.c index 8ec3998..cbe5a2d 100644 --- a/src/asscaddr.c +++ b/src/asscaddr.c @@ -30,13 +30,13 @@ eclat_associate_address(eclat_command_env_t *env, int argc, char **argv) argc -= i; argv += i; if (argc != 2) die(EX_USAGE, "wrong number of arguments to associate-address"); - translate_ids(1, argv, "InstanceId"); + translate_ids(1, argv, MAP_INSTANCE); eclat_query_add_param(env->query, "InstanceId", argv[0]); if (vpc) { eclat_query_add_param(env->query, "AllocationId", argv[1]); if (iface) eclat_query_add_param(env->query, "NetworkInterfaceId", iface); diff --git a/src/atvol.c b/src/atvol.c index 2ee452b..6ad4f5d 100644 --- a/src/atvol.c +++ b/src/atvol.c @@ -29,14 +29,14 @@ eclat_attach_volume(eclat_command_env_t *env, int argc, char **argv) argc -= i; argv += i; if (argc != 3) die(EX_USAGE, "bad number of arguments"); - translate_ids(1, argv, "VolumeId"); - translate_ids(1, argv + 1, "InstanceId"); + translate_ids(1, argv, MAP_VOLUME); + translate_ids(1, argv + 1, MAP_INSTANCE); eclat_query_add_param(env->query, "VolumeId", argv[0]); eclat_query_add_param(env->query, "InstanceId", argv[1]); eclat_query_add_param(env->query, "Device", argv[2]); return 0; diff --git a/src/cmdline.opt b/src/cmdline.opt index 561d7e2..b1faf5e 100644 --- a/src/cmdline.opt +++ b/src/cmdline.opt @@ -177,12 +177,18 @@ GROUP(Identifier translation) OPTION(translate,x,, [<translate resource IDs>]) BEGIN translate_option = 1; END +OPTION(no-translate,X,, + [<disable resource ID translation>]) +BEGIN + translate_option = 0; +END + OPTION(map,M,[<MAPNAME>], [<use this map instead of the default one (implies --translate)>]) BEGIN custom_map = optarg; translate_option = 1; END diff --git a/src/config.c b/src/config.c index c237e52..5495d41 100644 --- a/src/config.c +++ b/src/config.c @@ -289,12 +289,15 @@ static struct grecs_keyword eclat_kw[] = { { "map", "name: string", "Configure a map", grecs_type_section, GRECS_INAC }, { "confirm", "<mode: { positive | negative | tty | always }> <commands: list>", "Set confirmation mode", grecs_type_string, GRECS_LIST, NULL, 0, cb_confirm }, + { "translate", NULL, + "Use ID translation by default", + grecs_type_bool, GRECS_DFLT, &translation_enabled }, { NULL } }; void config_help() { diff --git a/src/deimg.c b/src/deimg.c index 4a76d39..345c586 100644 --- a/src/deimg.c +++ b/src/deimg.c @@ -26,11 +26,11 @@ eclat_deregister_image(eclat_command_env_t *env, int argc, char **argv) argv += i; argc -= i; if (argc != 1) die(EX_USAGE, "bad number of arguments"); - translate_ids(argc, argv, "ImageId"); + translate_ids(argc, argv, MAP_IMAGE); eclat_query_add_param(env->query, "ImageId", argv[0]); return 0; } diff --git a/src/devol.c b/src/devol.c index b575352..dfc7f31 100644 --- a/src/devol.c +++ b/src/devol.c @@ -28,17 +28,17 @@ eclat_detach_volume(eclat_command_env_t *env, int argc, char **argv) argc -= i; argv += i; if (argc < 1 || argc > 3) die(EX_USAGE, "bad number of arguments"); - translate_ids(1, argv, "VolumeId"); + translate_ids(1, argv, MAP_VOLUME); eclat_query_add_param(q, "VolumeId", argv[0]); if (argc > 1) { - translate_ids(1, argv + 1, "InstanceId"); + translate_ids(1, argv + 1, MAP_INSTANCE); eclat_query_add_param(q, "InstanceId", argv[1]); if (argc > 2) eclat_query_add_param(q, "Device", argv[2]); } if (force) eclat_query_add_param(q, "Force", "true"); diff --git a/src/eclat.c b/src/eclat.c index b78e079..c00c795 100644 --- a/src/eclat.c +++ b/src/eclat.c @@ -34,12 +34,13 @@ char *format_expr_option; char *format_file_option; char *format_name_option; int sort_option; char *format_file; char *test_map_name; enum eclat_confirm_mode confirm_mode; +int translate_option = -1; FILE *xml_dump_file; static char *categories[] = { "main", @@ -847,12 +848,15 @@ main(int argc, char **argv) run_config_finish_hooks(); } else die(errno == EACCES ? EX_NOPERM : EX_OSFILE, "cannot access \"%s\": %s", conffile, strerror(errno)); + if (translate_option != -1) + translation_enabled = translate_option; + if (test_map_name) { int i; if (argc < 1) die(EX_USAGE, "wrong number of arguments"); translate_ids(argc, argv, test_map_name); diff --git a/src/eclat.h b/src/eclat.h index e328b15..72691ca 100644 --- a/src/eclat.h +++ b/src/eclat.h @@ -47,13 +47,13 @@ extern char *ssl_ca_path; extern int dry_run_mode; extern char *region_name; extern char *access_file_name; extern char *access_key; extern char *secret_key; extern char *format_file; -extern int translate_option; +extern int translation_enabled; extern char *custom_map; extern enum eclat_confirm_mode confirm_mode; typedef int (*config_finish_hook_t) (void*); void add_config_finish_hook(config_finish_hook_t fun, void *data); @@ -166,13 +166,23 @@ extern struct filter_descr *available_filters; void list_filters(FILE *fp); extern char **available_attrs; void list_attrs(FILE *fp); int get_scr_cols(void); -void translate_ids(int argc, char **argv, const char *mapname); + +#define MAP_IMAGE "ImageId" +#define MAP_INSTANCE "InstanceId" +#define MAP_GROUPID "GroupId" +#define MAP_GROUPNAME "GroupName" +#define MAP_SNAPSHOT "SnapshotId" +#define MAP_VOLUME "VolumeId" +#define MAP_AZ "AZ" +#define MAP_REG "reg" + +void translate_ids(int argc, char **argv, const char *map); void translate_resource_ids(int argc, char **argv); int get_access_creds(const char *id, char **access_key_ptr, char **secret_key_ptr); void define_format(const char *name, const char *fmt, grecs_locus_t *loc); diff --git a/src/getconout.c b/src/getconout.c index a00f4cb..e8ff9b7 100644 --- a/src/getconout.c +++ b/src/getconout.c @@ -30,11 +30,11 @@ eclat_get_console_output(eclat_command_env_t *env, int argc, char **argv) argc -= i; if (i == 0) die(EX_USAGE, "not enough arguments"); else if (i > 1) die(EX_USAGE, "only one argument is allowed"); - translate_ids(argc, argv, "InstanceId"); + translate_ids(argc, argv, MAP_INSTANCE); describe_query_create(env, argc, argv, "InstanceId"); return 0; } diff --git a/src/lsattr.c b/src/lsattr.c index 9b49ca3..13d43aa 100644 --- a/src/lsattr.c +++ b/src/lsattr.c @@ -44,12 +44,12 @@ eclat_lsattr(eclat_command_env_t *env, int argc, char **argv) die(EX_USAGE, "unrecognized resource type: %s", argv[0]); } command = find_command_name(cmdname); if (!command) abort(); - translate_option = 0; + translation_enabled = 0; argv--; argc++; argv[0] = "lsattr"; return eclat_do_command(env, command, argc, argv); } diff --git a/src/lsiattr.c b/src/lsiattr.c index 633e94d..77d1ea1 100644 --- a/src/lsiattr.c +++ b/src/lsiattr.c @@ -47,13 +47,13 @@ eclat_describe_instance_attribute(eclat_command_env_t *env, int argc, char **arg argv += i; argc -= i; if (argc != 2) die(EX_USAGE, "wrong number of arguments"); - translate_ids(1, argv, "InstanceId"); + translate_ids(1, argv, MAP_INSTANCE); eclat_query_add_param(q, "InstanceId", argv[0]); eclat_query_add_param(q, "Attribute", argv[1]); return 0; } diff --git a/src/lsimg.c b/src/lsimg.c index db3c98b..973487e 100644 --- a/src/lsimg.c +++ b/src/lsimg.c @@ -24,11 +24,11 @@ eclat_describe_images(eclat_command_env_t *env, int argc, char **argv) parse_options(env, argc, argv, &i); argc -= i; argv += i; - translate_ids(argc, argv, "ImageId"); + translate_ids(argc, argv, MAP_IMAGE); describe_query_create(env, argc, argv, "ImageId"); return 0; } diff --git a/src/lsinst.c b/src/lsinst.c index 4cf4a34..cc45a70 100644 --- a/src/lsinst.c +++ b/src/lsinst.c @@ -142,11 +142,11 @@ eclat_describe_instances(eclat_command_env_t *env, int argc, char **argv) { int i; parse_options(env->cmd, argc, argv, &i); argv += i; argc -= i; - translate_ids(argc, argv, "InstanceId"); + translate_ids(argc, argv, MAP_INSTANCE); describe_query_create(env, argc, argv, "InstanceId"); return 0; } diff --git a/src/lsistat.c b/src/lsistat.c index c9a518a..7ec5a0d 100644 --- a/src/lsistat.c +++ b/src/lsistat.c @@ -23,13 +23,13 @@ eclat_describe_instance_status(eclat_command_env_t *env, int argc, char **argv) { int i; parse_options(env, argc, argv, &i); argv += i; argc -= i; - translate_ids(argc, argv, "InstanceId"); + translate_ids(argc, argv, MAP_INSTANCE); describe_query_create(env, argc, argv, "InstanceId"); if (all_option) eclat_query_add_param(env->query, "IncludeAllInstances", "1"); return 0; diff --git a/src/lsreg.c b/src/lsreg.c index ef2cafb..cddd11a 100644 --- a/src/lsreg.c +++ b/src/lsreg.c @@ -39,11 +39,11 @@ eclat_describe_regions(eclat_command_env_t *env, int argc, char **argv) { int i; parse_options(env->cmd, argc, argv, &i); argv += i; argc -= i; - translate_ids(argc, argv, "reg"); + translate_ids(argc, argv, MAP_REG); describe_query_create(env, argc, argv, "RegionName"); return 0; } diff --git a/src/lssattr.c b/src/lssattr.c index c3deb23..aa852bb 100644 --- a/src/lssattr.c +++ b/src/lssattr.c @@ -60,13 +60,13 @@ eclat_describe_snapshot_attribute(eclat_command_env_t *env, die(EX_USAGE, "unrecognized attribute name"); break; case 1: attrname = attrs[0]; } - translate_ids(1, argv, "SnapshotId"); + translate_ids(1, argv, MAP_SNAPSHOT); eclat_query_add_param(q, "SnapshotId", argv[0]); eclat_query_add_param(q, "Attribute", attrname); return 0; } static void @@ -136,13 +136,13 @@ eclat_modify_snapshot_attribute(eclat_command_env_t *env, if (argv[i][0] == 'u') remdash(argv[i] + 2); eclat_query_add_param(q, bufptr, argv[i] + 2); } free(bufptr); - translate_ids(1, argv + i, "SnapshotId"); + translate_ids(1, argv + i, MAP_SNAPSHOT); eclat_query_add_param(q, "SnapshotId", argv[i]); return 0; } int @@ -159,13 +159,13 @@ eclat_reset_snapshot_attribute(eclat_command_env_t *env, argv += i; argc -= i; if (argc != 1) die(EX_USAGE, "wrong number of arguments"); - translate_ids(1, argv, "SnapshotId"); + translate_ids(1, argv, MAP_SNAPSHOT); eclat_query_add_param(q, "SnapshotId", argv[0]); eclat_query_add_param(q, "Attribute", "CreateVolumePermission"); return 0; } @@ -19,17 +19,24 @@ static int name_option; #include "lssg-cl.h" int eclat_describe_security_groups(eclat_command_env_t *env, int argc, char **argv) { int i; - const char *resid = name_option ? "GroupName" : "GroupId"; + static struct { + char *resid; + char *map; + } rt[] = { + { "GroupId", MAP_GROUPID }, + { "GroupName", MAP_GROUPNAME } + }; + int n = !!name_option; parse_options(env, argc, argv, &i); argv += i; argc -= i; - translate_ids(argc, argv, resid); + translate_ids(argc, argv, rt[n].map); - describe_query_create(env, argc, argv, resid); + describe_query_create(env, argc, argv, rt[n].resid); return 0; } diff --git a/src/lssnap.c b/src/lssnap.c index d60e048..2392bf7 100644 --- a/src/lssnap.c +++ b/src/lssnap.c @@ -48,13 +48,13 @@ eclat_describe_snapshots(eclat_command_env_t *env, int argc, char **argv) available_filters = filters; proginfo.print_help_hook = list_filters; parse_options(env, argc, argv, &i); argc -= i; argv += i; - translate_ids(argc, argv, "SnapshotId"); + translate_ids(argc, argv, MAP_SNAPSHOT); describe_query_create(env, argc, argv, "SnapshotId"); if (parmlist) { for (ep = parmlist->head; ep; ep = ep->next) { struct param *param = ep->data; diff --git a/src/lstag-cl.opt b/src/lstag-cl.opt index dfb8fc0..56f051f 100644 --- a/src/lstag-cl.opt +++ b/src/lstag-cl.opt @@ -41,40 +41,40 @@ BEGIN END OPTION(instance,i,[<ID>], [<instance ID>]) BEGIN struct resource *res = grecs_malloc(sizeof(*res)); - res->map = "InstanceId"; + res->map = MAP_INSTANCE; res->resid = optarg; grecs_list_append(reslist, res); END OPTION(volume,v,[<ID>], [<volume ID>]) BEGIN struct resource *res = grecs_malloc(sizeof(*res)); - res->map = "VolumeId"; + res->map = MAP_VOLUME; res->resid = optarg; grecs_list_append(reslist, res); END OPTION(ami,a,[<ID>], [<AMI ID>]) BEGIN struct resource *res = grecs_malloc(sizeof(*res)); - res->map = "ImageId"; + res->map = MAP_IMAGE; res->resid = optarg; grecs_list_append(reslist, res); END OPTION(snapshot,s,[<ID>], [<snapshot ID>]) BEGIN struct resource *res = grecs_malloc(sizeof(*res)); - res->map = "SnapshotId"; + res->map = MAP_SNAPSHOT; res->resid = optarg; grecs_list_append(reslist, res); END ECLAT_CL_END diff --git a/src/lsvol.c b/src/lsvol.c index d52722d..de25b29 100644 --- a/src/lsvol.c +++ b/src/lsvol.c @@ -53,11 +53,11 @@ eclat_describe_volumes(eclat_command_env_t *env, int argc, char **argv) generic_proginfo->args_doc = "[FILTER...] [ID...]"; generic_parse_options(env->cmd, "describe Amazon EBS volumes", argc, argv, &i); argv += i; argc -= i; - translate_ids(argc, argv, "VolumeId"); + translate_ids(argc, argv, MAP_VOLUME); describe_query_create(env, argc, argv, "VolumeId"); return 0; } diff --git a/src/lszon.c b/src/lszon.c index d5c06df..67550c6 100644 --- a/src/lszon.c +++ b/src/lszon.c @@ -46,11 +46,11 @@ eclat_describe_avaialbility_zones(eclat_command_env_t *env, { int i; parse_options(env->cmd, argc, argv, &i); argv += i; argc -= i; - translate_ids(argc, argv, "AZ"); + translate_ids(argc, argv, MAP_AZ); describe_query_create(env, argc, argv, "ZoneName"); return 0; } diff --git a/src/mkimg.c b/src/mkimg.c index a34c302..5fc388a 100644 --- a/src/mkimg.c +++ b/src/mkimg.c @@ -29,13 +29,13 @@ eclat_create_image(eclat_command_env_t *env, int argc, char **argv) parse_options(env, argc, argv, &i); argc -= i; argv += i; if (argc != 2) die(EX_USAGE, "wrong number of arguments"); - translate_ids(1, argv+1, "InstanceId"); + translate_ids(1, argv+1, MAP_INSTANCE); eclat_query_add_param(q, "Name", argv[0]); eclat_query_add_param(q, "InstanceId", argv[1]); if (descr) eclat_query_add_param(q, "Description", descr); diff --git a/src/mksnap.c b/src/mksnap.c index 66a12f3..aaaa8fa 100644 --- a/src/mksnap.c +++ b/src/mksnap.c @@ -29,13 +29,13 @@ eclat_create_snapshot(eclat_command_env_t *env, int argc, char **argv) "create a snapshot of an Amazon EBS volume", argc, argv, &i); argc -= i; argv += i; if (argc < 1) die(EX_USAGE, "not enough arguments"); - translate_ids(1, argv, "VolumeId"); + translate_ids(1, argv, MAP_VOLUME); if (argc == 2) descr = argv[1]; else if (argc > 2) { acc = grecs_txtacc_create(); for (i = 1; i < argc; i++) { if (i > 1) diff --git a/src/mktags-cl.opt b/src/mktags-cl.opt index e622db8..58111e3 100644 --- a/src/mktags-cl.opt +++ b/src/mktags-cl.opt @@ -42,40 +42,40 @@ BEGIN END OPTION(instance,i,[<ID>], [<instance ID>]) BEGIN struct resource *res = grecs_malloc(sizeof(*res)); - res->map = "InstanceId"; + res->map = MAP_INSTANCE; res->resid = optarg; grecs_list_append(reslist, res); END OPTION(volume,v,[<ID>], [<volume ID>]) BEGIN struct resource *res = grecs_malloc(sizeof(*res)); - res->map = "VolumeId"; + res->map = MAP_VOLUME; res->resid = optarg; grecs_list_append(reslist, res); END OPTION(ami,a,[<ID>], [<AMI ID>]) BEGIN struct resource *res = grecs_malloc(sizeof(*res)); - res->map = "ImageId"; + res->map = MAP_IMAGE; res->resid = optarg; grecs_list_append(reslist, res); END OPTION(snapshot,s,[<ID>], [<snapshot ID>]) BEGIN struct resource *res = grecs_malloc(sizeof(*res)); - res->map = "SnapshotId"; + res->map = MAP_SNAPSHOT; res->resid = optarg; grecs_list_append(reslist, res); END OPTION(from-file,T,[<FILE>], [<read tags from FILE>]) diff --git a/src/rmsnap.c b/src/rmsnap.c index 1446433..51e23b4 100644 --- a/src/rmsnap.c +++ b/src/rmsnap.c @@ -27,12 +27,12 @@ eclat_delete_snapshot(eclat_command_env_t *env, int argc, char **argv) "delete a EC2 volume snapshot", argc, argv, &i); argc -= i; argv += i; if (argc != 1) die(EX_USAGE, "bad number of arguments"); - translate_ids(argc, argv, "SnapshotId"); + translate_ids(argc, argv, MAP_SNAPSHOT); eclat_query_add_param(q, "SnapshotId", argv[0]); return 0; } diff --git a/src/rmvol.c b/src/rmvol.c index 856b245..a90b79e 100644 --- a/src/rmvol.c +++ b/src/rmvol.c @@ -28,12 +28,12 @@ eclat_delete_volume(eclat_command_env_t *env, int argc, char **argv) argc, argv, &i); argc -= i; argv += i; if (argc != 1) die(EX_USAGE, "bad number of arguments"); - translate_ids(argc, argv, "VolumeId"); + translate_ids(argc, argv, MAP_VOLUME); eclat_query_add_param(q, "VolumeId", argv[0]); return 0; } diff --git a/src/setiattr.c b/src/setiattr.c index decfcbb..8a62c1a 100644 --- a/src/setiattr.c +++ b/src/setiattr.c @@ -89,13 +89,13 @@ eclat_modify_instance_attribute(eclat_command_env_t *env, int argc, char **argv) argv += i; argc -= i; if (argc < 3) die(EX_USAGE, "wrong number of arguments"); - translate_ids(1, argv, "InstanceId"); + translate_ids(1, argv, MAP_INSTANCE); eclat_query_add_param(q, "InstanceId", argv[0]); canonattr = canonattrname(argv[1], &canonlen); if (!canonattr) die(EX_USAGE, "unrecognized attribute: %s", argv[1]); diff --git a/src/startstop.c b/src/startstop.c index 7ffb5bb..fa36ed7 100644 --- a/src/startstop.c +++ b/src/startstop.c @@ -32,13 +32,13 @@ start_stop_instance(eclat_command_env_t *env, int argc, char **argv) struct ec2_query *q = env->query; char buf[128], *bend; size_t bs; if (argc == 0) die(EX_USAGE, "no instance ids"); - translate_ids(argc, argv, "InstanceId"); + translate_ids(argc, argv, MAP_INSTANCE); strcpy(buf, "InstanceId."); bend = buf + strlen(buf); bs = sizeof(buf) - strlen(buf); for (i = 0; i < argc; i++) { snprintf(bend, bs, "%lu", (unsigned long)(i + 1)); @@ -15,25 +15,26 @@ along with Eclat. If not, see <http://www.gnu.org/licenses/>. */ #include "eclat.h" #include <termios.h> #include <sys/ioctl.h> -int translate_option; +int translation_enabled; char *custom_map; void translate_ids(int argc, char **argv, const char *mapname) { int i; struct eclat_map *map; char *val; char *q, *realname; int dir; + int rc; - if (!translate_option || argc == 0) + if (!translation_enabled || argc == 0) return; if (custom_map) mapname = custom_map; dir = eclat_map_name_split(mapname, &realname, &q); if (dir == -1) @@ -47,18 +48,27 @@ translate_ids(int argc, char **argv, const char *mapname) die(EX_UNAVAILABLE, "failed to open map %s", realname); free(realname); for (i = 0; i < argc; i++) { if (!strchr(argv[i], '=')) { - int rc = eclat_map_get(map, dir, argv[i], &val); - if (rc != eclat_map_ok) { + switch (rc = eclat_map_get(map, dir, argv[i], &val)) { + case eclat_map_ok: + argv[i] = val; + break; + + case eclat_map_not_found: + debug(ECLAT_DEBCAT_MAIN, 1, + ("%s not found in map %s", + argv[i], mapname)); + break; + + default: die(EX_UNAVAILABLE, "cannot translate %s: %s", argv[i], eclat_map_strerror(rc)); } - argv[i] = val; } } } char * eclat_stpcpy(char *p, char *q) @@ -78,13 +88,13 @@ translate_resource_ids(int argc, char **argv) size_t len; struct eclat_map *map; char *val, *p; struct wordsplit ws; int wsflags = WRDSF_DEFFLAGS|WRDSF_DELIM; - if (!translate_option || argc == 0) + if (!translation_enabled || argc == 0) return; ws.ws_delim = ","; for (i = 0; i < argc; i++) { if (strncmp(argv[i], RESOURCE_ID_PFX, RESOURCE_ID_LEN)) continue; if (wordsplit(argv[i] + RESOURCE_ID_LEN, &ws, wsflags)) |