grouper 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/grouper.rb +91 -0
  2. metadata +63 -0
@@ -0,0 +1,91 @@
1
+ module Grouper
2
+
3
+ #find a security group, create it if it does not exist
4
+ #
5
+ def find_or_create(ec2, group_name)
6
+ if ec2.security_groups.map(&:name).include?(group_name)
7
+ ec2.security_groups.filter('group-name', group_name).first
8
+ else
9
+ ec2.security_groups.create(group_name)
10
+ end
11
+ end
12
+
13
+ #Takes an array of rules and applies them to a security froup
14
+ #if the security group has rules that are not part of the rules array being applied these are revoked
15
+ #
16
+ def apply_rules(group, rules)
17
+ remove_old_rules(group, rules)
18
+ rules.each do |rule|
19
+ add_rule(group, rule)
20
+ end
21
+ end
22
+
23
+ #revoke old rules that are not part of the rules array
24
+ #
25
+ def remove_old_rules(group, rules)
26
+ group.ingress_ip_permissions.each do |p|
27
+ p.revoke if !is_rule?(p, rules)
28
+ end
29
+ group.egress_ip_permissions.each do |p|
30
+ p.revoke if !is_rule?(p, rules)
31
+ end
32
+ end
33
+
34
+ #checks to see if an EC2 IP permission is in array of rules
35
+ #
36
+ def is_rule?(permission, rules)
37
+ rules.each do |rule|
38
+ return true if match?(permission, rule)
39
+ end
40
+ false
41
+ end
42
+
43
+ #checks to see if an EC2 IP permission matches a rule
44
+ #AWS doesn't do clever recombination of rules in the background so we do simple comparaisons to keep things simples
45
+ #
46
+ def match?(permission, rule)
47
+ if rule.direction == :in
48
+ (permission.port_range == rule.ports) and (permission.ip_ranges == rule.sources) and (permission.protocol == rule.protocol) and (!permission.egress)
49
+ elsif rule.direction == :out
50
+ (permission.port_range == rule.ports) and (permission.ip_ranges == rule.sources) and (permission.protocol == rule.protocol) and (permission.egress)
51
+ else #rule.direction == :both
52
+ (permission.port_range == rule.ports) and (permission.ip_ranges == rule.sources) and (permission.protocol == rule.protocol)
53
+ end
54
+ end
55
+
56
+ #add a rule to a security group
57
+ #
58
+ def add_rule(group, rule)
59
+ begin
60
+ case rule.direction
61
+ when :in
62
+ group.authorize_ingress(rule.protocol, rule.ports, *rule.sources)
63
+ when :out
64
+ group.authorize_egress(*rule.sources, :protocol => rule.protocol, :ports => rule.ports)
65
+ else
66
+ group.authorize_ingress(rule.protocol, rule.ports, *rule.sources)
67
+ group.authorize_egress(*rule.sources, :protocol => rule.protocol, :ports => rule.ports)
68
+ end
69
+ rescue AWS::EC2::Errors::InvalidPermission::Duplicate
70
+
71
+ end
72
+ end
73
+
74
+ #remove rule from a security group
75
+ #
76
+ def revoke_rule(group, rule)
77
+ case rule.direction
78
+ when :in
79
+ group.revoke_ingress(rule.protocol, rule.ports, *rule.sources)
80
+ when :out
81
+ group.revoke_egress(*rule.sources, :protocol => rule.protocol, :ports => rule.ports)
82
+ else
83
+ group.revoke_ingress(rule.protocol, rule.ports, *rule.sources)
84
+ group.revoke_egress(*rule.sources, :protocol => rule.protocol, :ports => rule.ports)
85
+ end
86
+ end
87
+
88
+ class Rule < Struct.new(:protocol, :ports, :sources, :direction)
89
+ end
90
+
91
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: grouper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - digitalfrost
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-12 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: aws-sdk
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: Easily configure and manage Amazon Web Services Security Groups
31
+ email:
32
+ - it@leanbid.com
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - lib/grouper.rb
38
+ homepage: https://github.com/digitalfrost/grouper
39
+ licenses:
40
+ - MIT
41
+ post_install_message:
42
+ rdoc_options: []
43
+ require_paths:
44
+ - lib
45
+ required_ruby_version: !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - ! '>='
49
+ - !ruby/object:Gem::Version
50
+ version: '0'
51
+ required_rubygems_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ requirements: []
58
+ rubyforge_project: grouper
59
+ rubygems_version: 1.8.24
60
+ signing_key:
61
+ specification_version: 3
62
+ summary: Super Easy AWS Security Group Management
63
+ test_files: []