Skip to content

Instantly share code, notes, and snippets.

@gsathya
Created June 11, 2012 16:28
Show Gist options
  • Save gsathya/2911068 to your computer and use it in GitHub Desktop.
Save gsathya/2911068 to your computer and use it in GitHub Desktop.
class MicrodescriptorExitPolicy:
def __init__(self):
self.ports = []
self.policy = None
# assume it's an accepted list of ports
self.is_accept = True
self.is_policy = False
def __str__(self):
if self.policy:
return self.policy
self.ports.sort()
port_range = []
start_port = self.ports[0]
for id, port in enumerate(self.ports):
if port+1 == self.ports[id+1]:
end_port = port
else:
if start_port == end_port:
port_range.append(start_port)
else:
port_range.append("%d-%d" % start_port, end_port)
start_port = port+1
ports = ','.join(port_range)
if self.is_accept: policy = 'accept %s' % ports
else: policy = 'reject %s' % ports
if len(policy) > 1000:
#raise PolicyLengthException
pass
# it's a policy, no more changes to the rules
if self.is_policy:
self.policy = policy
return policy
def add(self, rule):
# it's a polciy, we can't add more rules
if self.is_policy:
#raise PolicyException
pass
# sanitize the input a bit, cleaning up tabs and stripping quotes
rule = rule.replace("\\t", " ").replace("\"", "")
if ',' in rule:
self.add_policy(rule)
else:
self.add_rule(rule)
def add_policy(self):
self.is_policy = True
self.is_accept = rule.startswith("accept")
# remove "accept " or "reject "
ports = rule[7:]
for ports in rule.split(','):
if '-' in port:
start_port, end_port = ports.split('-', 1)
for port in range(int(start_port), int(end_port)):
self.ports.append(int(port))
else:
self.ports.append(int(ports))
def add_rule(self):
is_accept = rule.startswith("accept")
# remove "accept " or "reject "
rule = rule[7:]
# parse 'ip:port' and 'port'
if ':' in rule: ports = rule.split(":", 1)[1]
else: ports = rule
# last entry
if ports is "*":
if self.is_accept is not is_accept:
self.is_accept = not is_accept
self.policy = True
else:
# we can't have accept 80 and then accept *
# raise PolicyException
pass
# it's a rule
else:
self.is_accept = is_accept
self.ports.append(int(ports))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment