ip_pool.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import json
  4. import jimit as ji
  5. from IPy import IP, intToIp
  6. from jimvc.models import FilterFieldType
  7. from jimvc.models import ORM
  8. __author__ = 'James Iter'
  9. __date__ = '2018-12-15'
  10. __contact__ = 'james.iter.cn@gmail.com'
  11. __copyright__ = '(c) 2018 by James Iter.'
  12. class IPPool(ORM):
  13. _table_name = 'ip_pool'
  14. _primary_key = 'id'
  15. def __init__(self):
  16. super(IPPool, self).__init__()
  17. self.id = 0
  18. self.start_ip = ''
  19. self.end_ip = ''
  20. self.netmask = ''
  21. self.gateway = ''
  22. self.dns1 = ''
  23. self.dns2 = ''
  24. self.name = ''
  25. self.activity = 0
  26. self.description = ''
  27. self.create_time = ji.Common.tus()
  28. @staticmethod
  29. def get_filter_keywords():
  30. return {
  31. 'id': FilterFieldType.INT.value,
  32. 'name': FilterFieldType.STR.value,
  33. 'activity': FilterFieldType.INT.value
  34. }
  35. @staticmethod
  36. def get_allow_update_keywords():
  37. return ['activity']
  38. @staticmethod
  39. def get_allow_content_search_keywords():
  40. return ['name']
  41. def ip_generator(self, occupied_ips=None):
  42. """
  43. # 可用 IP 生成器
  44. :param occupied_ips: 已分配的虚拟机 IP 列表
  45. :return: 返回一个可分配的 IP 地址,格式如 '192.168.1.1'
  46. """
  47. assert isinstance(occupied_ips, list)
  48. occupied_ips_dec = list()
  49. for occupied_ip in occupied_ips:
  50. occupied_ips_dec.append(int(IP(occupied_ip).strDec()))
  51. for ip_dec in range(int(IP(self.start_ip).strDec()), int(IP(self.end_ip).strDec()) + 1):
  52. if ip_dec in occupied_ips_dec:
  53. continue
  54. yield intToIp(ip_dec, 4)
  55. @staticmethod
  56. def vnc_port_generator(occupied_vnc_ports=None):
  57. assert isinstance(occupied_vnc_ports, list)
  58. for vnc_port in range(15900, 20000):
  59. if vnc_port in occupied_vnc_ports:
  60. continue
  61. yield vnc_port
  62. def check_ip(self):
  63. network_segment = IP(self.start_ip + '/' + self.netmask, make_net=True)
  64. ret = dict()
  65. # 起止IP必须在同一个网段中
  66. if IP(self.end_ip) not in network_segment:
  67. ret['state'] = ji.Common.exchange_state(41251)
  68. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  69. # 网关必须与将分配给Guest的IP,处于同一个网段中
  70. if IP(self.gateway) not in network_segment:
  71. ret['state'] = ji.Common.exchange_state(41252)
  72. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  73. # 网关不能是网络地址或广播地址
  74. if IP(self.gateway) in [network_segment[i] for i in (0, -1)]:
  75. ret['state'] = ji.Common.exchange_state(41253)
  76. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  77. # 当用户输入的起始IP为网络地址时,自动重置其为该网段中第一个可用IP
  78. if self.start_ip == network_segment[0].__str__():
  79. self.start_ip = intToIp((int(IP(self.start_ip).strDec()) + 1).__str__(), 4)
  80. # 当用户输入的结束IP为广播地址时,自动重置其为该网段中最后一个可用IP
  81. if self.end_ip == network_segment[-1].__str__():
  82. self.end_ip = intToIp((int(IP(self.end_ip).strDec()) - 1).__str__(), 4)
  83. # 起始的可用IP地址必须小于结束的可用IP地址
  84. if IP(self.start_ip) >= IP(self.end_ip):
  85. ret['state'] = ji.Common.exchange_state(41254)
  86. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  87. return True