def log_record_save(request): response = {'error':'', 'success': 'true'} if request.method == 'GET': asset_id = request.GET.get('asset_id', '') log_id = request.GET.get('log_id', '') asset = Asset.objects.get(id_unique=asset_id) proxy = asset.proxy try: api = APIRequest('{0}/v1.0/loginfo/{1}'.format(proxy.url, log_id), proxy.username, CRYPTOR.decrypt(proxy.password)) result, codes = api.req_get() if 'data' in result.keys(): log_data = result['data'] username = User.objects.get(id=log_data['user_id']).username asset_ip = asset.networking.all()[0].ip_address loginfo = Log() loginfo.user = username loginfo.host = asset_ip loginfo.filename = '' if log_data['filename'] is None else log_data['filename'] loginfo.is_finished = False loginfo.log_path = log_data['log_path'] loginfo.login_type = log_data['login_type'] loginfo.pid = 0 loginfo.remote_ip = log_data['remote_ip'] loginfo.start_time = log_data['start_time'] loginfo.proxy_log_id = log_id loginfo.proxy_name = proxy.proxy_name loginfo.asset_id_unique = asset_id loginfo.save() else: response['error'] = u'从proxy获取日志信息失败' response['success'] = 'false' except Exception as e: logger.error(e) response['error'] = e response['success'] = 'false' else: time.sleep(3) try: asset_id = request.POST.get('asset_id', '') log_id = request.POST.get('log_id', '') asset = Asset.objects.get(id_unique=asset_id) proxy = asset.proxy api = APIRequest('{0}/v1.0/loginfo/{1}'.format(proxy.url, log_id), proxy.username, CRYPTOR.decrypt(proxy.password)) result, codes = api.req_get() if 'data' in result.keys(): log_data = result['data'] loginfo = Log.objects.get(proxy_log_id=int(log_id), proxy_name=proxy.proxy_name) loginfo.is_finished = True if log_data['is_finished'] is None else log_data['is_finished'] loginfo.end_time = log_data['end_time'] loginfo.filename = '' if log_data['filename'] is None else log_data['filename'] loginfo.save() else: response['error'] = u'从proxy获取日志信息失败' response['success'] = 'false' except Exception as e: response['error'] = e response['success'] = 'false' logger.error(e) return HttpResponse(json.dumps(response), content_type='application/json')
def task_exec_info_v1(request, res, *args, **kwargs): """ 获取任务执行信息 前端使用jquery plugin datatables进行分页 后端根据前端规则组合数据 """ if request.method == 'POST': task_id = request.POST.get('task_id') page = request.POST.get('page') limit = request.POST.get('limit') task = Task.objects.get(id=task_id) try: # 调用proxy接口, api = APIRequest('{0}/v1.0/job_task/{1}'.format(task.task_proxy.url, task.task_uuid), task.task_proxy.username, CRYPTOR.decrypt(task.task_proxy.password)) result, code = api.req_get() if code != 200: raise ServerError(result['messege']) else: tasks = result['result']['tasks'] except ServerError, e: error = e.message res['flag'] = False res['content'] = error except Exception, e: res['flag'] = False res['content'] = e[1]
def asset_event(request): response = {'success': True, 'message':''} if request.method == 'GET': user_name = request.user.username try: if asset_task_queue.qsize() > 0: tk_event = asset_task_queue.get() if tk_event['task_user'] != user_name: asset_task_queue.put(tk_event) response['success'] = False else: tk_proxy = Proxy.objects.get(proxy_name=tk_event['task_proxy']) api = APIRequest('{0}/v1.0/event/{1}'.format(tk_proxy.url, tk_event['task_name']), tk_proxy.username, CRYPTOR.decrypt(tk_proxy.password)) result, codes = api.req_get() logger.debug(u'事件查询结果result:%s'%result) tk = get_object(Task, task_name=tk_event['task_name']) tk.status = result['status'] tk.content = result['event_log'] tk.save() response['message'] = result['event_log'] return HttpResponse(json.dumps(response), content_type='application/json') except Exception as e: logger.error(e) response['success'] = False response['message'] = e return HttpResponse(json.dumps(response), content_type='application/json')
def task_exec_info(request, res, *args, **kwargs): """ 获取任务执行信息 前端使用jquery plugin datatables进行分页 后端根据前端规则组合数据 """ if request.method == 'POST': # 初始化返回结果 return_obj = { "sEcho": request.POST.get('sEcho', 0), # 前端上传原样返回 "iTotalRecords": 0, # 总记录数 "iTotalDisplayRecords": 0, # 过滤后总记录数 "aaData": [] # 返回前端数据,json格式 } # 获取过滤条件 task_id = request.POST.get('task_id') # 前端datatable上传每页显示数据 limit = request.POST.get('iDisplayLength', 0) # 前端datatable上送从第几条开始展示 offset = request.POST.get('iDisplayStart', 5) task = Task.objects.get(id=task_id) # 获取数据 try: # 调用proxy接口, api = APIRequest( '{0}/v1.0/job_task/{1}?limit={2}&offset={3}'.format(task.task_proxy.url, task.task_uuid, limit, offset), task.task_proxy.username, CRYPTOR.decrypt(task.task_proxy.password)) result, code = api.req_get() if code != 200: raise ServerError(result['messege']) else: tasks = result['result']['tasks'] total_count = result['result']['total_count'] display_lsit = [] for task in tasks: display_lsit.append({ 'start_time': task.get('start_time'), 'end_time': task.get('end_time'), 'status': task.get('status'), 'id': task.get('id'), 'job_id': task.get('job_id') }) return_obj['aaData'] = display_lsit return_obj['iTotalRecords'] = total_count return_obj['iTotalDisplayRecords'] = total_count except: logger.error("GET TASK EXEC INFO ERROR\n {0}".format(traceback.format_exc())) return HttpResponse(json.dumps(return_obj))
def get_profiles(): profiles = [] try: api = APIRequest('http://172.16.30.69:8100/v1.0/profile', 'test', '123456') msg, codes = api.req_get() logger.debug("msg:%s"%msg) if msg: profiles = msg['profiles'] except Exception as e: logger.error(e) return profiles
def get_backup_info_from_proxy(backup): # 调用proxy接口 api = APIRequest('{0}/v1.0/job_task/{1}?limit=1'.format(backup.proxy.url, backup.task_uuid), backup.proxy.username, CRYPTOR.decrypt(backup.proxy.password)) result, code = api.req_get() if code != 200: # 获取失败,下次继续获取 result = {} else: result = result['result'] return result
def get_one_or_all(obj_name, proxy, obj_uuid='all'): """ 获取所有的对象或者一个id对应的对象 """ obj_list = [] try: api = APIRequest('{0}/v1.0/permission/{1}/{2}'.format(proxy.url, obj_name, obj_uuid), proxy.username, CRYPTOR.decrypt(proxy.password)) result, codes = api.req_get() obj_list = result['messege'] except Exception as e: logger.error(e) return obj_list
def task_action(request, res, *args, **kwargs): if request.method == 'POST': task_id = request.POST.get('task_id') action = request.POST.get('action') task = Task.objects.get(id=task_id) try: # 先从Proxy获取是否存在,若不存在则新建 api = APIRequest('{0}/v1.0/job/{1}'.format(task.task_proxy.url, task.task_uuid), task.task_proxy.username, CRYPTOR.decrypt(task.task_proxy.password)) result, code = api.req_get() # 构建参数 param = {'action': action} if code == 200: # 调用proxy接口, api = APIRequest('{0}/v1.0/job/{1}/action/'.format(task.task_proxy.url, task.task_uuid), task.task_proxy.username, CRYPTOR.decrypt(task.task_proxy.password)) result, code = api.req_post(json.dumps(param)) if code != 200: raise ServerError(result['messege']) else: if action == 'pause': task.task_statu = '01' else: task.task_statu = '00' task.save() elif code == 404: logger.info("task [%s] have been deleted" % task.task_uuid) # 不存在时,若启用则创建,若禁用则直接修改为禁用 if action == 'pause': # 停用,直接修改为禁用 task.task_statu = '01' task.save() elif action == 'resume': res['flag'] = False res['content'] = '触发器已过期,请使用编辑功能编辑触发器' return HttpResponse(json.dumps(res)) except ServerError, e: logger.error("action error %s" % str(e)) error = e.message res['flag'] = False res['content'] = error except Exception, e: logger.error("error %s" % str(e)) res['flag'] = False res['content'] = e[1]
def get_one_or_all(obj_name, proxy, obj_uuid='all'): """ 获取所有的对象或者一个id对应的对象 """ obj_list = [] try: api = APIRequest( '{0}/v1.0/permission/{1}/{2}'.format(proxy.url, obj_name, obj_uuid), proxy.username, CRYPTOR.decrypt(proxy.password)) result, codes = api.req_get() obj_list = result['messege'] except Exception as e: logger.error(e) return obj_list
def gen_proxy_profiles(proxys): """ 获取proxy对应的profiles """ proxy_profiles = {} if isinstance(proxys, (list, QuerySet)): for item in proxys: profiles = [] try: api = APIRequest('{0}/v1.0/profile'.format(item.url), item.username, CRYPTOR.decrypt(item.password)) msg, codes = api.req_get() if msg: profiles = msg['profiles'] except Exception as e: logger.error(e) proxy_profiles[item.proxy_name] = profiles logger.info("获取proxy对应的profiles:%s"%proxy_profiles) return proxy_profiles
def gen_proxy_profiles(proxys): """ 获取proxy对应的profiles """ proxy_profiles = {} if isinstance(proxys, (list, QuerySet)): for item in proxys: profiles = [] try: api = APIRequest('{0}/v1.0/profile'.format(item.url), item.username, CRYPTOR.decrypt(item.password)) msg, codes = api.req_get() if msg: profiles = msg['profiles'] except Exception as e: logger.error(e) proxy_profiles[item.proxy_name] = profiles logger.info("获取proxy对应的profiles:%s" % proxy_profiles) return proxy_profiles
def exec_commands_log(request): log_id = request.POST.get('id', '') proxy_id = request.POST.get('proxy_id', '') try: proxy = Proxy.objects.get(id=int(proxy_id)) if log_id and proxy: api = APIRequest('{0}/v1.0/execute/commands/loginfos/{1}'.format(proxy.url, log_id), proxy.username, CRYPTOR.decrypt(proxy.password)) result, codes = api.req_get() log_info = result['data'] exec_log = ExecLog() exec_log.remote_id = log_id exec_log.user = request.user.username exec_log.host = log_info['host'] exec_log.cmd = log_info['cmd'] exec_log.remote_ip = log_info['remote_ip'] exec_log.proxy_host = log_info['proxy_host'] exec_log.result = log_info['result'] exec_log.save() except Exception as e: logger.error(e)
def log_history(request): """ 命令历史记录 """ log_id = request.GET.get('id', 0) loginfo = Log.objects.get(id=log_id) proxy_log_id = loginfo.proxy_log_id if loginfo: proxy_name = loginfo.proxy_name proxy = Proxy.objects.get(proxy_name=proxy_name) api = APIRequest('{0}/v1.0/ttylog?log_id={1}'.format(proxy.url, proxy_log_id), proxy.username, CRYPTOR.decrypt(proxy.password)) result, codes = api.req_get() if 'data' in result.keys(): tty_proxys = result['data'] tty_logs = sorted(tty_proxys, key=lambda x: x['datetime']) if tty_logs: content = '' for tty_log in tty_logs: content += '%s: %s\n' % (tty_log['datetime'], tty_log['cmd']) return HttpResponse(content) return HttpResponse('无日志记录!')
def log_kill(request): """ 杀掉connect进程 """ response = {'success':'true', 'error':''} log_id = request.POST.get('log_id') log = Log.objects.get(id=log_id) if log: proxy_name = log.proxy_name proxy = Proxy.objects.get(proxy_name=proxy_name) proxy_log_id = log.proxy_log_id api = APIRequest('{0}/v1.0/ws/terminal/kill/?id={1}'.format(proxy.url, proxy_log_id), proxy.username, CRYPTOR.decrypt(proxy.password)) result, codes = api.req_get() if codes == 200: time.sleep(3) else: log.is_finished = 1 log.save() response['error'] = u'断开[%s]连接成功'%log.host return HttpResponse(json.dumps(response), content_type='application/json') else: response['success'] = 'false' response['error'] = '没有此进程' return HttpResponseNotFound(u'没有此进程!')
def adv_task_edit(request, res, *args, **kwargs): if request.method == 'POST': param = {} # 触发器 trigger_kwargs = request.POST.get('trigger') comment = request.POST.get('comment') task_id = int(request.POST.get('task_id')) try: task = Task.objects.get(id=task_id) # 构建trigger trigger_kwargs = json.loads(trigger_kwargs) start_date = trigger_kwargs.pop('start_date') end_date = trigger_kwargs.get('end_date') if end_date: trigger_kwargs.pop('end_date') if not trigger_kwargs: start_date_2_date = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S') trigger_kwargs['year'] = start_date_2_date.year trigger_kwargs['month'] = start_date_2_date.month trigger_kwargs['day'] = start_date_2_date.day trigger_kwargs['hour'] = start_date_2_date.hour trigger_kwargs['minute'] = start_date_2_date.minute trigger_kwargs['second'] = start_date_2_date.second trigger_kwargs['start_date'] = start_date if end_date: trigger_kwargs['end_date'] = end_date param['trigger_kwargs'] = trigger_kwargs # 先从Proxy获取是否存在,若不存在则新建 api = APIRequest('{0}/v1.0/job/{1}'.format(task.task_proxy.url, task.task_uuid), task.task_proxy.username, CRYPTOR.decrypt(task.task_proxy.password)) result, code = api.req_get() if code == 404: param['job_id'] = task.task_uuid param['task_name'] = task.task_type param['task_kwargs'] = json.loads(task.task_kwargs) # 任务已经完全结束,再次编辑时,proxy端需要重新创建 api = APIRequest('{0}/v1.0/job'.format(task.task_proxy.url), task.task_proxy.username, CRYPTOR.decrypt(task.task_proxy.password)) result, code = api.req_post(json.dumps(param)) if code != 200: raise ServerError(result['messege']) else: task.trigger_kwargs = json.dumps(trigger_kwargs) task.comment = comment task.is_get_last = '00' task.task_statu = '00' task.save() elif code == 200: api = APIRequest('{0}/v1.0/job/{1}'.format(task.task_proxy.url, task.task_uuid), task.task_proxy.username, CRYPTOR.decrypt(task.task_proxy.password)) result, code = api.req_put(json.dumps(param)) if code != 200: raise ServerError(result['messege']) else: task.trigger_kwargs = json.dumps(trigger_kwargs) task.comment = comment task.save() except: logger.error(traceback.format_exc()) res['flag'] = False res['content'] = "update error" else: res['flag'] = True return HttpResponse(json.dumps(res)) elif request.method == "GET": task_id = request.GET.get('task_id') task = Task.objects.get(id=task_id).to_dict() proxy_list = [proxy.to_dict() for proxy in Proxy.objects.all().order_by('create_time')] task['task_proxy'] = task['task_proxy'].to_dict() res['task'] = task res['proxys'] = proxy_list res['task_types'] = Task.TYPES[1:] return HttpResponse(json.dumps(res))