1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
/* This file is part of Eclat.
Copyright (C) 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 <http://www.gnu.org/licenses/>. */
#include "eclat.h"
#define GROUP_ID 0
#define GROUP_NAME 1
static struct {
char *resid;
char *map;
} rt[] = {
{ "GroupId", MAP_GROUPID },
{ "GroupName", MAP_GROUPNAME }
};
static struct ec2_query *query;
static char *command;
static int list_option;
static int dest_n = GROUP_ID;
static char *proto = "tcp";
static int rule_n = 1;
static char *user;
struct group_arg {
int type;
char *str;
char *usr;
};
static struct grecs_list *group_list;
static struct grecs_list *source_list;
static char *from_port, *to_port;
static char *bufptr = NULL;
static size_t bufsize = 0;
static void
flush_rule()
{
int i;
struct grecs_list_entry *ep;
grecs_asprintf(&bufptr, &bufsize, "IpPermissions.%d.IpProtocol",
rule_n);
eclat_query_add_param(query, bufptr, proto);
if (group_list) {
for (i = 1, ep = group_list->head; ep; ep = ep->next, i++) {
struct group_arg *a = ep->data;
grecs_asprintf(&bufptr, &bufsize,
"IpPermissions.%d.Groups.%d.%s",
rule_n, i,
rt[a->type].resid);
eclat_query_add_param(query, bufptr, a->str);
if (a->usr) {
grecs_asprintf(&bufptr, &bufsize,
"IpPermissions.%d.Groups.%d.UserId",
rule_n, i);
eclat_query_add_param(query, bufptr, a->usr);
}
}
grecs_list_clear(group_list);
}
if (source_list) {
for (i = 1, ep = source_list->head; ep; ep = ep->next, i++) {
grecs_asprintf(&bufptr, &bufsize,
"IpPermissions.%d.IpRanges.%d.CidrIp",
rule_n, i);
eclat_query_add_param(query, bufptr, (char*) ep->data);
}
grecs_list_clear(source_list);
}
if (!from_port)
die(EX_USAGE, "rule %d: no ports", rule_n);
grecs_asprintf(&bufptr, &bufsize, "IpPermissions.%d.FromPort", rule_n);
eclat_query_add_param(query, bufptr, from_port);
grecs_asprintf(&bufptr, &bufsize, "IpPermissions.%d.ToPort", rule_n);
eclat_query_add_param(query, bufptr, to_port);
from_port = to_port = NULL;
++rule_n;
}
#include "sg-cl.h"
int
eclat_sg(eclat_command_env_t *env, int argc, char **argv)
{
query = env->query;
parse_options(env, argc, argv);
return 0;
}
|