def cmd_run(request): if request.method=='GET': form=CmdInputForm() return render_to_response('salt_cmd_run.html',RequestContext(request,{'form':form})) elif request.method=='POST': form=CmdInputForm(request.POST) if form.is_valid(): target=form.cleaned_data['target'].replace(' ','') mapping=form.cleaned_data['mapping'].replace(' ','') command=form.cleaned_data['cmdline'].lstrip(' ').rstrip(' ') result,info=parse_target_params(target,mapping) if result is None: return render_to_response('salt_cmd_run.html',RequestContext(request,{'form':form,'error':info})) if juge_danger_cmd(command): error='Danger Command !!!!' return render_to_response('salt_cmd_run.html',RequestContext(request,{'form':form,'cmd_error':error})) if not request.user.is_superuser: if not command.startswith('ls'): error='Permission Denied ! ' return render_to_response('salt_cmd_run.html',RequestContext(request,{'form':form,'cmd_error':error})) target=info client=SaltByLocalApi('/etc/salt/master') output=client.client.cmd(target,'cmd.run',[command],expr_form=mapping) if output is None or output == {}: error='Bad Target Host !!!' return render_to_response('salt_cmd_run.html',RequestContext(request,{'form':form,'error':error})) result='' hosts=[] for k,v in output.iteritems(): hosts.append(k) result=result+'\n\n------'+k+'-----\n\n'+v f=open('/tmp/.cmd_run.out','w') f.write(result) f.close() code,result=commands.getstatusoutput('cat /tmp/.cmd_run.out') if target == '*': cmd_info=CmdRunLogModel(user=request.user, time=datetime.now(), target=target, mapping=mapping, cmd=command, hosts='all hosts', total=len(hosts)) else: cmd_info=CmdRunLogModel(user=request.user, time=datetime.now(), target=target, mapping=mapping, cmd=command, hosts=','.join(hosts), total=len(hosts)) try: cmd_info.save() except: pass return render_to_response('salt_cmd_run.html',RequestContext(request,{'form':form,'result':result})) else: return render_to_response('salt_cmd_run.html',RequestContext(request,{'form':form})) else: return HttpResponseNotAllowed(request)
def deploy_application(request): match_list=['list','grain','nodegroup','pcre','glob'] app_list=['zabbix','mysql','memcached','nginx','tomcat','system','redis','php'] if request.method=='POST': if not request.user.is_superuser: return HttpResponseForbidden(request) mapping=request.POST.get('map','').replace(' ','') target=request.POST.get('target','').replace(' ','') app=str(request.POST.get('app','').replace(' ','')) if app == '' or target == '' or mapping == '': return HttpResponseNotAllowed(request) if mapping not in match_list or app not in app_list: return HttpResponseNotAllowed(request) result,info=parse_target_params(target,mapping) if result is None: return render_to_response('salt_deploy_application.html',RequestContext(request,{'error':info})) target=info client=SaltByLocalApi('/etc/salt/master') cmd='%s.install' %app output=client.client.cmd(target,'state.sls',[cmd],expr_form=mapping) if output is None or output == {}: return render_to_response('salt_deploy_application.html',RequestContext(request,{'error':u'无效的目标主机'})) error_dict={} error_log='' ok_dict={} all_dict={} for k,v in output.iteritems(): if isinstance(v,list): return render_to_response('salt_deploy_application.html',RequestContext(request,{'error':v[0]})) tmp_list=[] for i,j in v.iteritems(): if 'name' not in j or 'duration' not in j or 'comment' not in j: tmp_list.append([i,' ',0,j['result'],j['changes'],j['comment']]) else: tmp_list.append([i,j['name'],j['duration'],j['result'],j['changes'],j['comment']]) all_dict[k]=tmp_list for k ,v in all_dict.iteritems(): for i in v: if not i[3]: error_dict[k]=v break if len(error_dict)>0: host_error_dict={} for k,v in error_dict.iteritems(): host_error_list=[] for i in v: if not i[3]: host_error_list.append(i) break host_error_dict[k]=host_error_list for k,v in host_error_dict.iteritems(): error_log=error_log+'''-----host name: %s error log -----\n''' %k for i in v: if i[4] != {} and isinstance(i[4],dict): error_log=error_log+'''id: %s \n comment: %s \n name: %s \n %s \n''' %(i[0],i[5],i[1],i[4]['stderr']) else: error_log=error_log+'''id: %s \n comment: %s \n name: %s \n %s \n''' %(i[0],i[5],i[1],i[4]) all_key=all_dict.keys() for key in all_key: if key not in error_dict.keys(): ok_dict[key]=all_dict[key] head_txt='-'*10+'\n' head_txt=head_txt+''' total: %d , successed: %d , failed: %d \n''' %(len(all_dict),len(ok_dict),len(error_dict)) head_txt=head_txt+'-'*10+'\n' success_txt='-'*10+'success'+'-'*10+'\n' error_txt='' total_error_spend_time=0 total_ok_spend_time=0 if len(ok_dict)>0: for k,v in ok_dict.iteritems(): ok_spend_time=0 for i in v: ok_spend_time=i[2]+ok_spend_time ok_spend_time=ok_spend_time/1000 total_ok_spend_time=total_ok_spend_time+ok_spend_time success_txt=success_txt+''' Host: %s | Spend time: %s Sec | Result: success \n''' %(k,str(ok_spend_time)) success_txt=success_txt+'-----success-----\n' if len(error_dict)>0: log='' for k,v in error_dict.iteritems(): error_spend_time=0 for i in v: if i[4] != {} and isinstance(i[4],dict): log=log+'''name: %s \n --error_info--: %s \n ''' %(i[1],i[4]['stderr']) else: log=log+'''name: %s \n --error_info--: %s \n ''' %(i[1],i[4]) error_spend_time=i[2]+error_spend_time error_spend_time=error_spend_time/1000 total_error_spend_time=total_error_spend_time+error_spend_time error_txt=error_txt+''' Host: %s | Spend time: %s Sec | Result: failed \n ''' %(k,str(error_spend_time)) #error_txt=error_txt+'''-----------host: %s error log-----------\n''' %k error_txt=error_txt+'''%s \n ----------\n''' %error_log if ok_dict.keys() == []: success_hosts='' else: success_hosts=','.join(ok_dict.keys()) if error_dict.keys() == []: failed_hosts='' else: failed_hosts=','.join(error_dict.keys()) total=len(all_key) deploylog=AppDeployLogModel(user=request.user, time=datetime.now(), target=target, application=app, mapping=mapping, success_hosts=success_hosts, failed_hosts=failed_hosts, total=total, log=head_txt+success_txt+error_txt, duration=str(total_error_spend_time+total_ok_spend_time)+' s') try: deploylog.save() except: pass f=open('/tmp/.app_deploy.log','w') f.write(head_txt+success_txt+error_txt) f.close() code,log=commands.getstatusoutput('cat /tmp/.app_deploy.log') return render_to_response('salt_deploy_application.html',RequestContext(request,{'log':log})) return render_to_response('salt_deploy_application.html',RequestContext(request))
def deploy_application(request): match_list = ['list', 'grain', 'nodegroup', 'pcre', 'glob'] app_list = [ 'zabbix', 'mysql', 'memcached', 'nginx', 'tomcat', 'system', 'redis', 'php' ] if request.method == 'POST': if not request.user.is_superuser: return HttpResponseForbidden(request) mapping = request.POST.get('map', '').replace(' ', '') target = request.POST.get('target', '').replace(' ', '') app = str(request.POST.get('app', '').replace(' ', '')) if app == '' or target == '' or mapping == '': return HttpResponseNotAllowed(request) if mapping not in match_list or app not in app_list: return HttpResponseNotAllowed(request) result, info = parse_target_params(target, mapping) if result is None: return render_to_response('salt_deploy_application.html', RequestContext(request, {'error': info})) target = info client = SaltByLocalApi('/etc/salt/master') cmd = '%s.install' % app output = client.client.cmd(target, 'state.sls', [cmd], expr_form=mapping) if output is None or output == {}: return render_to_response( 'salt_deploy_application.html', RequestContext(request, {'error': u'无效的目标主机'})) error_dict = {} error_log = '' ok_dict = {} all_dict = {} for k, v in output.iteritems(): if isinstance(v, list): return render_to_response( 'salt_deploy_application.html', RequestContext(request, {'error': v[0]})) tmp_list = [] for i, j in v.iteritems(): if 'name' not in j or 'duration' not in j or 'comment' not in j: tmp_list.append( [i, ' ', 0, j['result'], j['changes'], j['comment']]) else: tmp_list.append([ i, j['name'], j['duration'], j['result'], j['changes'], j['comment'] ]) all_dict[k] = tmp_list for k, v in all_dict.iteritems(): for i in v: if not i[3]: error_dict[k] = v break if len(error_dict) > 0: host_error_dict = {} for k, v in error_dict.iteritems(): host_error_list = [] for i in v: if not i[3]: host_error_list.append(i) break host_error_dict[k] = host_error_list for k, v in host_error_dict.iteritems(): error_log = error_log + '''-----host name: %s error log -----\n''' % k for i in v: if i[4] != {} and isinstance(i[4], dict): error_log = error_log + '''id: %s \n comment: %s \n name: %s \n %s \n''' % ( i[0], i[5], i[1], i[4]['stderr']) else: error_log = error_log + '''id: %s \n comment: %s \n name: %s \n %s \n''' % ( i[0], i[5], i[1], i[4]) all_key = all_dict.keys() for key in all_key: if key not in error_dict.keys(): ok_dict[key] = all_dict[key] head_txt = '-' * 10 + '\n' head_txt = head_txt + ''' total: %d , successed: %d , failed: %d \n''' % ( len(all_dict), len(ok_dict), len(error_dict)) head_txt = head_txt + '-' * 10 + '\n' success_txt = '-' * 10 + 'success' + '-' * 10 + '\n' error_txt = '' total_error_spend_time = 0 total_ok_spend_time = 0 if len(ok_dict) > 0: for k, v in ok_dict.iteritems(): ok_spend_time = 0 for i in v: ok_spend_time = i[2] + ok_spend_time ok_spend_time = ok_spend_time / 1000 total_ok_spend_time = total_ok_spend_time + ok_spend_time success_txt = success_txt + ''' Host: %s | Spend time: %s Sec | Result: success \n''' % ( k, str(ok_spend_time)) success_txt = success_txt + '-----success-----\n' if len(error_dict) > 0: log = '' for k, v in error_dict.iteritems(): error_spend_time = 0 for i in v: if i[4] != {} and isinstance(i[4], dict): log = log + '''name: %s \n --error_info--: %s \n ''' % ( i[1], i[4]['stderr']) else: log = log + '''name: %s \n --error_info--: %s \n ''' % ( i[1], i[4]) error_spend_time = i[2] + error_spend_time error_spend_time = error_spend_time / 1000 total_error_spend_time = total_error_spend_time + error_spend_time error_txt = error_txt + ''' Host: %s | Spend time: %s Sec | Result: failed \n ''' % ( k, str(error_spend_time)) #error_txt=error_txt+'''-----------host: %s error log-----------\n''' %k error_txt = error_txt + '''%s \n ----------\n''' % error_log if ok_dict.keys() == []: success_hosts = '' else: success_hosts = ','.join(ok_dict.keys()) if error_dict.keys() == []: failed_hosts = '' else: failed_hosts = ','.join(error_dict.keys()) total = len(all_key) deploylog = AppDeployLogModel( user=request.user, time=datetime.now(), target=target, application=app, mapping=mapping, success_hosts=success_hosts, failed_hosts=failed_hosts, total=total, log=head_txt + success_txt + error_txt, duration=str(total_error_spend_time + total_ok_spend_time) + ' s') try: deploylog.save() except: pass f = open('/tmp/.app_deploy.log', 'w') f.write(head_txt + success_txt + error_txt) f.close() code, log = commands.getstatusoutput('cat /tmp/.app_deploy.log') return render_to_response('salt_deploy_application.html', RequestContext(request, {'log': log})) return render_to_response('salt_deploy_application.html', RequestContext(request))
def cmd_run(request): if request.method == 'GET': form = CmdInputForm() return render_to_response('salt_cmd_run.html', RequestContext(request, {'form': form})) elif request.method == 'POST': form = CmdInputForm(request.POST) if form.is_valid(): target = form.cleaned_data['target'].replace(' ', '') mapping = form.cleaned_data['mapping'].replace(' ', '') command = form.cleaned_data['cmdline'].lstrip(' ').rstrip(' ') result, info = parse_target_params(target, mapping) if result is None: return render_to_response( 'salt_cmd_run.html', RequestContext(request, { 'form': form, 'error': info })) if juge_danger_cmd(command): error = 'Danger Command !!!!' return render_to_response( 'salt_cmd_run.html', RequestContext(request, { 'form': form, 'cmd_error': error })) if not request.user.is_superuser: flag = True if command.startswith('ls'): flag = False if command.startswith('/root/deploy/deploy_test.sh'): num, output = commands.getstatusoutput(command) if num != 0: error = 'please checkout your command format !' return render_to_response( 'salt_cmd_run.html', RequestContext(request, { 'form': form, 'cmd_error': error })) cmd_info = CmdRunLogModel(user=request.user, time=datetime.now(), target=target, mapping=mapping, cmd=command, hosts='self', total=1) cmd_info.save() return render_to_response( 'salt_cmd_run.html', RequestContext(request, { 'form': form, 'result': output })) if ';' in command or r'&' in command or r'|' in command: flag = True if flag: error = 'Permission Denied ! ' return render_to_response( 'salt_cmd_run.html', RequestContext(request, { 'form': form, 'cmd_error': error })) target = info client = SaltByLocalApi('/etc/salt/master') output = client.client.cmd(target, 'cmd.run', [command], expr_form=mapping) if output is None or output == {}: error = 'Bad Target Host !!!' return render_to_response( 'salt_cmd_run.html', RequestContext(request, { 'form': form, 'error': error })) result = '' hosts = [] for k, v in output.iteritems(): hosts.append(k) result = result + '\n\n------' + k + '-----\n\n' + v f = open('/tmp/.cmd_run.out', 'w') f.write(result) f.close() code, result = commands.getstatusoutput('cat /tmp/.cmd_run.out') if target == '*': cmd_info = CmdRunLogModel(user=request.user, time=datetime.now(), target=target, mapping=mapping, cmd=command, hosts='all hosts', total=len(hosts)) else: cmd_info = CmdRunLogModel(user=request.user, time=datetime.now(), target=target, mapping=mapping, cmd=command, hosts=','.join(hosts), total=len(hosts)) try: cmd_info.save() except: pass return render_to_response( 'salt_cmd_run.html', RequestContext(request, { 'form': form, 'result': result })) else: return render_to_response('salt_cmd_run.html', RequestContext(request, {'form': form})) else: return HttpResponseNotAllowed(request)