#!/usr/bin/env python # Convert firewall rules from a Netgear router (do "nvram show") to OpenWRT's # format. # Adam Sampson import sys service = {} rules = {} def wackysplit(s, n): fs = [] count = n while True: count -= 1 if count == 0: sep = " " else: sep = ":" i = s.find(sep) if i == -1: fs.append(s) else: fs.append(s[:i]) s = s[i + 1:] if count == 0: yield fs fs = [] count = n if i == -1: return for l in sys.stdin.readlines(): l = l.rstrip() (k, v) = l.split("=", 1) if k == "fw_services": for fs in wackysplit(v, 3): service[fs[0]] = (fs[1], fs[2]) elif k == "fw_in_rules": for fs in wackysplit(v, 6): rules[fs[1]] = fs[3] for (name, dest) in sorted(rules.items()): print "# " + name (proto, ports) = service[name] (l, r) = ports.split("-") if l == r: ports = l match = "dport=" + ports if proto == "both": pass elif proto == "tcp": match += " proto=tcp" elif proto == "udp": match += " proto=udp" print "forward:" + match + ":" + dest