initialize.py 6.3 KB

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