Пример #1
0
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')
Пример #2
0
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]
Пример #3
0
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')
Пример #4
0
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))
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
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]
Пример #9
0
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
Пример #10
0
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
Пример #11
0
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
Пример #12
0
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)
Пример #13
0
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('无日志记录!')
Пример #14
0
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'没有此进程!')
Пример #15
0
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))