--- /dev/null
+#!/usr/bin/python
+
+import sys,commands
+from optparse import OptionParser
+from dns.resolver import query
+from dns.exception import DNSException
+import re
+
+# default domain list
+config = '/etc/setroute.list'
+
+# read domains from file
+def read_list(file):
+
+ lines = [line.strip() for line in open(config)]
+ names = []
+
+ for name in lines:
+ if name:
+ names.append(name)
+
+ return names
+
+# host to IP addresses
+def host_to_ip(name):
+ ip = []
+ try:
+ qa = query(name,"A")
+ for i in qa:
+ print name+"->"+i.to_text()
+ ip.append(i.to_text())
+ except DNSException:
+ return []
+ finally:
+ return ip
+
+# convert names into IP addresses
+def to_ip(names):
+ re_ip = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
+ ip_list = []
+ for name in names:
+ if re_ip.match(name):
+ ip_list = list(set(ip_list + [name]))
+ print name+' appended'
+ else:
+ ip = host_to_ip(name)
+ ip_list = list(set(ip_list + ip))
+ return ip_list
+
+# set route
+def set_route(list,interface,gateway,dest,remove):
+ for i in list:
+ if remove:
+ if interface:
+ if gateway:
+ command = "route del -net %s netmask 255.255.255.255 gw %s dev %s" % (i,gateway,interface)
+ else:
+ command = "route del -net %s netmask 255.255.255.255 dev %s" % (i,interface)
+ elif dest:
+ command = "iptables -t nat -D OUTPUT -p tcp -d %s -m tcp -j DNAT --to-destination %s" % (i,dest)
+ elif gateway:
+ command = "route del -net %s netmask 255.255.255.255 gw %s" % (i,gateway)
+ elif ipset:
+ command = "ipset del %s %s" %(ipset,i)
+ print command
+ commands.getoutput(command)
+ else:
+ if interface:
+ if gateway:
+ command = "route add -net %s netmask 255.255.255.255 gw %s dev %s" % (i,gateway,interface)
+ else:
+ command = "route add -net %s netmask 255.255.255.255 dev %s" % (i,interface)
+ elif dest:
+ command = "iptables -t nat -I OUTPUT -p tcp -d %s -m tcp -j DNAT --to-destination %s" % (i,dest)
+ elif gateway:
+ command = "route add -net %s netmask 255.255.255.255 gw %s" % (i,gateway)
+ elif ipset:
+ command = "ipset add %s %s" %(ipset,i)
+ print command
+ commands.getoutput(command)
+
+# main procedure - process input parameters, read file and set route
+def main():
+ global dest,interface,gateway,remove
+ try:
+ domain_list = read_list(config)
+ except:
+ print "Cannot get domains list from file", config
+ exit()
+ ip_list = to_ip(domain_list)
+ set_route(ip_list,interface,gateway,dest,remove)
+
+if __name__ == "__main__":
+ parser = OptionParser()
+ parser.add_option("-l", "--list", dest="config", help="Domain names list (default /etc/setroute.list) " )
+ parser.add_option("-s", "--ipset", dest="ipset", help="IPset to fill in")
+ parser.add_option("-d", "--destination", dest="destination", help="Proxy server (IP:Port)")
+ parser.add_option("-i", "--interface", dest="interface", help="Interface name")
+ parser.add_option("-g", "--gateway", dest="gateway", help="Gateway IP")
+ parser.add_option("-r", "--remove", action="store_true", dest="remove", help="Remove redirection")
+ (options, args) = parser.parse_args()
+ opts = options.__dict__
+ if opts["config"]:
+ config = opts["config"]
+ if opts["destination"]:
+ dest = opts["destination"]
+ else:
+ dest = None
+ if opts["interface"]:
+ interface = opts["interface"]
+ else:
+ interface = None
+ if opts["gateway"]:
+ gateway = opts["gateway"]
+ else:
+ gateway = None
+ if opts["remove"]:
+ remove = opts["remove"]
+ else:
+ remove = None
+ if opts["ipset"]:
+ ipset = opts["ipset"]
+ else:
+ ipset = None
+ main()
+
\ No newline at end of file