grouper 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: []