Initial commit
[setroute.git] / usr / local / bin / set-route
1 #!/usr/bin/python
2
3 import sys,commands
4 from optparse import OptionParser
5 from dns.resolver import query
6 from dns.exception import DNSException
7 import re
8
9 # default domain list
10 config = '/etc/setroute.list'
11
12 # read domains from file
13 def read_list(file):
14
15   lines = [line.strip() for line in open(config)]  
16   names = []
17
18   for name in lines:
19     if name:
20       names.append(name)
21         
22   return names
23
24 # host to IP addresses
25 def host_to_ip(name):
26   ip = []
27   try:
28     qa = query(name,"A")
29     for i in qa:  
30       print name+"->"+i.to_text()
31       ip.append(i.to_text())
32   except DNSException:
33     return []
34   finally:
35     return ip      
36
37 # convert names into IP addresses
38 def to_ip(names):
39   re_ip = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$')
40   ip_list = []
41   for name in names:
42     if re_ip.match(name):
43       ip_list = list(set(ip_list + [name]))
44       print name+' appended'
45     else:
46       ip = host_to_ip(name)
47       ip_list = list(set(ip_list + ip))
48   return ip_list  
49
50 # set route
51 def set_route(list,interface,gateway,dest,remove):
52   for i in list:
53     if remove:
54       if interface:
55         if gateway:
56           command = "route del -net %s netmask 255.255.255.255 gw %s dev %s" % (i,gateway,interface)
57         else:
58           command = "route del -net %s netmask 255.255.255.255 dev %s" % (i,interface)
59       elif dest:  
60         command = "iptables -t nat -D OUTPUT -p tcp -d %s -m tcp -j DNAT --to-destination %s" % (i,dest)
61       elif gateway:  
62         command = "route del -net %s netmask 255.255.255.255 gw %s" % (i,gateway)
63       elif ipset:
64         command = "ipset del %s %s" %(ipset,i)  
65       print command
66       commands.getoutput(command)
67     else:  
68       if interface:
69         if gateway:
70           command = "route add -net %s netmask 255.255.255.255 gw %s dev %s" % (i,gateway,interface)
71         else:
72           command = "route add -net %s netmask 255.255.255.255 dev %s" % (i,interface)
73       elif dest:  
74         command = "iptables -t nat -I OUTPUT -p tcp -d %s -m tcp -j DNAT --to-destination %s" % (i,dest)
75       elif gateway:  
76         command = "route add -net %s netmask 255.255.255.255 gw %s" % (i,gateway)
77       elif ipset:
78         command = "ipset add %s %s" %(ipset,i)  
79       print command
80       commands.getoutput(command)
81
82 # main procedure - process input parameters, read file and set route
83 def main():
84   global dest,interface,gateway,remove
85   try:
86     domain_list = read_list(config)
87   except:
88     print "Cannot get domains list from file", config
89     exit()  
90   ip_list = to_ip(domain_list)
91   set_route(ip_list,interface,gateway,dest,remove)
92
93 if __name__ == "__main__":
94   parser = OptionParser()
95   parser.add_option("-l", "--list", dest="config", help="Domain names list (default /etc/setroute.list) " )
96   parser.add_option("-s", "--ipset", dest="ipset", help="IPset to fill in")
97   parser.add_option("-d", "--destination", dest="destination", help="Proxy server (IP:Port)")
98   parser.add_option("-i", "--interface", dest="interface", help="Interface name")
99   parser.add_option("-g", "--gateway", dest="gateway", help="Gateway IP")
100   parser.add_option("-r", "--remove", action="store_true", dest="remove", help="Remove redirection")
101   (options, args) = parser.parse_args()
102   opts = options.__dict__
103   if opts["config"]:
104     config = opts["config"]
105   if opts["destination"]:
106     dest = opts["destination"] 
107   else:
108     dest = None  
109   if opts["interface"]:
110     interface = opts["interface"] 
111   else:
112     interface = None  
113   if opts["gateway"]:
114     gateway = opts["gateway"] 
115   else:
116     gateway = None  
117   if opts["remove"]:
118     remove = opts["remove"] 
119   else:
120     remove = None  
121   if opts["ipset"]:
122     ipset = opts["ipset"] 
123   else:
124     ipset = None  
125   main()
126