def handle_url(aConfig, environ, session): global gTileCache def handle_index(environ, session): statuscode, mimetype, body = 403, 'text/plain', 'Access deny' return statuscode, mimetype, body user_id = None if session and '_id' in session: user_id = session['_id'] statuscode, mimetype, body = 200, 'text/json', '{}' app = aConfig['gConfig']['wsgi']['application'] urllist = [] for key in aConfig['gConfig']['applications'][app]['url_mapping'].keys(): urllist.append(Rule(key, endpoint=aConfig['gConfig']['applications'][app]['url_mapping'][key])) urlmap = Map(urllist, converters={'bool': BooleanConverter}) urls = urlmap.bind_to_environ(environ) querydict, buf, stream = get_querydict_by_GET_POST(environ) try: endpoint, args = urls.match() if endpoint == 'handle_index': statuscode, mimetype, body = handle_index(environ, session) else: body = json.dumps({'result':u'access_deny'}, ensure_ascii=True, indent=4) # except HTTPException, e: except Exception as e: traceback.print_exc() body = json.dumps({'result':u'error:%s' % e.message}, ensure_ascii=True, indent=4) # if session: # aConfig['gSessionStore'].save(session) # for k in hh.keys(): # headers[k] = hh[k] return statuscode, mimetype, body
def handle_url(aConfig, environ, session): global gWebSocketsMap, gQueueSensor def online(websocket): if websocket and not websocket.closed: v = str(websocket.__hash__()) if not v in gWebSocketsMap: gWebSocketsMap[v] = websocket def offline(websocket): v = str(websocket.__hash__()) websocket.close() del gWebSocketsMap[v] def handle_uv4l_stun(session, querydict): ret = '' if 'uv4l' in aConfig['gConfig']['applications'][app]: uv4l = aConfig['gConfig']['applications'][app]['uv4l'] href = '%s://%s:%s%s' % (uv4l['protocol'], uv4l['host'], uv4l['port'], uv4l['stream_webrtc_url'] ) cert = None if 'ssl_cert' in uv4l and os.path.exists(os.path.join(module_path(), uv4l['ssl_cert'])): cert = os.path.join(module_path(), uv4l['ssl_cert']) statuscode, mimetype, s = handle_http_proxy(aConfig, environ, real_url=href, cert=cert) if statuscode == 200: scriptlines = s.split('\n') arr = filter(lambda x: '{url: "stun:' in x, scriptlines) stuns = [] for i in arr: stuns.append(i[i.index('stun:')+5:i.rindex('"')]) # print(stuns) signal_server = '%s:%s' % (aConfig['gConfig']['applications'][app]['uv4l']['host'], aConfig['gConfig']['applications'][app]['uv4l']['port']) protocol = '%s' % aConfig['gConfig']['applications'][app]['uv4l']['protocol'] websocket_protocol = '%s' % aConfig['gConfig']['applications'][app]['uv4l']['websocket_protocol'] ret = json.dumps({'stuns:':stuns, 'signal_server':signal_server, 'websocket_protocol':websocket_protocol, 'protocol':protocol}, ensure_ascii=True, indent=4) return ret def handle_index(environ, session): app = aConfig['gConfig']['wsgi']['application'] statuscode, mimetype, body = handle_static(aConfig, environ, aConfig['gConfig']['applications'][app]['static']['page']['indexpage']) return statuscode, mimetype, body def handle_get_post(environ, session, querydict): app = aConfig['gConfig']['wsgi']['application'] statuscode, mimetype, body = 200, 'text/plain', 'ok' if 'serial_no' in querydict \ and 'ip' in querydict \ and 'op' in querydict\ and 'type' in querydict: if querydict['op'] in [OPERATOR['OP_REGISTER'], OPERATOR['OP_TRANSFER']]: if gQueueSensor and gQueueSensor.full(): first = gQueueSensor.get() if gQueueSensor: gQueueSensor.put(querydict) else: body = 'serial_no of sensor ,ip , op, type are needed' return statuscode, mimetype, body statuscode, mimetype, body = 200, 'text/json', '{}' app = aConfig['gConfig']['wsgi']['application'] urllist = [] for key in aConfig['gConfig']['applications'][app]['url_mapping'].keys(): urllist.append(Rule(key, endpoint=aConfig['gConfig']['applications'][app]['url_mapping'][key])) urlmap = Map(urllist, converters={'bool': BooleanConverter}) urls = urlmap.bind_to_environ(environ) querydict, buf, stream = get_querydict_by_GET_POST(environ) endpoint = '' try: endpoint, args = urls.match() # print(endpoint) if endpoint == 'handle_index': statuscode, mimetype, body = handle_index(environ, session) # elif endpoint == 'handle_login': # hh, body = handle_login(session, querydict) # elif endpoint == 'handle_logout': # hh, body = handle_logout(session) elif endpoint == 'handle_uv4l_stun': body = handle_uv4l_stun(session, querydict) elif endpoint == 'handle_get_post': statuscode, mimetype, body = handle_get_post(environ, session, querydict) else: body = json.dumps({'result':'access_deny'}, ensure_ascii=True, indent=4) # except HTTPException, e: except Exception as e: # print(e) body = json.dumps({'result':'access_deny'}, ensure_ascii=True, indent=4) return statuscode, mimetype, body
def handle_url(aConfig, environ, session): global gJoinableQueue, gWebSocketsMap def handle_index(environ, session): app = aConfig['gConfig']['wsgi']['application'] statuscode, headers, body = handle_static(aConfig, environ, aConfig['gConfig']['applications'][app]['static']['page']['indexpage']) return statuscode, headers, body def user_query(session, querydict): ret = [] app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(app, 'main', 'collection_users') q = {} limit = 0 skip = 0 user_detail = False if querydict.has_key('user_detail') and querydict['user_detail'] is True: user_detail = True del querydict['user_detail'] if querydict.has_key('limit'): limit = int(querydict['limit']) del querydict['limit'] if querydict.has_key('skip'): skip = int(querydict['skip']) del querydict['skip'] if querydict.has_key('username'): if isinstance(querydict['username'], str) or isinstance(querydict['username'], unicode): q['username'] = querydict['username'] if isinstance(querydict['username'], list): q['username'] = {'$in': querydict['username']} if isinstance(querydict['username'], dict): q['username'] = querydict['username'] if querydict.has_key('_id'): if isinstance(querydict['_id'], str) or isinstance(querydict['_id'], unicode): q['_id'] = add_mongo_id(querydict['_id']) if isinstance(querydict['_id'], list): q['_id'] = {'$in': [add_mongo_id(i) for i in querydict['_id']]} if isinstance(querydict['_id'], dict): q['_id'] = querydict['_id'] rec = list(collection.find(q).limit(limit).skip(skip)) keys = list(gWebSocketsMap.keys()) for i in rec: if user_detail: if str(i['_id']) in keys: i['online_status'] = 'online' else: i['online_status'] = 'offline' ret.append(i) return ret def group_query(session, querydict={}): ret = [] app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(app, 'main', 'collection_groups') q = {} limit = 0 skip = 0 if querydict.has_key('limit'): limit = int(querydict['limit']) del querydict['limit'] if querydict.has_key('skip'): skip = int(querydict['skip']) del querydict['skip'] if querydict.has_key('group_name'): if isinstance(querydict['group_name'], str) or isinstance(querydict['group_name'], unicode): q['group_name'] = querydict['group_name'] if isinstance(querydict['group_name'], list): q['group_name'] = {'$in': querydict['group_name']} if isinstance(querydict['group_name'], dict): q['group_name'] = querydict['group_name'] if querydict.has_key('_id'): if isinstance(querydict['_id'], str) or isinstance(querydict['_id'], unicode): q['_id'] = querydict['_id'] if isinstance(querydict['_id'], list): q['_id'] = {'$in': querydict['_id']} ret = list(collection.find(add_mongo_id(q)).limit(limit).skip(skip)) if querydict.has_key('user_detail') and querydict['user_detail'] is True: keys = list(gWebSocketsMap.keys()) for i in ret: idx = ret.index(i) detail = [] userlist = user_query(session, {'_id':i['members']}) for j in userlist: if j.has_key('contacts'): del j['contacts'] if j.has_key('password'): del j['password'] if str(j['_id']) in keys: j['online_status'] = 'online' else: j['online_status'] = 'offline' detail.append(j) ret[idx]['members'] = detail return ret def group_get(session, querydict): rec = group_query(session, querydict) if len(rec)>0: ret = json.dumps(remove_mongo_id(rec), ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'query_no_record'}, ensure_ascii=True, indent=4) return ret def user_group_get(session, querydict): ret = [] app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(app, 'main', 'collection_groups') q = {} if querydict.has_key('username'): if isinstance(querydict['username'], str) or isinstance(querydict['username'], unicode) or isinstance(querydict['username'], dict): q['username'] = querydict['username'] if querydict.has_key('_id'): if isinstance(querydict['_id'], str) or isinstance(querydict['_id'], unicode): q['_id'] = add_mongo_id(querydict['_id']) if len(list(q.keys()))>0: users = user_query(session, querydict) if len(users)>0: user0 = users[0] _id = user0['_id'] grps = group_query(session) for i in grps: if i.has_key('members') and _id in i['members']: ret.append(i) ret = json.dumps(remove_mongo_id(ret), ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_group_get_user_not_exist'}, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_group_get_one_user_required'}, ensure_ascii=True, indent=4) return ret def all_user_get(session, querydict): limit = 0 skip = 0 filter_str = '' if querydict.has_key('user_detail') and querydict['user_detail'] is True: user_detail = True del querydict['user_detail'] if querydict.has_key('limit'): try: limit = int(querydict['limit']) except: pass del querydict['limit'] if querydict.has_key('skip'): try: skip = int(querydict['skip']) except: pass del querydict['skip'] if querydict.has_key('filter'): filter_str = querydict['filter'] del querydict['filter'] contactlist = user_query(session, {'username':{'$regex': '^.*' + filter_str + '.*$'}, 'limit':limit, 'skip':skip}) ret = [] keys = list(gWebSocketsMap.keys()) for i in contactlist: for k in i.keys(): if not k in ['_id', 'username', 'display_name', 'avatar']: del i[k] if str(i['_id']) in keys: i['online_status'] = 'online' else: i['online_status'] = 'offline' ret.append(i) ret = json.dumps(remove_mongo_id(ret), ensure_ascii=True, indent=4) return ret def user_contact_get(session, querydict): ret = [] app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(app, 'main', 'collection_users') q = {} if querydict.has_key('username'): if isinstance(querydict['username'], str) or isinstance(querydict['username'], unicode): q['username'] = querydict['username'] del querydict['username'] if querydict.has_key('_id'): if isinstance(querydict['_id'], str) or isinstance(querydict['_id'], unicode): q['_id'] = add_mongo_id(querydict['_id']) del querydict['_id'] if len(list(q.keys()))>0: contacts = [] selfid = None rec = collection.find_one(q) if rec and rec.has_key('contacts'): # contacts = rec['contacts'] contacts = [add_mongo_id(i) for i in rec['contacts']] ret = contacts selfid = rec['_id'] limit = 0 skip = 0 user_detail = False if querydict.has_key('user_detail') and querydict['user_detail'] is True: user_detail = True del querydict['user_detail'] if querydict.has_key('limit'): try: limit = int(querydict['limit']) except: pass del querydict['limit'] if querydict.has_key('skip'): try: skip = int(querydict['skip']) except: pass del querydict['skip'] if user_detail: if querydict.has_key('filter'): contactlist = user_query(session, {'username':{'$regex': '^.*' + querydict['filter'] + '.*$'}, '_id': {'$in':contacts, '$ne':selfid}, 'limit':limit, 'skip':skip}) del querydict['filter'] else: contactlist = user_query(session, {'_id':contacts, 'limit':limit, 'skip':skip}) ret = [] keys = list(gWebSocketsMap.keys()) for i in contactlist: if i.has_key('contacts'): del i['contacts'] if i.has_key('password'): del i['password'] if str(i['_id']) in keys: i['online_status'] = 'online' else: i['online_status'] = 'offline' ret.append(i) ret = json.dumps(remove_mongo_id(ret), ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_contact_query_one_user_required'}, ensure_ascii=True, indent=4) return ret def user_get(session, querydict): ret = '' rec = user_query(session, querydict) for i in rec: idx = rec.index(i) if i.has_key('contacts'): del i['contacts'] if i.has_key('password'): del i['password'] rec[idx] = i if len(rec)>0: ret = json.dumps(remove_mongo_id(rec), ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'query_no_record'}, ensure_ascii=True, indent=4) return ret def user_add(session, querydict): ret = '' app = aConfig['gConfig']['wsgi']['application'] if querydict.has_key('username') and querydict.has_key('password') and len(querydict['username'])>0 and len(querydict['password'])>0: try: db, collection = get_collection(app, 'main', 'collection_users') existone = collection.find_one({'username':querydict['username']}) if existone: ret = json.dumps({'result':u'user_add_fail_username_already_exist'}, ensure_ascii=True, indent=4) else: obj = {} obj['username'] = querydict['username'] obj['display_name'] = querydict['username'] obj['password'] = querydict['password'] ts = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) obj['register_date'] = ts obj['update_date'] = ts obj['description'] = '' obj['person_info'] = {} obj['contacts'] = [] obj['avatar'] = None if querydict.has_key('person_info') : obj['person_info'] = querydict['person_info'] if querydict.has_key('contacts') and isinstance(querydict['contacts'], list): obj['contacts'] = querydict['contacts'] if querydict.has_key('avatar') and len(querydict['avatar']) > 0: obj['avatar'] = querydict['avatar'] _id = collection.save(add_mongo_id(obj)) rec = collection.find_one({'_id':_id}) ret = json.dumps(remove_mongo_id(rec), ensure_ascii=True, indent=4) except: if hasattr(sys.exc_info()[1], 'message'): ret = json.dumps({'result':u'user_add_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_add_fail' }, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_add_fail_username_password_required'}, ensure_ascii=True, indent=4) return ret def user_update(session, querydict): ret = '' app = aConfig['gConfig']['wsgi']['application'] if querydict.has_key('_id') and len(querydict['_id'])>0: try: _id = add_mongo_id(querydict['_id']) db, collection = get_collection(app, 'main', 'collection_users') existone = collection.find_one({'_id':_id}) if existone: del querydict['_id'] querydict['update_date'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) collection.update({'_id':existone['_id']}, {'$set': add_mongo_id(querydict)}, multi=False, upsert=False) one = collection.find_one({'_id':_id}) ret = json.dumps(remove_mongo_id(one), ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_update_user_not_exist'}, ensure_ascii=True, indent=4) except: if hasattr(sys.exc_info()[1], 'message'): ret = json.dumps({'result':u'user_update_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_update_fail' }, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_update_fail_user_id_required'}, ensure_ascii=True, indent=4) return ret def user_remove(session, querydict): ret = '' app = aConfig['gConfig']['wsgi']['application'] if querydict.has_key('_id') and len(querydict['_id'])>0: try: db, collection = get_collection(app, 'main', 'collection_users') existone = collection.find_one({'_id':add_mongo_id(querydict['_id'])}) if existone: collection.remove({'_id':existone['_id']}) ret = json.dumps(remove_mongo_id(existone), ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_remove_user_not_exist'}, ensure_ascii=True, indent=4) except: if hasattr(sys.exc_info()[1], 'message'): ret = json.dumps({'result':u'user_remove_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_remove_fail' }, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'user_remove_fail_user_id_required'}, ensure_ascii=True, indent=4) return ret def group_add(session, querydict): ret = '' app = aConfig['gConfig']['wsgi']['application'] if querydict.has_key('owner_id')\ and len(querydict['owner_id']) > 0\ and querydict.has_key('group_name')\ and len(querydict['group_name']) > 0: try: db, collection = get_collection(app, 'main', 'collection_groups') existone = collection.find_one({'group_name':querydict['group_name']}) if existone: ret = json.dumps({'result':u'group_add_fail_group_name_already_exist'}, ensure_ascii=True, indent=4) else: obj = {} obj['owner_id'] = querydict['owner_id'] obj['group_name'] = querydict['group_name'] ts = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) obj['found_date'] = ts obj['update_date'] = ts obj['members'] = [add_mongo_id(obj['owner_id']), ] if querydict.has_key('avatar') and len(querydict['avatar']) > 0: obj['avatar'] = querydict['avatar'] if querydict.has_key('description') and len(querydict['description']) > 0: obj['description'] = querydict['description'] _id = collection.save(add_mongo_id(obj)) rec = collection.find_one({'_id':_id}) ret = json.dumps(remove_mongo_id(rec), ensure_ascii=True, indent=4) except: if hasattr(sys.exc_info()[1], 'message'): ret = json.dumps({'result':u'group_add_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'group_add_fail' }, ensure_ascii=True, indent=4) else: if not querydict.has_key('owner_id') or len(querydict['owner_id']) == 0: ret = json.dumps({'result':u'group_add_fail_owner_id_required'}, ensure_ascii=True, indent=4) if not querydict.has_key('group_name') or len(querydict['group_name']) == 0: ret = json.dumps({'result':u'group_add_fail_group_name_required'}, ensure_ascii=True, indent=4) return ret def group_update(session, querydict): ret = '' app = aConfig['gConfig']['wsgi']['application'] if querydict.has_key('_id') and len(querydict['_id'])>0: try: _id = add_mongo_id(querydict['_id']) db, collection = get_collection(app, 'main', 'collection_groups') existone = collection.find_one({'_id':_id}) if existone: del querydict['_id'] querydict['update_date'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) collection.update({'_id':existone['_id']}, {'$set': add_mongo_id(querydict)}, multi=False, upsert=False) one = collection.find_one({'_id':_id}) ret = json.dumps(remove_mongo_id(one), ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'group_update_group_not_exist'}, ensure_ascii=True, indent=4) except: if hasattr(sys.exc_info()[1], 'message'): ret = json.dumps({'result':u'group_update_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'group_update_fail' }, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'group_update_fail_group_id_required'}, ensure_ascii=True, indent=4) return ret def group_remove(session, querydict): ret = '' app = aConfig['gConfig']['wsgi']['application'] if querydict.has_key('_id') and len(querydict['_id']) > 0: try: db, collection = get_collection(app, 'main', 'collection_groups') existone = collection.find_one({'_id':add_mongo_id(querydict['_id'])}) if existone: collection.remove({'_id':existone['_id']}) ret = json.dumps(remove_mongo_id(existone), ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'group_remove_fail_group_not_exist'}, ensure_ascii=True, indent=4) except: if hasattr(sys.exc_info()[1], 'message'): ret = json.dumps({'result':u'group_remove_fail:%s' % sys.exc_info()[1].message}, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'group_remove_fail' }, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'group_remove_fail_found_group_id_required'}, ensure_ascii=True, indent=4) return ret def check_contact_exist(_id, alist): ret = None for i in alist: if i['_id'] == _id: ret = i break return ret def online(user_id, websocket): if user_id and websocket and not websocket.closed: if not gWebSocketsMap.has_key(user_id): gWebSocketsMap[user_id] = [] if not websocket in gWebSocketsMap[user_id]: gWebSocketsMap[user_id].append(websocket) def offline(user_id): if user_id and gWebSocketsMap.has_key(user_id): for i in gWebSocketsMap[user_id]: i.close() del gWebSocketsMap[user_id] chat_save_log(aConfig, { 'op':'chat/offline', 'from':user_id, 'timestamp':time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) }) def get_destination(session, from_id, _id): ret = [] if isinstance(_id, str) or isinstance(_id, unicode): userlist = user_query(session, {'_id':from_id}) if len(userlist)==0: userlist = user_query(session, {'username':from_id}) if len(userlist)>0: user0 = userlist[0] if user0.has_key('contacts'): toid = _id try: toid = ObjectId(_id) except: ul = user_query(session, {'username':_id}) if len(ul)>0: toid = ul[0]['_id'] if add_mongo_id(str(toid)) in user0['contacts']: ret.append(str(toid)) elif isinstance(_id, list): userlist = user_query(session, {'_id':from_id}) if len(userlist)==0: userlist = user_query(session, {'username':from_id}) if len(userlist)>0: user0 = userlist[0] if user0.has_key('contacts'): for id in _id: if add_mongo_id(id) in user0['contacts']: ret.append(id) return ret def get_destination_group(session, from_id, _id): ret = [] userset = set() grps = group_query(session, {'_id':_id}) for grp in grps: if grp.has_key('members') and len(grp['members'])>0: if add_mongo_id(from_id) in grp['members']: userset = userset.union(set(grp['members'])) userlist = list(userset) for id in userlist: ret.append(id) return ret def resend_offline_msg(session, to_id, limit=10): app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(app, 'main', 'collection_chat_log_offline') arr = list(collection.find({'to':add_mongo_id(to_id)}).limit(limit).sort('timestamp', pymongo.DESCENDING)) ids = [i['_id'] for i in arr] collection.remove({'_id':{'$in': ids}}) for i in arr: gJoinableQueue.put(remove_mongo_id(i)) def chat(session, websocket, obj={}): tolist = [] if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('msg') and len(obj['msg'])>0: if obj.has_key('to') and len(obj['to'])>0: tolist = get_destination(session, obj['from'], obj['to']) if obj.has_key('to_group') and len(obj['to_group']) > 0: tolist = get_destination_group(session, obj['from'], obj['to_group']) for k in tolist: try: d = {'op': 'chat/chat', 'from': obj['from'], 'to': k, 'timestamp': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), 'msg': obj['msg']} gJoinableQueue.put(d) except gevent.queue.Full: print('chat queue is full') def request_response(session, websocket, obj={}): #'chat/request/contact/add', #'chat/request/contact/remove', #'chat/response/contact/add/accept', #'chat/response/contact/add/reject' #'chat/request/group/join' #'chat/request/group/quit' #'chat/response/group/join/accept', #'chat/response/group/join/reject', tolist = [] app = aConfig['gConfig']['wsgi']['application'] try: if obj['op'] == 'chat/response/contact/add/accept': if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to') and len(obj['to'])>0: db, collection = get_collection(app, 'main','collection_users') userlist = user_query(session, {'_id':[obj['from'], obj['to']]}) for user in userlist: if str(user['_id']) == obj['from'] and not add_mongo_id(obj['to']) in user['contacts']: user['contacts'].append(add_mongo_id(obj['to'])) if str(user['_id']) == obj['to'] and not add_mongo_id(obj['from']) in user['contacts']: user['contacts'].append(add_mongo_id(obj['from'])) user['update_date'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) collection.save(user) fromuser = {} fromuser['op'] = obj['op'] fromuser['_id'] = obj['from'] fromuser['from'] = obj['to'] fromuser['to'] = obj['from'] fromuser['contacts'] = json.loads(user_contact_get(session, {'_id':obj['from'],'user_detail':True})) gJoinableQueue.put(remove_mongo_id(fromuser)) touser = {} touser['op'] = obj['op'] touser['_id'] = obj['to'] touser['from'] = obj['from'] touser['to'] = obj['to'] touser['contacts'] = json.loads(user_contact_get(session, {'_id':obj['to'],'user_detail':True})) gJoinableQueue.put(remove_mongo_id(touser)) elif obj['op'] == 'chat/response/contact/add/reject': if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to') and len(obj['to'])>0: userlist = user_query(session, {'_id':obj['from']}) if len(userlist)>0: user0 = userlist[0] user0['op'] = obj['op'] user0['from'] = obj['from'] user0['to'] = obj['to'] if user0.has_key('password'): del user0['password'] if user0.has_key('contacts'): del user0['contacts'] if obj.has_key('reject_reason') and len(obj['reject_reason'])>0: user0['reject_reason'] = obj['reject_reason'] gJoinableQueue.put(remove_mongo_id(user0)) elif obj['op'] == 'chat/request/contact/add': if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to') and len(obj['to'])>0: userlist = user_query(session, {'_id':obj['from']}) if len(userlist)>0: user0 = userlist[0] user0['op'] = obj['op'] user0['from'] = obj['from'] user0['to'] = obj['to'] if user0.has_key('password'): del user0['password'] if user0.has_key('contacts'): del user0['contacts'] gJoinableQueue.put(remove_mongo_id(user0)) elif obj['op'] == 'chat/request/contact/remove': if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to') and len(obj['to'])>0: db, collection = get_collection(app, 'main', 'collection_users') userlist = user_query(session, {'_id':[obj['from'], obj['to']]}) remover, removee = None, None for user in userlist: if str(user['_id']) == obj['from'] and add_mongo_id(obj['to']) in user['contacts']: user['contacts'].remove(add_mongo_id(obj['to'])) remover = user['display_name'] if str(user['_id']) == obj['to'] and add_mongo_id(obj['from']) in user['contacts']: user['contacts'].remove(add_mongo_id(obj['from'])) removee = user['display_name'] user['update_date'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) collection.save(user) fromuser = {} fromuser['op'] = obj['op'] fromuser['_id'] = obj['from'] fromuser['from'] = obj['to'] fromuser['to'] = obj['from'] fromuser['remover'] = remover fromuser['removee'] = removee fromuser['remove_type'] = 'remover' fromuser['contacts'] = json.loads(user_contact_get(session, {'_id':obj['from'], 'user_detail':True})) gJoinableQueue.put(remove_mongo_id(fromuser)) touser = {} touser['op'] = obj['op'] touser['_id'] = obj['to'] touser['from'] = obj['from'] touser['to'] = obj['to'] touser['remover'] = remover touser['removee'] = removee touser['remove_type'] = 'removee' touser['contacts'] = json.loads(user_contact_get(session, {'_id':obj['to'], 'user_detail':True})) gJoinableQueue.put(remove_mongo_id(touser)) elif obj['op'] == 'chat/request/group/join': if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to_group') and len(obj['to_group'])>0: grps = group_query(session, {'_id':obj['to_group']}) if len(grps)>0: grp0 = grps[0] userlist = user_query(session, {'_id':obj['from']}) if len(userlist)>0: user0 = userlist[0] user0['op'] = obj['op'] user0['from'] = obj['from'] user0['request_src'] = obj['from'] user0['to_group'] = obj['to_group'] user0['to'] = grp0['owner_id'] if user0.has_key('password'): del user0['password'] if user0.has_key('contacts'): del user0['contacts'] gJoinableQueue.put(remove_mongo_id(user0)) elif obj['op'] == 'chat/request/group/quit': if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to_group') and len(obj['to_group'])>0: grps = group_query(session, {'_id':obj['to_group']}) if len(grps)>0: grp0 = grps[0] members = [] if add_mongo_id(obj['from']) in grp0['members']: grp0['members'].remove(add_mongo_id(obj['from'])) members = [str(i) for i in grp0['members']] db, collection = get_collection(app, 'main', 'collection_groups') collection.save(grp0) broadcast(session, websocket, members, {'op':obj['op'], 'from':obj['from'], 'to_group':obj['to_group']} ) elif obj['op'] == 'chat/response/group/join/accept': if obj.has_key('to_group') and len(obj['to_group'])>0 and obj.has_key('request_src') and len(obj['request_src'])>0: grps = group_query(session, {'_id': obj['to_group']}) if len(grps)>0: grp0 = grps[0] if not add_mongo_id(obj['request_src']) in grp0['members']: grp0['members'].append(add_mongo_id(obj['request_src'])) db, collection = get_collection(app, 'main', 'collection_groups') collection.save(grp0) members = [str(i) for i in grp0['members']] broadcast(session, websocket, members, obj) elif obj['op'] == 'chat/response/group/join/reject': if obj.has_key('from') and len(obj['from'])>0 and obj.has_key('to') and len(obj['to'])>0 and obj.has_key('to_group') and len(obj['to_group'])>0: userlist = user_query(session, {'_id':obj['from']}) if len(userlist)>0: user0 = userlist[0] user0['op'] = obj['op'] user0['from'] = obj['from'] user0['to'] = obj['to'] user0['to_group'] = obj['to_group'] if user0.has_key('password'): del user0['password'] if user0.has_key('contacts'): del user0['contacts'] if obj.has_key('reject_reason') and len(obj['reject_reason'])>0: user0['reject_reason'] = obj['reject_reason'] gJoinableQueue.put(remove_mongo_id(user0)) except gevent.queue.Full: print('chat queue is full') def broadcast(session, websocket, alist, obj={}): for i in alist: d = {} for k in obj.keys(): d[k] = obj[k] if isinstance(i, str) : d['to'] = i elif isinstance(i, dict): if '_id' in i: d['to'] = i['_id'] try: gJoinableQueue.put(d) except: pass def handle_websocket(environ, session): ws = get_websocket(environ) app = aConfig['gConfig']['wsgi']['application'] interval = 1.0 try: interval = float(aConfig['gConfig']['applications'][app]['websocket']['interval_poll']) except: interval = 1.0 while ws and not ws.closed: obj = ws_recv(environ) if obj and isinstance(obj, dict) and obj.has_key('op'): if obj['op'] == 'queue_size': qsize = 0 if gJoinableQueue: qsize = gJoinableQueue.qsize() ws.send(json.dumps({'queue_size':qsize}, ensure_ascii=True, indent=4)) elif obj['op'] == 'chat/online': rec = [] if obj.has_key('_id') and len(obj['_id'])>0: rec = user_query(session, {'_id':obj['_id']}) elif obj.has_key('username') and len(obj['username'])>0: rec = user_query(session, {'username':obj['username']}) if len(rec)>0: r0 = rec[0] _id = str(r0['_id']) online(_id, ws) r0['contacts'] = json.loads(user_contact_get(session, {'_id':_id,'user_detail':True})) r0['groups'] = json.loads(user_group_get(session, {'_id':_id,'user_detail':True})) d = remove_mongo_id(r0) d['op'] = obj['op'] d['from'] = _id d['to'] = _id d['timestamp'] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) gJoinableQueue.put(d) #ws.send(json.dumps(d, ensure_ascii=True, indent=4)) if obj.has_key('inform_contact') and obj['inform_contact'] is True: other_contacts = list(gWebSocketsMap.keys())[:] if _id in other_contacts: other_contacts.remove(_id) broadcast(session, ws, other_contacts, {'op':'chat/info/online','from':_id}) limit = 10 if aConfig['gConfig']['applications'][app].has_key('resend') and aConfig['gConfig']['applications'][app]['resend'].has_key('max_resend_record_num'): try: limit = int(aConfig['gConfig']['applications'][app]['resend']['max_resend_record_num']) except: pass resend_offline_msg(session, _id, limit) else: ws.send(json.dumps({'result':'chat_online_user_not_exist'}, ensure_ascii=True, indent=4)) elif obj['op'] == 'chat/offline': if obj.has_key('_id'): _id = obj['_id'] if obj.has_key('inform_contact') and obj['inform_contact'] is True: other_contacts = list(gWebSocketsMap.keys())[:] if _id in other_contacts: other_contacts.remove(_id) broadcast(session, ws, other_contacts, {'op':'chat/info/offline','from':_id, 'timestamp': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}) offline(_id) elif obj.has_key('username'): rec = user_query(session, {'username':obj['username']}) if len(rec)>0: _id = str(rec[0]['_id']) if obj.has_key('inform_contact') and obj['inform_contact'] is True: other_contacts = list(gWebSocketsMap.keys())[:] if _id in other_contacts: other_contacts.remove(_id) broadcast(session, ws, other_contacts, {'op':'chat/info/offline','from':_id}) offline(_id) else: ws.send(json.dumps({'result':'chat_offline_user_not_exist'}, ensure_ascii=True, indent=4)) else: ws.send(json.dumps({'result':'chat_offline_username_or_id_required'}, ensure_ascii=True, indent=4)) elif obj['op'] == 'chat/chat': chat(session, ws, obj) elif 'chat/request' in obj['op'] or 'chat/response' in obj['op']: request_response(session, ws, obj) else: try: ws.send('') except: _id = None for k in gWebSocketsMap.keys(): if ws in gWebSocketsMap[k] : _id = k break if _id: print('websocket[%s] is closed2' % _id) offline(_id) broadcast(session, None, gWebSocketsMap.keys(), {'op':'chat/info/offline', 'from':_id}) gevent.sleep(interval) if ws and ws.closed: del ws def check_url_token(querydict): is_token_pass = False enable_url_md5_check = False md5prefix = '' app = aConfig['gConfig']['wsgi']['application'] if aConfig['gConfig']['applications'][app].has_key('security') \ and aConfig['gConfig']['applications'][app]['security'].has_key('md5prefix'): md5prefix = str(aConfig['gConfig']['applications'][app]['security']['md5prefix']) if aConfig['gConfig']['applications'][app].has_key('security') \ and aConfig['gConfig']['applications'][app]['security'].has_key('enable_url_md5_check') \ and aConfig['gConfig']['applications'][app]['security']['enable_url_md5_check'].lower() == 'true': enable_url_md5_check = True else: is_token_pass = True if enable_url_md5_check: print('checking token...') if querydict.has_key('_token'): plain = '%s_|_%s' % (md5prefix, time.strftime('%Y%m%d%H')) token = hashlib.md5.new(plain).hexdigest() if token == str(querydict['_token']): is_token_pass = True return is_token_pass def chat_broadcast(session, querydict): ret = '{}' tolist = [] if querydict.has_key('from') and len(querydict['from'])>0: if querydict.has_key('to'): if isinstance(querydict['to'], str) or isinstance(querydict['to'], unicode): tolist.append(querydict['to']) if isinstance(querydict['to'], list): tolist.extend(querydict['to']) else: ret = json.dumps({'result':u'chat_broadcast_to_required'}, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'chat_broadcast_from_required'}, ensure_ascii=True, indent=4) if querydict.has_key('msg') and len(querydict['msg'])>0: for k in tolist: try: d = {'op': 'chat/chat', 'from': querydict['from'], 'to': k, 'timestamp': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), 'msg': querydict['msg']} gJoinableQueue.put(d) except gevent.queue.Full: print('chat queue is full') ret = json.dumps({'result':u'chat queue is full'}, ensure_ascii=True, indent=4) else: ret = json.dumps({'result':u'chat_broadcast_msg_required'}, ensure_ascii=True, indent=4) return ret def chat_log_query(session, querydict): limit = 0 skip = 0 filter_str = '' from_id, to_id = None, None if querydict.has_key('from') and (isinstance(querydict['from'], str) or isinstance(querydict['from'], unicode)) and len(querydict['from'])>0: from_id = querydict['from'] if querydict.has_key('to') and (isinstance(querydict['to'], str) or isinstance(querydict['to'], unicode)) and len(querydict['to'])>0: to_id = querydict['to'] if from_id is None or to_id is None: return json.dumps({'result':u'chat_log_query_from_and_to_required'}, ensure_ascii=True, indent=4) if querydict.has_key('limit'): try: limit = int(querydict['limit']) except: pass del querydict['limit'] if querydict.has_key('skip'): try: skip = int(querydict['skip']) except: pass del querydict['skip'] if querydict.has_key('filter'): filter_str = querydict['filter'] del querydict['filter'] db, collection1 = get_collection(app, 'main', 'collection_chat_log') ret = list(collection1.find({'$or':[{'from':add_mongo_id(from_id), 'to':add_mongo_id(to_id)}, {'to':add_mongo_id(from_id), 'from':add_mongo_id(to_id)}]}).limit(limit).skip(skip).sort('timestamp', pymongo.DESCENDING)) ret = json.dumps(remove_mongo_id(ret), ensure_ascii=True, indent=4) return ret def chat_log_remove(session, querydict): return '' headers = {} hh = {} headers['Content-Type'] = 'text/json;charset=' + ENCODING statuscode = '200 OK' body = '' app = aConfig['gConfig']['wsgi']['application'] urllist = [] for key in aConfig['gConfig']['applications'][app]['url_mapping'].keys(): urllist.append(Rule(str(key), endpoint=str(aConfig['gConfig']['applications'][app]['url_mapping'][key]))) urlmap = Map(urllist, converters={'bool': BooleanConverter}) urls = urlmap.bind_to_environ(environ) querydict, buf, stream = get_querydict_by_GET_POST(aConfig, environ) endpoint = '' try: endpoint, args = urls.match() if endpoint == 'handle_index': statuscode, headers, body = handle_index(environ, session) elif endpoint == 'user_remove': body = user_remove(session, querydict) elif endpoint == 'user_get': body = user_get(session, querydict) elif endpoint == 'user_add': body = user_add(session, querydict) elif endpoint == 'all_user_get': body = all_user_get(session, querydict) elif endpoint == 'user_update': body = user_update(session, querydict) elif endpoint == 'group_add': body = group_add(session, querydict) elif endpoint == 'group_get': body = group_get(session, querydict) elif endpoint == 'user_group_get': body = user_group_get(session, querydict) elif endpoint == 'user_contact_get': body = user_contact_get(session, querydict) elif endpoint == 'group_update': body = group_update(session, querydict) elif endpoint == 'group_remove': body = group_remove(session, querydict) elif endpoint == 'handle_websocket': handle_websocket(environ, session) else: body = json.dumps({'result':u'access_deny'}, ensure_ascii=True, indent=4) # except HTTPException, e: except Exception as e: body = json.dumps({'result':u'access_deny'}, ensure_ascii=True, indent=4) if session: aConfig['gSessionStore'].save(session) for k in hh.keys(): headers[k] = hh[k] return statuscode, headers, body
def handle_url(aConfig, environ, session): global gWebSocketsClientMap, gMavlinkRedirectServer, gClientAddress # def ws_main_online(websocket, user_id): # global gWebSocketsClientMap # if websocket and not websocket.closed: # v = str(websocket.__hash__()) # if not 'main' in gWebSocketsClientMap: # gWebSocketsClientMap['main'] = {} # if not v in gWebSocketsClientMap['main']: # gWebSocketsClientMap['main'][v] = {'ws':websocket, 'user_id':user_id} def ws_mavlink_online(websocket, user_id): global gWebSocketsClientMap if websocket and not websocket.closed: v = str(websocket.__hash__()) if not 'mavlink' in gWebSocketsClientMap: gWebSocketsClientMap['mavlink'] = {} if not v in gWebSocketsClientMap['mavlink']: gWebSocketsClientMap['mavlink'][v] = {'ws':websocket, 'user_id':user_id} # def ws_offline_main(websocket): # global gWebSocketsClientMap # v = str(websocket.__hash__()) # websocket.close() # if 'main' in gWebSocketsClientMap and v in gWebSocketsClientMap['main']: # del gWebSocketsClientMap['main'][v] def ws_mavlink_offline(websocket): global gWebSocketsClientMap, gListenLoopList v = str(websocket.__hash__()) websocket.close() if 'mavlink' in gWebSocketsClientMap and v in gWebSocketsClientMap['mavlink']: del gWebSocketsClientMap['mavlink'][v] m = _.find(gListenLoopList, {'ws_hash': v}) if m: m['greenlet'].kill() gListenLoopList.remove(m) # def handle_websocket_main(environ, session, user_id): # if session: # ws = get_websocket(environ) # ws_main_online(ws, user_id) # app = aConfig['gConfig']['wsgi']['application'] # interval = 1 # try: # interval = float(aConfig['gConfig']['applications'][app]['websocket']['interval_poll_client']) # except: # interval = 1 # while ws and not ws.closed: # try: # ws.send('') # except: # ws_offline_main(ws) # break # gevent.sleep(interval) def create_ws_recv_loop(aConfig, ws): global gWebSocketsClientMap, gMavlinkRedirectServer, gClientAddress while ws and not ws.closed: try: data = ws.receive() if data and len(data): if gMavlinkRedirectServer and gClientAddress: # print('send %d byte to mavproxy...' % len(data)) gMavlinkRedirectServer.socket.sendto(data, gClientAddress) except geventwebsocket.WebSocketError as e: # raise e print('create_ws_recv_loop WebSocketError:', e) except Exception as e: raise e print('create_ws_recv_loop Exception:', e) gevent.sleep(0.001) def handle_websocket_data(environ, session, user_id): global gListenLoopList ws = get_websocket(environ) ws_mavlink_online(ws, user_id) v = str(ws.__hash__()) m = _.find(gListenLoopList, {'ws_hash': v}) if m is None: g = gevent.spawn(create_ws_recv_loop, aConfig, ws) gListenLoopList.append({'ws_hash':v, 'greenlet':g}) app = aConfig['gConfig']['wsgi']['application'] interval = 10 try: interval = float(aConfig['gConfig']['applications'][app]['websocket']['interval_poll_mavlink']) except: interval = 10 while ws and not ws.closed: try: # ws.send(str.encode('', encoding=ENCODING), binary=True) ws.send('', binary=True) except: ws_mavlink_offline(ws) break gevent.sleep(interval) # def save_to_log(device_id, queue): # app = aConfig['gConfig']['wsgi']['application'] # today = datetime.datetime.now().strftime("%Y%m%d") # collection_name = 'sensor_log_%s_%s' % (device_id, today) # if 'sensor_log' in aConfig['gConfig']['applications'][app]['database']['mongodb']: # db, collection = get_collection(aConfig, app, 'sensor_log', collection_name) # collection.insert_many(queue.queue) # queue.queue.clear() def handle_index(environ, session): statuscode, mimetype, body = 403, 'text/plain', 'Access deny' return statuscode, mimetype, body def handle_logout(session): statuscode, mimetype, body = 200, 'text/json', '' if session: aConfig['gSessionStore'].delete(session) body = json.dumps({'result':u'ok'}, ensure_ascii=True, indent=4) else: body = json.dumps({'result':u'403 Fobbiden'}, ensure_ascii=True, indent=4) return statuscode, mimetype, body def handle_login(session, querydict): def get_user(querydict): ret = None if 'username' in querydict and 'password' in querydict: app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(aConfig, app, 'main', 'collection_users') if check_is_mobile_phone_number(querydict['username']): ret = collection.find_one({'password':querydict['password'],'mobile_phone':querydict['username']}) elif check_is_mail_addr(querydict['username']): ret = collection.find_one({'password':querydict['password'],'mail_addr':querydict['username']}) else: ret = collection.find_one({'password':querydict['password'],'username':querydict['username']}) return ret statuscode, mimetype, body = 200, 'text/json', '' # header = {} user = get_user(querydict) if session and user: user = remove_mongo_id(user) sess = aConfig['gSessionStore'].session_class(user, session.sid, False) for k in user.keys(): sess[k] = user[k] if 'password' in sess: del sess['password'] aConfig['gSessionStore'].save_if_modified(sess) if 'callback_jsonp' in querydict: body = "%s('%s')" % (querydict['callback_jsonp'], json.dumps(sess, ensure_ascii=True)) else: body = '_cookie_' + json.dumps(sess, ensure_ascii=True, indent=4) else: body = json.dumps({'result':u'用户名或密码错误'}, ensure_ascii=True, indent=4) return statuscode, mimetype, body def check_permission(user_id, action): return True user_id = None if session and '_id' in session: user_id = session['_id'] statuscode, mimetype, body = 200, 'text/json', '{}' app = aConfig['gConfig']['wsgi']['application'] urllist = [] for key in aConfig['gConfig']['applications'][app]['url_mapping'].keys(): urllist.append(Rule(key, endpoint=aConfig['gConfig']['applications'][app]['url_mapping'][key])) urlmap = Map(urllist, converters={'bool': BooleanConverter}) urls = urlmap.bind_to_environ(environ) querydict, buf, stream = get_querydict_by_GET_POST(environ) try: endpoint, args = urls.match() if endpoint == 'handle_index': statuscode, mimetype, body = handle_index(environ, session) elif endpoint == 'handle_login': statuscode, mimetype, body = handle_login(session, querydict) elif endpoint == 'handle_logout': statuscode, mimetype, body = handle_logout(session) # elif endpoint == 'handle_websocket_main': # handle_websocket_main(environ, session, user_id) elif endpoint == 'handle_websocket_data': handle_websocket_data(environ, session, user_id) else: body = json.dumps({'result':u'access_deny'}, ensure_ascii=True, indent=4) # except HTTPException, e: except Exception as e: traceback.print_exc() body = json.dumps({'result':u'error:%s' % e.message}, ensure_ascii=True, indent=4) # if session: # aConfig['gSessionStore'].save(session) # for k in hh.keys(): # headers[k] = hh[k] return statuscode, mimetype, body
def handle_url(aConfig, environ, session): global gWebSocketsClientMap, gWebSocketsAgentMap, gTileCache, gSubscriptionList, gSensorControlList, gSerialIdMapping, gServiceFlags def ws_main_online(websocket, user_id): global gWebSocketsClientMap if websocket and not websocket.closed: v = str(websocket.__hash__()) if not 'main' in gWebSocketsClientMap: gWebSocketsClientMap['main'] = {} if not v in gWebSocketsClientMap['main']: gWebSocketsClientMap['main'][v] = {'ws':websocket, 'user_id':user_id} # def ws_mavlink_online(websocket, user_id): # global gWebSocketsClientMap # if websocket and not websocket.closed: # v = str(websocket.__hash__()) # if not 'mavlink' in gWebSocketsClientMap: # gWebSocketsClientMap['mavlink'] = {} # if not v in gWebSocketsClientMap['mavlink']: # gWebSocketsClientMap['mavlink'][v] = {'ws':websocket, 'user_id':user_id} def ws_main_offline(websocket): global gWebSocketsClientMap v = str(websocket.__hash__()) websocket.close() if 'main' in gWebSocketsClientMap and v in gWebSocketsClientMap['main']: del gWebSocketsClientMap['main'][v] # def ws_mavlink_offline(websocket): # global gWebSocketsClientMap # v = str(websocket.__hash__()) # websocket.close() # if 'mavlink' in gWebSocketsClientMap and v in gWebSocketsClientMap['mavlink']: # del gWebSocketsClientMap['mavlink'][v] def handle_websocket_client(environ, session, user_id): if session: ws = get_websocket(environ) ws_main_online(ws, user_id) app = aConfig['gConfig']['wsgi']['application'] interval = 1 try: interval = float(aConfig['gConfig']['applications'][app]['websocket']['interval_poll_client']) except: interval = 1 while ws and not ws.closed: try: ws.send('', binary=False) except Exception as e: # raise e ws_main_offline(ws) break gevent.sleep(interval) # def handle_websocket_mavlink(environ, session, user_id): # if session: # ws = get_websocket(environ) # ws_mavlink_online(ws, user_id) # app = aConfig['gConfig']['wsgi']['application'] # interval = 10 # try: # interval = float(aConfig['gConfig']['applications'][app]['websocket']['interval_poll_mavlink']) # except: # interval = 10 # while ws and not ws.closed: # try: # ws.send('', binary=True) # except: # ws_mavlink_offline(ws) # break # gevent.sleep(interval) # def save_to_log(device_id, queue): # app = aConfig['gConfig']['wsgi']['application'] # today = datetime.datetime.now().strftime("%Y%m%d") # collection_name = 'sensor_log_%s_%s' % (device_id, today) # if 'sensor_log' in aConfig['gConfig']['applications'][app]['database']['mongodb']: # db, collection = get_collection(aConfig, app, 'sensor_log', collection_name) # collection.insert_many(queue.queue) # queue.queue.clear() def handle_index(environ, session): app = aConfig['gConfig']['wsgi']['application'] if session and 'username' in session: statuscode, mimetype, body = handle_static(aConfig, environ, aConfig['gConfig']['applications'][app]['static']['page']['indexpage']) else: statuscode, mimetype, body = handle_static(aConfig, environ, aConfig['gConfig']['applications'][app]['static']['page']['unauthorizedpage']) statuscode = 401 return statuscode, mimetype, body def handle_logout(session): statuscode, mimetype, body = 200, 'text/json', '' if session: aConfig['gSessionStore'].delete(session) body = json.dumps({'result':'ok'}, ensure_ascii=True, indent=4) else: body = json.dumps({'result':'403 Fobbiden'}, ensure_ascii=True, indent=4) return statuscode, mimetype, body def handle_login(session, querydict): def get_user(querydict): ret = None if 'username' in querydict and 'password' in querydict: app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(aConfig, app, 'main', 'collection_users') if check_is_mobile_phone_number(querydict['username']): ret = collection.find_one({'password':querydict['password'],'mobile_phone':querydict['username']}) elif check_is_mail_addr(querydict['username']): ret = collection.find_one({'password':querydict['password'],'mail_addr':querydict['username']}) else: ret = collection.find_one({'password':querydict['password'],'username':querydict['username']}) return ret statuscode, mimetype, body = 200, 'text/json', '' # header = {} user = get_user(querydict) if session and user: user = remove_mongo_id(user) sess = aConfig['gSessionStore'].session_class(user, session.sid, False) for k in user: sess[k] = user[k] if 'password' in sess: del sess['password'] aConfig['gSessionStore'].save_if_modified(sess) if 'callback_jsonp' in querydict: body = "%s('%s')" % (querydict['callback_jsonp'], json.dumps(sess, ensure_ascii=True)) else: body = '_cookie_' + json.dumps(sess, ensure_ascii=True, indent=4) else: body = json.dumps({'result':'用户名或密码错误'}, ensure_ascii=True, indent=4) return statuscode, mimetype, body def check_permission(user_id, action): return True def handle_query_feature(session, aConfig, querydict, user_id): statuscode, mimetype, body = 200, 'text/json', '{}' app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(aConfig, app, 'main', 'collection_features') limit = 100 if 'limit' in querydict and isinstance(querydict['limit'], int): limit = querydict['limit'] cond = {} if 'name' in querydict: cond['$or'] = [ { 'properties.name': {'$regex': '^.*' + querydict['name'] + '.*$'} }, { 'properties.py': {'$regex': '^.*' + querydict['name'] + '.*$'} }] if 'webgis_type' in querydict: if isinstance(querydict['webgis_type'], str) : cond['properties.webgis_type'] = add_mongo_id(querydict['webgis_type']) elif isinstance(querydict['webgis_type'], list): cond['properties.webgis_type'] = {'$in': add_mongo_id(querydict['webgis_type'])} if 'tower_id' in querydict: if isinstance(querydict['tower_id'], str) : cond['_id'] = add_mongo_id(querydict['tower_id']) elif isinstance(querydict['tower_id'], list): cond['_id'] = {'$in':add_mongo_id(querydict['tower_id'])} arr = remove_mongo_id(list(collection.find(cond).limit(limit))) return statuscode, mimetype, json.dumps(arr, ensure_ascii=True, indent=4) def get_device_from_tower(session, aConfig, tower_id): ret = None app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(aConfig, app, 'main', 'collection_tower_device_bind') if isinstance(tower_id, str) : one = collection.find_one({'tower_id':add_mongo_id(tower_id)}) if one: ret = remove_mongo_id(one['device_id']) elif isinstance(tower_id, list): arr = _.pluck(list(collection.find({'tower_id':{'$in':add_mongo_id(tower_id)}})), 'device_id') ret = remove_mongo_id(arr) return ret def handle_geo_near(session, aConfig, querydict, user_id): def calc_dist(p1, p2): po1 = tuple((p1[1], p1[0])) po2 = tuple((p2[1], p2[0])) return int(great_circle(po1, po2).m) statuscode, mimetype, body = 200, 'text/json', '{}' app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(aConfig, app, 'main', 'collection_features') limit = 100 if 'limit' in querydict and isinstance(querydict['limit'], int): limit = querydict['limit'] if 'geometry' in querydict: geojsonobj = querydict['geometry'] if isinstance(geojsonobj, str) : try: geojsonobj = json.loads(geojsonobj) except: geojsonobj = {} if 'type' in geojsonobj: cond = {'geometry2d': {'$nearSphere': {'$geometry': geojsonobj}}} if 'webgis_type' in querydict: if isinstance(querydict['webgis_type'], str) : cond['properties.webgis_type'] = querydict['webgis_type'] if isinstance(querydict['webgis_type'], list): cond['properties.webgis_type'] = {'$in': querydict['webgis_type']} minDistance = 0 maxDistance = 0 if 'min_distance' in querydict and (isinstance(querydict['min_distance'], float) or isinstance(querydict['min_distance'], int)): minDistance = querydict['min_distance'] if 'max_distance' in querydict and (isinstance(querydict['max_distance'], float) or isinstance(querydict['max_distance'], int)): maxDistance = querydict['max_distance'] cond['geometry2d']['$nearSphere']['$minDistance'] = minDistance cond['geometry2d']['$nearSphere']['$maxDistance'] = maxDistance arr = remove_mongo_id(list(collection.find(cond).limit(limit))) if 'is_calc_dist' in querydict and (querydict['is_calc_dist'] is True or querydict['is_calc_dist'].lower() == 'true'): if geojsonobj['type'] == 'Point': def get_dist(x = {}): x['properties']['calc_dist'] = calc_dist(geojsonobj['coordinates'], x['geometry']['coordinates']) return x arr = _.map_(arr, get_dist) body = json.dumps(arr, ensure_ascii=True, indent=4) else: body = json.dumps({'result': 'geometry_geojson_required'}, ensure_ascii=True, indent=4) else: body = json.dumps({'result': 'geometry_required'}, ensure_ascii=True, indent=4) return statuscode, mimetype, body def handle_geo_within(session, aConfig, querydict, user_id): statuscode, mimetype, body = 200, 'text/json', '{}' app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(aConfig, app, 'main', 'collection_features') limit = 0 if 'limit' in querydict and isinstance(querydict['limit'], int): limit = querydict['limit'] if 'geometry' in querydict: geojsonobj = querydict['geometry'] if isinstance(geojsonobj, str) : try: geojsonobj = json.loads(geojsonobj) except: geojsonobj = {} if 'type'in geojsonobj: cond = {'geometry2d':{'$geoWithin':{'$geometry':geojsonobj}}} if 'webgis_type' in querydict: if isinstance(querydict['webgis_type'], str) : cond['properties.webgis_type'] = querydict['webgis_type'] if isinstance(querydict['webgis_type'], list): cond['properties.webgis_type'] = {'$in': querydict['webgis_type']} arr = list(collection.find(cond).limit(limit)) body = json.dumps(remove_mongo_id(arr), ensure_ascii=True, indent=4) else: body = json.dumps({'result': 'geometry_geojson_required'}, ensure_ascii=True, indent=4) else: body = json.dumps({'result': 'geometry_required'}, ensure_ascii=True, indent=4) return statuscode, mimetype, body statuscode, mimetype, body = 200, 'text/json', '{}' if check_permission(user_id, 'enable_sensor'): device_id = None db, collection = get_collection(aConfig, app, 'main', 'collection_device') if 'tower_id' in querydict: device_id = get_device_from_tower(session, aConfig, querydict['tower_id']) if 'device_id' in querydict: device_id = querydict['device_id'] #add for db device = None if device_id: cond = {'_id': device_id} device = collection.find_one(add_mongo_id(cond)) if 'sensor_id' in querydict and len(querydict['sensor_id']): sensor_id = querydict['sensor_id'] gevent.spawn(savedb, collection, querydict, device, device_id, sensor_id, enable) else: gevent.spawn(savedb, collection, querydict, device, device_id, None, enable) #add for gSensorControlList device = None if device_id: device = _.find(gSensorControlList, {'_id': device_id}) device_index = _.find_index(gSensorControlList, {'_id': device_id}) if device and 'sensors' in device: pass else: device = {} device['_id'] = device_id device['sensors'] = [] if 'sensor_id' in querydict and len(querydict['sensor_id']): sensor_id = querydict['sensor_id'] sensor = _.find(device['sensors'], {'_id': sensor_id}) if sensor: index = _.find_index(device['sensors'], {'_id': sensor_id}) sensor['enable'] = enable if 'interval' in querydict and (isinstance(querydict['interval'], int) or isinstance(querydict['interval'], float)): sensor['interval'] = querydict['interval'] device['sensors'][index] = sensor else: sensor = {} sensor['_id'] = sensor_id sensor['enable'] = enable if 'interval' in querydict and (isinstance(querydict['interval'], int) or isinstance(querydict['interval'], float)): sensor['interval'] = querydict['interval'] device['sensors'].append(sensor) else: for i in range(len(device['sensors'])): device['sensors'][i]['enable'] = enable if 'interval' in querydict and (isinstance(querydict['interval'], int) or isinstance(querydict['interval'], float)): device['sensors'][i]['interval'] = querydict['interval'] if device_index < 0: gSensorControlList.append(device) else: gSensorControlList[device_index] = device else: body = json.dumps({'result': 'cannot_find_device_id'}, ensure_ascii=True, indent=4) else: body = json.dumps({'result':'permission_deny'}, ensure_ascii=True, indent=4) return statuscode, mimetype, body def handle_query_network_data(session, aConfig, querydict, user_id): statuscode, mimetype, body = 200, 'text/json', '{}' app = aConfig['gConfig']['wsgi']['application'] db, collection = get_collection(aConfig, app, 'main', 'collection_network') limit = 0 if 'limit' in querydict and isinstance(querydict['limit'], int): limit = querydict['limit'] if 'name' in querydict: arr = [] arr = list(collection.find({'$or':[{'properties.name': {'$regex':'^.*' + querydict['name'] + '.*$'}},{'properties.py': {'$regex':'^.*' + querydict['name'] + '.*$'}}]}).limit(limit)) if len(arr): arr = remove_mongo_id(arr) body = json.dumps(arr, ensure_ascii=True, indent=4) return statuscode, mimetype, body def handle_test_pymagic(session, aConfig, querydict): statuscode, mimetype, body = 200, 'text/plain', 'ok' if 'serial_no' in querydict \ and 'ip' in querydict \ and 'op' in querydict \ and 'type' in querydict: print(querydict) else: body = 'serial_no of sensor ,ip , op, type are needed' return statuscode, mimetype, body user_id = None if session and '_id' in session: user_id = session['_id'] statuscode, mimetype, body = 200, 'text/json', '{}' app = aConfig['gConfig']['wsgi']['application'] urllist = [] for key in aConfig['gConfig']['applications'][app]['url_mapping']: urllist.append(Rule(key, endpoint=aConfig['gConfig']['applications'][app]['url_mapping'][key])) urlmap = Map(urllist, converters={'bool': BooleanConverter}) urls = urlmap.bind_to_environ(environ) querydict, buf, stream = get_querydict_by_GET_POST(environ) try: endpoint, args = urls.match() if endpoint == 'handle_index': statuscode, mimetype, body = handle_index(environ, session) elif endpoint == 'handle_login': statuscode, mimetype, body = handle_login(session, querydict) elif endpoint == 'handle_logout': statuscode, mimetype, body = handle_logout(session) elif endpoint == 'handle_websocket_client': handle_websocket_client(environ, session, user_id) # elif endpoint == 'handle_websocket_mavlink': # handle_websocket_mavlink(environ, session, user_id) elif endpoint == 'handle_query_feature': statuscode, mimetype, body = handle_query_feature(session, aConfig, querydict, user_id) elif endpoint == 'handle_query_network_data': statuscode, mimetype, body = handle_query_network_data(session, aConfig, querydict, user_id) elif endpoint == 'handle_geo_within': statuscode, mimetype, body = handle_geo_within(session, aConfig, querydict, user_id) elif endpoint == 'handle_geo_near': statuscode, mimetype, body = handle_geo_near(session, aConfig, querydict, user_id) elif endpoint == 'handle_test_pymagic': statuscode, mimetype, body = handle_test_pymagic(session, aConfig, querydict) else: body = json.dumps({'result':'access_deny'}, ensure_ascii=True, indent=4) # except HTTPException, e: except Exception as e: traceback.print_exc() body = json.dumps({'result':'error:%s' % str(e)}, ensure_ascii=True, indent=4) # if session: # aConfig['gSessionStore'].save(session) # for k in hh: # headers[k] = hh[k] return statuscode, mimetype, body