def user_perm_asset_num(user_id): user = get_object(User, id=user_id) if user: user_perm_info = get_group_user_perm(user) return len(user_perm_info.get('asset').keys()) else: return 0
def download(request): user = request.user assets = get_group_user_perm(user).get('asset').keys() asset_select = [] if request.method == 'POST': remote_ip = request.META.get('REMOTE_ADDR') asset_ids = request.POST.getlist('asset_ids', '') file_path = request.POST.get('file_path') date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S") upload_dir = get_tmp_dir() for asset_id in asset_ids: asset_select.append(get_object(Asset, id=asset_id)) if not set(asset_select).issubset(set(assets)): illegal_asset = set(asset_select).issubset(set(assets)) return HttpResponse(u'没有权限的服务器 %s' % ','.join([asset.hostname for asset in illegal_asset])) res = gen_resource({'user': user, 'asset': asset_select}) runner = MyRunner(res) runner.run('fetch', module_args='src=%s dest=%s' % (file_path, upload_dir), pattern='*') FileLog(user=request.user.username, host=' '.join([asset.hostname for asset in asset_select]), filename=file_path, type='download', remote_ip=remote_ip, result=runner.results).save() logger.debug(runner.results) os.chdir('/tmp') tmp_dir_name = os.path.basename(upload_dir) tar_file = '%s.tar.gz' % upload_dir bash('tar czf %s %s' % (tar_file, tmp_dir_name)) f = open(tar_file) data = f.read() f.close() response = HttpResponse(data, content_type='application/octet-stream') response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(tar_file) return response return render_to_response('download.html', locals(), context_instance=RequestContext(request))
def search(self, str_r=''): gid_pattern = re.compile(r'^g\d+$') # 获取用户授权的所有主机信息 if not self.user_perm: self.user_perm = get_group_user_perm(self.user) user_asset_all = self.user_perm.get('asset').keys() # 搜索结果保存 user_asset_search = [] if str_r: # 资产组组id匹配 if gid_pattern.match(str_r): gid = int(str_r.lstrip('g')) # 获取资产组包含的资产 user_asset_search = get_object(AssetGroup, id=gid).asset_set.all() else: # 匹配 ip, hostname, 备注 for asset in user_asset_all: if str_r in asset.ip or str_r in str(asset.hostname) or str_r in str(asset.comment): user_asset_search.append(asset) else: # 如果没有输入就展现所有 user_asset_search = user_asset_all self.search_result = dict(zip(range(len(user_asset_search)), user_asset_search)) color_print('[%-3s] %-12s %-15s %-5s %-10s %s' % ('ID', u'主机名', 'IP', u'端口', u'系统用户', u'备注'), 'title') for index, asset in self.search_result.items(): # 获取该资产信息 asset_info = get_asset_info(asset) # 获取该资产包含的角色 role = [str(role.name) for role in self.user_perm.get('asset').get(asset).get('role')] print '[%-3s] %-15s %-15s %-5s %-10s %s' % (index, asset.hostname, asset.ip, asset_info.get('port'), role, asset.comment) print
def print_asset_group(self): """ 打印用户授权的资产组 """ user_asset_group_all = get_group_user_perm(self.user).get('asset_group', []) color_print('[%-3s] %-20s %s' % ('ID', '组名', '备注'), 'title') for asset_group in user_asset_group_all: print '[%-3s] %-15s %s' % (asset_group.id, asset_group.name, asset_group.comment) print
def download(self): while True: if not self.user_perm: self.user_perm = get_group_user_perm(self.user) try: print "进入批量下载模式" print "请输入主机名或ansile支持的pattern, 多个主机:分隔,q退出" pattern = raw_input("\033[1;32mPattern>:\033[0m ").strip() if pattern == 'q': break else: assets = self.user_perm.get('asset').keys() res = gen_resource({'user': self.user, 'asset': assets}, perm=self.user_perm) runner = MyRunner(res) asset_name_str = '' print "匹配用户:\n" for inv in runner.inventory.get_hosts(pattern=pattern): asset_name_str += '%s ' % inv.name print ' %s' % inv.name if not asset_name_str: color_print('没有匹配主机') continue print while True: tmp_dir = get_tmp_dir() logger.debug('Download tmp dir: %s' % tmp_dir) print "请输入文件路径(不支持目录)" file_path = raw_input("\033[1;32mPath>:\033[0m ").strip() if file_path == 'q': break if not file_path: color_print("文件路径为空") continue runner.run('fetch', module_args='src=%s dest=%s' % (file_path, tmp_dir), pattern=pattern) ret = runner.results FileLog(user=self.user.name, host=asset_name_str, filename=file_path, type='download', remote_ip=remote_ip, result=ret).save() logger.debug('Download file result: %s' % ret) os.chdir('/tmp') tmp_dir_name = os.path.basename(tmp_dir) if not os.listdir(tmp_dir): color_print('下载全部失败') continue bash('tar czf %s.tar.gz %s && sz %s.tar.gz' % (tmp_dir, tmp_dir_name, tmp_dir)) if ret.get('failed'): error = '文件名称: %s \n下载失败: [ %s ] \n下载成功 [ %s ]' % \ ('%s.tar.gz' % tmp_dir_name, ', '.join(ret.get('failed').keys()), ', '.join(ret.get('ok').keys())) color_print(error) else: msg = '文件名称: %s \n下载成功 [ %s ]' % ('%s.tar.gz' % tmp_dir_name, ', '.join(ret.get('ok').keys())) color_print(msg, 'green') print except IndexError: pass
def print_asset_group(self): """ 打印用户授权的资产组 """ user_asset_group_all = get_group_user_perm(self.user).get("asset_group", []) color_print("[%-3s] %-20s %s" % ("ID", "组名", "备注"), "title") for asset_group in user_asset_group_all: print "[%-3s] %-15s %s" % (asset_group.id, asset_group.name, asset_group.comment) print
def rule_list(request): """ rule list view """ header_title, path1, path2 = u'查看规则', u'灰度管理', u'查看规则' username = request.user.username user_perm = request.session['role_id'] rule_status = RULE_STATUS status = request.GET.get('status', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) rule_id_all = request.GET.getlist("id", '') rule_find = Rule.objects.all() if user_perm != 0: rule_find = Rule.objects.all() else: rule_id_all = [] user = get_object(User, username=username) rule_perm = get_group_user_perm(user) if user else {'rule': ''} user_rule_perm = rule_perm['rule'].keys() for rule in user_rule_perm: rule_id_all.append(rule.id) rule_find = Rule.objects.filter(pk__in=rule_id_all) if status: rule_find = rule_find.filter(status__contains=status) if keyword: rule_find = rule_find.filter( Q(name__contains=keyword) | Q(shortname__contains=keyword) | Q(content__contains=keyword) | Q(comment__contains=keyword)) if export: if rule_id_all: rule_find = [] for rule_id in rule_id_all: rule = get_object(Rule, id=rule_id) if rule: rule_find.append(rule) s = write_rule_excel(rule_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upgray/rule_excel_download.html', locals(), request) rules_list, p, rules, page_range, current_page, show_first, show_end = pages(rule_find, request) if user_perm != 0: return my_render('upgray/rule_list.html', locals(), request) else: return my_render('upgray/rule_cu_list.html', locals(), request)
def upload(self): while True: if not self.user_perm: self.user_perm = get_group_user_perm(self.user) try: print "进入批量上传模式" print "请输入主机名或ansile支持的pattern, 多个主机:分隔 q退出" pattern = raw_input("\033[1;32mPattern>:\033[0m ").strip() if pattern == 'q': break else: assets = self.user_perm.get('asset').keys() res = gen_resource({'user': self.user, 'asset': assets}, perm=self.user_perm) runner = MyRunner(res) asset_name_str = '' print "匹配主机:" for inv in runner.inventory.get_hosts(pattern=pattern): print inv.name asset_name_str += '%s ' % inv.name if not asset_name_str: color_print('没有匹配主机') continue tmp_dir = get_tmp_dir() logger.debug('Upload tmp dir: %s' % tmp_dir) os.chdir(tmp_dir) bash('rz') filename_str = ' '.join(os.listdir(tmp_dir)) if not filename_str: color_print("上传文件为空") continue logger.debug('上传文件: %s' % filename_str) runner = MyRunner(res) runner.run('copy', module_args='src=%s dest=%s directory_mode' % (tmp_dir, tmp_dir), pattern=pattern) ret = runner.results FileLog(user=self.user.name, host=asset_name_str, filename=filename_str, remote_ip=remote_ip, type='upload', result=ret).save() logger.debug('Upload file: %s' % ret) if ret.get('failed'): error = '上传目录: %s \n上传失败: [ %s ] \n上传成功 [ %s ]' % (tmp_dir, ', '.join(ret.get('failed').keys()), ', '.join(ret.get('ok').keys())) color_print(error) else: msg = '上传目录: %s \n传送成功 [ %s ]' % (tmp_dir, ', '.join(ret.get('ok').keys())) color_print(msg, 'green') print except IndexError: pass
def rule_list(request): """ rule list view """ header_title, path1, path2 = u'查看规则', u'灰度管理', u'查看规则' username = request.user.username user_perm = request.session['role_id'] rule_status = RULE_STATUS status = request.GET.get('status', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) rule_id_all = request.GET.getlist("id", '') rule_find = Rule.objects.all() if user_perm != 0: rule_find = Rule.objects.all() else: rule_id_all = [] user = get_object(User, username=username) rule_perm = get_group_user_perm(user) if user else {'rule': ''} user_rule_perm = rule_perm['rule'].keys() for rule in user_rule_perm: rule_id_all.append(rule.id) rule_find = Rule.objects.filter(pk__in=rule_id_all) if status: rule_find = rule_find.filter(status__contains=status) if keyword: rule_find = rule_find.filter( Q(name__contains=keyword) | Q(shortname__contains=keyword) | Q(content__contains=keyword) | Q(comment__contains=keyword)) if export: if rule_id_all: rule_find = [] for rule_id in rule_id_all: rule = get_object(Rule, id=rule_id) if rule: rule_find.append(rule) s = write_rule_excel(rule_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upgray/rule_excel_download.html', locals(), request) rules_list, p, rules, page_range, current_page, show_first, show_end = pages( rule_find, request) if user_perm != 0: return my_render('upgray/rule_list.html', locals(), request) else: return my_render('upgray/rule_cu_list.html', locals(), request)
def upload(request): user = request.user assets = get_group_user_perm(user).get('asset').keys() asset_select = [] if request.method == 'POST': remote_ip = request.META.get('REMOTE_ADDR') asset_ids = request.POST.getlist('asset_ids', '') upload_files = request.FILES.getlist('file[]', None) date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S") upload_dir = get_tmp_dir() # file_dict = {} for asset_id in asset_ids: asset_select.append(get_object(Asset, id=asset_id)) if not set(asset_select).issubset(set(assets)): illegal_asset = set(asset_select).issubset(set(assets)) return HttpResponse( '没有权限的服务器 %s' % ','.join([asset.hostname for asset in illegal_asset])) for upload_file in upload_files: file_path = '%s/%s' % (upload_dir, upload_file.name) with open(file_path, 'w') as f: for chunk in upload_file.chunks(): f.write(chunk) res = gen_resource({'user': user, 'asset': asset_select}) runner = MyRunner(res) runner.run('copy', module_args='src=%s dest=%s directory_mode' % (upload_dir, upload_dir), pattern='*') ret = runner.results logger.debug(ret) FileLog(user=request.user.username, host=' '.join([asset.hostname for asset in asset_select]), filename=' '.join([f.name for f in upload_files]), type='upload', remote_ip=remote_ip, result=ret).save() if ret.get('failed'): error = u'上传目录: %s <br> 上传失败: [ %s ] <br>上传成功 [ %s ]' % ( upload_dir, ', '.join(ret.get('failed').keys()), ', '.join( ret.get('ok').keys())) return HttpResponse(error, status=500) msg = u'上传目录: %s <br> 传送成功 [ %s ]' % (upload_dir, ', '.join( ret.get('ok').keys())) return HttpResponse(msg) return my_render('upload.html', locals(), request)
def download(request): user = request.user assets = get_group_user_perm(user).get('asset').keys() asset_select = [] if request.method == 'POST': remote_ip = request.META.get('REMOTE_ADDR') asset_ids = request.POST.getlist('asset_ids', '') file_path = request.POST.get('file_path') date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S") upload_dir = get_tmp_dir() for asset_id in asset_ids: asset_select.append(get_object(Asset, id=asset_id)) if not set(asset_select).issubset(set(assets)): illegal_asset = set(asset_select).issubset(set(assets)) return HttpResponse( u'没有权限的服务器 %s' % ','.join([asset.hostname for asset in illegal_asset])) res = gen_resource({'user': user, 'asset': asset_select}) runner = MyRunner(res) runner.run('fetch', module_args='src=%s dest=%s' % (file_path, upload_dir), pattern='*') FileLog(user=request.user.username, host=' '.join([asset.hostname for asset in asset_select]), filename=file_path, type='download', remote_ip=remote_ip, result=runner.results).save() logger.debug(runner.results) os.chdir('/tmp') tmp_dir_name = os.path.basename(upload_dir) tar_file = '%s.tar.gz' % upload_dir bash('tar czf %s %s' % (tar_file, tmp_dir_name)) f = open(tar_file) data = f.read() f.close() response = HttpResponse(data, content_type='application/octet-stream') response[ 'Content-Disposition'] = 'attachment; filename=%s' % os.path.basename( tar_file) return response return render_to_response('download.html', locals(), context_instance=RequestContext(request))
def user_detail(request): header_title, path1, path2 = '用户详情', '用户管理', '用户详情' if request.session.get('role_id') == 0: user_id = request.user.id else: user_id = request.GET.get('id', '') user = get_object(User, id=user_id) if not user: return HttpResponseRedirect(reverse('user_list')) user_perm_info = get_group_user_perm(user) role_assets = user_perm_info.get('role') user_log_ten = Log.objects.filter(user=user.username).order_by('id')[0:10] user_log_last = Log.objects.filter(user=user.username).order_by('id')[0:50] user_log_last_num = len(user_log_last) return my_render('upuser/user_detail.html', locals(), request)
def upload(request): user = request.user assets = get_group_user_perm(user).get('asset').keys() asset_select = [] if request.method == 'POST': remote_ip = request.META.get('REMOTE_ADDR') asset_ids = request.POST.getlist('asset_ids', '') upload_files = request.FILES.getlist('file[]', None) date_now = datetime.datetime.now().strftime("%Y%m%d%H%M%S") upload_dir = get_tmp_dir() # file_dict = {} for asset_id in asset_ids: asset_select.append(get_object(Asset, id=asset_id)) if not set(asset_select).issubset(set(assets)): illegal_asset = set(asset_select).issubset(set(assets)) return HttpResponse('没有权限的服务器 %s' % ','.join([asset.hostname for asset in illegal_asset])) for upload_file in upload_files: file_path = '%s/%s' % (upload_dir, upload_file.name) with open(file_path, 'w') as f: for chunk in upload_file.chunks(): f.write(chunk) res = gen_resource({'user': user, 'asset': asset_select}) runner = MyRunner(res) runner.run('copy', module_args='src=%s dest=%s directory_mode' % (upload_dir, upload_dir), pattern='*') ret = runner.results logger.debug(ret) FileLog(user=request.user.username, host=' '.join([asset.hostname for asset in asset_select]), filename=' '.join([f.name for f in upload_files]), type='upload', remote_ip=remote_ip, result=ret).save() if ret.get('failed'): error = u'上传目录: %s <br> 上传失败: [ %s ] <br>上传成功 [ %s ]' % (upload_dir, ', '.join(ret.get('failed').keys()), ', '.join(ret.get('ok').keys())) return HttpResponse(error, status=500) msg = u'上传目录: %s <br> 传送成功 [ %s ]' % (upload_dir, ', '.join(ret.get('ok').keys())) return HttpResponse(msg) return my_render('upload.html', locals(), request)
def search(self, str_r=""): gid_pattern = re.compile(r"^g\d+$") # 获取用户授权的所有主机信息 if not self.user_perm: self.user_perm = get_group_user_perm(self.user) user_asset_all = self.user_perm.get("asset").keys() # 搜索结果保存 user_asset_search = [] if str_r: # 资产组组id匹配 if gid_pattern.match(str_r): gid = int(str_r.lstrip("g")) # 获取资产组包含的资产 user_asset_search = get_object(AssetGroup, id=gid).asset_set.all() else: # 匹配 ip, hostname, 备注 for asset in user_asset_all: if str_r in asset.ip or str_r in str(asset.hostname) or str_r in str(asset.comment): user_asset_search.append(asset) else: # 如果没有输入就展现所有 user_asset_search = user_asset_all self.search_result = dict(zip(range(len(user_asset_search)), user_asset_search)) color_print("[%-3s] %-12s %-15s %-5s %-10s %s" % ("ID", u"主机名", "IP", u"端口", u"系统用户", u"备注"), "title") for index, asset in self.search_result.items(): # 获取该资产信息 asset_info = get_asset_info(asset) # 获取该资产包含的角色 role = [str(role.name) for role in self.user_perm.get("asset").get(asset).get("role")] print "[%-3s] %-15s %-15s %-5s %-10s %s" % ( index, asset.hostname, asset.ip, asset_info.get("port"), role, asset.comment, ) print
def exec_cmd(self): """ 批量执行命令 """ while True: if not self.user_perm: self.user_perm = get_group_user_perm(self.user) roles = self.user_perm.get("role").keys() if len(roles) > 1: # 授权角色数大于1 color_print("[%-2s] %-15s" % ("ID", "系统用户"), "info") role_check = dict(zip(range(len(roles)), roles)) for i, r in role_check.items(): print "[%-2s] %-15s" % (i, r.name) print print "请输入运行命令所关联系统用户的ID, q退出" try: role_id = raw_input("\033[1;32mRole>:\033[0m ").strip() if role_id == "q": break except (IndexError, ValueError): color_print("错误输入") else: role = role_check[int(role_id)] elif len(roles) == 1: # 授权角色数为1 role = roles[0] assets = list(self.user_perm.get("role", {}).get(role).get("asset")) # 获取该用户,角色授权主机 print "授权包含该系统用户的所有主机" for asset in assets: print " %s" % asset.hostname print print "请输入主机名或ansile支持的pattern, 多个主机:分隔, q退出" pattern = raw_input("\033[1;32mPattern>:\033[0m ").strip() if pattern == "q": break else: res = gen_resource({"user": self.user, "asset": assets, "role": role}, perm=self.user_perm) runner = MyRunner(res) asset_name_str = "" print "匹配主机:" for inv in runner.inventory.get_hosts(pattern=pattern): print " %s" % inv.name asset_name_str += "%s " % inv.name print while True: print "请输入执行的命令, 按q退出" command = raw_input("\033[1;32mCmds>:\033[0m ").strip() if command == "q": break runner.run("shell", command, pattern=pattern) ExecLog( host=asset_name_str, user=self.user.username, cmd=command, remote_ip=remote_ip, result=runner.results, ).save() for k, v in runner.results.items(): if k == "ok": for host, output in v.items(): color_print("%s => %s" % (host, "Ok"), "green") print output print else: for host, output in v.items(): color_print("%s => %s" % (host, k), "red") color_print(output, "red") print print "~o~ Task finished ~o~" print
def dns_list(request): """ dns list view """ header_title, path1, path2 = u'查看域名', u'应用管理', u'查看域名' username = request.user.username user_perm = request.session['role_id'] app_group_all = AppGroup.objects.all() app_types = APP_TYPE app_envs = ENV_ENVS app_status = APP_STATUS group_name = request.GET.get('group', '') app_type = request.GET.get('app_type', '') app_env = request.GET.get('app_env', '') status = request.GET.get('status', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) group_id = request.GET.get("group_id", '') app_id_all = request.GET.getlist("id", '') if group_id: group = get_object(AppGroup, id=group_id) if group: app_find = App.objects.filter(group=group) else: if user_perm != 0: app_find = App.objects.all() else: app_id_all = [] user = get_object(User, username=username) app_perm = get_group_user_perm(user) if user else {'app': ''} user_app_perm = app_perm['app'].keys() for app in user_app_perm: app_id_all.append(app.id) app_find = App.objects.filter(pk__in=app_id_all) app_group_all = list(app_perm['app_group']) if app_env: app_find = app_find.filter(app_env__contains=app_env) if group_name: app_find = app_find.filter(group__name__contains=group_name) if app_type: app_find = app_find.filter(app_type__contains=app_type) if status: app_find = app_find.filter(status__contains=status) if keyword: app_find = app_find.filter( Q(name__contains=keyword) | Q(pre_value__contains=keyword) | Q(value__contains=keyword) | Q(comment__contains=keyword) | Q(group__name__contains=keyword)) if export: if app_id_all: app_find = [] for app_id in app_id_all: app = get_object(App, id=app_id) if app: app_find.append(app) s = write_excel(app_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upapp/web_excel_download.html', locals(), request) apps_list, p, apps, page_range, current_page, show_first, show_end = pages(app_find, request) if user_perm != 0: return my_render('upapp/dns_list.html', locals(), request) else: return my_render('upapp/dns_cu_list.html', locals(), request)
def map_list(request): """ map list view """ header_title, path1, path2 = u'查看映射', u'应用管理', u'查看映射' username = request.user.username user_perm = request.session['role_id'] map_envs = ENV_ENVS map_env = request.GET.get('app_env', '') node_ip = request.GET.get('node_ip', '') node = request.GET.get('node', '') path = request.GET.get('path', '') contextroot = request.GET.get('contextroot', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) map_id_all = request.GET.getlist("id", '') if user_perm != 0: map_find = Map.objects.all() else: map_id_all = [] user = get_object(User, username=username) map_perm = get_group_user_perm(user) if user else {'map': ''} user_map_perm = map_perm['map'].keys() for map in user_map_perm: map_id_all.append(map.id) map_find = Map.objects.filter(pk__in=map_id_all) map_group_all = list(map_perm['map_group']) if map_env: map_find = map_find.filter(map_env__contains=map_env) if node_ip: map_find = map_find.filter(node_ip__contains=node_ip) if node: map_find = map_find.filter(node__contains=node) if path: map_find = map_find.filter(path__contains=path) if contextroot: map_find = map_find.filter(contextroot__contains=contextroot) if keyword: map_find = map_find.filter( Q(name__contains=keyword) | Q(comment__contains=keyword) | Q(group__name__contains=keyword)) if export: if map_id_all: map_find = [] for map_id in map_id_all: map = get_object(Map, id=map_id) if map: map_find.append(map) s = write_excel(map_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upapp/app_excel_download.html', locals(), request) maps_list, p, maps, page_range, current_page, show_first, show_end = pages(map_find, request) if user_perm != 0: return my_render('upapp/map_list.html', locals(), request) else: return my_render('upapp/map_cu_list.html', locals(), request)
def system_list(request): """ system list view """ header_title, path1, path2 = u'查看系统', u'灰度管理', u'查看系统' username = request.user.username user_perm = request.session['role_id'] system_rule_all = Rule.objects.all() system_status = RULE_STATUS status = request.GET.get('status', '') rule_name = request.GET.get('rule_name', '') old_version = request.GET.get('old_version', '') new_version = request.GET.get('new_version', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) rule_id = request.GET.get("rule_id", '') system_id_all = request.GET.getlist("id", '') if rule_id: rule_name = get_object(Rule, id=rule_id) if rule_name: system_find = System.objects.filter(rule_name=rule_name) else: if user_perm != 0: system_find = System.objects.all() else: system_id_all = [] user = get_object(User, username=username) system_perm = get_group_user_perm(user) if user else {'system': ''} user_system_perm = system_perm['system'].keys() for system in user_system_perm: system_id_all.append(system.id) system_find = System.objects.filter(pk__in=system_id_all) system_rule_all = list(system_perm['system_rule']) if rule_name: system_find = system_find.filter(rule_name__name__contains=rule_name) if status: system_find = system_find.filter(status__contains=status) if keyword: system_find = system_find.filter( Q(name__contains=keyword) | Q(rule_name__name__contains=keyword) | Q(old_version__contains=keyword) | Q(new_version__contains=keyword) | Q(comment__contains=keyword)) if export: if system_id_all: system_find = [] for system_id in system_id_all: system = get_object(System, id=system_id) if system: system_find.append(system) s = write_system_excel(system_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upgray/system_excel_download.html', locals(), request) systems_list, p, systems, page_range, current_page, show_first, show_end = pages(system_find, request) if user_perm != 0: return my_render('upgray/system_list.html', locals(), request) else: return my_render('upgray/system_cu_list.html', locals(), request)
def etcd_list(request): """ etcd list view """ header_title, path1, path2 = u'查看参数', u'参数管理', u'查看参数' username = request.user.username user_perm = request.session['role_id'] etcd_group_all = EtcdGroup.objects.all() etcd_types = ETCD_TYPE etcd_envs = ENV_ENVS etcd_status = ETCD_STATUS group_name = request.GET.get('group', '') etcd_type = request.GET.get('etcd_type', '') etcd_env = request.GET.get('etcd_env', '') status = request.GET.get('status', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) group_id = request.GET.get("group_id", '') etcd_id_all = request.GET.getlist("id", '') if group_id: group = get_object(EtcdGroup, id=group_id) if group: etcd_find = Etcd.objects.filter(group=group) else: if user_perm != 0: etcd_find = Etcd.objects.all() else: etcd_id_all = [] user = get_object(User, username=username) etcd_perm = get_group_user_perm(user) if user else {'etcd': ''} user_etcd_perm = etcd_perm['etcd'].keys() for etcd in user_etcd_perm: etcd_id_all.append(etcd.id) etcd_find = Etcd.objects.filter(pk__in=etcd_id_all) etcd_group_all = list(etcd_perm['etcd_group']) if etcd_env: etcd_find = etcd_find.filter(etcd_env__contains=etcd_env) if group_name: etcd_find = etcd_find.filter(group__name__contains=group_name) if etcd_type: etcd_find = etcd_find.filter(etcd_type__contains=etcd_type) if status: etcd_find = etcd_find.filter(status__contains=status) if keyword: etcd_find = etcd_find.filter( Q(name__contains=keyword) | Q(pre_value__contains=keyword) | Q(value__contains=keyword) | Q(comment__contains=keyword) | Q(group__name__contains=keyword)) if export: if etcd_id_all: etcd_find = [] for etcd_id in etcd_id_all: etcd = get_object(Etcd, id=etcd_id) if etcd: etcd_find.append(etcd) s = write_excel(etcd_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upetcd/etcd_excel_download.html', locals(), request) etcds_list, p, etcds, page_range, current_page, show_first, show_end = pages(etcd_find, request) if user_perm != 0: return my_render('upetcd/etcd_list.html', locals(), request) else: return my_render('upetcd/etcd_cu_list.html', locals(), request)
def exec_cmd(self): """ 批量执行命令 """ while True: if not self.user_perm: self.user_perm = get_group_user_perm(self.user) roles = self.user_perm.get('role').keys() if len(roles) > 1: # 授权角色数大于1 color_print('[%-2s] %-15s' % ('ID', '系统用户'), 'info') role_check = dict(zip(range(len(roles)), roles)) for i, r in role_check.items(): print '[%-2s] %-15s' % (i, r.name) print print "请输入运行命令所关联系统用户的ID, q退出" try: role_id = raw_input("\033[1;32mRole>:\033[0m ").strip() if role_id == 'q': break except (IndexError, ValueError): color_print('错误输入') else: role = role_check[int(role_id)] elif len(roles) == 1: # 授权角色数为1 role = roles[0] assets = list(self.user_perm.get('role', {}).get(role).get('asset')) # 获取该用户,角色授权主机 print "授权包含该系统用户的所有主机" for asset in assets: print ' %s' % asset.hostname print print "请输入主机名或ansile支持的pattern, 多个主机:分隔, q退出" pattern = raw_input("\033[1;32mPattern>:\033[0m ").strip() if pattern == 'q': break else: res = gen_resource({'user': self.user, 'asset': assets, 'role': role}, perm=self.user_perm) runner = MyRunner(res) asset_name_str = '' print "匹配主机:" for inv in runner.inventory.get_hosts(pattern=pattern): print ' %s' % inv.name asset_name_str += '%s ' % inv.name print while True: print "请输入执行的命令, 按q退出" command = raw_input("\033[1;32mCmds>:\033[0m ").strip() if command == 'q': break runner.run('shell', command, pattern=pattern) ExecLog(host=asset_name_str, user=self.user.username, cmd=command, remote_ip=remote_ip, result=runner.results).save() for k, v in runner.results.items(): if k == 'ok': for host, output in v.items(): color_print("%s => %s" % (host, 'Ok'), 'green') print output print else: for host, output in v.items(): color_print("%s => %s" % (host, k), 'red') color_print(output, 'red') print print "~o~ Task finished ~o~" print
def asset_list(request): """ asset list view """ header_title, path1, path2 = u'查看资产', u'资产管理', u'查看资产' username = request.user.username user_perm = request.session['role_id'] idc_all = IDC.objects.filter() asset_group_all = AssetGroup.objects.all() asset_types = ASSET_TYPE asset_status = ASSET_STATUS idc_name = request.GET.get('idc', '') group_name = request.GET.get('group', '') asset_type = request.GET.get('asset_type', '') status = request.GET.get('status', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) group_id = request.GET.get("group_id", '') idc_id = request.GET.get("idc_id", '') asset_id_all = request.GET.getlist("id", '') if group_id: group = get_object(AssetGroup, id=group_id) if group: asset_find = Asset.objects.filter(group=group) elif idc_id: idc = get_object(IDC, id=idc_id) if idc: asset_find = Asset.objects.filter(idc=idc) else: if user_perm != 0: asset_find = Asset.objects.all() else: asset_id_all = [] user = get_object(User, username=username) asset_perm = get_group_user_perm(user) if user else {'asset': ''} user_asset_perm = asset_perm['asset'].keys() for asset in user_asset_perm: asset_id_all.append(asset.id) asset_find = Asset.objects.filter(pk__in=asset_id_all) asset_group_all = list(asset_perm['asset_group']) if idc_name: asset_find = asset_find.filter(idc__name__contains=idc_name) if group_name: asset_find = asset_find.filter(group__name__contains=group_name) if asset_type: asset_find = asset_find.filter(asset_type__contains=asset_type) if status: asset_find = asset_find.filter(status__contains=status) if keyword: asset_find = asset_find.filter( Q(hostname__contains=keyword) | Q(other_ip__contains=keyword) | Q(ip__contains=keyword) | Q(remote_ip__contains=keyword) | Q(comment__contains=keyword) | Q(username__contains=keyword) | Q(group__name__contains=keyword) | Q(cpu__contains=keyword) | Q(memory__contains=keyword) | Q(disk__contains=keyword) | Q(brand__contains=keyword) | Q(cabinet__contains=keyword) | Q(sn__contains=keyword) | Q(system_type__contains=keyword) | Q(system_version__contains=keyword)) if export: if asset_id_all: asset_find = [] for asset_id in asset_id_all: asset = get_object(Asset, id=asset_id) if asset: asset_find.append(asset) s = write_excel(asset_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upasset/asset_excel_download.html', locals(), request) assets_list, p, assets, page_range, current_page, show_first, show_end = pages(asset_find, request) if user_perm != 0: return my_render('upasset/asset_list.html', locals(), request) else: return my_render('upasset/asset_cu_list.html', locals(), request)
def system_list(request): """ system list view """ header_title, path1, path2 = u'查看系统', u'灰度管理', u'查看系统' username = request.user.username user_perm = request.session['role_id'] system_rule_all = Rule.objects.all() system_status = RULE_STATUS status = request.GET.get('status', '') rule_name = request.GET.get('rule_name', '') old_version = request.GET.get('old_version', '') new_version = request.GET.get('new_version', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) rule_id = request.GET.get("rule_id", '') system_id_all = request.GET.getlist("id", '') if rule_id: rule_name = get_object(Rule, id=rule_id) if rule_name: system_find = System.objects.filter(rule_name=rule_name) else: if user_perm != 0: system_find = System.objects.all() else: system_id_all = [] user = get_object(User, username=username) system_perm = get_group_user_perm(user) if user else {'system': ''} user_system_perm = system_perm['system'].keys() for system in user_system_perm: system_id_all.append(system.id) system_find = System.objects.filter(pk__in=system_id_all) system_rule_all = list(system_perm['system_rule']) if rule_name: system_find = system_find.filter(rule_name__name__contains=rule_name) if status: system_find = system_find.filter(status__contains=status) if keyword: system_find = system_find.filter( Q(name__contains=keyword) | Q(rule_name__name__contains=keyword) | Q(old_version__contains=keyword) | Q(new_version__contains=keyword) | Q(comment__contains=keyword)) if export: if system_id_all: system_find = [] for system_id in system_id_all: system = get_object(System, id=system_id) if system: system_find.append(system) s = write_system_excel(system_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upgray/system_excel_download.html', locals(), request) systems_list, p, systems, page_range, current_page, show_first, show_end = pages( system_find, request) if user_perm != 0: return my_render('upgray/system_list.html', locals(), request) else: return my_render('upgray/system_cu_list.html', locals(), request)
def etcd_list(request): """ etcd list view """ header_title, path1, path2 = u'查看参数', u'参数管理', u'查看参数' username = request.user.username user_perm = request.session['role_id'] etcd_group_all = EtcdGroup.objects.all() etcd_types = ETCD_TYPE etcd_envs = ENV_ENVS etcd_status = ETCD_STATUS group_name = request.GET.get('group', '') etcd_type = request.GET.get('etcd_type', '') etcd_env = request.GET.get('etcd_env', '') status = request.GET.get('status', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) group_id = request.GET.get("group_id", '') etcd_id_all = request.GET.getlist("id", '') if group_id: group = get_object(EtcdGroup, id=group_id) if group: etcd_find = Etcd.objects.filter(group=group) else: if user_perm != 0: etcd_find = Etcd.objects.all() else: etcd_id_all = [] user = get_object(User, username=username) etcd_perm = get_group_user_perm(user) if user else {'etcd': ''} user_etcd_perm = etcd_perm['etcd'].keys() for etcd in user_etcd_perm: etcd_id_all.append(etcd.id) etcd_find = Etcd.objects.filter(pk__in=etcd_id_all) etcd_group_all = list(etcd_perm['etcd_group']) if etcd_env: etcd_find = etcd_find.filter(etcd_env__contains=etcd_env) if group_name: etcd_find = etcd_find.filter(group__name__contains=group_name) if etcd_type: etcd_find = etcd_find.filter(etcd_type__contains=etcd_type) if status: etcd_find = etcd_find.filter(status__contains=status) if keyword: etcd_find = etcd_find.filter( Q(name__contains=keyword) | Q(pre_value__contains=keyword) | Q(value__contains=keyword) | Q(comment__contains=keyword) | Q(group__name__contains=keyword)) if export: if etcd_id_all: etcd_find = [] for etcd_id in etcd_id_all: etcd = get_object(Etcd, id=etcd_id) if etcd: etcd_find.append(etcd) s = write_excel(etcd_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upetcd/etcd_excel_download.html', locals(), request) etcds_list, p, etcds, page_range, current_page, show_first, show_end = pages( etcd_find, request) if user_perm != 0: return my_render('upetcd/etcd_list.html', locals(), request) else: return my_render('upetcd/etcd_cu_list.html', locals(), request)
def download(self): while True: if not self.user_perm: self.user_perm = get_group_user_perm(self.user) try: print "进入批量下载模式" print "请输入主机名或ansile支持的pattern, 多个主机:分隔,q退出" pattern = raw_input("\033[1;32mPattern>:\033[0m ").strip() if pattern == "q": break else: assets = self.user_perm.get("asset").keys() res = gen_resource({"user": self.user, "asset": assets}, perm=self.user_perm) runner = MyRunner(res) asset_name_str = "" print "匹配用户:\n" for inv in runner.inventory.get_hosts(pattern=pattern): asset_name_str += "%s " % inv.name print " %s" % inv.name if not asset_name_str: color_print("没有匹配主机") continue print while True: tmp_dir = get_tmp_dir() logger.debug("Download tmp dir: %s" % tmp_dir) print "请输入文件路径(不支持目录)" file_path = raw_input("\033[1;32mPath>:\033[0m ").strip() if file_path == "q": break if not file_path: color_print("文件路径为空") continue runner.run("fetch", module_args="src=%s dest=%s" % (file_path, tmp_dir), pattern=pattern) ret = runner.results FileLog( user=self.user.name, host=asset_name_str, filename=file_path, type="download", remote_ip=remote_ip, result=ret, ).save() logger.debug("Download file result: %s" % ret) os.chdir("/tmp") tmp_dir_name = os.path.basename(tmp_dir) if not os.listdir(tmp_dir): color_print("下载全部失败") continue bash("tar czf %s.tar.gz %s && sz %s.tar.gz" % (tmp_dir, tmp_dir_name, tmp_dir)) if ret.get("failed"): error = "文件名称: %s \n下载失败: [ %s ] \n下载成功 [ %s ]" % ( "%s.tar.gz" % tmp_dir_name, ", ".join(ret.get("failed").keys()), ", ".join(ret.get("ok").keys()), ) color_print(error) else: msg = "文件名称: %s \n下载成功 [ %s ]" % ( "%s.tar.gz" % tmp_dir_name, ", ".join(ret.get("ok").keys()), ) color_print(msg, "green") print except IndexError: pass
def map_list(request): """ map list view """ header_title, path1, path2 = u'查看映射', u'应用管理', u'查看映射' username = request.user.username user_perm = request.session['role_id'] map_envs = ENV_ENVS map_env = request.GET.get('app_env', '') node_ip = request.GET.get('node_ip', '') node = request.GET.get('node', '') path = request.GET.get('path', '') contextroot = request.GET.get('contextroot', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) map_id_all = request.GET.getlist("id", '') if user_perm != 0: map_find = Map.objects.all() else: map_id_all = [] user = get_object(User, username=username) map_perm = get_group_user_perm(user) if user else {'map': ''} user_map_perm = map_perm['map'].keys() for map in user_map_perm: map_id_all.append(map.id) map_find = Map.objects.filter(pk__in=map_id_all) map_group_all = list(map_perm['map_group']) if map_env: map_find = map_find.filter(map_env__contains=map_env) if node_ip: map_find = map_find.filter(node_ip__contains=node_ip) if node: map_find = map_find.filter(node__contains=node) if path: map_find = map_find.filter(path__contains=path) if contextroot: map_find = map_find.filter(contextroot__contains=contextroot) if keyword: map_find = map_find.filter( Q(name__contains=keyword) | Q(comment__contains=keyword) | Q(group__name__contains=keyword)) if export: if map_id_all: map_find = [] for map_id in map_id_all: map = get_object(Map, id=map_id) if map: map_find.append(map) s = write_excel(map_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upapp/app_excel_download.html', locals(), request) maps_list, p, maps, page_range, current_page, show_first, show_end = pages( map_find, request) if user_perm != 0: return my_render('upapp/map_list.html', locals(), request) else: return my_render('upapp/map_cu_list.html', locals(), request)
def dns_list(request): """ dns list view """ header_title, path1, path2 = u'查看域名', u'应用管理', u'查看域名' username = request.user.username user_perm = request.session['role_id'] app_group_all = AppGroup.objects.all() app_types = APP_TYPE app_envs = ENV_ENVS app_status = APP_STATUS group_name = request.GET.get('group', '') app_type = request.GET.get('app_type', '') app_env = request.GET.get('app_env', '') status = request.GET.get('status', '') keyword = request.GET.get('keyword', '') export = request.GET.get("export", False) group_id = request.GET.get("group_id", '') app_id_all = request.GET.getlist("id", '') if group_id: group = get_object(AppGroup, id=group_id) if group: app_find = App.objects.filter(group=group) else: if user_perm != 0: app_find = App.objects.all() else: app_id_all = [] user = get_object(User, username=username) app_perm = get_group_user_perm(user) if user else {'app': ''} user_app_perm = app_perm['app'].keys() for app in user_app_perm: app_id_all.append(app.id) app_find = App.objects.filter(pk__in=app_id_all) app_group_all = list(app_perm['app_group']) if app_env: app_find = app_find.filter(app_env__contains=app_env) if group_name: app_find = app_find.filter(group__name__contains=group_name) if app_type: app_find = app_find.filter(app_type__contains=app_type) if status: app_find = app_find.filter(status__contains=status) if keyword: app_find = app_find.filter( Q(name__contains=keyword) | Q(pre_value__contains=keyword) | Q(value__contains=keyword) | Q(comment__contains=keyword) | Q(group__name__contains=keyword)) if export: if app_id_all: app_find = [] for app_id in app_id_all: app = get_object(App, id=app_id) if app: app_find.append(app) s = write_excel(app_find) if s[0]: file_name = s[1] smg = u'excel文件已生成,请点击下载!' return my_render('upapp/web_excel_download.html', locals(), request) apps_list, p, apps, page_range, current_page, show_first, show_end = pages( app_find, request) if user_perm != 0: return my_render('upapp/dns_list.html', locals(), request) else: return my_render('upapp/dns_cu_list.html', locals(), request)
def upload(self): while True: if not self.user_perm: self.user_perm = get_group_user_perm(self.user) try: print "进入批量上传模式" print "请输入主机名或ansile支持的pattern, 多个主机:分隔 q退出" pattern = raw_input("\033[1;32mPattern>:\033[0m ").strip() if pattern == "q": break else: assets = self.user_perm.get("asset").keys() res = gen_resource({"user": self.user, "asset": assets}, perm=self.user_perm) runner = MyRunner(res) asset_name_str = "" print "匹配主机:" for inv in runner.inventory.get_hosts(pattern=pattern): print inv.name asset_name_str += "%s " % inv.name if not asset_name_str: color_print("没有匹配主机") continue tmp_dir = get_tmp_dir() logger.debug("Upload tmp dir: %s" % tmp_dir) os.chdir(tmp_dir) bash("rz") filename_str = " ".join(os.listdir(tmp_dir)) if not filename_str: color_print("上传文件为空") continue logger.debug("上传文件: %s" % filename_str) runner = MyRunner(res) runner.run( "copy", module_args="src=%s dest=%s directory_mode" % (tmp_dir, tmp_dir), pattern=pattern ) ret = runner.results FileLog( user=self.user.name, host=asset_name_str, filename=filename_str, remote_ip=remote_ip, type="upload", result=ret, ).save() logger.debug("Upload file: %s" % ret) if ret.get("failed"): error = "上传目录: %s \n上传失败: [ %s ] \n上传成功 [ %s ]" % ( tmp_dir, ", ".join(ret.get("failed").keys()), ", ".join(ret.get("ok").keys()), ) color_print(error) else: msg = "上传目录: %s \n传送成功 [ %s ]" % (tmp_dir, ", ".join(ret.get("ok").keys())) color_print(msg, "green") print except IndexError: pass