@@ -2,10 +2,11 @@ package provision
22
33import (
44 "fmt"
5- "github.com/aws/aws-sdk-go/aws/credentials"
65 "strconv"
76 "strings"
87
8+ "github.com/aws/aws-sdk-go/aws/credentials"
9+
910 "github.com/aws/aws-sdk-go/aws"
1011 "github.com/aws/aws-sdk-go/aws/session"
1112 "github.com/aws/aws-sdk-go/service/ec2"
@@ -40,10 +41,12 @@ func (p *EC2Provisioner) Provision(host BasicHost) (*ProvisionedHost, error) {
4041 }
4142 pro := host .Additional ["pro" ]
4243
44+ ports := host .Additional ["ports" ]
45+
4346 var vpcID = host .Additional ["vpc-id" ]
4447 var subnetID = host .Additional ["subnet-id" ]
4548
46- groupID , name , err := p .createEC2SecurityGroup (vpcID , port , pro )
49+ groupID , name , err := p .createEC2SecurityGroup (vpcID , port , pro , ports )
4750 if err != nil {
4851 return nil , err
4952 }
@@ -85,6 +88,7 @@ func (p *EC2Provisioner) Provision(host BasicHost) (*ProvisionedHost, error) {
8588 return nil , fmt .Errorf ("could not create host: %s" , runResult .String ())
8689 }
8790
91+ // AE: not sure why this error isn't handled?
8892 _ , err = p .ec2Provisioner .CreateTags (& ec2.CreateTagsInput {
8993 Resources : []* string {runResult .Instances [0 ].InstanceId },
9094 Tags : []* ec2.Tag {
@@ -247,9 +251,21 @@ func (p *EC2Provisioner) lookupID(request HostDeleteRequest) (string, error) {
247251}
248252
249253// createEC2SecurityGroup creates a security group for the exit-node
250- func (p * EC2Provisioner ) createEC2SecurityGroup (vpcID string , controlPort int , pro string ) (* string , * string , error ) {
251- ports := []int {80 , 443 , controlPort }
252- proPorts := []int {1024 , 65535 }
254+ func (p * EC2Provisioner ) createEC2SecurityGroup (vpcID string , controlPort int , pro , extraPorts string ) (* string , * string , error ) {
255+ ports := []int {controlPort }
256+
257+ proPortRange := []int {1024 , 65535 }
258+
259+ if len (extraPorts ) > 0 {
260+ extraPorts , err := parsePorts (extraPorts )
261+ if err != nil {
262+ return nil , nil , err
263+ }
264+ ports = append (ports , extraPorts ... )
265+
266+ proPortRange = []int {}
267+ }
268+
253269 groupName := "inlets-" + uuid .New ().String ()
254270 var input = & ec2.CreateSecurityGroupInput {
255271 Description : aws .String ("inlets security group" ),
@@ -271,8 +287,9 @@ func (p *EC2Provisioner) createEC2SecurityGroup(vpcID string, controlPort int, p
271287 return group .GroupId , & groupName , err
272288 }
273289 }
274- if pro == "true" {
275- err = p .createEC2SecurityGroupRule (* group .GroupId , proPorts [0 ], proPorts [1 ])
290+
291+ if pro == "true" && len (proPortRange ) == 2 {
292+ err = p .createEC2SecurityGroupRule (* group .GroupId , proPortRange [0 ], proPortRange [1 ])
276293 if err != nil {
277294 return group .GroupId , & groupName , err
278295 }
@@ -281,6 +298,22 @@ func (p *EC2Provisioner) createEC2SecurityGroup(vpcID string, controlPort int, p
281298 return group .GroupId , & groupName , nil
282299}
283300
301+ func parsePorts (extraPorts string ) ([]int , error ) {
302+ var ports []int
303+ parts := strings .Split (extraPorts , "," )
304+ for _ , part := range parts {
305+ if trimmed := strings .TrimSpace (part ); len (trimmed ) > 0 {
306+ port , err := strconv .Atoi (trimmed )
307+ if err != nil {
308+ return nil , err
309+ }
310+ ports = append (ports , port )
311+ }
312+ }
313+
314+ return ports , nil
315+ }
316+
284317func (p * EC2Provisioner ) createEC2SecurityGroupRule (groupID string , fromPort , toPort int ) error {
285318 _ , err := p .ec2Provisioner .AuthorizeSecurityGroupIngress (& ec2.AuthorizeSecurityGroupIngressInput {
286319 CidrIp : aws .String ("0.0.0.0/0" ),
0 commit comments