initialize.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from multiprocessing import JoinableQueue
  4. from flask import Flask
  5. from flask_socketio import SocketIO
  6. import logging
  7. from logging.handlers import TimedRotatingFileHandler
  8. import json
  9. import os
  10. import sys
  11. import re
  12. import getopt
  13. import jimit as ji
  14. import time
  15. import errno
  16. from jimvc_exception import PathNotExist
  17. from state_code import own_state_branch
  18. reload(sys)
  19. sys.setdefaultencoding('utf8')
  20. __author__ = 'James Iter'
  21. __date__ = '2017/3/21'
  22. __contact__ = 'james.iter.cn@gmail.com'
  23. __copyright__ = '(c) 2017 by James Iter.'
  24. app = Flask(__name__, template_folder='../templates', static_folder='../static')
  25. class Init(object):
  26. config = {
  27. 'config_file': '/etc/jimvc.conf',
  28. 'log_cycle': 'D',
  29. 'instruction_channel': 'C:Instruction',
  30. 'ip_available_set': 'S:IP:Available',
  31. 'ip_used_set': 'S:IP:Used',
  32. 'vnc_port_available_set': 'S:VNCPort:Available',
  33. 'vnc_port_used_set': 'S:VNCPort:Used',
  34. 'downstream_queue': 'Q:Downstream',
  35. 'upstream_queue': 'Q:Upstream',
  36. 'hosts_info': 'H:HostsInfo',
  37. 'guest_boot_jobs': 'S:GuestBootJobs',
  38. 'guest_boot_jobs_wait_time': 600,
  39. 'db_charset': 'utf8',
  40. 'db_pool_size': 10,
  41. 'DEBUG': False,
  42. 'jwt_algorithm': 'HS512',
  43. 'token_ttl': 604800,
  44. 'SESSION_TYPE': 'filesystem',
  45. 'SESSION_PERMANENT': True,
  46. 'SESSION_USE_SIGNER': True,
  47. 'SESSION_FILE_DIR': '/tmp/jimv',
  48. 'SESSION_FILE_THRESHOLD': 5000,
  49. 'SESSION_COOKIE_NAME': 'sid',
  50. 'SESSION_COOKIE_SECURE': False,
  51. 'PERMANENT_SESSION_LIFETIME': 604800
  52. }
  53. @classmethod
  54. def load_config(cls):
  55. def usage():
  56. print "Usage:%s [-c] [--config]" % sys.argv[0]
  57. opts = None
  58. try:
  59. opts, args = getopt.getopt(sys.argv[1:], 'hc:',
  60. ['help', 'config='])
  61. except getopt.GetoptError as e:
  62. print str(e)
  63. usage()
  64. exit(e.message.__len__())
  65. for k, v in opts:
  66. if k in ("-h", "--help"):
  67. usage()
  68. exit()
  69. elif k in ("-c", "--config"):
  70. cls.config['config_file'] = v
  71. else:
  72. print "unhandled option"
  73. if not os.path.isfile(cls.config['config_file']):
  74. raise PathNotExist(u'配置文件不存在, 请指明配置文件路径')
  75. with open(cls.config['config_file'], 'r') as f:
  76. cls.config.update(json.load(f))
  77. return cls.config
  78. @classmethod
  79. def init_logger(cls):
  80. log_dir = os.path.dirname(cls.config['log_file_path'])
  81. if not os.path.isdir(log_dir):
  82. try:
  83. os.makedirs(log_dir, 0755)
  84. except OSError as e:
  85. # 如果配置文件中的日志目录无写入权限,则调整日志路径到本项目目录下
  86. if e.errno != errno.EACCES:
  87. raise
  88. cls.config['log_file_path'] = './logs/jimvc.log'
  89. log_dir = os.path.dirname(cls.config['log_file_path'])
  90. if not os.path.isdir(log_dir):
  91. os.makedirs(log_dir, 0755)
  92. print u'日志路径自动调整为 ' + cls.config['log_file_path']
  93. _logger = logging.getLogger(cls.config['log_file_path'])
  94. if cls.config['DEBUG']:
  95. _logger.setLevel(logging.DEBUG)
  96. else:
  97. _logger.setLevel(logging.INFO)
  98. fh = TimedRotatingFileHandler(cls.config['log_file_path'], when=cls.config['log_cycle'],
  99. interval=1, backupCount=7)
  100. formatter = logging.Formatter(
  101. '%(asctime)s - %(name)s - %(levelname)s - %(funcName)s - %(lineno)s - %(message)s')
  102. fh.setFormatter(formatter)
  103. _logger.addHandler(fh)
  104. return _logger
  105. @staticmethod
  106. def pub_sub_ping_pong():
  107. from models import Database as db
  108. from models import Utils
  109. while True:
  110. if Utils.exit_flag:
  111. print 'Thread pub_sub_ping_pong say bye-bye'
  112. return
  113. time.sleep(10)
  114. db.r.publish(app.config['instruction_channel'], message=json.dumps({'action': 'ping'}))
  115. @staticmethod
  116. def clear_expire_monitor_log():
  117. from models import CPUMemory, Traffic, DiskIO, HostCPUMemory, HostTraffic, HostDiskUsageIO
  118. from models import Utils
  119. already_clear = False
  120. the_time = '03:30'
  121. while True:
  122. if Utils.exit_flag:
  123. print 'Thread clear_expire_monitor_log say bye-bye'
  124. return
  125. time.sleep(10)
  126. # 每天凌晨3点30分执行,清除15天前的监控记录
  127. if ji.JITime.now_time()[:5] == the_time and not already_clear:
  128. boundary = ji.Common.ts() - 86400 * 15
  129. filter_str = 'timestamp:lt:' + boundary.__str__()
  130. CPUMemory.delete_by_filter(filter_str=filter_str)
  131. Traffic.delete_by_filter(filter_str=filter_str)
  132. DiskIO.delete_by_filter(filter_str=filter_str)
  133. HostCPUMemory.delete_by_filter(filter_str=filter_str)
  134. HostTraffic.delete_by_filter(filter_str=filter_str)
  135. HostDiskUsageIO.delete_by_filter(filter_str=filter_str)
  136. already_clear = True
  137. if already_clear and ji.JITime.now_time()[:5] != the_time:
  138. already_clear = False
  139. q_ws = JoinableQueue()
  140. # 预编译效率更高
  141. regex_sql_str = re.compile('\\\+"')
  142. regex_dsl_str = re.compile('^\w+:\w+:[\S| ]+$')
  143. config = Init.load_config()
  144. logger = Init.init_logger()
  145. app.config = dict(app.config, **config)
  146. socketio = SocketIO(app)
  147. ji.index_state['branch'] = dict(ji.index_state['branch'], **own_state_branch)
  148. # sequence_device_node_mapping = ['vda', 'vdb', 'vdc', 'vdd']
  149. dev_table = list()
  150. for i in range(26):
  151. dev_table.append('vd' + chr(97 + i))
  152. app.jinja_env.add_extension('jinja2.ext.loopcontrols')