core.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. # -*- coding: utf-8 -*-
  2. """
  3. demeter
  4. name:core.py
  5. author:rabin
  6. """
  7. import time
  8. import os
  9. import signal
  10. import re
  11. import sys
  12. import getopt
  13. import json
  14. import ConfigParser
  15. import subprocess
  16. class Demeter(object):
  17. path = ''
  18. root = ''
  19. config = {}
  20. serviceObj = {}
  21. modelObj = {}
  22. web = ''
  23. request = False
  24. route = []
  25. def __new__(self, *args, **kwargs):
  26. sys.exit()
  27. def __init__(self):
  28. pass
  29. @staticmethod
  30. def isset(v):
  31. try :
  32. type (eval(v))
  33. except :
  34. return 0
  35. else :
  36. return 1
  37. @classmethod
  38. def initConfig(self):
  39. self.path = File.path()
  40. self.root = File.cur_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. Demeter.echo(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, type = 'db'):
  134. if type == 'mysql':
  135. value = value == str(True)
  136. if value == True:
  137. return '1'
  138. else:
  139. return '2'
  140. else:
  141. return value == str(True)
  142. @classmethod
  143. def runtime(self, path, file, content=''):
  144. path = self.path + 'runtime/' + path + '/'
  145. File.mkdir(path)
  146. file = path + file
  147. if File.exists(file):
  148. return False
  149. else:
  150. File.write(file, content)
  151. return True
  152. @classmethod
  153. def web(self, name):
  154. self.web = name
  155. self.webPath = self.path + self.web + '/'
  156. if self.web == 'admin':
  157. self.webPath = self.root + self.web + '/'
  158. self.getObject('main', name + '.')
  159. @classmethod
  160. def md5(self, value, salt=False):
  161. module = __import__('md5')
  162. md5 = getattr(module, 'new')
  163. md5_obj = md5()
  164. if salt:
  165. if salt == True:
  166. salt = self.rand()
  167. md5_obj.update(value + salt)
  168. return md5_obj.hexdigest() + '_' + salt
  169. else:
  170. md5_obj.update(value)
  171. return md5_obj.hexdigest()
  172. @staticmethod
  173. def rand(length = 4):
  174. module = __import__('random')
  175. rand = getattr(module, 'randint')
  176. salt = ''
  177. chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
  178. len_chars = len(chars) - 1
  179. for i in xrange(length):
  180. salt += chars[rand(0, len_chars)]
  181. return salt
  182. @staticmethod
  183. def hour(value):
  184. if value < 10:
  185. return '0' + str(value)
  186. return value
  187. @staticmethod
  188. def time():
  189. return int(time.time())
  190. @staticmethod
  191. def mktime(value, string='%Y-%m-%d %H:%M:%S'):
  192. if ' ' in string and ' ' not in value:
  193. value = value + ' 00:00:00'
  194. return int(time.mktime(time.strptime(value,string)))
  195. @staticmethod
  196. def date(value, string='%Y-%m-%d %H:%M:%S'):
  197. module = __import__('datetime')
  198. datetime = getattr(module, 'datetime')
  199. fromtimestamp = getattr(datetime, 'fromtimestamp')
  200. return str(fromtimestamp(value).strftime(string))
  201. @staticmethod
  202. def isJson(value):
  203. result = False
  204. try:
  205. result = json.loads(value)
  206. except ValueError:
  207. return result
  208. return result
  209. @staticmethod
  210. def compressUuid(value):
  211. row = value.replace('-', '')
  212. code = ''
  213. hash = [x for x in "0123456789-abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ"]
  214. for i in xrange(10):
  215. enbin = "%012d" % int(bin(int(row[i * 3] + row[i * 3 + 1] + row[i * 3 + 2], 16))[2:], 10)
  216. code += (hash[int(enbin[0:6], 2)] + hash[int(enbin[6:12], 2)])
  217. return code
  218. @staticmethod
  219. def checkMobile(request):
  220. if 'Demeter-Mobile' in request.headers:
  221. return True
  222. userAgent = request.headers['User-Agent']
  223. # userAgent = env.get('HTTP_USER_AGENT')
  224. _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'
  225. _long_matches = re.compile(_long_matches, re.IGNORECASE)
  226. _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\-'
  227. _short_matches = re.compile(_short_matches, re.IGNORECASE)
  228. if _long_matches.search(userAgent) != None:
  229. return True
  230. user_agent = userAgent[0:4]
  231. if _short_matches.search(user_agent) != None:
  232. return True
  233. return False
  234. @staticmethod
  235. def exp(exp, value):
  236. if exp:
  237. exp = exp.replace('{n}', value)
  238. value = str(eval(exp))
  239. return value
  240. @classmethod
  241. def curl(self, url):
  242. import urllib2
  243. req = urllib2.Request(url)
  244. response = urllib2.urlopen(req)
  245. return response.read()
  246. @classmethod
  247. def error(self, string):
  248. from tornado.web import Finish
  249. if self.request:
  250. self.request.out(string)
  251. #self.request.finish()
  252. raise Finish()
  253. else:
  254. self.echo(string)
  255. #os._exit(0)
  256. class File(object):
  257. @staticmethod
  258. def write(file, content):
  259. handle = open(file, 'w')
  260. handle.write(content)
  261. handle.close()
  262. Shell.popen('chmod +x ' + file)
  263. @staticmethod
  264. def read(path, name):
  265. handle = open(path + name, 'r')
  266. content = handle.read()
  267. handle.close()
  268. return content
  269. @staticmethod
  270. def cur_path():
  271. return os.path.split(os.path.realpath(__file__))[0] + '/'
  272. @staticmethod
  273. def path():
  274. return os.sys.path[0] + '/'
  275. @staticmethod
  276. def exists(name):
  277. return os.path.exists(name)
  278. @staticmethod
  279. def rename(old, new):
  280. return os.rename(old, new)
  281. @staticmethod
  282. def remove(file):
  283. return os.remove(file)
  284. @staticmethod
  285. def mkdir(path):
  286. if File.exists(path) == False:
  287. os.mkdir(path)
  288. return path
  289. @staticmethod
  290. def mkdirs(path):
  291. if File.exists(path) == False:
  292. os.makedirs(path)
  293. return path
  294. class Shell(object):
  295. @staticmethod
  296. def popen(command, sub=False, bg=False, timeout=0):
  297. string = command
  298. if bg == True:
  299. command = command + ' 1>/dev/null 2>&1 &'
  300. if timeout > 0:
  301. proc = subprocess.Popen(command,bufsize=0,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True, close_fds=True, preexec_fn = os.setsid)
  302. poll_seconds = .250
  303. deadline = time.time() + timeout
  304. while time.time() < deadline and proc.poll() == None:
  305. time.sleep(poll_seconds)
  306. if proc.poll() == None:
  307. os.killpg(proc.pid, signal.SIGTERM)
  308. return 'timeout'
  309. stdout,stderr = proc.communicate()
  310. return stdout
  311. elif sub == False:
  312. process = os.popen(command)
  313. output = process.read()
  314. process.close()
  315. return output
  316. else:
  317. popen = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
  318. output = ''
  319. Demeter.echo(string)
  320. while True:
  321. output = popen.stdout.readline()
  322. Demeter.echo(output)
  323. if popen.poll() is not None:
  324. break
  325. return output
  326. class Check(object):
  327. @staticmethod
  328. def match(rule, value):
  329. if not rule.match(value):
  330. return False
  331. return True
  332. @staticmethod
  333. def mobile(value):
  334. rule = re.compile(r'1\d{10}')
  335. return Check.match(rule, value)
  336. @staticmethod
  337. def number(value):
  338. try:
  339. int(value)
  340. return True
  341. except ValueError:
  342. return False
  343. @staticmethod
  344. def numberFloat(value):
  345. try:
  346. float(value)
  347. return True
  348. except ValueError:
  349. return False
  350. Demeter.initConfig()