python chnroutes ROS版

chnroutes 估计懂网络很多人都认得。挺不错的自动更新路由表脚本。

挤了点时间简单修改了一下。将它支持生成RouterOS脚本,方便软路由器做根据IP自动择线了。
注意脚本会清空原有的地址列表china_address_lists

#!/usr/bin/env python

import re
import urllib2
import sys
import argparse
import math
import textwrap
import time

def generate_ros(metric):
    results = fetch_ip_data()
    rosscript_header=textwrap.dedent("""    # %s by chnrouters
    #
    /ip firewall address-list
    remove [find list =china_address_lists ]

    """ % time.strftime(‘%b/%d/%Y %H:%M:%S‘,time.localtime(time.time())))

    rfile=open(‘ros_addlist_china.rsc‘,‘w‘)
    rfile.write(rosscript_header)

    for ip,_,mask2 in results:
        address_item="add address=%s/%d list=china_address_lists\n"%(ip,mask2)
        rfile.write(address_item)
    rfile.close()
    print "Usage: Import the content of the newly created ros_addlist_china.rsc to your routeros,"           "script while clear the original before add."

def generate_ovpn(metric):
    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)
        rfile.write(route_item)
    rfile.close()
    print "Usage: Append the content of the newly created routes.txt to your openvpn config file,"           " and also add ‘max-routes %d‘, which takes a line, to the head of the file." % (len(results)+20)

def generate_linux(metric):
    results = fetch_ip_data()
    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))

    downfile.write(‘rm /tmp/vpn_oldgw\n‘)

    print "For pptp only, please copy the file ip-pre-up to the folder/etc/ppp,"           "and copy the file ip-down to the folder /etc/ppp/ip-down.d."

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

    """)

    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`

    """)

    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()  

    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."

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"

def fetch_ip_data():
    #fetch data from apnic
    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:]
        mask=[0]*4
        mask[0]=imask[0:2]
        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

if __name__==‘__main__‘:
    parser=argparse.ArgumentParser(description="Generate routing rules for vpn.")
    parser.add_argument(‘-p‘,‘--platform‘,
                        dest=‘platform‘,
                        default=‘routeros‘,
                        nargs=‘?‘,
                        help="Target platforms, it can be openvpn, mac, linux,"
                        "win, android. 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‘:
        generate_linux(args.metric)
    elif args.platform.lower() == ‘mac‘:
        generate_mac(args.metric)
    elif args.platform.lower() == ‘win‘:
        generate_win(args.metric)
    elif args.platform.lower() == ‘android‘:
        generate_android(args.metric)
    elif args.platform.lower() == ‘routeros‘:
        generate_ros(args.metric)
    else:
        print>>sys.stderr, "Platform %s is not supported."%args.platform
        exit(1)

  

时间: 2024-11-09 02:48:36

python chnroutes ROS版的相关文章

像计算机科学家一样思考Python (第2版)高清PDF电子版下载

本书以培养读者以计算机科学家一样的思维方式来理解Python语言编程.贯穿全书的主体是如何思考.设计.开发的方法,而具体的编程语言,只是提供了一个具体场景方便介绍的媒介. 全书共21章,详细介绍Python语言编程的方方面面.本书从基本的编程概念开始讲起,包括语言的语法和语义,而且每个编程概念都有清晰的定义,引领读者循序渐进地学习变量.表达式.语句.函数和数据结构.书中还探讨了如何处理文件和数据库,如何理解对象.方法和面向对象编程,如何使用调试技巧来修正语法错误.运行时错误和语义错误.每一章都配

Instant Python 中文缩减版

前言 本文主要来自<Python基础教程(第2版)>([挪]Magnus Lie Hetland著,司维 曾军崴 谭颖华译 人民邮电出版社) 中的“附录A 简明版本”,对于其中的有问题之处进行修改,仅是个人理解,若有错误敬请见谅. 简介 本部分是基于我([挪]Magnus Lie Hetland)的流行网络教程“instant Python”(http://hetland.org/writing/instant-python.html)的一个简短的Python介绍.它面向那些已经掌握一到两门语

Spark 入门(Python、Scala 版)

本文中,我们将首先讨论如何在本地机器上利用Spark进行简单分析.然后,将在入门级水平探索Spark,了解Spark是什么以及它如何工作(希望可以激发更多探索).最后两节将开始通过命令行与Spark进行交互,然后演示如何用Python写Spark应用,并作为Spark作业提交到集群上.同时也会提供相应的 Scala 版本. 1.设置Spark环境 在本机设置和运行Spark非常简单.你只需要下载一个预构建的包,只要你安装了Java 6+和Python 2.6+,就可以在Windows.Mac O

像计算机科学家一样思考Python (第2版)pdf

下载地址:网盘下载 内容简介  · · · · · · 本书以培养读者以计算机科学家一样的思维方式来理解Python语言编程.贯穿全书的主体是如何思考.设计.开发的方法,而具体的编程语言,只是提供了一个具体场景方便介绍的媒介. 全书共21章,详细介绍Python语言编程的方方面面.本书从基本的编程概念开始讲起,包括语言的语法和语义,而且每个编程概念都有清晰的定义,引领读者循序渐进地学习变量.表达式.语句.函数和数据结构.书中还探讨了如何处理文件和数据库,如何理解对象.方法和面向对象编程,如何使用

《父与子的编程之旅 python【第二版】》高清中文版PDF+高清英文版PDF+源代码

下载:https://pan.baidu.com/s/17jzBzVdQ2XMmRIrOZhMnDQ 以Python语言为例,详尽细致地介绍了Python如何安装.字符串和操作符等程序设计的基本概念. 高清中文版PDF,带目录和书签,能够复制粘贴:高清英文版PDF,带目录和书签,能够复制粘贴:中英文两版可以对比学习. 配套源代码: 经典书籍,讲解详细: 其中高清中文版如图 原文地址:https://www.cnblogs.com/javapythonstudy/p/9884881.html

分享《父与子的编程之旅python【第二版】》+PDF+源码+Warren Sande+苏金国

下载:https://pan.baidu.com/s/1hv3QvBfU7tG9WRCiSxoucA 更多资料分享:http://blog.51cto.com/14087171 <父与子的编程之旅[第二版]>高清中文版PDF+高清英文版PDF+源代码 以Python语言为例,详尽细致地介绍了Python如何安装.字符串和操作符等程序设计的基本概念. 高清中文版PDF,458页,彩色配图,带目录和书签,能够复制粘贴:高清英文版PDF,490页,彩色配图,带目录和书签,能够复制粘贴:中英文两版可以

python爬虫(简单版)

学过python的帅哥都知道,爬虫是python的非常好玩的东西,而且python自带urllib.urllib2.requests等的库,为爬虫的开发提供大大的方便. 这次我要用urllib2,爬一堆风景图片. 先上重点代码 1 response = urllib2.urlopen(url).read() 2 soup = BeautifulSoup( 3 response, # html字符串 4 'html.parser', # html解析器 5 from_encoding='utf-8

python爬虫beta版之抓取知乎单页面回答(low 逼版)

闲着无聊,逛知乎.发现想找点有意思的回答也不容易,就想说要不写个爬虫帮我把点赞数最多的给我搞下来方便阅读,也许还能做做数据分析(意淫中--) 鉴于之前用python写爬虫,帮运营人员抓取过京东的商品品牌以及分类,这次也是用python来搞简单的抓取单页面版,后期再补充哈. #-*- coding: UTF-8 -*- import requests import sys from bs4 import BeautifulSoup #------知乎答案收集---------- #获取网页body

python面向对象进阶版

面向对象基础知识: 1.面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 2.类是一个模板,模板中包装了多个'函数'供使用(可以将多函数中公用的变量封装到对象中): 3.对象,根据模板创建的实例(即:对象),实例用于被包装在类中的函数: 4.面向对象三大特性:封装.继承和多态. 面向对象进阶篇详细介绍python类的成员.成员修饰符和类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存