async def login(self, request: web.Request): if not self._user_db.is_user_exists(): return web.HTTPFound(request.app.router['register'].url_for()) if request.method == 'GET': session = await get_session(request) if 'username' in session: return web.HTTPFound(request.app.router['index'].url_for()) return aiohttp_jinja2.render_template('login.html', request, {}) elif request.method == 'POST': form_data = await request.post() if 'username' in form_data and 'password' in form_data: if self._user_db.has_user(form_data['username'], form_data['password']): await self.authorize_user(request, form_data['username']) return jsonp_response( request, { 'status': 0, 'msg': 'success', 'url': str(request.app.router['index'].url_for()) }) return jsonp_response(request, { 'status': 200, 'msg': 'Username or password error' })
async def register(self, request: web.Request): if self._user_db.is_user_exists(): return jsonp_response( request, { 'status': 100, 'msg': 'This method does not allow to visit after initialization' }) if request.method == 'GET': return aiohttp_jinja2.render_template('register.html', request, {}) elif request.method == 'POST': form_data = await request.post() if 'username' in form_data and 'password' in form_data: self._user_db.create_user(form_data['username'], form_data['password'], permission=0) if self._user_db.is_user_exists(): await self.authorize_user(request, form_data['username']) return jsonp_response( request, { 'status': 0, 'msg': 'success', 'url': str(request.app.router['index'].url_for()) }) return jsonp_response(request, { 'status': 101, 'msg': 'Something went wrong' })
async def remove_client_api(self, request: web.Request): uuid = request.match_info['uuid'] exception = self.client_db.remove_client(uuid) if exception: return jsonp_response(request, {'status': 400, 'msg': exception}) else: await self._disconnect_websocket(uuid) return jsonp_response( request, { 'status': 0, 'msg': 'Delete the uuid "{uuid}..." successfully'.format( uuid=uuid[:5]) })
async def deauth_api(self, request: web.Request): uuid = request.match_info['uuid'] check = self.client_db.clear_token(uuid) if check: return jsonp_response( request, { 'status': 0, 'msg': '{uuid}\'s token is cleared'.format(uuid=uuid) }) else: return jsonp_response( request, { 'status': 101, 'msg': 'uuid: {uuid} not found'.format(uuid=uuid) })
async def deploy(self, request: web.Request): project_name = request.match_info['project_name'] uuid = request.match_info['uuid'] filepath = self.__project_dir / project_name if project_name not in self.__projects or not filepath.is_dir(): return jsonp_response( request, { 'status': 400, 'msg': 'project "{project_name}" is not found'.format( project_name=project_name) }) elif uuid not in self.ws_client: return jsonp_response(request, { 'status': 400, 'msg': 'the crawler is disconnected' }) archive = self.__projects[project_name].get('archive', None) if archive is None \ or archive.split('_', 2)[0] != self.__projects[project_name]['hash'] \ or not Path(archive).is_file(): archive = shutil.make_archive( base_name='{project_dir}/{hash}_{project_name}'.format( project_dir=str(self.__project_dir), hash=self.__projects[project_name]['hash'], project_name=project_name), format=self.__archive_type, root_dir=str(filepath.absolute())) self.__projects[project_name]['archive'] = archive token = gen_token() while token in self.__downloads: token = gen_token() self.__downloads[token] = archive await self.send_command(uuid, 1, { 'token': token, 'filename': Path(archive).name }) return jsonp_response(request, { 'status': 0, })
async def auth_api(self, request: web.Request): client_id = request.match_info['id'] token = self.client_db.auth(client_id) if token: return jsonp_response( request, { 'status': 0, 'msg': '"id: {client_id} is verified"'.format(client_id=client_id) }) else: return jsonp_response( request, { 'status': 101, 'msg': 'id: {client_id} is not found'.format(client_id=client_id) })
async def get_websocket_url(self, request: web.Request): session = await get_session(request) return jsonp_response( request, { 'status': 0, 'websocket_url': str(request.app.router['user_websocket'].url_for( token=session['token'])) })
async def get_active_client(self, request: web.Request): page_number = int(request.query.get('pageNumber', '1')) page_size = int(request.query.get('pageSize', '5')) total = self.__active_clients.count() rows = [{ 'id': one.client_id, 'uuid': one.uuid, 'remote': one.remote_ip, 'host': one.host, 'hostname': one.hostname, 'status': one.status, 'authorized_at': one.authorized_at.strftime(DATETIME_FORMAT) } for one in self.__active_clients.paginate(page_number, page_size)] return jsonp_response(request, {'total': total, 'rows': rows})
async def get_unverified_client_api(self, request: web.Request): page_number = int(request.query.get('pageNumber', '1')) page_size = int(request.query.get('pageSize', '5')) total = self.__unverified_clients.count() # total = int(ceil(self.__unverified_clients.count() / page_size)) rows = [{ 'id': one.client_id, 'uuid': one.uuid, 'remote': one.remote_ip, 'host': one.host, 'hostname': one.hostname, 'last': one.connected_at.strftime(DATETIME_FORMAT) } for one in self.__unverified_clients.paginate( page_number, page_size)] return jsonp_response(request, {'total': total, 'rows': rows})
async def get_project(self, request: web.Request): return jsonp_response(request, { 'total': len(self.__projects), 'rows': list(self.__projects.values()) })