def get_guacamole_client(client_id, image,protocol,mylog): session = DBSession() guacamole_client = None try: query = session.query(GuacamoleClientInfo) result = query.filter(GuacamoleClientInfo.user_info == client_id).filter(GuacamoleClientInfo.image == image).with_lockmode('update').first() if result != None: if result.status == 0: result.status = 1 result.latest_active_timestamp = str(datetime.now()) guacamole_server = result.guacamole_server guacamole_client_name = result.guacamole_client_name guacamole_client = guacamole_server+'client.xhtml?id=c/'+guacamole_client_name session.commit() else: session.commit() res = establish_guacamole_client(session,client_id, image,protocol) if res != None: guacamole_client = res else: create_guacamole_server(session,client_id, image,protocol) guacamole_client = get_guacamole_client(client_id, image,protocol,mylog) except Exception,e: session.rollback() print e
def add_user(): name = request.form.get('name', default=None) password = request.form.get('password', default=None) email = request.form.get('email', default=None) sex = request.form.get('sex', default=None) db = DBSession() u = db.query(User).filter(User.name == name).first() if u is not None: db.close() error_message = '用户名' + name + '已存在,请重新输入' res = { 'code': 100, 'message': error_message, 'data': { 'email': email, 'name': name } } return render_template('user/register.html', result=res) else: user = User(id=get_uuid(), name=name, password=password, email=email, sex=sex, create_time=datetime.now()) db.add(user) db.commit() db.close() res = {'code': 200, 'message': 'success'} return render_template('login.html', result=res)
def cancel_guacamole_client(client_id,image,protocol=None): session = DBSession() guacamole_client_host = None guacamole_client_vm = None try: query = session.query(GuacamoleClientInfo) result = query.filter(GuacamoleClientInfo.user_info == client_id).filter(GuacamoleClientInfo.image == image).filter(GuacamoleClientInfo.protocol == protocol).with_lockmode('update').first() if result != None: result.user_info = '' result.image = '' result.status = 0 guacamole_server = result.guacamole_server guacamole_client_host = result.guacamole_client_host guacamole_client_vm = result.guacamole_client_vm query = session.query(GuacamoleServerLoad) result = query.filter(GuacamoleServerLoad.guacamole_server==guacamole_server).with_lockmode('update').first() if result==None: pass result = server_protocol_update(protocol, -1 , result) session.commit() except: print 'cancel a guacamole client failed...' session.rollback() finally: session.close() return guacamole_client_host,guacamole_client_vm
def cancel_guacamole_client(client_id, image, protocol=None): session = DBSession() guacamole_client_host = None guacamole_client_vm = None try: query = session.query(GuacamoleClientInfo) result = query.filter( GuacamoleClientInfo.user_info == client_id).filter( GuacamoleClientInfo.image == image).filter( GuacamoleClientInfo.protocol == protocol).with_lockmode( 'update').first() if result != None: result.user_info = '' result.image = '' result.status = 0 guacamole_server = result.guacamole_server guacamole_client_host = result.guacamole_client_host guacamole_client_vm = result.guacamole_client_vm query = session.query(GuacamoleServerLoad) result = query.filter( GuacamoleServerLoad.guacamole_server == guacamole_server).with_lockmode('update').first() if result == None: pass result = server_protocol_update(protocol, -1, result) session.commit() except: print 'cancel a guacamole client failed...' session.rollback() finally: session.close() return guacamole_client_host, guacamole_client_vm
def validate_remove_guacamole_server(guacamole_server, load_upper_bound): session = DBSession() try: query = session.query(GuacamoleClientInfo) results = query.filter( GuacamoleClientInfo.guacamole_server == guacamole_server).filter( GuacamoleClientInfo.status == 0).with_lockmode('update').all() if len(results) < load_upper_bound: raise Exception cur_time = datetime.now() for res in results: cur_diff = __time_diff(cur_time, res.latest_active_timestamp) if cur_diff < server_time_limit: raise Exception for res in results: session.delete(res) query = session.query(GuacamoleServerLoad) server = query.filter( GuacamoleServerLoad.guacamole_server == guacamole_server).with_lockmode('update').first() session.delete(server) session.commit() return True except Exception, e: print e session.rollback() return False
def get_guacamole_client(client_id, image, protocol, mylog): session = DBSession() guacamole_client = None try: query = session.query(GuacamoleClientInfo) result = query.filter( GuacamoleClientInfo.user_info == client_id).filter( GuacamoleClientInfo.image == image).with_lockmode( 'update').first() if result != None: if result.status == 0: result.status = 1 result.latest_active_timestamp = str(datetime.now()) guacamole_server = result.guacamole_server guacamole_client_name = result.guacamole_client_name guacamole_client = guacamole_server + 'client.xhtml?id=c/' + guacamole_client_name session.commit() else: session.commit() res = establish_guacamole_client(session, client_id, image, protocol) if res != None: guacamole_client = res else: create_guacamole_server(session, client_id, image, protocol) guacamole_client = get_guacamole_client( client_id, image, protocol, mylog) except Exception, e: session.rollback() print e
def reset_guacamole_client(): session = DBSession() query = session.query(GuacamoleClientInfo) #If I can add another condition for query to lock with update, for example, query.filter(GuacamoleClientInfo.guacamole_client_host=='').filter....... #Then this process can be more fine-grained result = query.filter(GuacamoleClientInfo.status==1).filter(GuacamoleClientInfo.user_info!='').with_lockmode('update').all() if result==None: return cur_time = datetime.now() for res in result: seconds = __time_diff(cur_time,res.latest_active_timestamp) if seconds>=client_time_limit: guacamole_client_vm = res.guacamole_client_vm guacamole_client_host = res.guacamole_client_host image = res.image res.user_info = '' res.status = 0 res.image = '' protocol = res.protocol guacamole_server = res.guacamole_server query = session.query(GuacamoleServerLoad) result = query.filter(GuacamoleServerLoad.guacamole_server == guacamole_server).with_lockmode('update').first() result = __server_protocol_update(protocol,-1,result) signal = containerservice.shutdown_container(guacamole_client_vm,int(guacamole_client_host[guacamole_client_host.index(':')+1:]),image) if signal==False: #Record this error pass session.commit() session.close()
def heart_beat(client_id, image): """Receive heart beat signal When a heart beat signal is received, the latest_active_timestamp of the record in database is updated """ session = DBSession() try: query = session.query(GuacamoleClientInfo) result = query.filter(GuacamoleClientInfo.user_info == client_id).filter(GuacamoleClientInfo.image == image).with_lockmode('update').first() if result != None: result.status = 1 result.latest_active_timestamp = str(datetime.now()) session.commit() except Exception: session.rollback() finally: session.close()
def read_config(config_file): session = DBSession() tree = ElementTree() tree.parse(config_file) root = tree.getroot() server = root.attrib['name'] server_vm = root.attrib['virtual_machine'] protocals = root.getchildren() acnt = [0, 0, 0, 0] cur_datetime = datetime.now() t = [] for protocal in protocals: pro_name = protocal.attrib['name'] clients = protocal.getchildren() cnt = 0 for client in clients: cnt += 1 client_name = client.attrib['name'] client_host = client[0].text client_vm = client[1].text guacamoleClientInfo = GuacamoleClientInfo('', '', server, client_name, pro_name, client_host, client_vm, 0, cur_datetime) #t.append(guacamoleClientInfo) session.add(guacamoleClientInfo) #session.commit() if pro_name == 'vnc': acnt[0] = cnt elif pro_name == 'vnc-read-only': acnt[1] = cnt elif pro_name == 'ssh': acnt[2] = cnt else: acnt[3] = cnt guacamoleServerLoad = GuacamoleServerLoad(server, server_vm, acnt[0], acnt[1], acnt[2], acnt[3], sum(acnt), cur_datetime, 0) #guacamoleServerLoad.guacamole_client_info = t session.add(guacamoleServerLoad) session.commit() session.close()
def read_config(config_file): session = DBSession() tree = ElementTree() tree.parse(config_file) root = tree.getroot() server = root.attrib["name"] server_vm = root.attrib["virtual_machine"] protocals = root.getchildren() acnt = [0, 0, 0, 0] cur_datetime = datetime.now() t = [] for protocal in protocals: pro_name = protocal.attrib["name"] clients = protocal.getchildren() cnt = 0 for client in clients: cnt += 1 client_name = client.attrib["name"] client_host = client[0].text client_vm = client[1].text guacamoleClientInfo = GuacamoleClientInfo( "", "", server, client_name, pro_name, client_host, client_vm, 0, cur_datetime ) # t.append(guacamoleClientInfo) session.add(guacamoleClientInfo) # session.commit() if pro_name == "vnc": acnt[0] = cnt elif pro_name == "vnc-read-only": acnt[1] = cnt elif pro_name == "ssh": acnt[2] = cnt else: acnt[3] = cnt guacamoleServerLoad = GuacamoleServerLoad( server, server_vm, acnt[0], acnt[1], acnt[2], acnt[3], sum(acnt), cur_datetime, 0 ) # guacamoleServerLoad.guacamole_client_info = t session.add(guacamoleServerLoad) session.commit() session.close()
def heart_beat(client_id, image): """Receive heart beat signal When a heart beat signal is received, the latest_active_timestamp of the record in database is updated """ session = DBSession() try: query = session.query(GuacamoleClientInfo) result = query.filter( GuacamoleClientInfo.user_info == client_id).filter( GuacamoleClientInfo.image == image).with_lockmode( 'update').first() if result != None: result.status = 1 result.latest_active_timestamp = str(datetime.now()) session.commit() except Exception: session.rollback() finally: session.close()
def reset_guacamole_client(): session = DBSession() query = session.query(GuacamoleClientInfo) #If I can add another condition for query to lock with update, for example, query.filter(GuacamoleClientInfo.guacamole_client_host=='').filter....... #Then this process can be more fine-grained result = query.filter(GuacamoleClientInfo.status == 1).filter( GuacamoleClientInfo.user_info != '').with_lockmode('update').all() if result == None: return cur_time = datetime.now() for res in result: seconds = __time_diff(cur_time, res.latest_active_timestamp) if seconds >= client_time_limit: guacamole_client_vm = res.guacamole_client_vm guacamole_client_host = res.guacamole_client_host image = res.image res.user_info = '' res.status = 0 res.image = '' protocol = res.protocol guacamole_server = res.guacamole_server query = session.query(GuacamoleServerLoad) result = query.filter( GuacamoleServerLoad.guacamole_server == guacamole_server).with_lockmode('update').first() result = __server_protocol_update(protocol, -1, result) signal = containerservice.shutdown_container( guacamole_client_vm, int(guacamole_client_host[guacamole_client_host.index(':') + 1:]), image) if signal == False: #Record this error pass session.commit() session.close()
def validate_remove_guacamole_server(guacamole_server,load_upper_bound): session = DBSession() try: query = session.query(GuacamoleClientInfo) results = query.filter(GuacamoleClientInfo.guacamole_server==guacamole_server).filter(GuacamoleClientInfo.status==0).with_lockmode('update').all() if len(results)<load_upper_bound: raise Exception cur_time = datetime.now() for res in results: cur_diff = __time_diff(cur_time, res.latest_active_timestamp) if cur_diff<server_time_limit: raise Exception for res in results: session.delete(res) query = session.query(GuacamoleServerLoad) server = query.filter(GuacamoleServerLoad.guacamole_server==guacamole_server).with_lockmode('update').first() session.delete(server) session.commit() return True except Exception,e: print e session.rollback() return False