4-15 0 views
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : Eric Winn # @Email : eng.eric.winn@gmail.com # @Time : 19-4-15 上午2:57 # @Version : 1.0 # @File : add_ipsegment # @Software : PyCharm import os import re import sys import json import argparse from IPy import IP BASE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..') os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'cmdb.settings') sys.path.extend([BASE_DIR, os.path.join(BASE_DIR, 'apps')]) from config import Config import django django.setup() from assets.models import IPAddress, Asset, IPSegment, DataCenter, assetEnvironment datacenter_list = DataCenter.objects.values_list('name', flat=True) environment_list = list(assetEnvironment.objects.exclude(name='Null').values_list('name', flat=True)) # 正则匹配验证IP合规性 ipv4_re = r'(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)(?:\.(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}' ipv4_re_compile = re.compile(ipv4_re) gateway_re = r'^(\.(?:25[0-5]|2[0-4]\d|[0-1]?\d?\d))' gateway_re_compile = re.compile(gateway_re) def build_arg_parser(): """ Builds a standard argument parser with arguments for talking to IP Segment -b 起始IP段 -d 终至IP段 -g 网关 -n 掩码 -e 环境 -i 数据中心 """ parser = argparse.ArgumentParser( description='添加IP段') parser.add_argument('-b', '--begin', required=True, action='store', help='起始IP段') parser.add_argument('-d', '--dest', required=True, action='store', help='终至IP段') parser.add_argument('-g', '--gateway', default='.1', action='store', help='网关,默认是.1,只需要输入后一位,如: .1, .254') parser.add_argument('-n', '--netmask', default='255.255.255.0', action='store', help='掩码,默认是255.255.255.0') parser.add_argument('-i', '--idc', required=True, action='store', help=','.join(datacenter_list), choices=datacenter_list) parser.add_argument('-e', '--env', required=True, action='store', help=','.join(environment_list), choices=environment_list) return parser def add_segment(kwargs): """ 向表中插入想要录入的IP地址段数据 :param kwargs: :return: """ # 获取数据中心对象 datacenter = DataCenter.objects.get(name=kwargs['datacenter']) # 获取环境对象 environment = assetEnvironment.objects.get(name=kwargs['env']) ret_values = [] # 轮循录入地址段 for seg_dic in kwargs['segment_list']: print(seg_dic) seg = seg_dic.get('segment') gateway = seg_dic.get('gateway') netmask = seg_dic.get('netmask') try: # 向地址段表中插入数据 seg_obj = IPSegment.objects.create(segment=seg, netmask=netmask, gateway=gateway, env=environment, machineroom=datacenter) # 生成整个网段的地址池 ip_nets = IP(seg_obj.segment).make_net(seg_obj.netmask) # 将地址池轮通过IP地址模型表转换成对象列表 ip_objs = [IPAddress(ip=str(ip), segment=seg_obj, status=False) for ip in ip_nets] # 将地址对象列表利用bulk_create批量定入到表中 IPAddress.objects.bulk_create(ip_objs) ret_values.append(seg) except Exception as e: print(e) continue return {'messages': ret_values} if __name__ == '__main__': args = build_arg_parser().parse_args() # 判断是否是合法的IPv4地址 try: IP(args.begin).version() IP(args.dest).version() except Exception as e: print(e) sys.exit(1) # 判断是不是完整的字段 if not ipv4_re_compile.search(args.begin): print('起始IP: "{}"不是一个合法的IPv4的地址,IPv4必须满足4段'.format(args.begin)) sys.exit(1) if not ipv4_re_compile.search(args.dest): print('终至IP: "{}"不是一个合法的IPv4的地址, IPv4必须满足4段'.format(args.dest)) sys.exit(1) # 判断网关是不是.254的格式 if not gateway_re_compile.search(args.gateway): print('网关地址: "{}"不是所期望的格式,请使用-h获取帮助'.format(args.gateway)) sys.exit(1) # 判断网关的值是否大于255 try: IP('192.168.1{}'.format(args.gateway)).version() except Exception as e: print('gateway: "{}" single byte must be 0 <= byte < 256'.format(args.gateway)) sys.exit(1) # 起至IP段分割获取地址区间 begin_list = args.begin.split('.') dest_list = args.dest.split('.') segment_list = [{'segment': '{0}.{1}.{2}.0'.format(begin_list[0], begin_list[1], i), 'gateway': '{0}.{1}.{2}{3}'.format(begin_list[0], begin_list[1], i, args.gateway), 'netmask': args.netmask} for i in range(int(begin_list[2]), int(dest_list[2]) + 1)] # 确认分割后的地址是否正确 y = input('{}\n请确认以上网段是否正确? [y/n]:'.format(json.dumps(segment_list, indent=4))) # 判断用户输入结果 if y.lower() not in ['yes', 'y']: sys.exit(0) # 开始处理 print(add_segment({'segment_list': segment_list, 'datacenter': args.idc, 'env': args.env})) |
如果想赏钱,可以用微信扫描下面的二维码,一来能刺激我写博客的欲望,二来好维护云主机的费用; 另外再次标注博客原地址 itnotebooks.com 感谢!
