aboutsummaryrefslogtreecommitdiff
path: root/src/sg.c
blob: 098477ecd6e887b2e38bfb5de9f2f0b70134bc58 (plain)
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
111
112
113
114
/* 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);
	} else if (!group_list) {
		grecs_asprintf(&bufptr, &bufsize,
			       "IpPermissions.%d.IpRanges.1.CidrIp",
			       rule_n);
		eclat_query_add_param(query, bufptr, "0.0.0.0/0");
	}
	
	if (from_port) {
		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;
}

Return to:

Send suggestions and report system problems to the System administrator.