Skip to content

Commit

Permalink
add pydata target, cleanup code.
Browse files Browse the repository at this point in the history
  • Loading branch information
biergaizi committed Sep 21, 2014
1 parent 4ab3893 commit db411bf
Showing 1 changed file with 64 additions and 51 deletions.
115 changes: 64 additions & 51 deletions chnroutes.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@


def generate_ovpn(metric):
results = fetch_ip_data()
results = fetch_ip_data()
rfile=open('routes.txt','w')
for ip,mask,_ in results:
route_item="route %s %s net_gateway %d\n"%(ip,mask,metric)
Expand All @@ -24,35 +24,35 @@ def generate_linux(metric):
upscript_header=textwrap.dedent("""\
#!/bin/bash
export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
OLDGW=`ip route show | grep '^default' | sed -e 's/default via \\([^ ]*\\).*/\\1/'`
if [ $OLDGW == '' ]; then
exit 0
fi
if [ ! -e /tmp/vpn_oldgw ]; then
echo $OLDGW > /tmp/vpn_oldgw
fi
""")

downscript_header=textwrap.dedent("""\
#!/bin/bash
export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
OLDGW=`cat /tmp/vpn_oldgw`
""")

upfile=open('ip-pre-up','w')
downfile=open('ip-down','w')

upfile.write(upscript_header)
upfile.write('\n')
downfile.write(downscript_header)
downfile.write('\n')

for ip,mask,_ in results:
upfile.write('route add -net %s netmask %s gw $OLDGW\n'%(ip,mask))
downfile.write('route del -net %s netmask %s\n'%(ip,mask))
Expand All @@ -65,90 +65,90 @@ def generate_linux(metric):

def generate_mac(metric):
results=fetch_ip_data()

upscript_header=textwrap.dedent("""\
#!/bin/sh
export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
OLDGW=`netstat -nr | grep '^default' | grep -v 'ppp' | sed 's/default *\\([0-9\.]*\\) .*/\\1/'`
if [ ! -e /tmp/pptp_oldgw ]; then
echo "${OLDGW}" > /tmp/pptp_oldgw
fi
dscacheutil -flushcache
route add 10.0.0.0/8 "${OLDGW}"
route add 172.16.0.0/12 "${OLDGW}"
route add 192.168.0.0/16 "${OLDGW}"
""")

downscript_header=textwrap.dedent("""\
#!/bin/sh
export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
if [ ! -e /tmp/pptp_oldgw ]; then
exit 0
fi
ODLGW=`cat /tmp/pptp_oldgw`
route delete 10.0.0.0/8 "${OLDGW}"
route delete 172.16.0.0/12 "${OLDGW}"
route delete 192.168.0.0/16 "${OLDGW}"
""")

upfile=open('ip-up','w')
downfile=open('ip-down','w')

upfile.write(upscript_header)
upfile.write('\n')
downfile.write(downscript_header)
downfile.write('\n')

for ip,_,mask in results:
upfile.write('route add %s/%s "${OLDGW}"\n'%(ip,mask))
downfile.write('route delete %s/%s ${OLDGW}\n'%(ip,mask))

downfile.write('\n\nrm /tmp/pptp_oldgw\n')
upfile.close()
downfile.close()

print "For pptp on mac only, please copy ip-up and ip-down to the /etc/ppp folder," \
"don't forget to make them executable with the chmod command."

def generate_win(metric):
results = fetch_ip_data()
results = fetch_ip_data()

upscript_header=textwrap.dedent("""@echo off
for /F "tokens=3" %%* in ('route print ^| findstr "\\<0.0.0.0\\>"') do set "gw=%%*"
""")

upfile=open('vpnup.bat','w')
downfile=open('vpndown.bat','w')

upfile.write(upscript_header)
upfile.write('\n')
upfile.write('ipconfig /flushdns\n\n')

downfile.write("@echo off")
downfile.write('\n')

for ip,mask,_ in results:
upfile.write('route add %s mask %s %s metric %d\n'%(ip,mask,"%gw%",metric))
downfile.write('route delete %s\n'%(ip))

upfile.close()
downfile.close()

# up_vbs_wrapper=open('vpnup.vbs','w')
# up_vbs_wrapper.write('Set objShell = CreateObject("Wscript.shell")\ncall objShell.Run("vpnup.bat",0,FALSE)')
# up_vbs_wrapper.close()
# down_vbs_wrapper=open('vpndown.vbs','w')
# down_vbs_wrapper.write('Set objShell = CreateObject("Wscript.shell")\ncall objShell.Run("vpndown.bat",0,FALSE)')
# down_vbs_wrapper.close()

print "For pptp on windows only, run vpnup.bat before dialing to vpn," \
"and run vpndown.bat after disconnected from the vpn."

Expand Down Expand Up @@ -204,41 +204,52 @@ def generate_pac(metric):
print "Note: Some browser doesn't support Socks 5 in PAC, although they may support Socks 5 in the settings."
print 'Tip: You can use "file://path" as the URL of the local file.'

def generate_pydata(metric):
results = fetch_ip_data()

pydata = open("./chnroutes_data.py", "wb")

pydata.write('CHINESE_SUBNETS = [\n')
for ip, mask, _ in results:
pydata.write(' ["%s", "%s"],\n' % (ip, mask))
pydata.write("]\n")
pydata.close()

def generate_android(metric):
results = fetch_ip_data()

upscript_header=textwrap.dedent("""\
#!/bin/sh
alias nestat='/system/xbin/busybox netstat'
alias grep='/system/xbin/busybox grep'
alias awk='/system/xbin/busybox awk'
alias route='/system/xbin/busybox route'
OLDGW=`netstat -rn | grep ^0\.0\.0\.0 | awk '{print $2}'`
""")

downscript_header=textwrap.dedent("""\
#!/bin/sh
alias route='/system/xbin/busybox route'
""")

upfile=open('vpnup.sh','w')
downfile=open('vpndown.sh','w')

upfile.write(upscript_header)
upfile.write('\n')
downfile.write(downscript_header)
downfile.write('\n')

for ip,mask,_ in results:
upfile.write('route add -net %s netmask %s gw $OLDGW\n'%(ip,mask))
downfile.write('route del -net %s netmask %s\n'%(ip,mask))

upfile.close()
downfile.close()

print "Old school way to call up/down script from openvpn client. " \
"use the regular openvpn 2.1 method to add routes if it's possible"

Expand All @@ -248,17 +259,17 @@ def fetch_ip_data():
print "Fetching data from apnic.net, it might take a few minutes, please wait..."
url=r'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest'
data=urllib2.urlopen(url).read()

cnregex=re.compile(r'apnic\|cn\|ipv4\|[0-9\.]+\|[0-9]+\|[0-9]+\|a.*',re.IGNORECASE)
cndata=cnregex.findall(data)

results=[]

for item in cndata:
unit_items=item.split('|')
starting_ip=unit_items[3]
num_ip=int(unit_items[4])

imask=0xffffffff^(num_ip-1)
#convert to string
imask=hex(imask)[2:]
Expand All @@ -267,16 +278,16 @@ def fetch_ip_data():
mask[1]=imask[2:4]
mask[2]=imask[4:6]
mask[3]=imask[6:8]

#convert str to int
mask=[ int(i,16 ) for i in mask]
mask="%d.%d.%d.%d"%tuple(mask)

#mask in *nix format
mask2=32-int(math.log(num_ip,2))

results.append((starting_ip,mask,mask2))

return results


Expand All @@ -286,17 +297,17 @@ def fetch_ip_data():
dest='platform',
default='openvpn',
nargs='?',
help="Target platforms, it can be openvpn, mac, linux,"
help="Target platforms, it can be openvpn, mac, linux,"
"win, android and pac. openvpn by default.")
parser.add_argument('-m','--metric',
dest='metric',
default=5,
nargs='?',
type=int,
help="Metric setting for the route rules")

args = parser.parse_args()

if args.platform.lower() == 'openvpn':
generate_ovpn(args.metric)
elif args.platform.lower() == 'linux':
Expand All @@ -309,6 +320,8 @@ def fetch_ip_data():
generate_android(args.metric)
elif args.platform.lower() == 'pac':
generate_pac(args.metric)
elif args.platform.lower() == "pydata":
generate_pydata(args.metric)
else:
print>>sys.stderr, "Platform %s is not supported."%args.platform
exit(1)

0 comments on commit db411bf

Please sign in to comment.