config.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 initialize import app
  7. from models import Database as db
  8. from models import ORM
  9. from models import status
  10. __author__ = 'James Iter'
  11. __date__ = '2017/3/21'
  12. __contact__ = 'james.iter.cn@gmail.com'
  13. __copyright__ = '(c) 2017 by James Iter.'
  14. class Config(ORM):
  15. _table_name = 'config'
  16. _primary_key = 'id'
  17. def __init__(self):
  18. super(Config, self).__init__()
  19. # 配置条目的 id 只会是 1
  20. self.id = 1
  21. self.jimv_edition = status.JimVEdition.standalone.value
  22. self.storage_mode = status.StorageMode.local.value
  23. self.dfs_volume = ''
  24. self.storage_path = ''
  25. self.vm_network = ''
  26. self.vm_manage_network = ''
  27. self.start_ip = ''
  28. self.end_ip = ''
  29. self.start_vnc_port = None
  30. self.netmask = ''
  31. self.gateway = ''
  32. self.dns1 = ''
  33. self.dns2 = ''
  34. @staticmethod
  35. def get_filter_keywords():
  36. return {}
  37. @staticmethod
  38. def get_allow_update_keywords():
  39. return []
  40. @staticmethod
  41. def get_allow_content_search_keywords():
  42. return []
  43. def check_ip(self):
  44. network_segment = IP(self.start_ip + '/' + self.netmask, make_net=True)
  45. ret = dict()
  46. # 起止IP必须在同一个网段中
  47. if IP(self.end_ip) not in network_segment:
  48. ret['state'] = ji.Common.exchange_state(41251)
  49. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  50. # 网关必须与将分配给Guest的IP,处于同一个网段中
  51. if IP(self.gateway) not in network_segment:
  52. ret['state'] = ji.Common.exchange_state(41252)
  53. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  54. # 网关不能是网络地址或广播地址
  55. if IP(self.gateway) in [network_segment[i] for i in (0, -1)]:
  56. ret['state'] = ji.Common.exchange_state(41253)
  57. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  58. # 当用户输入的起始IP为网络地址时,自动重置其为该网段中第一个可用IP
  59. if self.start_ip == network_segment[0].__str__():
  60. self.start_ip = intToIp((int(IP(self.start_ip).strDec()) + 1).__str__(), 4)
  61. # 当用户输入的结束IP为广播地址时,自动重置其为该网段中最后一个可用IP
  62. if self.end_ip == network_segment[-1].__str__():
  63. self.end_ip = intToIp((int(IP(self.end_ip).strDec()) - 1).__str__(), 4)
  64. # 起始的可用IP地址必须小于结束的可用IP地址
  65. if IP(self.start_ip) >= IP(self.end_ip):
  66. ret['state'] = ji.Common.exchange_state(41254)
  67. raise ji.PreviewingError(json.dumps(ret, ensure_ascii=False))
  68. return True
  69. def generate_available_ip2set(self):
  70. # 删除现有的可用IP集合
  71. db.r.delete(app.config['ip_available_set'])
  72. for ip_dec in range(int(IP(self.start_ip).strDec()), int(IP(self.end_ip).strDec()) + 1):
  73. db.r.sadd(app.config['ip_available_set'], intToIp(ip_dec, 4))
  74. def generate_available_vnc_port(self):
  75. # 删除现有的可用 vnc 端口集合
  76. db.r.delete(app.config['vnc_port_available_set'])
  77. i = 0
  78. # 借用可用 IP 范围生成需要的 vnc 端口集合
  79. for ip_dec in range(int(IP(self.start_ip).strDec()), int(IP(self.end_ip).strDec()) + 1):
  80. i += 1
  81. db.r.sadd(app.config['vnc_port_available_set'], self.start_vnc_port + i)