core.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  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. path = 'service.'
  89. if name == 'common':
  90. path = 'demeter.'
  91. name = 'service'
  92. service = self.getClass(name, path)
  93. return service()
  94. """
  95. if name not in self.serviceObj:
  96. path = 'service.'
  97. if name == 'common':
  98. path = 'demeter.'
  99. name = 'service'
  100. service = self.getClass(name, path)
  101. self.serviceObj[name] = service()
  102. return self.serviceObj[name]
  103. """
  104. @classmethod
  105. def model(self, table, name='rdb'):
  106. name = self.config['db'][name]
  107. config = self.config[name]
  108. obj = self.getObject('db', 'demeter.')
  109. db = getattr(obj, name.capitalize())
  110. connect = db(config).get()
  111. model = self.getClass(table, 'model.')
  112. return model(name, connect, config)
  113. """
  114. if table not in self.modelObj:
  115. name = self.config['db'][name]
  116. config = self.config[name]
  117. obj = self.getObject('db', 'demeter.')
  118. db = getattr(obj, name.capitalize())
  119. connect = db(config).get()
  120. model = self.getClass(table, 'model.')
  121. self.modelObj[table] = model(name, connect, config)
  122. return self.modelObj[table]
  123. """
  124. @classmethod
  125. def getClass(self, name, path=''):
  126. obj = self.getObject(name, path)
  127. return getattr(obj, name.capitalize())
  128. @staticmethod
  129. def getObject(name, path = ''):
  130. module = __import__(path + name)
  131. return getattr(module, name)
  132. @staticmethod
  133. def bool(value):
  134. return value == str(True)
  135. @classmethod
  136. def runtime(self, path, file, content=''):
  137. path = self.path + 'runtime/' + path + '/'
  138. File.mkdir(path)
  139. file = path + file
  140. if File.exists(file):
  141. return False
  142. else:
  143. File.write(file, content)
  144. return True
  145. @classmethod
  146. def webstart(self, name):
  147. self.web = name
  148. self.webPath = self.path + self.web + '/'
  149. self.getObject('main', name + '.')
  150. @classmethod
  151. def md5(self, value, salt=False):
  152. module = __import__('md5')
  153. md5 = getattr(module, 'new')
  154. md5_obj = md5()
  155. if salt:
  156. if salt == True:
  157. salt = self.rand()
  158. md5_obj.update(value + salt)
  159. return md5_obj.hexdigest() + '_' + salt
  160. else:
  161. md5_obj.update(value)
  162. return md5_obj.hexdigest()
  163. @staticmethod
  164. def rand(length = 4):
  165. module = __import__('random')
  166. rand = getattr(module, 'randint')
  167. salt = ''
  168. chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
  169. len_chars = len(chars) - 1
  170. for i in xrange(length):
  171. salt += chars[rand(0, len_chars)]
  172. return salt
  173. @staticmethod
  174. def hour(value):
  175. if value < 10:
  176. return '0' + str(value)
  177. return value
  178. @staticmethod
  179. def time():
  180. return int(time.time())
  181. @staticmethod
  182. def mktime(value, string='%Y-%m-%d %H:%M:%S'):
  183. if ' ' in string and ' ' not in value:
  184. value = value + ' 00:00:00'
  185. return int(time.mktime(time.strptime(value,string)))
  186. @staticmethod
  187. def date(value, string='%Y-%m-%d %H:%M:%S'):
  188. module = __import__('datetime')
  189. datetime = getattr(module, 'datetime')
  190. fromtimestamp = getattr(datetime, 'fromtimestamp')
  191. return str(fromtimestamp(value).strftime(string))
  192. @staticmethod
  193. def isJson(value):
  194. result = False
  195. try:
  196. result = json.loads(value)
  197. except ValueError:
  198. return result
  199. return result
  200. @staticmethod
  201. def compressUuid(value):
  202. row = value.replace('-', '')
  203. code = ''
  204. hash = [x for x in "0123456789-abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
  205. for i in xrange(10):
  206. enbin = "%012d" % int(bin(int(row[i * 3] + row[i * 3 + 1] + row[i * 3 + 2], 16))[2:], 10)
  207. code += (hash[int(enbin[0:6], 2)] + hash[int(enbin[6:12], 2)])
  208. return code
  209. @staticmethod
  210. def checkMobile(request):
  211. if 'Demeter-Mobile' in request.headers:
  212. return True
  213. userAgent = request.headers['User-Agent']
  214. # userAgent = env.get('HTTP_USER_AGENT')
  215. _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'
  216. _long_matches = re.compile(_long_matches, re.IGNORECASE)
  217. _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\-'
  218. _short_matches = re.compile(_short_matches, re.IGNORECASE)
  219. if _long_matches.search(userAgent) != None:
  220. return True
  221. user_agent = userAgent[0:4]
  222. if _short_matches.search(user_agent) != None:
  223. return True
  224. return False
  225. @staticmethod
  226. def exp(exp, value):
  227. if exp:
  228. exp = exp.replace('{n}', value)
  229. value = str(eval(exp))
  230. return value
  231. @classmethod
  232. def curl(self, url):
  233. module = __import__('tornado')
  234. http = getattr(module, 'httpclient')
  235. http_client = http.HTTPClient()
  236. response = http_client.fetch(url)
  237. return response
  238. @classmethod
  239. def error(self, string):
  240. if self.request:
  241. self.request.out(string)
  242. #self.request.finish()
  243. raise Finish()
  244. else:
  245. print string
  246. #os._exit(0)
  247. class File(object):
  248. @staticmethod
  249. def write(file, content):
  250. handle = open(file, 'w')
  251. handle.write(content)
  252. handle.close()
  253. Shell.popen('chmod +x ' + file)
  254. @staticmethod
  255. def read(path, name):
  256. handle = open(path + name, 'r')
  257. content = handle.read()
  258. handle.close()
  259. return content
  260. @staticmethod
  261. def cur_path():
  262. return os.path.split(os.path.realpath(__file__))[0] + '/'
  263. @staticmethod
  264. def path():
  265. return os.sys.path[0] + '/'
  266. @staticmethod
  267. def exists(name):
  268. return os.path.exists(name)
  269. @staticmethod
  270. def rename(old, new):
  271. return os.rename(old, new)
  272. @staticmethod
  273. def remove(file):
  274. return os.remove(file)
  275. @staticmethod
  276. def mkdir(path):
  277. if File.exists(path) == False:
  278. os.mkdir(path)
  279. return path
  280. @staticmethod
  281. def mkdirs(path):
  282. if File.exists(path) == False:
  283. os.makedirs(path)
  284. return path
  285. class Shell(object):
  286. @staticmethod
  287. def popen(command, sub=False, bg=False, timeout=0):
  288. string = command
  289. if bg == True:
  290. command = command + ' 1>/dev/null 2>&1 &'
  291. if timeout > 0:
  292. proc = subprocess.Popen(command,bufsize=0,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True, close_fds=True, preexec_fn = os.setsid)
  293. poll_seconds = .250
  294. deadline = time.time() + timeout
  295. while time.time() < deadline and proc.poll() == None:
  296. time.sleep(poll_seconds)
  297. if proc.poll() == None:
  298. os.killpg(proc.pid, signal.SIGTERM)
  299. return 'timeout'
  300. stdout,stderr = proc.communicate()
  301. return stdout
  302. elif sub == False:
  303. process = os.popen(command)
  304. output = process.read()
  305. process.close()
  306. return output
  307. else:
  308. popen = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
  309. output = ''
  310. print string
  311. while True:
  312. output = popen.stdout.readline()
  313. print output
  314. if popen.poll() is not None:
  315. break
  316. return output
  317. class Check(object):
  318. @staticmethod
  319. def match(rule, value):
  320. if not rule.match(value):
  321. return False
  322. return True
  323. @staticmethod
  324. def mobile(value):
  325. rule = re.compile(r'1\d{10}')
  326. return Check.match(rule, value)
  327. @staticmethod
  328. def number(value):
  329. try:
  330. int(value)
  331. return True
  332. except ValueError:
  333. return False
  334. @staticmethod
  335. def numberFloat(value):
  336. try:
  337. float(value)
  338. return True
  339. except ValueError:
  340. return False
  341. Demeter.initConfig()