core.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. demeter core
  5. name:demeter.py
  6. author:rabin
  7. """
  8. import time
  9. import os
  10. import signal
  11. import re
  12. import sys
  13. import getopt
  14. import json
  15. import ConfigParser
  16. import subprocess
  17. from tornado.web import Finish
  18. class Demeter(object):
  19. path = ''
  20. config = {}
  21. serviceObj = {}
  22. modelObj = {}
  23. web = ''
  24. request = False
  25. def __new__(self, *args, **kwargs):
  26. print 'error'
  27. sys.exit()
  28. def __init__(self):
  29. pass
  30. @staticmethod
  31. def isset(v):
  32. try :
  33. type (eval(v))
  34. except :
  35. return 0
  36. else :
  37. return 1
  38. @classmethod
  39. def initConfig(self):
  40. self.path = File.path()
  41. if self.config == {}:
  42. name = 'dev'
  43. if 'DEMETER_CONF' in os.environ:
  44. name = os.environ['DEMETER_CONF']
  45. filename = self.path + 'conf/'+name+'.conf'
  46. if File.exists(filename):
  47. config = ConfigParser.ConfigParser()
  48. config.read(filename)
  49. for item in config.sections():
  50. self.config[item] = self.readConfig(config, item)
  51. return True
  52. else:
  53. print filename + ' is not exists'
  54. sys.exit()
  55. @staticmethod
  56. def readConfig(config, type):
  57. value = config.options(type)
  58. result = {}
  59. for item in value:
  60. result[item] = config.get(type, item)
  61. return result
  62. @classmethod
  63. def temp(self, key='', name='', value=''):
  64. temp = Demeter.path + 'conf/temp.conf'
  65. if File.exists(temp):
  66. config = ConfigParser.ConfigParser()
  67. config.read(temp)
  68. if key and name:
  69. config.set(key, name, value)
  70. config.write(open(temp, 'w'))
  71. else:
  72. result = {}
  73. for item in config.sections():
  74. result[item] = self.readConfig(config, item)
  75. return result
  76. @classmethod
  77. def echo(self, args):
  78. module = self.getObject('pprint')
  79. module.pprint(args)
  80. @classmethod
  81. def record(self, key, value):
  82. # 记录日志
  83. # self.log(key, value)
  84. service = self.service('record')
  85. service.push(key, value)
  86. @classmethod
  87. def service(self, name):
  88. if name not in self.serviceObj:
  89. path = 'service.'
  90. if name == 'common':
  91. path = 'demeter.'
  92. name = 'service'
  93. service = self.getClass(name, path)
  94. self.serviceObj[name] = service()
  95. return self.serviceObj[name]
  96. @classmethod
  97. def model(self, table, name='rdb'):
  98. if table not in self.modelObj:
  99. name = self.config['db'][name]
  100. config = self.config[name]
  101. obj = self.getObject('db', 'demeter.')
  102. db = getattr(obj, name.capitalize())
  103. connect = db(config).get()
  104. model = self.getClass(table, 'model.')
  105. self.modelObj[table] = model(name, connect, config)
  106. return self.modelObj[table]
  107. @classmethod
  108. def getClass(self, name, path=''):
  109. obj = self.getObject(name, path)
  110. return getattr(obj, name.capitalize())
  111. @staticmethod
  112. def getObject(name, path = ''):
  113. module = __import__(path + name)
  114. return getattr(module, name)
  115. @staticmethod
  116. def bool(value):
  117. return value == str(True)
  118. @classmethod
  119. def runtime(self, path, file, content=''):
  120. path = self.path + 'runtime/' + path + '/'
  121. File.mkdir(path)
  122. file = path + file
  123. if File.exists(file):
  124. return False
  125. else:
  126. File.write(file, content)
  127. return True
  128. @classmethod
  129. def webstart(self, name):
  130. self.web = name
  131. self.webPath = self.path + self.web + '/'
  132. self.getObject('main', name + '.')
  133. @classmethod
  134. def md5(self, value, salt=False):
  135. module = __import__('md5')
  136. md5 = getattr(module, 'new')
  137. md5_obj = md5()
  138. if salt:
  139. if salt == True:
  140. salt = self.rand()
  141. md5_obj.update(value + salt)
  142. return md5_obj.hexdigest() + '_' + salt
  143. else:
  144. md5_obj.update(value)
  145. return md5_obj.hexdigest()
  146. @staticmethod
  147. def rand(length = 4):
  148. module = __import__('random')
  149. rand = getattr(module, 'randint')
  150. salt = ''
  151. chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
  152. len_chars = len(chars) - 1
  153. for i in xrange(length):
  154. salt += chars[rand(0, len_chars)]
  155. return salt
  156. @staticmethod
  157. def hour(value):
  158. if value < 10:
  159. return '0' + str(value)
  160. return value
  161. @staticmethod
  162. def time():
  163. return int(time.time())
  164. @staticmethod
  165. def mktime(value, string='%Y-%m-%d %H:%M:%S'):
  166. if ' ' in string and ' ' not in value:
  167. value = value + ' 00:00:00'
  168. return int(time.mktime(time.strptime(value,string)))
  169. @staticmethod
  170. def date(value, string='%Y-%m-%d %H:%M:%S'):
  171. module = __import__('datetime')
  172. datetime = getattr(module, 'datetime')
  173. fromtimestamp = getattr(datetime, 'fromtimestamp')
  174. return str(fromtimestamp(value).strftime(string))
  175. @staticmethod
  176. def isJson(value):
  177. result = False
  178. try:
  179. result = json.loads(value)
  180. except ValueError:
  181. return result
  182. return result
  183. @staticmethod
  184. def compressUuid(value):
  185. row = value.replace('-', '')
  186. code = ''
  187. hash = [x for x in "0123456789-abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
  188. for i in xrange(10):
  189. enbin = "%012d" % int(bin(int(row[i * 3] + row[i * 3 + 1] + row[i * 3 + 2], 16))[2:], 10)
  190. code += (hash[int(enbin[0:6], 2)] + hash[int(enbin[6:12], 2)])
  191. return code
  192. @staticmethod
  193. def checkMobile(request):
  194. userAgent = request.headers['User-Agent']
  195. # userAgent = env.get('HTTP_USER_AGENT')
  196. _long_matches = r'googlebot-mobile|android|avantgo|blackberry|blazer|elaine|hiptop|ip(hone|od)|kindle|midp|mmp|mobile|o2|opera mini|palm( os)?|pda|plucker|pocket|psp|smartphone|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce; (iemobile|ppc)|xiino|maemo|fennec'
  197. _long_matches = re.compile(_long_matches, re.IGNORECASE)
  198. _short_matches = r'1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-'
  199. _short_matches = re.compile(_short_matches, re.IGNORECASE)
  200. if _long_matches.search(userAgent) != None:
  201. return True
  202. user_agent = userAgent[0:4]
  203. if _short_matches.search(user_agent) != None:
  204. return True
  205. return False
  206. @staticmethod
  207. def exp(exp, value):
  208. if exp:
  209. exp = exp.replace('{n}', value)
  210. value = str(eval(exp))
  211. return value
  212. @classmethod
  213. def error(self, string):
  214. if self.request:
  215. self.request.out(string)
  216. #self.request.finish()
  217. raise Finish()
  218. else:
  219. print string
  220. #os._exit(0)
  221. class File(object):
  222. @staticmethod
  223. def write(file, content):
  224. handle = open(file, 'w')
  225. handle.write(content)
  226. handle.close()
  227. Shell.popen('chmod +x ' + file)
  228. @staticmethod
  229. def read(path, name):
  230. handle = open(path + name, 'r')
  231. content = handle.read()
  232. handle.close()
  233. return content
  234. @staticmethod
  235. def cur_path():
  236. return os.path.split(os.path.realpath(__file__))[0] + '/'
  237. @staticmethod
  238. def path():
  239. return os.sys.path[0] + '/'
  240. @staticmethod
  241. def exists(name):
  242. return os.path.exists(name)
  243. @staticmethod
  244. def rename(old, new):
  245. return os.rename(old, new)
  246. @staticmethod
  247. def remove(file):
  248. return os.remove(file)
  249. @staticmethod
  250. def mkdir(path):
  251. if File.exists(path) == False:
  252. os.mkdir(path)
  253. return path
  254. @staticmethod
  255. def mkdirs(path):
  256. if File.exists(path) == False:
  257. os.makedirs(path)
  258. return path
  259. class Shell(object):
  260. @staticmethod
  261. def popen(command, sub=False, bg=False, timeout=0):
  262. string = command
  263. if bg == True:
  264. command = command + ' 1>/dev/null 2>&1 &'
  265. if timeout > 0:
  266. proc = subprocess.Popen(command,bufsize=0,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True, close_fds=True, preexec_fn = os.setsid)
  267. poll_seconds = .250
  268. deadline = time.time() + timeout
  269. while time.time() < deadline and proc.poll() == None:
  270. time.sleep(poll_seconds)
  271. if proc.poll() == None:
  272. os.killpg(proc.pid, signal.SIGTERM)
  273. return 'timeout'
  274. stdout,stderr = proc.communicate()
  275. return stdout
  276. elif sub == False:
  277. process = os.popen(command)
  278. output = process.read()
  279. process.close()
  280. return output
  281. else:
  282. popen = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
  283. output = ''
  284. print string
  285. while True:
  286. output = popen.stdout.readline()
  287. print output
  288. if popen.poll() is not None:
  289. break
  290. return output
  291. class Check(object):
  292. @staticmethod
  293. def match(rule, value):
  294. if not rule.match(value):
  295. return False
  296. return True
  297. @staticmethod
  298. def mobile(value):
  299. rule = re.compile(r'1\d{10}')
  300. return Check.match(rule, value)
  301. @staticmethod
  302. def number(value):
  303. try:
  304. int(value)
  305. return True
  306. except ValueError:
  307. return False
  308. Demeter.initConfig()