/* This file is part of Eclat. Copyright (C) 2012, 2013 Sergey Poznyakoff. Eclat is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. Eclat is distributed in the hope that it will be useful, 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 . */ #include #include #include #include #include #include #include #include #include #include #include "grecs.h" #include "grecsopt.h" #include "wordsplit.h" #include "libeclat.h" #include "forlan.h" #define EX_CANCELLED 16 #define ECLAT_DEBCAT_MAIN 0 #define ECLAT_DEBCAT_CFGRAM 1 #define ECLAT_DEBCAT_CFLEX 2 #define ECLAT_DEBCAT_CONF 3 #define ECLAT_DEBCAT_CURL 4 #define ECLAT_DEBCAT_FORLAN 5 extern char *endpoint; extern int use_ssl; extern int ssl_verify_peer; extern char *ssl_ca_file; 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 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); void config_help(void); void config_init(void); void config_finish(struct grecs_node *tree); int run_config_finish_hooks(void); struct eclat_command_env { struct eclat_command const *cmd; CURL *curl; struct ec2_query *query; }; typedef struct eclat_command_env eclat_command_env_t; typedef int (*eclat_command_handler_t) (eclat_command_env_t *env, int argc, char **argv); struct eclat_command { const char *name; const char *ident; const char *tag; eclat_command_handler_t handler; int flags; enum eclat_confirm_mode confirm; char *fmt; struct grecs_locus locus; }; struct eclat_command *find_command_name(const char *name); int eclat_do_command(eclat_command_env_t *env, struct eclat_command *command, int argc, char **argv); int eclat_start_instance(eclat_command_env_t *env, int argc, char **argv); int eclat_stop_instance(eclat_command_env_t *env, int argc, char **argv); int eclat_reboot_instance(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_tags(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_instance_status(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_instances(eclat_command_env_t *env, int argc, char **argv); int eclat_allocate_address(eclat_command_env_t *env, int argc, char **argv); int eclat_release_address(eclat_command_env_t *env, int argc, char **argv); int eclat_associate_address(eclat_command_env_t *env, int argc, char **argv); int eclat_disassociate_address(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_addresses(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_volumes(eclat_command_env_t *env, int argc, char **argv); int eclat_get_console_output(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_instance_attribute(eclat_command_env_t *env, int argc, char **argv); int eclat_create_tags(eclat_command_env_t *env, int argc, char **argv); int eclat_delete_tags(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_security_groups(eclat_command_env_t *env, int argc, char **argv); int eclat_create_snapshot(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_snapshots(eclat_command_env_t *env, int argc, char **argv); int eclat_delete_snapshot(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_snapshot_attribute(eclat_command_env_t *env, int argc, char **argv); int eclat_modify_snapshot_attribute(eclat_command_env_t *env, int argc, char **argv); int eclat_reset_snapshot_attribute(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_avaialbility_zones(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_regions(eclat_command_env_t *env, int argc, char **argv); int eclat_create_volume(eclat_command_env_t *env, int argc, char **argv); int eclat_delete_volume(eclat_command_env_t *env, int argc, char **argv); int eclat_attach_volume(eclat_command_env_t *env, int argc, char **argv); int eclat_detach_volume(eclat_command_env_t *env, int argc, char **argv); int eclat_modify_instance_attribute(eclat_command_env_t *env, int argc, char **argv); int eclat_run_instances(eclat_command_env_t *env, int argc, char **argv); int eclat_describe_images(eclat_command_env_t *env, int argc, char **argv); int eclat_create_image(eclat_command_env_t *env, int argc, char **argv); int eclat_deregister_image(eclat_command_env_t *env, int argc, char **argv); int eclat_copy_image(eclat_command_env_t *env, int argc, char **argv); int eclat_copy_snapshot(eclat_command_env_t *env, int argc, char **argv); int eclat_lsattr(eclat_command_env_t *env, int argc, char **argv); char *region_to_endpoint(const char *region); void define_format(const char *name, const char *format, grecs_locus_t *locus); void set_command_format(const char *name, const char *format, grecs_locus_t *locus); void describe_query_create(eclat_command_env_t *env, int argc, char **argv, const char *uparm); void describe_query_update(eclat_command_env_t *env, int argc, char **argv, const char *uparm, int n_in, int *n_out); int eclat_send_query(CURL *curl, struct ec2_query *q); int eclat_actcmp(const char *a, const char *b); #define XML_DUMP_FILE_NAME "eclat.dump.xml" #define FILTER_STRING 0 #define FILTER_DATE 1 #define FILTER_BOOL 2 #define FILTER_INT 3 #define FILTER_ENUM 4 struct filter_descr { char *name; int type; char **avail; }; 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); 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); forlan_eval_env_t find_format(const char *name); void generic_parse_options(struct eclat_command const *command, const char *docstring, int argc, char *argv[], int *index); extern struct grecs_proginfo *generic_proginfo; void set_command_confirmation(const char *name, enum eclat_confirm_mode cfmode, grecs_locus_t *locus);