def post(request): ret = {'status': True, 'error': None, } try: if request.POST.get('nid'): ids = request.POST.get('nid', None) asset_obj = AssetInfo.objects.get(id=ids) try: asset_obj.user.hostname except Exception as e: logger.error(e) ret['status'] = False ret['error'] = '未关联用户,请关联后再更新'.format(e) return HttpResponse(json.dumps(ret)) assets = [{"hostname": asset_obj.hostname, "ip": asset_obj.network_ip, "port": asset_obj.port, "username": asset_obj.user.username, "password": decrypt_p(asset_obj.user.password), "private_key": asset_obj.user.private_key.name }] ansbile_asset_hardware.delay(ids, assets) except Exception as e: logger.error(e) ret['status'] = False ret['error'] = '获取资产信息错误{}'.format(e) finally: return HttpResponse(json.dumps(ret))
def post(request): ret = { 'status': True, 'error': None, } try: if request.POST.get('nid'): ids = request.POST.get('nid', None) asset_obj = AssetInfo.objects.get(id=ids) try: asset_obj.user.hostname except Exception as e: logger.error(e) ret['status'] = False ret['error'] = '未关联用户,请关联后再更新'.format(e) return HttpResponse(json.dumps(ret)) assets = [{ "hostname": asset_obj.hostname, "ip": asset_obj.network_ip, "port": asset_obj.port, "username": asset_obj.user.username, "password": decrypt_p(asset_obj.user.password), "private_key": asset_obj.user.private_key.name }] ansbile_asset_hardware.delay(ids, assets) except Exception as e: logger.error(e) ret['status'] = False ret['error'] = '获取资产信息错误{}'.format(e) finally: return HttpResponse(json.dumps(ret))
def taillog(request, hostname, port, username, password, private, tail): """ 执行 tail log 接口 """ channel_layer = get_channel_layer() user = request.user.username os.environ["".format(user)] = "true" ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) if password: ssh.connect(hostname=hostname, port=port, username=username, password=decrypt_p(password)) else: pkey = paramiko.RSAKey.from_private_key_file(private) ssh.connect(hostname=hostname, port=port, username=username, pkey=pkey) cmd = "tail " + tail stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True) for line in iter(stdout.readline, ""): if os.environ.get("".format(user)) == 'false': break result = {"status": 0, 'data': line} result_all = json.dumps(result) async_to_sync(channel_layer.group_send)(user, { "type": "user.message", 'text': result_all })
def post(request): ids = request.POST.getlist('id') args = request.POST.getlist('args', None) modules = request.POST.getlist('module', None) idstring = ','.join(ids) asset_obj = AssetInfo.objects.extra(where=['id IN (' + idstring + ')']) tasks, assets = [], [] for x in range(len(modules)): tasks.append( { "action": { "module": modules[x], "args": args[x] }, "name": 'task{}'.format(x) }, ) ret_data = {'data': []} for i in asset_obj: try: i.user.hostname except Exception as e: logger.error(e) ret = { 'hostname': i.hostname, 'data': '未关联用户,请关联后再操作 {0}'.format(e) } ret_data['data'].append(ret) return HttpResponse(json.dumps(ret_data)) varall = { 'hostname': i.hostname, 'inner_ip': i.inner_ip, "network_ip": i.network_ip, "project": i.project } try: varall.update(Variable.objects.get(assets__hostname=i).vars) except Exception as e: logger.error(e) assets.append( { "hostname": i.hostname, "ip": i.network_ip, "port": i.port, "username": i.user.username, "password": decrypt_p(i.user.password), "private_key": i.user.private_key.name, "vars": varall, }, ) t = cmdjob(assets, tasks) ret_data['data'] = t return HttpResponse(json.dumps(ret_data))
def post(request): name = Names.objects.get(username=request.user) ids = request.POST.getlist('id') args = request.POST.getlist('args', None) modules = request.POST.getlist('module', None) ret_data = {'data': []} if not ids or args == [''] or not modules: ret = {'hostname': None, 'data': "请选中服务器,输入要执行的命令"} ret_data['data'].append(ret) return HttpResponse(json.dumps(ret_data)) idstring = ','.join(ids) asset_obj = AssetInfo.objects.extra(where=['id IN (' + idstring + ')']) for i in asset_obj: project = AssetInfo.objects.get(hostname=i).project project_obj = AssetProject.objects.get(projects=project) hasperm = name.has_perm('cmd_assetproject', project_obj) if hasperm == False: return HttpResponse(status=500) tasks, assets = [], [] for x in range(len(modules)): tasks.append( {"action": {"module": modules[x], "args": args[x]}, "name": 'task{}'.format(x)}, ) for i in asset_obj: try: i.user.hostname except Exception as e: logger.error(e) ret = { 'hostname': i.hostname, 'data': '未关联用户,请关联后再操作 {0}'.format(e)} ret_data['data'].append(ret) return HttpResponse(json.dumps(ret_data)) var_all = { 'hostname': i.hostname, 'inner_ip': i.inner_ip, "network_ip": i.network_ip, "project": i.project.projects} try: var_all.update(Variable.objects.get(assets__hostname=i).vars) except Exception as e: pass assets.append({ "hostname": i.hostname, "ip": i.network_ip, "port": i.port, "username": i.user.username, "password": decrypt_p(i.user.password), "private_key": i.user.private_key.name, "vars": var_all, }, ) t = cmdjob(assets, tasks) ret_data['data'] = t return HttpResponse(json.dumps(ret_data))
def post(request): name = Names.objects.get(username=request.user) ids = request.POST.getlist('id') args = request.POST.getlist('args', None) modules = request.POST.getlist('module', None) ret_data = {'data': []} if not ids or args == [''] or not modules: ret = {'hostname': None, 'data': "请选中服务器,输入要执行的命令"} ret_data['data'].append(ret) return HttpResponse(json.dumps(ret_data)) idstring = ','.join(ids) asset_obj = AssetInfo.objects.extra(where=['id IN (' + idstring + ')']) for i in asset_obj: project = AssetInfo.objects.get(hostname=i).project project_obj = AssetProject.objects.get(projects=project) hasperm = name.has_perm('cmd_assetproject', project_obj) if not hasperm: return HttpResponse(status=500) tasks, assets = [], [] for x in range(len(modules)): tasks.append( {"action": {"module": modules[x], "args": args[x]}, "name": 'task{}'.format(x)}, ) for i in asset_obj: try: i.user.hostname except Exception as e: logger.error(e) ret = { 'hostname': i.hostname, 'data': '未关联用户,请关联后再操作 {0}'.format(e)} ret_data['data'].append(ret) return HttpResponse(json.dumps(ret_data)) var_all = { 'hostname': i.hostname, 'inner_ip': i.inner_ip, "network_ip": i.network_ip, "project": i.project.projects} try: var_all.update(Variable.objects.get(assets__hostname=i).vars) except Exception as e: pass assets.append({ "hostname": i.hostname, "ip": i.network_ip, "port": i.port, "username": i.user.username, "password": decrypt_p(i.user.password), "private_key": i.user.private_key.name, "vars": var_all, }, ) t = cmdjob(assets, tasks) ret_data['data'] = t return HttpResponse(json.dumps(ret_data))
def taillog(request, hostname, port, username, password, private, tail): """ 执行 tail log 接口 """ channel_layer = get_channel_layer() user = request.user.username os.environ["".format(user)] = "true" ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) if password: ssh.connect(hostname=hostname, port=port, username=username, password=decrypt_p(password)) else: pkey = paramiko.RSAKey.from_private_key_file("{0}".format(private)) ssh.connect(hostname=hostname, port=port, username=username, pkey=pkey) cmd = "tail " + tail stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True) for line in iter(stdout.readline, ""): if os.environ.get("".format(user)) == 'false': break result = {"status": 0, 'data': line} result_all = json.dumps(result) async_to_sync(channel_layer.group_send)(user, {"type": "user.message", 'text': result_all})
def post(request): """ 执行工具 :param request: asset_id,tool_id :return: ret """ ret = { 'status': True, 'error': None, } name = Names.objects.get(username=request.user) try: asset_id = request.POST.getlist('asset[]', None) tool_id = request.POST.getlist('tool[]', None) if asset_id == [] or tool_id == []: ret['status'] = False ret['error'] = '未选择主机 或 未选择工具' return HttpResponse(json.dumps(ret)) asset_id_tring = ','.join(asset_id) asset_obj = AssetInfo.objects.extra( where=['id IN (' + asset_id_tring + ')']) for i in asset_obj: pro = AssetInfo.objects.get(hostname=i).project proj = AssetProject.objects.get(projects=pro) rets = name.has_perm('cmd_assetproject', proj) if rets == False: return HttpResponse(status=403) tool_obj = Tools.objects.filter(id=int(tool_id[0])).first() assets = [] for i in asset_obj: varall = { 'hostname': i.hostname, 'inner_ip': i.inner_ip, "network_ip": i.network_ip, "project": i.project.projects } try: varall.update( Variable.objects.get(assets__hostname=i).vars) except Exception as e: logger.error(e) assets.append( { "hostname": i.hostname, "ip": i.network_ip, "port": i.port, "username": i.user.username, "password": decrypt_p(i.user.password), "private_key": i.user.private_key.name, "vars": varall, }, ) file = "data/script/{0}".format(random.randint(0, 999999)) file2 = "data/script/{0}".format(random.randint(1000000, 9999999)) rets = None if tool_obj.tool_run_type == 'shell' or tool_obj.tool_run_type == 'python': with open("{}.sh".format(file), 'w+') as f: f.write(tool_obj.tool_script) os.system("sed 's/\r//' {0}.sh > {1}.sh".format( file, file2)) rets = ansbile_tools.delay(assets, '{}.sh'.format(file2), "script") elif tool_obj.tool_run_type == 'yml': with open("{}.yml".format(file), 'w+') as f: f.write(tool_obj.tool_script) os.system("sed 's/\r//' {0}.yml > {1}.yml".format( file, file2)) rets = ansbile_tools.delay(assets, tools='{}.yml'.format(file2), modules="yml") task_obj = ToolsResults.objects.create(task_id=rets.task_id) ret['id'] = task_obj.id return HttpResponse(json.dumps(ret)) except Exception as e: ret['status'] = False ret['error'] = '创建任务失败,{0}'.format(e) return HttpResponse(json.dumps(ret))
def ansbile_tools_crontab(tools_name, *args): current_process()._config = {'semprefix': '/mp'} a_list, assets_list = [], [] for i in args: AssetInfo.objects.get(hostname=i) a_list.append(AssetInfo.objects.get(hostname=i)) t_obj = Tools.objects.get(name=tools_name) for i in a_list: var_all = { 'hostname': i.hostname, 'inner_ip': i.inner_ip, "network_ip": i.network_ip, "project": i.project.projects } try: var_all.update( Variable.objects.get(assets__hostname=i.hostname).vars) except Exception as e: pass assets_list.append( { "hostname": i.hostname, "ip": i.network_ip, "port": i.port, "username": i.user.username, "password": decrypt_p(i.user.password), "private_key": i.user.private_key.name, "vars": var_all, }, ) file = "data/script/{0}".format(random.randint(0, 999999)) file2 = "data/script/{0}".format(random.randint(1000000, 9999999)) tools, modules = None, None if t_obj.tool_run_type == 'shell' or t_obj.tool_run_type == 'python': with open("{}.sh".format(file), 'w+') as f: f.write(t_obj.tool_script) os.system("sed 's/\r//' {0}.sh > {1}.sh".format(file, file2)) tools = '{}.sh'.format(file2) modules = "script" elif t_obj.tool_run_type == 'yml': with open("{}.yml".format(file), 'w+') as f: f.write(t_obj.tool_script) os.system("sed 's/\r//' {0}.yml > {1}.yml".format(file, file2)) tools = '{}.yml'.format(file2) modules = "yml" inventory = BaseInventory(host_list=assets_list) hostname, retsult_data = [], [] for i in inventory.hosts: hostname.append(i) ret = None if modules == "script": runner = AdHocRunner(inventory) tasks = [ { "action": { "module": "{}".format(modules), "args": "{}".format(tools) }, "name": "script" }, ] retsult = runner.run(tasks, "all") try: ok = retsult.results_raw['ok'] failed = retsult.results_raw['failed'] unreachable = retsult.results_raw['unreachable'] if not ok and not failed: ret = unreachable elif not ok: ret = failed else: ret = ok except Exception as e: logger.error("{}".format(e)) for i, element in enumerate(hostname): std, ret_host = [], {} try: out = ret[element]['script']['stdout'] if not out: out = ret[element]['script']['stderr'] std.append("{0}".format(out)) except Exception as e: logger.error(e) try: std.append("{0}".format(ret[element]['script']['msg'])) except Exception as e: logger.error("执行失败{0}".format(e)) ret_host['hostname'] = element ret_host['data'] = ''.join(std) retsult_data.append(ret_host) elif modules == 'yml': runers = PlayBookRunner(playbook_path=tools, inventory=inventory) retsult = runers.run() try: ret = retsult['results_callback'] except Exception as e: logger.error("{}".format(e)) for i, element in enumerate(hostname): std, ret_host = [], {} try: out = ret[element]['stdout'] if not out: out = ret[element]['stderr'] std.append("{0}".format(out)) except Exception as e: logger.error(e) try: std.append("{0}".format(ret[element]['msg'])) except Exception as e: logger.error("执行失败{0}".format(e)) ret_host['hostname'] = element ret_host['data'] = ''.join(std) retsult_data.append(ret_host) return retsult_data
def post(request): """ 执行工具 :param request: asset_id,tool_id,priority :return: ret """ ret = { 'status': True, 'error': None, } name = Names.objects.get(username=request.user) try: asset_id = request.POST.getlist('asset_id', None) tool_id = request.POST.getlist('tool_id', None) priority = request.POST.getlist('priority', None) if asset_id == [] or tool_id == [] or priority == []: ret['status'] = False ret['error'] = '未选择主机 或 未选择脚本 或 未设置优先级' return HttpResponse(json.dumps(ret)) while '' in priority: priority.remove('') for i in priority: if priority.count(i) >= 2: ret['status'] = False ret['error'] = '优先级设置有重复 ,请重新修改!!!' return HttpResponse(json.dumps(ret)) asset_id_tring = ','.join(asset_id) asset_obj = AssetInfo.objects.extra( where=['id IN (' + asset_id_tring + ')']) for i in asset_obj: project = AssetInfo.objects.get(hostname=i).project project_obj = AssetProject.objects.get(projects=project) hasperm = name.has_perm('cmd_assetproject', project_obj) if not hasperm: return HttpResponse(status=500) assets = [] for i in asset_obj: var_all = { 'hostname': i.hostname, 'inner_ip': i.inner_ip, "network_ip": i.network_ip, "project": i.project.projects } try: var_all.update( Variable.objects.get(assets__hostname=i).vars) except Exception as e: pass assets.append( { "hostname": i.hostname, "ip": i.network_ip, "port": i.port, "username": i.user.username, "password": decrypt_p(i.user.password), "private_key": i.user.private_key.name, "vars": var_all, }, ) tool_priority_1 = dict(zip(tool_id, priority)) tool_priority = sorted(tool_priority_1.items(), key=lambda item: item[1]) tasks = [] for i in tool_priority: tool_obj = Tools.objects.get(id=i[0]) if tool_obj.tool_run_type == 'shell' or tool_obj.tool_run_type == 'python': t = time.time() file = "data/script/{0}".format( int(round(t * 1000)) + random.randint(0, 999999)) t1 = time.time() file2 = "data/script/{0}".format( int(round(t1 * 1000)) + random.randint(10000000, 99999999)) with open("{}.sh".format(file), 'w+') as f: f.write(tool_obj.tool_script) os.system("sed 's/\r//' {0}.sh > {1}.sh".format( file, file2)) tasks.append( { "action": { "module": "script", "args": '{}.sh'.format(file2), }, "name": 'task{}'.format(i[1]) }, ) elif tool_obj.tool_run_type == 'yml': t = time.time() file = "data/script/{0}".format( int(round(t * 1000)) + random.randint(0, 999999)) t1 = time.time() file2 = "data/script/{0}".format( int(round(t1 * 1000)) + random.randint(10000000, 99999999)) with open("{}.yml".format(file), 'w+') as f: f.write(tool_obj.tool_script) os.system("sed 's/\r//' {0}.yml > {1}.yml".format( file, file2)) tasks.append( { "action": { "module": "yml", "args": '{}.yml'.format(file2), }, "name": 'task{}'.format(i[1]) }, ) rets = ansbile_tools.delay(assets, tasks) task_obj = ToolsResults.objects.create(task_id=rets.task_id, add_user=name) ret['id'] = task_obj.id return HttpResponse(json.dumps(ret)) except Exception as e: ret['status'] = False ret['error'] = '创建任务失败,{0}'.format(e) return HttpResponse(json.dumps(ret))
def post(self, request): ids = request.POST.getlist('id') args = request.POST.getlist('args', None) module = request.POST.getlist('module', None) idstring = ','.join(ids) asset_obj = asset.objects.extra(where=['id IN (' + idstring + ')']) tasks, assets = [], [] for x in range(len(module)): tasks.append( { "action": { "module": module[x], "args": args[x] }, "name": 'task{}'.format(x) }, ) ret_data = {'data': []} for i in asset_obj: try: test = i.user.hostname except Exception as e: logger.error(e) ret = { 'hostname': i.hostname, 'data': '未关联用户,请关联后再操作 {0}'.format(e) } ret_data['data'].append(ret) return HttpResponse(json.dumps(ret_data)) vars = { 'hostname': i.hostname, 'inner_ip': i.inner_ip, "network_ip": i.network_ip, "project": i.project } try: vars.update(variable.objects.get(assets__hostname=i).vars) except Exception as e: logger.error(e) assets.append([{ "hostname": i.hostname, "ip": i.network_ip, "port": i.port, "username": i.user.username, "password": decrypt_p(i.user.password), "private_key": i.user.private_key.name, "vars": vars, }], ) t_list = [] for i in range(asset_obj.count()): t = MyThread(ThreadCmdJob, args=( assets[i], tasks, )) t_list.append(t) t.start() for j in t_list: j.join() ret = j.get_result() ret_data['data'].append(ret) return HttpResponse(json.dumps(ret_data))
def post(self, request): """ 执行工具 :param request: asset_id,tool_id :return: ret """ ret = { 'status': True, 'error': None, } try: asset_id = request.POST.getlist('asset[]', None) tool_id = request.POST.getlist('tool[]', None) if asset_id == [] or tool_id == []: ret['status'] = False ret['error'] = '未选择主机 或 未选择工具' return HttpResponse(json.dumps(ret)) asset_id_tring = ','.join(asset_id) asset_obj = asset.objects.extra( where=['id IN (' + asset_id_tring + ')']) tool_obj = tools_script.objects.filter(id=int(tool_id[0])).first() assets = [] for i in asset_obj: assets.append( [{ "hostname": i.hostname, "ip": i.network_ip, "port": i.port, "username": i.user.username, "password": decrypt_p(i.user.password), "private_key": i.user.private_key.name, # "vars": {'name':123}, 变量 }], ) file = "data/script/{0}".format(random.randint(0, 999999)) file2 = "data/script/{0}".format(random.randint(1000000, 9999999)) if tool_obj.tool_run_type == 'shell' or tool_obj.tool_run_type == 'python': with open("{}.sh".format(file), 'w+') as f: f.write(tool_obj.tool_script) os.system("sed 's/\r//' {0}.sh > {1}.sh".format( file, file2)) rets = ansbile_tools.delay(assets, '{}.sh'.format(file2), "script") elif tool_obj.tool_run_type == 'yml': with open("{}.yml".format(file), 'w+') as f: f.write(tool_obj.tool_script) os.system("sed 's/\r//' {0}.yml > {1}.yml".format( file, file2)) rets = ansbile_tools.delay(assets, '{}.yml'.format(file2), "yml") task_obj = tool_results.objects.create(task_id=rets.task_id) ret['id'] = task_obj.id except Exception as e: ret['status'] = False ret['error'] = '创建任务失败,{0}'.format(e) finally: return HttpResponse(json.dumps(ret))
def post(request): """ 执行工具 :param request: asset_id,tool_id,priority :return: ret """ ret = {'status': True, 'error': None, } name = Names.objects.get(username=request.user) try: asset_id = request.POST.getlist('asset_id', None) tool_id = request.POST.getlist('tool_id', None) priority = request.POST.getlist('priority', None) if asset_id == [] or tool_id == [] or priority == ['']: ret['status'] = False ret['error'] = '未选择主机 或 未选择脚本 或 未设置优先级' return HttpResponse(json.dumps(ret)) for i in priority: if priority.count(i) >= 2: ret['status'] = False ret['error'] = '优先级设置有重复 ,请重新修改!!!' return HttpResponse(json.dumps(ret)) asset_id_tring = ','.join(asset_id) asset_obj = AssetInfo.objects.extra(where=['id IN (' + asset_id_tring + ')']) for i in asset_obj: project = AssetInfo.objects.get(hostname=i).project project_obj = AssetProject.objects.get(projects=project) hasperm = name.has_perm('cmd_assetproject', project_obj) if not hasperm: return HttpResponse(status=500) assets = [] for i in asset_obj: var_all = { 'hostname': i.hostname, 'inner_ip': i.inner_ip, "network_ip": i.network_ip, "project": i.project.projects } try: var_all.update(Variable.objects.get(assets__hostname=i).vars) except Exception as e: pass assets.append({ "hostname": i.hostname, "ip": i.network_ip, "port": i.port, "username": i.user.username, "password": decrypt_p(i.user.password), "private_key": i.user.private_key.name, "vars": var_all, }, ) tool_priority_1 = dict(zip(tool_id, priority)) tool_priority = sorted(tool_priority_1.items(), key=lambda item: item[1]) tasks = [] for i in tool_priority: tool_obj = Tools.objects.get(id=i[0]) if tool_obj.tool_run_type == 'shell' or tool_obj.tool_run_type == 'python': t = time.time() file = "data/script/{0}".format(int(round(t * 1000)) + random.randint(0, 999999)) t1 = time.time() file2 = "data/script/{0}".format(int(round(t1 * 1000)) + random.randint(10000000, 99999999)) with open("{}.sh".format(file), 'w+') as f: f.write(tool_obj.tool_script) os.system("sed 's/\r//' {0}.sh > {1}.sh".format(file, file2)) tasks.append({"action": {"module": "script", "args": '{}.sh'.format(file2), }, "name": 'task{}'.format(i[1])}, ) elif tool_obj.tool_run_type == 'yml': t = time.time() file = "data/script/{0}".format(int(round(t * 1000)) + random.randint(0, 999999)) t1 = time.time() file2 = "data/script/{0}".format(int(round(t1 * 1000)) + random.randint(10000000, 99999999)) with open("{}.yml".format(file), 'w+') as f: f.write(tool_obj.tool_script) os.system("sed 's/\r//' {0}.yml > {1}.yml".format(file, file2)) tasks.append({"action": {"module": "yml", "args": '{}.yml'.format(file2), }, "name": 'task{}'.format(i[1])}, ) rets = ansbile_tools.delay(assets, tasks) task_obj = ToolsResults.objects.create(task_id=rets.task_id, add_user=name) ret['id'] = task_obj.id return HttpResponse(json.dumps(ret)) except Exception as e: ret['status'] = False ret['error'] = '创建任务失败,{0}'.format(e) return HttpResponse(json.dumps(ret))