电商系统大考双十一过去了,能够找点时间写点东西了。python
此次说说提高工做效率。讲工程效率提高的文章有不少,咱们先不看团队的。从个体小处如何减小机械性,重复性的工做,是切切实实提升我的幸福感的一件事。nginx
因为工做上的缘由,常常须要给外包服务商开通访问内部系统的白名单。咱们知道根据网络上通路到达web系统不一样,大体上能够分为两类访问控制:web
nginx上的七层访问控制,彻底由应用上的配置文件控制访问IP,该方式的好处也是坏处,就是须要开发明确知道并维护nginx上的白名单配置文件,一样的只要有了这份配置文件,理论上名单不会丢,应用基线能够保证多机房部署。微信
防火墙控制,此种方式对应用透明,应用开发不须要关心白名单控制,问题也是明显的,防火墙ACL控制在跨机房时并不能跟随,有几个机房就要同时维护几份白名单,对运维系统也有要求,同一份IP段要支持多机房下发。网络
故事的起点就在这,防火墙的ACL控制下发要求提供CIDR格式的规则。什么是CIDR格式?直接看自由的百科全书的解释:less
无类别域间路由(Classless Inter-Domain Routing、CIDR)是一个用于给用户分配IP地址以及在互联网上有效地路由IP数据包的对IP地址进行归类的方法。运维
CIDR看起来就是这样的: 208.130.29.0/24spa
好比有个需求就是208.130.29.30-35这个IP段换成CIDR格式,有几个只学过基础网络知识的开发懂这个?翻译
做为一个开发人员作这个换算是很费劲的,好比要去网上用相似如下这个巨难用的表格来作网段和CIDR格式的换算,还要搞清楚/32 /31 /29 这些彷佛跟web开发没有多大关系的知识。code
在经历了痛苦和挫折后,一个偶然的机会,发现python竟然有现成的类库支持此类网络操做与换算。 将以上的需求翻译成python只要几行代码搞定:
# 肯定起始和结尾IP,不管多复杂均可以转换 startip = '208.130.29.30' endip = '208.130.29.35' cidrs = netaddr.iprange_to_cidrs(startip, endip) for k, v in enumerate(cidrs): iplist = v print iplist
输出:
208.130.29.30/31
208.130.29.32/30
反过来,CIDR也能直接转成IP地址段:
from netaddr import * ip = IPNetwork('192.0.2.16/29') ip_list = list(ip) print(ip_list)
输出:
[IPAddress('192.0.2.16'), IPAddress('192.0.2.17'), …, IPAddress('192.0.2.22'), IPAddress('192.0.2.23')]
感谢python大法!
文章来自微信平台「麦芽面包」
微信公众号「darkjune_think」转载请注明。
若是以为有趣,微信扫一扫关注公众号。